11#include " read_pp.h"
2+ #include < string>
3+ #include < stdexcept>
24
35// qianrui rewrite it 2021-5-10
46// liuyu update 2023-09-17 add uspp support
@@ -197,47 +199,58 @@ void Pseudopot_upf::getnameval(std::ifstream& ifs, int& n, std::string* name, st
197199
198200namespace // Helper functions for subsequent type conversion
199201{
200- int parse_int (const std::string& s)
202+ int parse_int (const std::string& s, const std::string& key )
201203{
202204 size_t pos = 0 ;
203205 int value = 0 ;
206+
204207 try
205208 {
206209 value = std::stoi (s, &pos);
207210 }
208- catch (...)
211+ catch (const std::invalid_argument&)
212+ {
213+ ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_int" ,
214+ " Invalid integer value for " + key + " : " + s);
215+ }
216+ catch (const std::out_of_range&)
209217 {
210218 ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_int" ,
211- " Invalid integer value: " + s);
219+ " Out-of-range integer value for " + key + " : " + s);
212220 }
213221
214222 if (pos != s.size ())
215223 {
216224 ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_int" ,
217- " Invalid integer value (extra characters): " + s);
225+ " Invalid integer value for " + key + " (extra characters): " + s);
218226 }
219227
220228 return value;
221229}
222230
223- double parse_double (const std::string& s)
231+ double parse_double (const std::string& s, const std::string& key )
224232{
225233 size_t pos = 0 ;
226234 double value = 0.0 ;
227235 try
228236 {
229237 value = std::stod (s, &pos);
230238 }
231- catch (...)
239+ catch (const std::invalid_argument&)
240+ {
241+ ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_double" ,
242+ " Invalid floating-point value for " + key + " : " + s);
243+ }
244+ catch (const std::out_of_range&)
232245 {
233246 ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_double" ,
234- " Invalid floating-point value: " + s);
247+ " Out-of-range floating-point value for " + key + " : " + s);
235248 }
236249
237250 if (pos != s.size ())
238251 {
239252 ModuleBase::WARNING_QUIT (" read_pp_upf201::parse_double" ,
240- " Invalid floating-point value (extra characters): " + s);
253+ " Invalid floating-point value for " + key + " (extra characters): " + s);
241254 }
242255
243256 return value;
@@ -352,35 +365,35 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
352365 }
353366 else if (name[ip] == " z_valence" )
354367 {
355- pp.zv = parse_double (val[ip]);
368+ pp.zv = parse_double (val[ip],name[ip] );
356369 }
357370 else if (name[ip] == " total_psenergy" )
358371 {
359- pp.etotps = parse_double (val[ip]);
372+ pp.etotps = parse_double (val[ip],name[ip] );
360373 }
361374 else if (name[ip] == " wfc_cutoff" )
362375 {
363- pp.ecutwfc = parse_double (val[ip]);
376+ pp.ecutwfc = parse_double (val[ip],name[ip] );
364377 }
365378 else if (name[ip] == " rho_cutoff" )
366379 {
367- pp.ecutrho = parse_double (val[ip]);
380+ pp.ecutrho = parse_double (val[ip],name[ip] );
368381 }
369382 else if (name[ip] == " l_max" )
370383 {
371- pp.lmax = parse_int (val[ip]);
384+ pp.lmax = parse_int (val[ip],name[ip] );
372385 }
373386 else if (name[ip] == " l_max_rho" )
374387 {
375- this ->lmax_rho = parse_int (val[ip]);
388+ this ->lmax_rho = parse_int (val[ip],name[ip] );
376389 }
377390 else if (name[ip] == " l_local" )
378391 {
379- this ->lloc = parse_int (val[ip]);
392+ this ->lloc = parse_int (val[ip],name[ip] );
380393 }
381394 else if (name[ip] == " mesh_size" )
382395 {
383- pp.mesh = parse_int (val[ip]);
396+ pp.mesh = parse_int (val[ip],name[ip] );
384397 this ->mesh_changed = false ;
385398 if (pp.mesh % 2 == 0 )
386399 {
@@ -390,11 +403,11 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
390403 }
391404 else if (name[ip] == " number_of_wfc" )
392405 {
393- pp.nchi = parse_int (val[ip]);
406+ pp.nchi = parse_int (val[ip],name[ip] );
394407 }
395408 else if (name[ip] == " number_of_proj" )
396409 {
397- pp.nbeta = parse_int (val[ip]);
410+ pp.nbeta = parse_int (val[ip],name[ip] );
398411 }
399412 else
400413 {
0 commit comments