Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 76 additions & 33 deletions source/source_cell/read_pp_upf201.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,48 @@
#include "read_pp.h"

// convert helper function
template<typename T>
T safe_convert(const std::string& str, T default_value = T{});

template<>
int safe_convert<int>(const std::string& str, int default_value) {
try {
return std::stoi(str);
} catch (const std::invalid_argument& e) {
std::cerr << "Warning: Invalid number format '" << str << "', using default" << std::endl;
return default_value;
} catch (const std::out_of_range& e) {
std::cerr << "Warning: Number out of range '" << str << "', using default" << std::endl;
return default_value;
}
}

template<>
double safe_convert<double>(const std::string& str, double default_value) {
try {
return std::stod(str);
} catch (const std::invalid_argument& e) {
std::cerr << "Warning: Invalid number format '" << str << "', using default" << std::endl;
return default_value;
} catch (const std::out_of_range& e) {
std::cerr << "Warning: Number out of range '" << str << "', using default" << std::endl;
return default_value;
}
}

template<>
float safe_convert<float>(const std::string& str, float default_value) {
try {
return std::stof(str);
} catch (const std::invalid_argument& e) {
std::cerr << "Warning: Invalid number format '" << str << "', using default" << std::endl;
return default_value;
} catch (const std::out_of_range& e) {
std::cerr << "Warning: Number out of range '" << str << "', using default" << std::endl;
return default_value;
}
}

