50 magic_enum::enum_cast<JobType>(ini.Get(
"Main",
"job",
""),
51 magic_enum::case_insensitive)
54 ini.GetReal(
"Main",
"temperature",
57 ini.GetInteger(
"Main",
"random_seed",
60 ini.GetBoolean(
"Main",
"checkpoint",
67 ini.GetBoolean(
"Main",
"write_con_forces",
73 ini.GetReal(
"Main",
"finite_difference",
77 unsigned i =
static_cast<unsigned>(std::time(
nullptr));
84 ini.GetInteger(
"Main",
"max_force_calls",
87 ini.GetBoolean(
"Main",
"remove_net_force",
94 std::string potTok = ini.Get(
"Potential",
"potential",
"");
97 if (potTok ==
"ase_nwcem" || potTok ==
"ASE_NWCEM") {
98 potTok =
"ase_nwchem";
101 magic_enum::enum_cast<PotType>(potTok, magic_enum::case_insensitive)
104 "Potential",
"mpi_poll_period",
108 "Potential",
"lammps_logging",
111 static_cast<int>(ini.GetInteger(
112 "Potential",
"lammps_threads",
115 "Potential",
"emt_rasmussen",
118 ini.Get(
"Potential",
"ext_pot_path",
121 ini.Get(
"Potential",
"potentials_path",
131 "Potential",
"log_potential",
134 "Potential",
"thread_safe",
142 ini.Get(
"AMS",
"forcefield",
145 ini.Get(
"AMS",
"resources",
159 ini.Get(
"AMS_IO",
"forcefield",
170 ini.Get(
"AMS_ENV",
"amshome",
173 ini.Get(
"AMS_ENV",
"scm_tmpdir",
176 ini.Get(
"AMS_ENV",
"scmlicense",
179 ini.Get(
"AMS_ENV",
"scm_pythondir",
182 ini.Get(
"AMS_ENV",
"amsbin",
185 ini.Get(
"AMS_ENV",
"amsresources",
191 ini.Get(
"XTBPot",
"paramset",
196 ini.GetReal(
"XTBPot",
"electronic_temperature",
199 ini.GetInteger(
"XTBPot",
"max_iterations",
209 ini.GetReal(
"ZBLPot",
"cut_inner",
212 ini.GetReal(
"ZBLPot",
"cut_global",
216 throw std::runtime_error(
217 "Switching function must begin before the global cutoff!");
224 ini.Get(
"D3Pot",
"functional",
225 ini.Get(
"D4Pot",
"functional",
229 ini.GetBoolean(
"D4Pot",
"atm",
232 ini.Get(
"D3Pot",
"damping",
235 ini.GetReal(
"D4Pot",
"charge",
240 ini.Get(
"ExprPot",
"expression",
247 ini.GetInteger(
"MOPACPot",
"charge",
250 ini.GetInteger(
"MOPACPot",
"spin",
253 ini.GetInteger(
"MOPACPot",
"model",
256 ini.Get(
"MOPACPot",
"engine_path",
262 ini.Get(
"SocketNWChemPot",
"host",
265 "SocketNWChemPot",
"port",
269 "SocketNWChemPot",
"mem_in_gb",
272 ini.Get(
"SocketNWChemPot",
"nwchem_settings",
276 ini.Get(
"SocketNWChemPot",
"unix_socket_path",
280 ini.GetBoolean(
"SocketNWChemPot",
"unix_socket_mode",
284 ini.GetBoolean(
"SocketNWChemPot",
"make_template_input",
286 .make_template_input);
291 const char *sec =
"RgpotPot";
297 ini.Get(sec,
"basis",
298 ini.Get(sec,
"nwchem_basis",
301 ini.Get(sec,
"theory",
302 ini.Get(sec,
"nwchem_theory",
305 ini.Get(sec,
"scf_type",
306 ini.Get(sec,
"nwchem_scf_type",
310 ini.Get(sec,
"cpmd_functional",
318 sec,
"cpmd_cut_off_ry",
322 ini.GetInteger(sec,
"nwchem_charge",
327 sec,
"nwchem_multiplicity",
330 ini.Get(sec,
"engine_path",
333 ini.Get(sec,
"engine_library",
336 ini.Get(sec,
"engine_root",
341 ini.GetInteger(sec,
"memory_mb",
344 ini.Get(sec,
"scratch_dir",
347 ini.Get(sec,
"input_block",
350 ini.Get(sec,
"permanent_dir",
353 ini.Get(sec,
"params_path",
357 sec,
"ranks_per_image",
360 ini.Get(sec,
"model_path",
365 ini.Get(sec,
"length_unit",
368 sec,
"extensions_directory",
372 sec,
"check_consistency",
376 sec,
"uncertainty_threshold",
379 ini.GetBoolean(sec,
"torch_determinism_strict",
381 .torch_determinism_strict);
385 ini.Get(sec,
"xtb_paramset",
389 ini.GetReal(sec,
"xtb_accuracy",
392 ini.GetReal(sec,
"electronic_temperature",
393 ini.GetReal(sec,
"xtb_electronic_temperature",
395 .xtb_electronic_temperature));
397 static_cast<int>(ini.GetInteger(
398 sec,
"max_iterations",
399 ini.GetInteger(sec,
"xtb_max_iterations",
401 .xtb_max_iterations)));
403 ini.GetReal(sec,
"xtb_charge",
407 static_cast<int>(ini.GetInteger(
412 const std::string be =
414 if (be ==
"xtb" || be ==
"xtbpot" || be ==
"gfn" || be ==
"gfnxtb") {
416 ini.Get(
"XTBPot",
"paramset",
419 ini.GetReal(
"XTBPot",
"accuracy",
422 ini.GetReal(
"XTBPot",
"electronic_temperature",
424 .xtb_electronic_temperature);
426 static_cast<int>(ini.GetInteger(
427 "XTBPot",
"max_iterations",
430 ini.GetInteger(
"XTBPot",
"uhf",
433 ini.GetReal(
"XTBPot",
"charge",
440 if (be ==
"cpmd" || be ==
"cpmdc" || be ==
"cpmdpot") {
443 ini.Get(
"cpmd",
"functional",
444 ini.Get(
"cpmd",
"cpmd_functional", rg.functional));
445 rg.cutoff_ry = ini.GetReal(
447 ini.GetReal(
"cpmd",
"cutoff_ry",
448 ini.GetReal(
"cpmd",
"cpmd_cut_off_ry", rg.cutoff_ry)));
449 rg.charge = ini.GetInteger(
"cpmd",
"charge", rg.charge);
450 rg.multiplicity = ini.GetInteger(
"cpmd",
"multiplicity", rg.multiplicity);
451 rg.title = ini.Get(
"cpmd",
"title", rg.title);
452 rg.memory_mb = ini.GetInteger(
"cpmd",
"memory_mb", rg.memory_mb);
453 rg.input_block = ini.Get(
"cpmd",
"input_block", rg.input_block);
460 ini.GetBoolean(
"Debug",
"write_movies",
464 "Debug",
"write_movies_interval",
468 "Debug",
"write_deprecated_outs",
472 "Debug",
"estimate_neb_eigenvalues",
475 toLowerCase(ini.Get(
"Debug",
"neb_mmf_estimator",
482 ini.GetReal(
"Structure Comparison",
"distance_difference",
484 .distance_difference);
486 ini.GetReal(
"Structure Comparison",
"neighbor_cutoff",
490 ini.GetBoolean(
"Structure Comparison",
"check_rotation",
494 ini.GetReal(
"Structure Comparison",
"energy_difference",
499 ini.GetBoolean(
"Structure Comparison",
"indistinguishable_atoms",
501 .indistinguishable_atoms);
504 ini.GetBoolean(
"Structure Comparison",
"remove_translation",
506 .remove_translation);
512 "Process Search",
"minimize_first",
515 ini.GetReal(
"Process Search",
"minimization_offset",
517 .minimization_offset);
521 magic_enum::enum_cast<OptType>(ini.Get(
"Optimizer",
"opt_method",
"none"),
522 magic_enum::case_insensitive)
530 "Optimizer",
"convergence_metric",
538 "unknown convergence_metric {}",
543 if (ini.HasSection(
"Refine")) {
545 magic_enum::enum_cast<OptType>(ini.Get(
"Refine",
"opt_method",
""),
546 magic_enum::case_insensitive)
550 "Refine",
"threshold",
555 "Optimizer",
"converged_force",
558 static_cast<size_t>(ini.GetInteger(
559 "Optimizer",
"max_iterations",
562 ini.GetReal(
"Optimizer",
"max_move",
565 if (ini.HasSection(
"QuickMin")) {
568 "QuickMin",
"time_step",
574 ini.GetBoolean(
"Optimizer",
"qm_steepest_descent",
576 .quickmin.steepest_descent);
578 if (ini.HasSection(
"FIRE")) {
588 ini.GetReal(
"FIRE",
"time_step_max",
590 .max_time_step_input);
597 const char *lbfgs_sec = ini.HasSection(
"LBFGS") ?
"LBFGS" :
"Optimizer";
600 lbfgs_sec,
"lbfgs_memory",
603 ini.GetReal(lbfgs_sec,
"lbfgs_inverse_curvature",
605 .lbfgs.inverse_curvature);
608 ini.GetReal(lbfgs_sec,
"lbfgs_max_inverse_curvature",
610 .lbfgs.max_inverse_curvature);
613 ini.GetBoolean(lbfgs_sec,
"lbfgs_auto_scale", lbfgs.auto_scale);
615 ini.GetBoolean(lbfgs_sec,
"lbfgs_angle_reset", lbfgs.angle_reset);
616 lbfgs.distance_reset =
617 ini.GetBoolean(lbfgs_sec,
"lbfgs_distance_reset", lbfgs.distance_reset);
619 toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_curvature", lbfgs.curvature));
620 lbfgs.project_rigid =
621 ini.GetBoolean(lbfgs_sec,
"lbfgs_project_rigid", lbfgs.project_rigid);
623 toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_secant", lbfgs.secant));
625 toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_precon", lbfgs.precon));
626 lbfgs.step = toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_step", lbfgs.step));
627 lbfgs.h0 = toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_h0", lbfgs.h0));
629 toLowerCase(ini.Get(lbfgs_sec,
"lbfgs_accept", lbfgs.accept));
630 lbfgs.extra_updates =
631 ini.GetInteger(lbfgs_sec,
"lbfgs_extra_updates", lbfgs.extra_updates);
633 ini.GetReal(lbfgs_sec,
"lbfgs_cautious_eps", lbfgs.cautious_eps);
634 lbfgs.cautious_alpha =
635 ini.GetReal(lbfgs_sec,
"lbfgs_cautious_alpha", lbfgs.cautious_alpha);
636 lbfgs.precon_A = ini.GetReal(lbfgs_sec,
"lbfgs_precon_A", lbfgs.precon_A);
638 ini.GetReal(lbfgs_sec,
"lbfgs_precon_mu", lbfgs.precon_mu);
640 ini.GetReal(lbfgs_sec,
"lbfgs_precon_rcut", lbfgs.precon_rcut);
645 toLowerCase(ini.Get(
"Optimizer",
"xtsci_method", xtsci.method));
646 if (ini.HasSection(
"Xtsci")) {
647 xtsci.method = toLowerCase(ini.Get(
648 "Xtsci",
"method", ini.Get(
"Xtsci",
"xtsci_method", xtsci.method)));
649 xtsci.qn_step = toLowerCase(ini.Get(
"Xtsci",
"qn_step", xtsci.qn_step));
650 xtsci.precon = toLowerCase(ini.Get(
"Xtsci",
"precon", xtsci.precon));
651 xtsci.accept = toLowerCase(ini.Get(
"Xtsci",
"accept", xtsci.accept));
653 ini.GetBoolean(
"Xtsci",
"highs",
654 ini.GetBoolean(
"Xtsci",
"xtsci_highs", xtsci.highs));
655 xtsci.manifold = toLowerCase(
656 ini.Get(
"Xtsci",
"manifold",
657 ini.Get(
"Xtsci",
"xtsci_manifold", xtsci.manifold)));
659 xtsci.highs = ini.GetBoolean(
"Optimizer",
"xtsci_highs", xtsci.highs);
662 if (ini.HasSection(
"CG")) {
665 "CG",
"cg_no_overshooting",
668 ini.GetBoolean(
"CG",
"cg_knock_out_max_move",
670 .cg.knock_out_max_move);
673 "CG",
"cg_line_search",
677 "CG",
"cg_line_converged",
680 ini.GetInteger(
"CG",
"cg_max_iter_before_reset",
682 .cg.max_iter_before_reset);
684 ini.GetInteger(
"CG",
"cg_max_iter_line_search",
686 .cg.line_search_max_iter);
688 if (ini.HasSection(
"SD")) {
690 ini.GetReal(
"SD",
"sd_alpha",
701 ini.GetReal(
"Dimer",
"finite_angle",
704 ini.GetBoolean(
"Dimer",
"improved",
707 ini.GetReal(
"Dimer",
"converged_angle",
710 "Dimer",
"max_iterations",
712 if (
auto dimerOpt = magic_enum::enum_cast<OptType>(
713 ini.Get(
"Dimer",
"opt_method",
"cg"), magic_enum::case_insensitive);
718 ini.GetInteger(
"Dimer",
"rotations_min",
721 ini.GetInteger(
"Dimer",
"rotations_max",
724 ini.GetReal(
"Dimer",
"torque_min",
727 ini.GetReal(
"Dimer",
"torque_max",
730 "Dimer",
"remove_rotation",
733 ini.GetReal(
"Dimer",
"lor_residual_tol",
737 toLowerCase(ini.Get(
"Dimer",
"rotation_backend",
"classical"));
739 magic_enum::enum_cast<DimerRotationBackend>(
740 rotTok, magic_enum::case_insensitive)
746 ini.GetBoolean(
"Surrogate",
"use_surrogate",
false);
753 "Surrogate",
"gp_uncertainty",
755 if (ini.HasSection(
"Surrogate")) {
757 magic_enum::enum_cast<PotType>(ini.Get(
"Surrogate",
"potential",
""),
758 magic_enum::case_insensitive)
761 throw std::runtime_error(
"We only support catlearn for GP right now");
765 if (ini.HasSection(
"CatLearn")) {
767 ini.Get(
"CatLearn",
"catl_path",
"");
769 ini.Get(
"CatLearn",
"model",
"catl_model");
771 ini.Get(
"CatLearn",
"prior",
"catl_prior");
773 ini.GetBoolean(
"CatLearn",
"use_derivatives",
"catl_deriv");
775 ini.GetBoolean(
"CatLearn",
"use_fingerprint",
"catl_fingerprint");
777 "CatLearn",
"parallel_hyperparameter_opt",
"catl_parallel");
780 if (ini.HasSection(
"ASE_ORCA")) {
782 ini.Get(
"ASE_ORCA",
"orca_path",
"");
784 ini.Get(
"ASE_ORCA",
"nproc",
"1");
786 ini.Get(
"ASE_ORCA",
"simpleinput",
"");
788 static_cast<int>(ini.GetInteger(
"ASE_ORCA",
"charge", 0));
790 static_cast<int>(ini.GetInteger(
"ASE_ORCA",
"multiplicity", 1));
793 if (ini.HasSection(
"ASE_NWCHEM")) {
795 ini.Get(
"ASE_NWCHEM",
"nwchem_path",
"");
797 ini.Get(
"ASE_NWCHEM",
"nproc",
"1");
799 ini.Get(
"ASE_NWCHEM",
"mpi_launcher",
802 ini.Get(
"ASE_NWCHEM",
"multiplicity",
"");
804 ini.GetReal(
"ASE_NWCHEM",
"scf_thresh", 1e-5);
806 ini.GetInteger(
"ASE_NWCHEM",
"scf_maxiter", 200);
808 ini.Get(
"ASE_NWCHEM",
"basis",
811 ini.Get(
"ASE_NWCHEM",
"memory",
815 if (ini.HasSection(
"Metatomic")) {
817 ini.Get(
"Metatomic",
"model_path",
"");
819 ini.Get(
"Metatomic",
"device",
"cpu");
821 ini.Get(
"Metatomic",
"length_unit",
"angstrom");
823 ini.Get(
"Metatomic",
"extensions_directory",
"");
825 ini.GetBoolean(
"Metatomic",
"check_consistency",
false);
827 ini.GetReal(
"Metatomic",
"uncertainty_threshold", -1.0);
829 ini.Get(
"Metatomic",
"energy_output",
832 ini.Get(
"Metatomic",
"energy_uncertainty_output",
834 .energy_uncertainty_output);
836 ini.Get(
"Metatomic",
"force_output",
839 ini.GetBoolean(
"Metatomic",
"non_conservative",
false);
841 ini.GetBoolean(
"Metatomic",
"random_rotation",
false);
844 ini.GetInteger(
"Metatomic",
"n_symmetry_rotations", 0));
846 ini.GetBoolean(
"Metatomic",
"deterministic",
true);
848 ini.GetBoolean(
"Metatomic",
"deterministic_strict",
false);
850 _variant.
base = ini.Get(
"Metatomic",
"variant_base",
"");
851 _variant.energy = ini.Get(
"Metatomic",
"variant_energy",
"");
852 _variant.energy_uncertainty =
853 ini.Get(
"Metatomic",
"variant_energy_uncertainty",
"");
854 _variant.force = ini.Get(
"Metatomic",
"variant_force",
"");
857 if (ini.HasSection(
"Serve")) {
861 static_cast<uint16_t
>(ini.GetInteger(
864 ini.GetInteger(
"Serve",
"replicas",
867 static_cast<uint16_t
>(ini.GetInteger(
868 "Serve",
"gateway_port",
871 ini.Get(
"Serve",
"endpoints",
877 ini.GetBoolean(
"Surrogate",
"gp_linear_path_always",
879 .linear_path_always);
883 ini.GetReal(
"Lanczos",
"tolerance",
886 "Lanczos",
"max_iterations",
889 ini.GetBoolean(
"Lanczos",
"quit_early",
891 if (ini.HasValue(
"Lanczos",
"phva_atoms")) {
893 toLowerCase(ini.Get(
"Lanczos",
"phva_atoms",
"All"));
898 ini.GetReal(
"Davidson",
"tolerance",
902 "Davidson",
"max_iterations",
905 ini.GetBoolean(
"Davidson",
"diagonal_preconditioner",
907 .diagonal_preconditioner);
908 if (ini.HasValue(
"Davidson",
"phva_atoms")) {
910 toLowerCase(ini.Get(
"Davidson",
"phva_atoms",
"All"));
915 ini.GetReal(
"ARTn",
"push_step_size",
918 ini.GetReal(
"ARTn",
"force_threshold",
921 ini.GetInteger(
"ARTn",
"max_iterations",
926 ini.Get(
"ARTn",
"nperp_limitation",
929 "ARTn",
"lanczos_min_size",
938 ini.GetReal(
"IRA",
"distance_threshold",
941 ini.GetReal(
"IRA",
"symmetry_threshold",
948 "GPR Dimer",
"finite_angle",
951 "GPR Dimer",
"converged_angle",
955 "GPR Dimer",
"relaxation_converged_angle",
958 static_cast<long>(ini.GetInteger(
959 "GPR Dimer",
"max_initial_rotation_iterations",
962 static_cast<long>(ini.GetInteger(
963 "GPR Dimer",
"max_relaxation_rotation_iterations",
966 static_cast<long>(ini.GetInteger(
967 "GPR Dimer",
"divisor_t_dimer",
971 "GPR Dimer",
"max_outer_iterations",
975 "GPR Dimer",
"max_inner_iterations",
979 "GPR Dimer",
"max_midpoint_displacement",
982 ini.Get(
"GPR Dimer",
"rotation_opt_method",
985 ini.Get(
"GPR Dimer",
"translation_opt_method",
988 "GPR Dimer",
"active_radius",
991 ini.GetReal(
"GPR Dimer",
"dimer_separation",
994 ini.GetReal(
"GPR Dimer",
"convex_region_step_size",
997 ini.GetReal(
"GPR Dimer",
"max_step_size",
1000 "GPR Dimer",
"ratio_at_limit",
1003 "GPR Dimer",
"nogp_initial_rotations",
1007 "GPR Dimer",
"nogp_init_translations",
1011 "GPR Dimer",
"has_many_iterations",
1015 ini.Get(
"GPR Dimer",
"hyperparameter_opt_method",
1017 .gpr_params.hyper_opt_method);
1020 "GPR Dimer",
"gpr_variance",
1023 ini.GetReal(
"GPR Dimer",
"gpr_jitter_variance",
1025 .gpr_params.jitter_sigma2);
1027 ini.GetReal(
"GPR Dimer",
"gpr_noise_variance",
1029 .gpr_params.noise_sigma2);
1032 "GPR Dimer",
"prior_mean",
1035 ini.GetReal(
"GPR Dimer",
"prior_variance",
1037 .gpr_params.prior_sigma2);
1040 "GPR Dimer",
"prior_degrees_of_freedom",
1044 ini.GetBoolean(
"GPR Dimer",
"check_derivatives",
1046 .opt_params.check_derivatives);
1049 ini.GetInteger(
"GPR Dimer",
"opt_max_iterations",
1051 .opt_params.max_iterations));
1054 "GPR Dimer",
"opt_tol_func",
1058 "GPR Dimer",
"opt_tol_sol",
1061 ini.GetReal(
"GPR Dimer",
"opt_lambda_limit",
1063 .opt_params.lambda_limit);
1065 ini.GetReal(
"GPR Dimer",
"opt_lambda_init",
1067 .opt_params.lambda_init);
1071 ini.GetInteger(
"GPR Dimer",
"report_level",
1073 .debug_params.report_level));
1076 ini.GetInteger(
"GPR Dimer",
"debug_level",
1078 .debug_params.debug_level));
1081 "GPR Dimer",
"debug_output_directory",
1084 ini.Get(
"GPR Dimer",
"debug_position_basename",
1086 .debug_params.pos_file);
1088 ini.Get(
"GPR Dimer",
"debug_energy_basename",
1090 .debug_params.energy_file);
1092 ini.Get(
"GPR Dimer",
"debug_gradient_basename",
1094 .debug_params.grad_file);
1097 ini.GetReal(
"GPR Dimer",
"debug_midpoint_offset",
1099 .debug_params.offset_mid_point);
1101 "GPR Dimer",
"debug_y_step",
1104 "GPR Dimer",
"debug_z_step",
1108 ini.GetBoolean(
"GPR Dimer",
"use_prune",
1110 .prune_params.use_prune);
1112 static_cast<int>(ini.GetInteger(
1113 "GPR Dimer",
"start_prune_at",
1116 static_cast<int>(ini.GetInteger(
1117 "GPR Dimer",
"nprune_vals",
1120 ini.GetReal(
"GPR Dimer",
"prune_threshold",
1122 .prune_params.threshold);
1127 "Prefactor",
"default_value",
1130 ini.GetReal(
"Prefactor",
"max_value",
1133 ini.GetReal(
"Prefactor",
"min_value",
1136 "Prefactor",
"within_radius",
1140 "Prefactor",
"min_displacement",
1143 ini.Get(
"Prefactor",
"rate_estimation",
1146 ini.Get(
"Prefactor",
"configuration",
1150 "Prefactor",
"all_free_atoms",
1153 ini.Get(
"Prefactor",
"filter_scheme",
1156 "Prefactor",
"filter_fraction",
1161 if (ini.HasValue(
"Hessian",
"phva_atoms")) {
1163 toLowerCase(ini.Get(
"Hessian",
"phva_atoms",
"All"));
1164 }
else if (ini.HasValue(
"Hessian",
"atom_list")) {
1166 toLowerCase(ini.Get(
"Hessian",
"atom_list",
"All"));
1169 "Hessian",
"zero_freq_value",
1172 ini.Get(
"Hessian",
"fd_scheme",
1175 ini.GetBoolean(
"Hessian",
"resume",
1178 ini.Get(
"Hessian",
"checkpoint_path",
1181 ini.GetBoolean(
"Hessian",
"write_modes",
1185 const std::string neb_section =
"Nudged Elastic Band";
1188 ini.GetInteger(neb_section,
"images",
1192 neb_section,
"solid_state",
1195 ini.GetReal(neb_section,
"solid_state_weight",
1198 neb_section,
"solid_state_pressure",
1201 neb_section,
"max_iterations",
1204 neb_section,
"converged_force",
1206 auto neb_optMethod =
1207 magic_enum::enum_cast<OptType>(ini.Get(neb_section,
"opt_method",
"none"),
1208 magic_enum::case_insensitive)
1214 neb_section,
"setup_mmf_peaks",
1217 neb_section,
"mmf_peak_tolerance",
1220 ini.GetBoolean(neb_section,
"match_endpoints",
1223 ini.Get(neb_section,
"match_method",
1227 ini.GetReal(neb_section,
"spring",
1231 neb_section,
"elastic_band",
1235 neb_section,
"doubly_nudged",
1239 neb_section,
"doubly_nudged_switching",
1244 neb_section,
"energy_weighted",
1248 neb_section,
"ew_trigger",
1252 neb_section,
"ew_ksp_min",
1256 neb_section,
"ew_ksp_max",
1260 neb_section,
"onsager_machlup",
1264 neb_section,
"om_optimize_k",
1267 ini.GetReal(neb_section,
"om_k_scale",
1270 ini.GetReal(neb_section,
"om_k_min",
1273 ini.GetReal(neb_section,
"om_k_max",
1278 neb_section,
"climbing_image_method",
1281 ini.GetBoolean(neb_section,
"climbing_image_converged_only",
1283 .climbing_image.converged_only);
1286 neb_section,
"climbing_image_band_slack",
1289 ini.GetBoolean(neb_section,
"old_tangent",
1291 .climbing_image.use_old_tangent);
1293 ini.GetReal(neb_section,
"ci_after",
1295 .climbing_image.trigger_force);
1297 ini.GetReal(neb_section,
"ci_after_rel",
1299 .climbing_image.trigger_factor);
1302 oci.
use_mmf = ini.GetBoolean(neb_section,
"ci_mmf", oci.use_mmf);
1304 ini.GetReal(neb_section,
"ci_mmf_after", oci.trigger_force);
1305 oci.trigger_factor =
1306 ini.GetReal(neb_section,
"ci_mmf_after_rel", oci.trigger_factor);
1307 oci.max_steps = ini.GetInteger(neb_section,
"ci_mmf_nsteps", oci.max_steps);
1308 oci.ci_stability_count = ini.GetInteger(
1309 neb_section,
"ci_mmf_ci_stability_count", oci.ci_stability_count);
1310 oci.angle_tol = ini.GetReal(neb_section,
"ci_mmf_angle", oci.angle_tol);
1311 oci.restore_unhelpful = ini.GetBoolean(
1312 neb_section,
"ci_mmf_restore_unhelpful", oci.restore_unhelpful);
1315 zoom.
enabled = ini.GetBoolean(neb_section,
"zoom_neb", zoom.enabled);
1316 zoom.alpha = ini.GetReal(neb_section,
"zoom_alpha", zoom.alpha);
1317 zoom.offset = ini.GetInteger(neb_section,
"zoom_offset", zoom.offset);
1318 zoom.mode = magic_enum::enum_cast<neb_options_t::zoom_options_t::Mode>(
1319 ini.Get(neb_section,
"zoom_mode",
1320 std::string(magic_enum::enum_name(zoom.mode))),
1321 magic_enum::case_insensitive)
1322 .value_or(zoom.mode);
1323 zoom.activation_threshold =
1324 ini.GetReal(neb_section,
"zoom_after", zoom.activation_threshold);
1325 zoom.interpolation =
1326 magic_enum::enum_cast<neb_options_t::zoom_options_t::Interpolation>(
1327 ini.Get(neb_section,
"zoom_interpolation",
1328 std::string(magic_enum::enum_name(zoom.interpolation))),
1329 magic_enum::case_insensitive)
1330 .value_or(zoom.interpolation);
1331 zoom.stability_count =
1332 ini.GetInteger(neb_section,
"zoom_ci_stability", zoom.stability_count);
1333 zoom.max_iterations =
1334 ini.GetInteger(neb_section,
"zoom_max_iterations", zoom.max_iterations);
1338 magic_enum::enum_cast<NEBInit>(ini.Get(neb_section,
"initializer",
""),
1339 magic_enum::case_insensitive)
1341 init.input_path = ini.Get(neb_section,
"initial_path_in", init.input_path);
1342 init.max_iterations =
1343 ini.GetInteger(neb_section,
"init_max_iterations", init.max_iterations);
1344 init.nsteps = ini.GetInteger(neb_section,
"init_nsteps", init.nsteps);
1345 init.max_move = ini.GetReal(neb_section,
"init_max_move", init.max_move);
1346 init.force_tolerance =
1347 ini.GetReal(neb_section,
"init_force_threshold", init.force_tolerance);
1349 ini.GetReal(neb_section,
"sidpp_growth_alpha", init.sidpp_alpha);
1350 init.sidpp_frontier_tol =
1351 ini.GetReal(neb_section,
"sidpp_frontier_tol", init.sidpp_frontier_tol);
1352 init.sidpp_reparam =
1353 ini.GetBoolean(neb_section,
"sidpp_reparameterize", init.sidpp_reparam);
1354 init.sidpp_ideal_ksp =
1355 ini.GetBoolean(neb_section,
"sidpp_ideal_ksp", init.sidpp_ideal_ksp);
1356 auto neb_ipath_optMethod =
1357 magic_enum::enum_cast<OptType>(
1358 ini.Get(neb_section,
"ipath_opt_method",
"none"),
1359 magic_enum::case_insensitive)
1363 neb_ipath_optMethod;
1366 ini.GetBoolean(neb_section,
"oversampling", init.oversampling);
1367 init.oversampling_factor = ini.GetInteger(neb_section,
"oversampling_factor",
1368 init.oversampling_factor);
1371 neb_section,
"minimize_endpoints",
1375 neb_section,
"minimize_endpoints_for_ipath",
1381 "Dynamics",
"time_step",
1387 ini.GetReal(
"Dynamics",
"time",
1394 static_cast<long>(std::floor(
1402 toLowerCase(ini.Get(
"Dynamics",
"thermostat",
"andersen"));
1404 "Dynamics",
"andersen_alpha",
1408 "Dynamics",
"andersen_collision_period",
1414 ini.GetReal(
"Dynamics",
"nose_mass",
1417 ini.GetReal(
"Dynamics",
"langevin_friction",
1419 .langevin_friction_input);
1425 th.path_beads = ini.GetInteger(
"Dynamics",
"path_beads", th.path_beads);
1427 toLowerCase(ini.Get(
"Dynamics",
"path_springs", th.path_springs));
1428 th.path_eco_omega_max =
1429 ini.GetReal(
"Dynamics",
"path_eco_omega_max", th.path_eco_omega_max);
1430 th.path_gle_file = ini.Get(
"Dynamics",
"path_gle_file", th.path_gle_file);
1431 th.path_pile_tau_input =
1432 ini.GetReal(
"Dynamics",
"path_pile_tau", th.path_pile_tau_input);
1434 th.path_pile_tau = timeUnit > 0.0 ? th.path_pile_tau_input / timeUnit : 0.0;
1435 th.path_pile_scale =
1436 ini.GetReal(
"Dynamics",
"path_pile_scale", th.path_pile_scale);
1437 const long seed = ini.GetInteger(
"Dynamics",
"path_seed",
1438 static_cast<long>(th.path_seed));
1440 throw std::invalid_argument(
"[Dynamics] path_seed must be non-negative");
1442 th.path_seed =
static_cast<std::uint64_t
>(seed);
1443 if (th.path_springs !=
"trotter" && th.path_springs !=
"eco") {
1444 throw std::invalid_argument(
1445 "[Dynamics] path_springs must be trotter or eco, not " +
1454 "Parallel Replica",
"stop_after_transition",
1457 ini.GetBoolean(
"Parallel Replica",
"refine_transition",
1459 .refine_transition);
1461 ini.GetBoolean(
"Parallel Replica",
"dephase_loop_stop",
1463 .dephase_loop_stop);
1465 ini.GetReal(
"Parallel Replica",
"dephase_time",
1467 .dephase_time_input);
1473 ini.GetInteger(
"Parallel Replica",
"dephase_loop_max",
1478 ini.GetReal(
"Parallel Replica",
"state_check_interval",
1480 .state_check_interval_input);
1486 ini.GetReal(
"Parallel Replica",
"state_save_interval",
1488 .state_check_interval_input);
1494 ini.GetReal(
"Parallel Replica",
"post_transition_time",
1504 ini.GetReal(
"TAD",
"low_temperature",
1507 ini.GetReal(
"TAD",
"min_prefactor",
1510 ini.GetReal(
"TAD",
"confidence",
1517 toLowerCase(ini.Get(
"Replica Exchange",
"temperature_distribution",
1519 .temperature_distribution));
1522 "Replica Exchange",
"replicas",
1525 ini.GetInteger(
"Replica Exchange",
"exchange_trials",
1529 ini.GetReal(
"Replica Exchange",
"sampling_time",
1531 .sampling_time_input);
1537 ini.GetReal(
"Replica Exchange",
"temperature_low",
1540 ini.GetReal(
"Replica Exchange",
"temperature_high",
1544 ini.GetReal(
"Replica Exchange",
"exchange_period",
1546 .exchange_period_input);
1556 "Hyperdynamics",
"bb_rmd_time",
1562 toLowerCase(ini.Get(
1563 "Hyperdynamics",
"bb_boost_atomlist",
1566 ini.GetReal(
"Hyperdynamics",
"bb_dvmax",
1569 ini.GetReal(
"Hyperdynamics",
"bb_stretch_threshold",
1572 ini.GetReal(
"Hyperdynamics",
"bb_ds_curvature",
1575 ini.GetReal(
"Hyperdynamics",
"bb_rcut",
1578 toLowerCase(ini.Get(
1579 "Hyperdynamics",
"bias_potential",
1585 ini.Get(
"Saddle Search",
"method",
1588 toLowerCase(ini.Get(
1589 "Saddle Search",
"min_mode_method",
1592 ini.GetReal(
"Saddle Search",
"displace_magnitude",
1594 .displace_magnitude);
1597 "Saddle Search",
"displace_radius",
1600 "Saddle Search",
"max_energy",
1604 "Saddle Search",
"max_iterations",
1608 ini.GetBoolean(
"Saddle Search",
"nonnegative_displacement_abort",
1610 .nonnegative_displacement_abort);
1612 ini.GetReal(
"Saddle Search",
"max_single_displace",
1614 .max_single_displace);
1617 "Saddle Search",
"converged_force",
1621 "Saddle Search",
"perp_force_ratio",
1624 toLowerCase(ini.Get(
"Saddle Search",
"client_displace_type",
1627 ini.GetInteger(
"Saddle Search",
"nonlocal_count_abort",
1629 .nonlocal_count_abort);
1631 ini.GetReal(
"Saddle Search",
"nonlocal_distance_abort",
1633 .nonlocal_distance_abort);
1649 std::string atomListStr =
1650 ini.Get(
"Saddle Search",
"displace_atom_list",
"");
1651 if (!atomListStr.empty()) {
1652 std::stringstream ss(atomListStr);
1654 while (std::getline(ss, token,
',')) {
1655 size_t start = token.find_first_not_of(
" \t");
1656 size_t end = token.find_last_not_of(
" \t");
1657 if (start != std::string::npos) {
1660 std::stol(token.substr(start, end - start + 1)));
1666 ini.GetBoolean(
"Saddle Search",
"confine_positive",
1668 .confine_positive.enabled);
1670 .confine_positive.enabled) {
1673 ini.GetBoolean(
"Saddle Search",
"bowl_breakout",
1675 .confine_positive.bowl_breakout);
1678 ini.GetInteger(
"Saddle Search",
"bowl_active_atoms",
1680 .confine_positive.bowl_active);
1683 ini.GetReal(
"Saddle Search",
"confine_positive_min_move",
1685 .confine_positive.min_force);
1688 ini.GetReal(
"Saddle Search",
"confine_positive_scale_ratio",
1690 .confine_positive.scale_ratio);
1692 ini.GetReal(
"Saddle Search",
"confine_positive_boost",
1694 .confine_positive.boost);
1697 ini.GetInteger(
"Saddle Search",
"confine_positive_min_active",
1699 .confine_positive.min_active);
1704 ini.GetReal(
"Saddle Search",
"dynamics_temperature",
1706 .dynamics.temperature);
1709 ini.GetReal(
"Saddle Search",
"dynamics_state_check_interval",
1711 .dynamics.state_check_interval_input);
1719 ini.GetReal(
"Saddle Search",
"dynamics_record_interval",
1721 .dynamics.record_interval_input);
1728 ini.GetBoolean(
"Saddle Search",
"dynamics_linear_interpolation",
1730 .dynamics.linear_interpolation);
1733 "Saddle Search",
"remove_rotation",
1737 ini.GetReal(
"Saddle Search",
"dynamics_max_init_curvature",
1739 .dynamics.max_init_curvature);
1742 ini.GetReal(
"Saddle Search",
"zero_mode_abort_curvature",
1744 .zero_mode_abort_curvature);
1750 "Basin Hopping",
"displacement",
1753 ini.GetReal(
"Basin Hopping",
"push_apart_distance",
1755 .push_apart_distance);
1758 ini.GetReal(
"Basin Hopping",
"initial_random_structure_probability",
1760 .initial_random_structure_probability);
1762 ini.GetInteger(
"Basin Hopping",
"steps",
1766 "Basin Hopping",
"quenching_steps",
1769 ini.GetBoolean(
"Basin Hopping",
"single_atom_displace",
1771 .single_atom_displace);
1773 ini.GetBoolean(
"Basin Hopping",
"significant_structure",
1775 .significant_structure);
1777 toLowerCase(ini.Get(
"Basin Hopping",
"displacement_algorithm",
1779 .displacement_algorithm));
1785 .displacement_algorithm);
1790 toLowerCase(ini.Get(
"Basin Hopping",
"displacement_distribution",
1792 .displacement_distribution));
1797 .displacement_distribution);
1802 "Basin Hopping",
"swap_probability",
1805 "Basin Hopping",
"jump_max",
1809 "Basin Hopping",
"jump_steps",
1812 ini.GetBoolean(
"Basin Hopping",
"adjust_displacement",
1814 .adjust_displacement);
1817 "Basin Hopping",
"adjust_period",
1821 "Basin Hopping",
"adjust_fraction",
1825 "Basin Hopping",
"target_ratio",
1829 "Basin Hopping",
"write_unique",
1832 "Basin Hopping",
"stop_energy",
1839 "Global Optimization",
"move_method",
1843 ini.Get(
"Global Optimization",
"decision_method",
1855 "Global Optimization",
"steps",
1858 "Global Optimization",
"beta",
1861 "Global Optimization",
"alpha",
1865 "Global Optimization",
"mdmin",
1868 ini.GetReal(
"Global Optimization",
"target_energy",
1879 ini.GetReal(
"BGSD",
"gradientfinitedifference",
1881 .gradient_finite_difference);
1884 "BGSD",
"grad2energyconvergence",
1888 "BGSD",
"grad2forceconvergence",
1894 ini.GetReal(
"Monte Carlo",
"step_size",
1897 ini.GetInteger(
"Monte Carlo",
"steps",
1903 o.mode = ini.Get(
"Instanton",
"mode", o.mode);
1904 o.reactant_filename =
1905 ini.Get(
"Instanton",
"reactant_filename", o.reactant_filename);
1906 o.product_filename =
1907 ini.Get(
"Instanton",
"product_filename", o.product_filename);
1908 o.initial_path = ini.Get(
"Instanton",
"initial_path", o.initial_path);
1909 o.beads = ini.GetInteger(
"Instanton",
"beads", o.beads);
1911 ini.GetReal(
"Instanton",
"beta_hbar_omega", o.beta_hbar_omega);
1913 ini.GetInteger(
"Instanton",
"max_iterations", o.max_iterations);
1915 ini.GetReal(
"Instanton",
"force_tolerance", o.force_tolerance);
1917 ini.GetInteger(
"Instanton",
"hessian_stride", o.hessian_stride);
1919 ini.Get(
"Instanton",
"saddle_filename", o.saddle_filename);
1920 o.temperature = ini.GetReal(
"Instanton",
"temperature", o.temperature);
1921 o.temperatures.clear();
1923 const std::string list = ini.Get(
"Instanton",
"temperatures",
"");
1924 std::stringstream ss(list);
1926 while (std::getline(ss, token,
',')) {
1927 const size_t start = token.find_first_not_of(
" \t");
1928 const size_t end = token.find_last_not_of(
" \t");
1929 if (start == std::string::npos) {
1933 o.temperatures.push_back(
1934 std::stod(token.substr(start, end - start + 1)));
1935 }
catch (
const std::exception &) {
1936 throw std::invalid_argument(
1937 "[Instanton] temperatures must be comma-separated kelvin "
1943 o.half_ring = ini.GetBoolean(
"Instanton",
"half_ring", o.half_ring);
1944 o.initial_hessians =
1945 ini.Get(
"Instanton",
"initial_hessians", o.initial_hessians);
1946 if (o.initial_hessians !=
"saddle" &&
1947 o.initial_hessians !=
"finite_difference") {
1948 throw std::invalid_argument(
"[Instanton] initial_hessians must be saddle "
1949 "or finite_difference, not " +
1950 o.initial_hessians);
1952 o.energy_shift = ini.GetReal(
"Instanton",
"energy_shift", o.energy_shift);
1953 o.bead_ladder = ini.GetBoolean(
"Instanton",
"bead_ladder", o.bead_ladder);
1954 o.hessian_final = ini.Get(
"Instanton",
"hessian_final", o.hessian_final);
1955 o.springs = toLowerCase(ini.Get(
"Instanton",
"springs", o.springs));
1956 if (o.springs !=
"trotter" && o.springs !=
"eco") {
1957 throw std::invalid_argument(
1958 "[Instanton] springs must be trotter or eco, not " + o.springs);
1960 if (o.mode !=
"splitting" && o.mode !=
"rate") {
1961 throw std::invalid_argument(
"[Instanton] mode must be splitting or rate, "
1965 o.pi_planes = ini.GetInteger(
"Instanton",
"pi_planes", o.pi_planes);
1966 o.pi_beads = ini.GetInteger(
"Instanton",
"pi_beads", o.pi_beads);
1967 o.pi_equilibration_steps = ini.GetInteger(
1968 "Instanton",
"pi_equilibration_steps", o.pi_equilibration_steps);
1969 o.pi_sampling_steps =
1970 ini.GetInteger(
"Instanton",
"pi_sampling_steps", o.pi_sampling_steps);
1971 o.pi_time_step = ini.GetReal(
"Instanton",
"pi_time_step", o.pi_time_step);
1973 toLowerCase(ini.Get(
"Instanton",
"pi_thermostat", o.pi_thermostat));
1974 o.pi_gle_file = ini.Get(
"Instanton",
"pi_gle_file", o.pi_gle_file);
1975 o.pi_pile_tau = ini.GetReal(
"Instanton",
"pi_pile_tau", o.pi_pile_tau);
1977 ini.GetReal(
"Instanton",
"pi_pile_scale", o.pi_pile_scale);
1978 o.pi_seed = ini.GetInteger(
"Instanton",
"pi_seed", o.pi_seed);
1980 toLowerCase(ini.Get(
"Instanton",
"pi_direction", o.pi_direction));
1981 o.pi_reactant_extent =
1982 ini.GetReal(
"Instanton",
"pi_reactant_extent", o.pi_reactant_extent);
1983 o.pi_recrossing_parents = ini.GetInteger(
1984 "Instanton",
"pi_recrossing_parents", o.pi_recrossing_parents);
1985 o.pi_recrossing_children = ini.GetInteger(
1986 "Instanton",
"pi_recrossing_children", o.pi_recrossing_children);
1987 o.pi_recrossing_time =
1988 ini.GetReal(
"Instanton",
"pi_recrossing_time", o.pi_recrossing_time);
1989 o.pi_recrossing_spacing = ini.GetInteger(
1990 "Instanton",
"pi_recrossing_spacing", o.pi_recrossing_spacing);
1997 ini.Get(
"OH_TST",
"reactant_filename",
2000 ini.Get(
"OH_TST",
"product_filename",
2003 ini.GetReal(
"OH_TST",
"time_step",
2006 ini.GetInteger(
"OH_TST",
"equil_steps",
2009 ini.GetInteger(
"OH_TST",
"sample_steps",
2012 ini.GetInteger(
"OH_TST",
"max_planes",
2015 ini.GetReal(
"OH_TST",
"plane_mass",
2018 ini.GetReal(
"OH_TST",
"alpha_rot",
2021 ini.GetReal(
"OH_TST",
"plane_time_step",
2026 ini.GetReal(
"OH_TST",
"dtheta_max",
2029 ini.GetReal(
"OH_TST",
"force_tol",
2035 "OH_TST",
"reactant_md_steps",
2038 ini.Get(
"OH_TST",
"symmetry_products",
2041 ini.GetReal(
"OH_TST",
"max_delta_a",
2044 ini.Get(
"OH_TST",
"thermostat",
2047 ini.Get(
"OH_TST",
"gle_a_file",
2050 ini.GetBoolean(
"OH_TST",
"pmf_scan",
2053 ini.GetInteger(
"OH_TST",
"scan_planes",