#include "read_pp.h"
#include "source_base/atom_in.h"
#include "source_base/element_name.h"
int Pseudopot_upf::read_pseudo_blps(std::ifstream &ifs, Atom_pseudo& pp)
{
// double bohr2a = 0.529177249;
pp.nlcc = false;
pp.tvanp = false;
pp.has_so = false;
pp.nbeta = 0;
pp.kkbeta = 0;
pp.lll = std::vector(pp.nbeta, 0);
pp.betar.create(0, 0);
pp.dion.create(pp.nbeta, pp.nbeta);
pp.nchi = 0;
pp.nn = std::vector(pp.nchi, 0);
pp.jchi = std::vector(pp.nchi, 0.0);
pp.jjj = std::vector(pp.nchi, 0.0);
ifs >> pp.psd;
// if(!SCAN_BEGIN(ifs,"BLPS")) WARNING_QUIT("read_pp_blps","Find no PP_HEADER");
ifs.ignore(300, '\n');
double zatom;
double zion;
ifs >> zatom >> zion;
pp.zv = zion;
ifs.ignore(300, '\n');
atom_in ai;
for (auto each_type: ModuleBase::element_name)
{
if (zatom == ai.atom_Z[each_type])
{
pp.psd = each_type;
break;
}
}
int pspcod, pspxc, lloc, r2well;
ifs >> pspcod >> pspxc >> pp.lmax >> lloc >> pp.mesh >> r2well;
this->mesh_changed = false;
if (pp.mesh%2 == 0)
{
pp.mesh -= 1;
this->mesh_changed = true;
}
if (pspxc == 2)
{
pp.xc_func = "PZ";
}
else if (pspxc == 11)
{
pp.xc_func = "PBE";
}
else
{
std::string msg = "Unknown pspxc: " + std::to_string(pspxc);
ModuleBase::WARNING_QUIT("Pseudopot_upf::read_pseudo_blps", msg);
}
if (pspcod == 8)
{
for (int i = 0; i < 5; ++i)
{
ifs.ignore(300, '\n');
}
}
else if (pspcod == 6)
{
for (int i = 0; i < 17; ++i)
{
ifs.ignore(300, '\n');
}
}
else
{
std::string msg = "Unknown pspcod: " + std::to_string(pspcod);
ModuleBase::WARNING_QUIT("Pseudopot_upf::read_pseudo_blps", msg);
}
assert(pp.mesh > 0);
pp.r = std::vector(pp.mesh, 0.0); // Bohr
pp.rab = std::vector(pp.mesh, 0.0);
pp.vloc_at = std::vector(pp.mesh, 0.0); // Hartree
int num = 0;
if (pspcod == 8)
{
for(int i = 0;i < pp.mesh; ++i)
{
ifs >> num >> pp.r[i] >> pp.vloc_at[i];
pp.vloc_at[i] = pp.vloc_at[i]*2; // Hartree to Ry
}
}
else if (pspcod == 6)
{
double temp = 0.;
for(int i = 0;i < pp.mesh; ++i)
{
ifs >> num >> pp.r[i] >> temp >> pp.vloc_at[i];
pp.vloc_at[i] = pp.vloc_at[i]*2; // Hartree to Ry
}
}
pp.rab[0] = pp.r[1] - pp.r[0];
for(int i = 1; i < pp.mesh - 1; ++i)
{
pp.rab[i] = (pp.r[i+1] - pp.r[i-1])/2.0;
}
pp.rab[pp.mesh - 1] = pp.r[pp.mesh - 1] - pp.r[pp.mesh - 2];
pp.rho_at = std::vector(pp.mesh, 0.0);
double charge = zion/pp.r[pp.mesh - 1];
for(int i = 0;i < pp.mesh; ++i)
{
pp.rho_at[i] = charge;
}
return 0;
}
//parameters
//read_pp.h blps_real
//nv -
//psd head
//pp_type(NC or US) -
//tvanp False
//nlcc False
//dft pspxc 2->lda, 11->gga
//zp zion
//etotps -
//ecutwfc -
//ecutrho -
//lmax lmax
//mesh mmax
//nwfc -
//nbeta -
//els -
//lchi -
//oc -
//rab rab[ir]=(r[ir+1]-r[ir-1])/2.0
//rho_atc(nonlocal) -
//vloc
//chi -
//rho_at -
// lll -
// kbeta -
// beta -
// dion -
//nn -
//jchi -
//jjj -
//nd -