@@ -197,34 +197,36 @@ void ReadInput::item_output()
197197 {
198198 Input_Item item (" out_dmk" );
199199 item.annotation = " >0 output density matrix DM(k) for each k-point" ;
200- item.read_value = [](const Input_Item& item, Parameter& para) {
201- const size_t count = item.get_size ();
202- if (count != 1 && count != 2 )
203- {
204- ModuleBase::WARNING_QUIT ( " ReadInput " , " out_dmk should have 1 or 2 values " ) ;
205- }
206- para. input . out_dmk [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
207- para. input . out_dmk [ 1 ] = (count == 2 ) ? std::stoi (item. str_values [ 1 ]) : 8 ;
208- if (para. input . calculation == " get_pchg " || para. input . calculation == " get_wf " )
209- {
210- para. input . out_dmk [ 0 ] = 0 ;
211- }
212- };
213-
200+ item.read_value = [](const Input_Item& item, Parameter& para) {
201+ const size_t count = item.get_size ();
202+ if (count < 1 ) ModuleBase::WARNING_QUIT ( " ReadInput " , " out_dmk needs at least 1 value " );
203+ para. input . out_dmk [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
204+ para. input . out_dmk [ 1 ] = 8 ;
205+ if (count >= 2 ) try { para. input . out_dmk [ 1 ] = std::stoi (item. str_values [ 1 ]); }
206+ catch ( const std::invalid_argument&) { /* do nothing */ }
207+ catch ( const std::out_of_range&) { /* do nothing */ }
208+ // some other case
209+ if (para. input . calculation == " get_pchg " || para. input . calculation == " get_wf " )
210+ {
211+ para. input . out_dmk [ 0 ] = 0 ;
212+ }
213+ };
214214 sync_intvec (input.out_dmk , 2 , 0 );
215215 this ->add_item (item);
216216 }
217217 {
218218 Input_Item item (" out_dmr" );
219219 item.annotation = " output density matrix DM(R) with respect to lattice vector R (with precision 8)" ;
220- item.read_value = [](const Input_Item& item, Parameter& para) {
221- const size_t count = item.get_size ();
222- if (count != 1 && count != 2 )
223- {
224- ModuleBase::WARNING_QUIT (" ReadInput" , " out_dmr should have 1 or 2 values" );
225- }
226- para.input .out_dmr [0 ] = assume_as_boolean (item.str_values [0 ]);
227- para.input .out_dmr [1 ] = (count == 2 ) ? std::stoi (item.str_values [1 ]) : 8 ;
220+
221+ item.read_value = [](const Input_Item& item, Parameter& para) {
222+ const size_t count = item.get_size ();
223+ if (count < 1 ) ModuleBase::WARNING_QUIT (" ReadInput" , " out_dmr needs at least 1 value" );
224+ para.input .out_dmr [0 ] = assume_as_boolean (item.str_values [0 ]);
225+ para.input .out_dmr [1 ] = 8 ;
226+ if (count >= 2 ) try { para.input .out_dmr [1 ] = std::stoi (item.str_values [1 ]); }
227+ catch (const std::invalid_argument&) { /* do nothing */ }
228+ catch (const std::out_of_range&) {/* do nothing */ }
229+ // some special case
228230 if (para.input .calculation == " get_pchg" || para.input .calculation == " get_wf" )
229231 {
230232 para.input .out_dmr [0 ] = 0 ;
@@ -271,15 +273,15 @@ void ReadInput::item_output()
271273 }
272274 {
273275 Input_Item item (" out_mat_tk" );
274- item.annotation = " output kinetic matrix T(k)" ;
275- item.read_value = [](const Input_Item& item, Parameter& para) {
276- const size_t count = item.get_size ();
277- if (count != 1 && count != 2 )
278- {
279- ModuleBase::WARNING_QUIT ( " ReadInput " , " out_mat_tk should have 1 or 2 values " ) ;
280- }
281- para. input . out_mat_tk [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
282- para. input . out_mat_tk [ 1 ] = (count == 2 ) ? std::stoi (item. str_values [ 1 ]) : 8 ;
276+ item.annotation = " output kinetic matrix of electrons T(k)" ;
277+ item.read_value = [](const Input_Item& item, Parameter& para) {
278+ const size_t count = item.get_size ();
279+ if (count < 1 ) ModuleBase::WARNING_QUIT ( " ReadInput " , " out_mat_tk needs at least 1 value " );
280+ para. input . out_mat_tk [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
281+ para. input . out_mat_tk [ 1 ] = 8 ;
282+ if (count >= 2 ) try { para. input . out_mat_tk [ 1 ] = std::stoi (item. str_values [ 1 ]); }
283+ catch ( const std::invalid_argument&) { /* do nothing */ }
284+ catch ( const std::out_of_range&) { /* do nothing */ }
283285 };
284286 sync_intvec (input.out_mat_tk , 2 , 0 );
285287 this ->add_item (item);
@@ -299,14 +301,14 @@ void ReadInput::item_output()
299301 {
300302 Input_Item item (" out_mat_l" );
301303 item.annotation = " output the expectation values of angular momentum operators" ;
302- item.read_value = [](const Input_Item& item, Parameter& para) {
303- const size_t count = item.get_size ();
304- if (count != 1 && count != 2 )
305- {
306- ModuleBase::WARNING_QUIT ( " ReadInput " , " out_mat_l should have 1 or 2 values " ) ;
307- }
308- para. input . out_mat_l [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
309- para. input . out_mat_l [ 1 ] = (count == 2 ) ? std::stoi (item. str_values [ 1 ]) : 8 ;
304+ item.read_value = [](const Input_Item& item, Parameter& para) {
305+ const size_t count = item.get_size ();
306+ if (count < 1 ) ModuleBase::WARNING_QUIT ( " ReadInput " , " out_mat_l needs at least 1 value " );
307+ para. input . out_mat_l [ 0 ] = assume_as_boolean (item. str_values [ 0 ]);
308+ para. input . out_mat_l [ 1 ] = 8 ;
309+ if (count >= 2 ) try { para. input . out_mat_l [ 1 ] = std::stoi (item. str_values [ 1 ]); }
310+ catch ( const std::invalid_argument&) { /* do nothing */ }
311+ catch ( const std::out_of_range&) { /* do nothing */ }
310312 };
311313 sync_intvec (input.out_mat_l , 2 , 0 );
312314 this ->add_item (item);
@@ -521,10 +523,13 @@ void ReadInput::item_output()
521523 item.read_value = [](const Input_Item& item, Parameter& para) {
522524 size_t count = item.get_size ();
523525 std::vector<int > out_xc_r (count); // create a placeholder vector
524- std::transform (item.str_values .begin (), item.str_values .end (), out_xc_r.begin (), [](std::string s) { return std::stoi (s); });
526+ std::transform (item.str_values .begin (),
527+ item.str_values .end (),
528+ out_xc_r.begin (), [](std::string s) { return std::stoi (s); });
525529 // assign non-negative values to para.input.out_xc_r
526530 std::copy (out_xc_r.begin (), out_xc_r.end (), para.input .out_xc_r .begin ());
527531 };
532+ // check value
528533 item.check_value = [](const Input_Item& item, const Parameter& para) {
529534 if (para.input .out_xc_r [0 ] >= 0 )
530535 {
0 commit comments