// qianrui rewrite it 2021-5-10
// liuyu update 2023-09-17 add uspp support
int Pseudopot_upf::read_pseudo_upf201(std::ifstream &ifs, Atom_pseudo& pp)
Expand Down Expand Up @@ -303,35 +346,35 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
}
else if (name[ip] == "z_valence")
{
pp.zv = std::stod(val[ip]);
pp.zv = safe_convert<double>(val[ip], 0.0);
}
else if (name[ip] == "total_psenergy")
{
pp.etotps = atof(val[ip].c_str());
pp.etotps = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "wfc_cutoff")
{
pp.ecutwfc = atof(val[ip].c_str());
pp.ecutwfc = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "rho_cutoff")
{
pp.ecutrho = atof(val[ip].c_str());
pp.ecutrho = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "l_max")
{
pp.lmax = atoi(val[ip].c_str());
pp.lmax = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "l_max_rho")
{
this->lmax_rho = atoi(val[ip].c_str());
this->lmax_rho = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "l_local")
{
this->lloc = atoi(val[ip].c_str());
this->lloc = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "mesh_size")
{
pp.mesh = atoi(val[ip].c_str());
pp.mesh = safe_convert<int>(val[ip], 0);
this->mesh_changed = false;
if (pp.mesh % 2 == 0)
{
Expand All @@ -341,11 +384,11 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
}
else if (name[ip] == "number_of_wfc")
{
pp.nchi = atoi(val[ip].c_str());
pp.nchi = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "number_of_proj")
{
pp.nbeta = atoi(val[ip].c_str());
pp.nbeta = safe_convert<int>(val[ip], 0);
}
else
{
Expand Down Expand Up @@ -377,11 +420,11 @@ void Pseudopot_upf::read_pseudo_upf201_mesh(std::ifstream& ifs, Atom_pseudo& pp)
{
if (name[ip] == "dx")
{
dx = atof(val[ip].c_str());
dx = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "mesh")
{
pp.mesh = atoi(val[ip].c_str());
pp.mesh = safe_convert<int>(val[ip], 0);

this->mesh_changed = false;
if (pp.mesh % 2 == 0)
Expand All @@ -392,15 +435,15 @@ void Pseudopot_upf::read_pseudo_upf201_mesh(std::ifstream& ifs, Atom_pseudo& pp)
}
else if (name[ip] == "xmin")
{
xmin = atof(val[ip].c_str());
xmin = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "rmax")
{
rmax = atof(val[ip].c_str());
rmax = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "zmesh")
{
zmesh = atof(val[ip].c_str());
zmesh = safe_convert<float>(val[ip], 0.0);
}
else
{
Expand Down Expand Up @@ -501,19 +544,19 @@ void Pseudopot_upf::read_pseudo_upf201_nonlocal(std::ifstream& ifs, Atom_pseudo&
}
else if (name[ip] == "angular_momentum")
{
pp.lll[ib] = atoi(val[ip].c_str());
pp.lll[ib] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "cutoff_radius_index")
{
this->kbeta[ib] = atoi(val[ip].c_str());
this->kbeta[ib] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "cutoff_radius")
{
rcut[ib] = atof(val[ip].c_str());
rcut[ib] = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "ultrasoft_cutoff_radius")
{
rcutus[ib] = atof(val[ip].c_str());
rcutus[ib] = safe_convert<float>(val[ip], 0.0);
}
else
{
Expand Down Expand Up @@ -572,11 +615,11 @@ void Pseudopot_upf::read_pseudo_upf201_nonlocal(std::ifstream& ifs, Atom_pseudo&
}
else if (name[ip] == "nqf")
{
nqf = atoi(val[ip].c_str());
nqf = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "nqlc")
{
pp.nqlc = atoi(val[ip].c_str());
pp.nqlc = safe_convert<int>(val[ip], 0);
}
else
{
Expand Down Expand Up @@ -752,31 +795,31 @@ void Pseudopot_upf::read_pseudo_upf201_pswfc(std::ifstream& ifs, Atom_pseudo& pp
}
else if (name[ip] == "l")
{
pp.lchi[iw] = atoi(val[ip].c_str());
pp.lchi[iw] = safe_convert<int>(val[ip], 0);
if (nchi[iw] == -1)
{
nchi[iw] = pp.lchi[iw] - 1;
}
}
else if (name[ip] == "occupation")
{
pp.oc[iw] = atof(val[ip].c_str());
pp.oc[iw] = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "n")
{
nchi[iw] = atoi(val[ip].c_str());
nchi[iw] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "pseudo_energy")
{
epseu[iw] = atof(val[ip].c_str());
epseu[iw] = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "cutoff_radius")
{
rcut_chi[iw] = atof(val[ip].c_str());
rcut_chi[iw] = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "ultrasoft_cutoff_radius")
{
rcutus_chi[iw] = atof(val[ip].c_str());
rcutus_chi[iw] = safe_convert<float>(val[ip], 0.0);
}
else
{
Expand Down Expand Up @@ -870,19 +913,19 @@ void Pseudopot_upf::read_pseudo_upf201_so(std::ifstream& ifs, Atom_pseudo& pp)
}
else if (name[ip] == "nn")
{
pp.nn[nw] = atoi(val[ip].c_str());
pp.nn[nw] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "lchi")
{
pp.lchi[nw] = atoi(val[ip].c_str());
pp.lchi[nw] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "jchi")
{
pp.jchi[nw] = atof(val[ip].c_str());
pp.jchi[nw] = safe_convert<float>(val[ip], 0.0);
}
else if (name[ip] == "oc")
{
pp.oc[nw] = atof(val[ip].c_str());
pp.oc[nw] = safe_convert<float>(val[ip], 0.0);
}
else
{
Expand All @@ -907,11 +950,11 @@ void Pseudopot_upf::read_pseudo_upf201_so(std::ifstream& ifs, Atom_pseudo& pp)
}
else if (name[ip] == "lll")
{
pp.lll[nb] = atoi(val[ip].c_str());
pp.lll[nb] = safe_convert<int>(val[ip], 0);
}
else if (name[ip] == "jjj")
{
pp.jjj[nb] = atof(val[ip].c_str());
pp.jjj[nb] = safe_convert<float>(val[ip], 0.0);
}
else
{
Expand Down
Loading
Loading