Loading...
Searching...
No Matches
ParametersINI.cpp
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#include "eon/ParametersINI.h"
13#include "eon/BaseStructures.h"
14#include "eon/ConFileIO.h"
15#include "eon/EpiCenters.h"
16#include "eon/HelperFunctions.h"
17#include "eon/Parameters.h"
18#include "magic_enum/magic_enum.hpp"
19
20#include <INIReader.h>
21
22#include <cerrno>
23#include <cmath>
24#include <ctime>
25#include <sstream>
26#include <stdexcept>
27#include <string>
28
29#include "eon/EonLogger.h"
30
31namespace {
32std::string toLowerCase(std::string s) {
33 for (std::string::size_type i = 0; i < s.length(); ++i) {
34 s[i] = tolower(s[i]);
35 }
36 return s;
37}
38} // namespace
39
40namespace eonc::config {
41
42int load_ini(INIReader &ini, Parameters &params) {
43 int error = 0;
44
45 // [Main] //
46
47 params.main_options.job =
48 magic_enum::enum_cast<JobType>(ini.Get("Main", "job", ""),
49 magic_enum::case_insensitive)
50 .value_or(JobType::Unknown);
52 ini.GetReal("Main", "temperature", params.main_options.temperature);
54 ini.GetInteger("Main", "random_seed", params.main_options.randomSeed);
56 ini.GetBoolean("Main", "checkpoint", params.main_options.checkpoint);
57 params.main_options.quiet =
58 ini.GetBoolean("Main", "quiet", params.main_options.quiet);
59 params.main_options.writeLog =
60 ini.GetBoolean("Main", "write_log", params.main_options.writeLog);
61 params.main_options.writeConForces = ini.GetBoolean(
62 "Main", "write_con_forces", params.main_options.writeConForces);
63 // Process-wide io mode; same pattern as the RNG seeding below.
65 params.main_options.finiteDifference = ini.GetReal(
66 "Main", "finite_difference", params.main_options.finiteDifference);
67 // Initialize random generator
68 if (params.main_options.randomSeed < 0) {
69 unsigned i = static_cast<unsigned>(std::time(nullptr));
70 params.main_options.randomSeed = i;
72 } else {
74 }
75 params.main_options.maxForceCalls = ini.GetInteger(
76 "Main", "max_force_calls", params.main_options.maxForceCalls);
77 params.main_options.removeNetForce = ini.GetBoolean(
78 "Main", "remove_net_force", params.main_options.removeNetForce);
79 params.main_options.parallel =
80 ini.GetBoolean("Main", "parallel", params.main_options.parallel);
81
82 // [Potential] //
83
85 magic_enum::enum_cast<PotType>(ini.Get("Potential", "potential", ""),
86 magic_enum::case_insensitive)
87 .value_or(PotType::UNKNOWN);
88 params.potential_options.MPIPollPeriod = ini.GetReal(
89 "Potential", "mpi_poll_period", params.potential_options.MPIPollPeriod);
90 params.potential_options.LAMMPSLogging = ini.GetBoolean(
91 "Potential", "lammps_logging", params.potential_options.LAMMPSLogging);
92 params.potential_options.LAMMPSThreads = static_cast<int>(ini.GetInteger(
93 "Potential", "lammps_threads", params.potential_options.LAMMPSThreads));
94 params.potential_options.EMTRasmussen = ini.GetBoolean(
95 "Potential", "emt_rasmussen", params.potential_options.EMTRasmussen);
97 ini.Get("Potential", "ext_pot_path", params.potential_options.extPotPath);
98 params.potential_options.potentialsPath = ini.Get(
99 "Potential", "potentials_path", params.potential_options.potentialsPath);
100
103 params.potential_options.LogPotential = true;
104 } else {
105 params.potential_options.LogPotential = false;
106 }
107 params.potential_options.LogPotential = ini.GetBoolean(
108 "Potential", "log_potential", params.potential_options.LogPotential);
109
110 // [AMS]
112 params.ams_options.engine =
113 ini.Get("AMS", "engine", params.ams_options.engine);
114 params.ams_options.forcefield =
115 ini.Get("AMS", "forcefield", params.ams_options.forcefield);
116 params.ams_options.resources =
117 ini.Get("AMS", "resources", params.ams_options.resources);
118 params.ams_options.model =
119 ini.Get("AMS", "model", params.ams_options.model);
120 params.ams_options.xc = ini.Get("AMS", "xc", params.ams_options.xc);
121 params.ams_options.basis =
122 ini.Get("AMS", "basis", params.ams_options.basis);
123 }
124 // [AMS_IO]
126 params.ams_options.engine =
127 ini.Get("AMS_IO", "engine", params.ams_options.engine);
128 params.ams_options.forcefield =
129 ini.Get("AMS_IO", "forcefield", params.ams_options.forcefield);
130 params.ams_options.model =
131 ini.Get("AMS_IO", "model", params.ams_options.model);
132 params.ams_options.xc = ini.Get("AMS_IO", "xc", params.ams_options.xc);
133 }
134 // [AMS_ENV]
137 params.ams_options.env.amshome =
138 ini.Get("AMS_ENV", "amshome", params.ams_options.env.amshome);
139 params.ams_options.env.scm_tmpdir =
140 ini.Get("AMS_ENV", "scm_tmpdir", params.ams_options.env.scm_tmpdir);
141 params.ams_options.env.scmlicense =
142 ini.Get("AMS_ENV", "scmlicense", params.ams_options.env.scmlicense);
143 params.ams_options.env.scm_pythondir = ini.Get(
144 "AMS_ENV", "scm_pythondir", params.ams_options.env.scm_pythondir);
145 params.ams_options.env.amsbin =
146 ini.Get("AMS_ENV", "amsbin", params.ams_options.env.amsbin);
148 ini.Get("AMS_ENV", "amsresources", params.ams_options.env.amsresources);
149 }
150 // [XTBPot]
152 params.xtb_options.paramset =
153 ini.Get("XTBPot", "paramset", params.xtb_options.paramset);
154 params.xtb_options.acc =
155 ini.GetReal("XTBPot", "accuracy", params.xtb_options.acc);
157 ini.GetReal("XTBPot", "electronic_temperature",
159 params.xtb_options.maxiter =
160 ini.GetInteger("XTBPot", "max_iterations", params.xtb_options.maxiter);
161 params.xtb_options.uhf =
162 ini.GetInteger("XTBPot", "uhf", params.xtb_options.uhf);
163 params.xtb_options.charge =
164 ini.GetReal("XTBPot", "charge", params.xtb_options.charge);
165 }
166 // [ZBLPot]
168 params.zbl_options.cut_inner =
169 ini.GetReal("ZBLPot", "cut_inner", params.zbl_options.cut_inner);
170 params.zbl_options.cut_global =
171 ini.GetReal("ZBLPot", "cut_global", params.zbl_options.cut_global);
172 if (params.zbl_options.cut_inner > params.zbl_options.cut_global) {
173 throw std::runtime_error(
174 "Switching function must begin before the global cutoff!");
175 }
176 }
177 // [SocketNWChemPot]
180 ini.Get("SocketNWChemPot", "host", params.socket_nwchem_options.host);
181 params.socket_nwchem_options.port = ini.GetInteger(
182 "SocketNWChemPot", "port", params.socket_nwchem_options.port);
183 params.socket_nwchem_options.mem_in_gb = ini.GetInteger(
184 "SocketNWChemPot", "mem_in_gb", params.socket_nwchem_options.mem_in_gb);
186 ini.Get("SocketNWChemPot", "nwchem_settings",
189 ini.Get("SocketNWChemPot", "unix_socket_path",
192 ini.GetBoolean("SocketNWChemPot", "unix_socket_mode",
195 ini.GetBoolean("SocketNWChemPot", "make_template_input",
197 }
198
199 // [RgpotPot] — in-process NWChemPot/CPMDPot (also accept legacy [RGPot] keys)
201 const char *sec = "RgpotPot";
202 // Prefer [RgpotPot]; fall back to [RGPot] field names used by direct-link
203 // design
204 params.rgpot_options.backend =
205 ini.Get(sec, "backend", params.rgpot_options.backend);
206 params.rgpot_options.basis = ini.Get(
207 sec, "basis", ini.Get(sec, "nwchem_basis", params.rgpot_options.basis));
208 params.rgpot_options.theory =
209 ini.Get(sec, "theory",
210 ini.Get(sec, "nwchem_theory", params.rgpot_options.theory));
211 params.rgpot_options.scf_type =
212 ini.Get(sec, "scf_type",
213 ini.Get(sec, "nwchem_scf_type", params.rgpot_options.scf_type));
214 params.rgpot_options.functional = ini.Get(
215 sec, "functional",
216 ini.Get(sec, "cpmd_functional", params.rgpot_options.functional));
217 params.rgpot_options.cutoff_ry = ini.GetReal(
218 sec, "cutoff_ry",
219 ini.GetReal(sec, "cpmd_cut_off_ry", params.rgpot_options.cutoff_ry));
220 params.rgpot_options.charge = ini.GetInteger(
221 sec, "charge",
222 ini.GetInteger(sec, "nwchem_charge", params.rgpot_options.charge));
224 ini.GetInteger(sec, "multiplicity",
225 ini.GetInteger(sec, "nwchem_multiplicity",
228 ini.Get(sec, "engine_path", params.rgpot_options.engine_path);
230 ini.Get(sec, "engine_library", params.rgpot_options.engine_library);
232 ini.Get(sec, "engine_root", params.rgpot_options.engine_root);
233 params.rgpot_options.title =
234 ini.Get(sec, "title", params.rgpot_options.title);
235 params.rgpot_options.memory_mb =
236 ini.GetInteger(sec, "memory_mb", params.rgpot_options.memory_mb);
238 ini.Get(sec, "scratch_dir", params.rgpot_options.scratch_dir);
240 ini.Get(sec, "input_block", params.rgpot_options.input_block);
242 ini.Get(sec, "model_path", params.rgpot_options.model_path);
243 params.rgpot_options.device =
244 ini.Get(sec, "device", params.rgpot_options.device);
246 ini.Get(sec, "length_unit", params.rgpot_options.length_unit);
247 params.rgpot_options.extensions_directory = ini.Get(
248 sec, "extensions_directory", params.rgpot_options.extensions_directory);
249 params.rgpot_options.check_consistency = ini.GetBoolean(
250 sec, "check_consistency", params.rgpot_options.check_consistency);
252 ini.GetReal(sec, "uncertainty_threshold",
255 ini.GetBoolean(sec, "torch_determinism_strict",
257 // XTB dlopen knobs (also accept [XTBPot] when backend=xtb)
258 params.rgpot_options.xtb_paramset = ini.Get(
259 sec, "paramset",
260 ini.Get(sec, "xtb_paramset", params.rgpot_options.xtb_paramset));
261 params.rgpot_options.xtb_accuracy = ini.GetReal(
262 sec, "accuracy",
263 ini.GetReal(sec, "xtb_accuracy", params.rgpot_options.xtb_accuracy));
264 params.rgpot_options.xtb_electronic_temperature = ini.GetReal(
265 sec, "electronic_temperature",
266 ini.GetReal(sec, "xtb_electronic_temperature",
268 params.rgpot_options.xtb_max_iterations = static_cast<int>(ini.GetInteger(
269 sec, "max_iterations",
270 ini.GetInteger(sec, "xtb_max_iterations",
272 params.rgpot_options.xtb_charge = ini.GetReal(
273 sec, "xtb_charge", static_cast<double>(params.rgpot_options.charge));
274 params.rgpot_options.xtb_uhf = static_cast<int>(ini.GetInteger(
275 sec, "uhf",
276 ini.GetInteger(sec, "xtb_uhf", params.rgpot_options.xtb_uhf)));
277 const std::string be = toLowerCase(params.rgpot_options.backend);
278 if (be == "xtb" || be == "xtbpot" || be == "gfn" || be == "gfnxtb") {
280 ini.Get("XTBPot", "paramset", params.rgpot_options.xtb_paramset);
282 ini.GetReal("XTBPot", "accuracy", params.rgpot_options.xtb_accuracy);
284 ini.GetReal("XTBPot", "electronic_temperature",
286 params.rgpot_options.xtb_max_iterations = static_cast<int>(ini.GetInteger(
287 "XTBPot", "max_iterations", params.rgpot_options.xtb_max_iterations));
288 params.rgpot_options.xtb_uhf = static_cast<int>(
289 ini.GetInteger("XTBPot", "uhf", params.rgpot_options.xtb_uhf));
291 ini.GetReal("XTBPot", "charge", params.rgpot_options.xtb_charge);
292 }
293 }
294
295 // [Debug] //
296
297 params.debug_options.write_movies = ini.GetBoolean(
298 "Debug", "write_movies", params.debug_options.write_movies);
300 ini.GetInteger("Debug", "write_movies_interval",
303 ini.GetBoolean("Debug", "write_deprecated_outs",
306 ini.GetBoolean("Debug", "estimate_neb_eigenvalues",
308 params.debug_options.neb_mmf = toLowerCase(
309 ini.Get("Debug", "neb_mmf_estimator", params.debug_options.neb_mmf));
310
311 // [Structure Comparison] //
312
314 ini.GetReal("Structure Comparison", "distance_difference",
317 ini.GetReal("Structure Comparison", "neighbor_cutoff",
320 ini.GetBoolean("Structure Comparison", "check_rotation",
323 ini.GetReal("Structure Comparison", "energy_difference",
326 "Structure Comparison", "indistinguishable_atoms",
329 ini.GetBoolean("Structure Comparison", "remove_translation",
331
332 // [Process Search] //
333
335 ini.GetBoolean("Process Search", "minimize_first",
338 ini.GetReal("Process Search", "minimization_offset",
340
341 // [Optimizers] //
342 auto inp_optMethod =
343 magic_enum::enum_cast<OptType>(ini.Get("Optimizer", "opt_method", "none"),
344 magic_enum::case_insensitive)
345 .value_or(OptType::Unknown);
346 if (inp_optMethod != OptType::None) {
347 params.optimizer_options.method = inp_optMethod;
348 }
349
351 toLowerCase(ini.Get("Optimizer", "convergence_metric",
356 } else {
357 EONC_LOG_ERROR("unknown convergence_metric {}",
359 error = 1;
360 }
361
362 if (ini.HasSection("Refine")) {
364 magic_enum::enum_cast<OptType>(ini.Get("Refine", "opt_method", ""),
365 magic_enum::case_insensitive)
366 .value_or(OptType::None);
367 params.optimizer_options.refine.threshold = ini.GetReal(
368 "Refine", "threshold", params.optimizer_options.refine.threshold);
369 }
370
371 params.optimizer_options.converged_force = ini.GetReal(
372 "Optimizer", "converged_force", params.optimizer_options.converged_force);
373 params.optimizer_options.max_iterations = static_cast<size_t>(ini.GetInteger(
374 "Optimizer", "max_iterations", params.optimizer_options.max_iterations));
376 ini.GetReal("Optimizer", "max_move", params.optimizer_options.max_move);
377 // Handle each optimizer separately
378 if (ini.HasSection("QuickMin")) {
379 params.optimizer_options.time_step_input = ini.GetReal(
380 "QuickMin", "time_step", params.optimizer_options.time_step_input);
384 ini.GetBoolean("Optimizer", "qm_steepest_descent",
386 }
387 if (ini.HasSection("FIRE")) {
388 EONC_LOG_WARNING("Overwriting QuickMin timestep with Fire timestep!!");
389 params.optimizer_options.time_step_input = ini.GetReal(
390 "FIRE", "time_step", params.optimizer_options.time_step_input);
393 params.optimizer_options.max_time_step_input = ini.GetReal(
394 "FIRE", "time_step_max", params.optimizer_options.max_time_step_input);
397 params.constants.timeUnit;
398 }
399 if (ini.HasSection("LBFGS")) {
400 params.optimizer_options.lbfgs.memory = ini.GetInteger(
401 "LBFGS", "lbfgs_memory", params.optimizer_options.lbfgs.memory);
403 ini.GetReal("LBFGS", "lbfgs_inverse_curvature",
406 ini.GetReal("LBFGS", "lbfgs_max_inverse_curvature",
408 params.optimizer_options.lbfgs.auto_scale = ini.GetBoolean(
409 "LBFGS", "lbfgs_auto_scale", params.optimizer_options.lbfgs.auto_scale);
411 ini.GetBoolean("LBFGS", "lbfgs_angle_reset",
414 ini.GetBoolean("LBFGS", "lbfgs_distance_reset",
416 }
417 if (ini.HasSection("CG")) {
419 ini.GetBoolean("CG", "cg_no_overshooting",
422 ini.GetBoolean("CG", "cg_knock_out_max_move",
424 params.optimizer_options.cg.line_search = ini.GetBoolean(
425 "CG", "cg_line_search", params.optimizer_options.cg.line_search);
426 params.optimizer_options.cg.line_converged = ini.GetReal(
427 "CG", "cg_line_converged", params.optimizer_options.cg.line_converged);
429 ini.GetInteger("CG", "cg_max_iter_before_reset",
432 ini.GetInteger("CG", "cg_max_iter_line_search",
434 }
435 if (ini.HasSection("SD")) {
436 params.optimizer_options.sd.alpha =
437 ini.GetReal("SD", "sd_alpha", params.optimizer_options.sd.alpha);
438 params.optimizer_options.sd.two_point = ini.GetBoolean(
439 "SD", "sd_twopoint", params.optimizer_options.sd.two_point);
440 }
441
442 // [Dimer] //
443
445 ini.GetReal("Dimer", "finite_angle", params.dimer_options.rotation_angle);
446 params.dimer_options.improved =
447 ini.GetBoolean("Dimer", "improved", params.dimer_options.improved);
448 params.dimer_options.converged_angle = ini.GetReal(
449 "Dimer", "converged_angle", params.dimer_options.converged_angle);
450 params.dimer_options.max_iterations = ini.GetInteger(
451 "Dimer", "max_iterations", params.dimer_options.max_iterations);
452 params.dimer_options.opt_method = toLowerCase(
453 ini.Get("Dimer", "opt_method", params.dimer_options.opt_method));
454 params.dimer_options.rotations_min = ini.GetInteger(
455 "Dimer", "rotations_min", params.dimer_options.rotations_min);
456 params.dimer_options.rotations_max = ini.GetInteger(
457 "Dimer", "rotations_max", params.dimer_options.rotations_max);
459 ini.GetReal("Dimer", "torque_min", params.dimer_options.torque_min);
461 ini.GetReal("Dimer", "torque_max", params.dimer_options.torque_max);
462 params.dimer_options.remove_rotation = ini.GetBoolean(
463 "Dimer", "remove_rotation", params.dimer_options.remove_rotation);
464 params.dimer_options.lor_residual_tol = ini.GetReal(
465 "Dimer", "lor_residual_tol", params.dimer_options.lor_residual_tol);
466 {
467 const auto rotTok =
468 toLowerCase(ini.Get("Dimer", "rotation_backend", "classical"));
470 magic_enum::enum_cast<DimerRotationBackend>(
471 rotTok, magic_enum::case_insensitive)
473 }
474
475 // GP Surrogate Parameters
477 ini.GetBoolean("Surrogate", "use_surrogate", false);
478 if (params.gp_surrogate_options.enabled) {
481 }
482 params.gp_surrogate_options.uncertainty = ini.GetReal(
483 "Surrogate", "gp_uncertainty", params.gp_surrogate_options.uncertainty);
484 if (ini.HasSection("Surrogate")) {
486 magic_enum::enum_cast<PotType>(ini.Get("Surrogate", "potential", ""),
487 magic_enum::case_insensitive)
488 .value_or(PotType::UNKNOWN);
490 throw std::runtime_error("We only support catlearn for GP right now");
491 }
492 }
493 // [CatLearn]
494 if (ini.HasSection("CatLearn")) {
495 params.catlearn_options.path = ini.Get("CatLearn", "catl_path", "");
496 params.catlearn_options.model = ini.Get("CatLearn", "model", "catl_model");
497 params.catlearn_options.prior = ini.Get("CatLearn", "prior", "catl_prior");
499 ini.GetBoolean("CatLearn", "use_derivatives", "catl_deriv");
501 ini.GetBoolean("CatLearn", "use_fingerprint", "catl_fingerprint");
502 params.catlearn_options.parallel = ini.GetBoolean(
503 "CatLearn", "parallel_hyperparameter_opt", "catl_parallel");
504 }
505 // [ASE_ORCA]
506 if (ini.HasSection("ASE_ORCA")) {
507 params.ase_orca_options.path = ini.Get("ASE_ORCA", "orca_path", "");
508 params.ase_orca_options.nproc = ini.Get("ASE_ORCA", "nproc", "1");
510 ini.Get("ASE_ORCA", "simpleinput", "");
511 }
512 // [ASE_NWCHEM]
513 if (ini.HasSection("ASE_NWCHEM")) {
514 params.ase_nwchem_options.path = ini.Get("ASE_NWCHEM", "nwchem_path", "");
515 params.ase_nwchem_options.nproc = ini.Get("ASE_NWCHEM", "nproc", "1");
516 params.ase_nwchem_options.mpi_launcher = ini.Get(
517 "ASE_NWCHEM", "mpi_launcher", params.ase_nwchem_options.mpi_launcher);
519 ini.Get("ASE_NWCHEM", "multiplicity", "");
521 ini.GetReal("ASE_NWCHEM", "scf_thresh", 1e-5);
523 ini.GetInteger("ASE_NWCHEM", "scf_maxiter", 200);
524 }
525 // [Metatomic]
526 if (ini.HasSection("Metatomic")) {
528 ini.Get("Metatomic", "model_path", "");
529 params.metatomic_options.device = ini.Get("Metatomic", "device", "cpu");
531 ini.Get("Metatomic", "length_unit", "angstrom");
533 ini.Get("Metatomic", "extensions_directory", "");
535 ini.GetBoolean("Metatomic", "check_consistency", false);
537 ini.GetReal("Metatomic", "uncertainty_threshold", -1.0);
538 params.metatomic_options.energy_output = ini.Get(
539 "Metatomic", "energy_output", params.metatomic_options.energy_output);
541 ini.Get("Metatomic", "energy_uncertainty_output",
543 params.metatomic_options.force_output = ini.Get(
544 "Metatomic", "force_output", params.metatomic_options.force_output);
546 ini.GetBoolean("Metatomic", "non_conservative", false);
548 ini.GetBoolean("Metatomic", "random_rotation", false);
549 params.metatomic_options.n_symmetry_rotations = static_cast<long>(
550 ini.GetInteger("Metatomic", "n_symmetry_rotations", 0));
552 ini.GetBoolean("Metatomic", "deterministic", true);
554 ini.GetBoolean("Metatomic", "deterministic_strict", false);
555 auto &_variant = params.metatomic_options.variant;
556 _variant.base = ini.Get("Metatomic", "variant_base", "");
557 _variant.energy = ini.Get("Metatomic", "variant_energy", "");
558 _variant.energy_uncertainty =
559 ini.Get("Metatomic", "variant_energy_uncertainty", "");
560 _variant.force = ini.Get("Metatomic", "variant_force", "");
561 }
562 // [Serve]
563 if (ini.HasSection("Serve")) {
564 params.serve_options.host =
565 ini.Get("Serve", "host", params.serve_options.host);
566 params.serve_options.port = static_cast<uint16_t>(
567 ini.GetInteger("Serve", "port", params.serve_options.port));
568 params.serve_options.replicas = static_cast<size_t>(
569 ini.GetInteger("Serve", "replicas", params.serve_options.replicas));
570 params.serve_options.gateway_port = static_cast<uint16_t>(ini.GetInteger(
571 "Serve", "gateway_port", params.serve_options.gateway_port));
572 params.serve_options.endpoints =
573 ini.Get("Serve", "endpoints", params.serve_options.endpoints);
574 }
575
576 // GP_NEB only
578 ini.GetBoolean("Surrogate", "gp_linear_path_always",
580 // [Lanczos] //
581
583 ini.GetReal("Lanczos", "tolerance", params.lanczos_options.tolerance);
584 params.lanczos_options.max_iterations = ini.GetInteger(
585 "Lanczos", "max_iterations", params.lanczos_options.max_iterations);
586 params.lanczos_options.quit_early = ini.GetBoolean(
587 "Lanczos", "quit_early", params.lanczos_options.quit_early);
588 if (ini.HasValue("Lanczos", "phva_atoms")) {
590 toLowerCase(ini.Get("Lanczos", "phva_atoms", "All"));
591 }
592
593 // [Davidson] //
595 ini.GetReal("Davidson", "tolerance", params.davidson_options.tolerance);
596 params.davidson_options.max_iterations = ini.GetInteger(
597 "Davidson", "max_iterations", params.davidson_options.max_iterations);
599 ini.GetBoolean("Davidson", "diagonal_preconditioner",
601 if (ini.HasValue("Davidson", "phva_atoms")) {
603 toLowerCase(ini.Get("Davidson", "phva_atoms", "All"));
604 }
605
606 // [ARTn] //
608 ini.GetReal("ARTn", "push_step_size", params.artn_options.push_step_size);
609 params.artn_options.force_threshold = ini.GetReal(
610 "ARTn", "force_threshold", params.artn_options.force_threshold);
611 params.artn_options.max_iterations = ini.GetInteger(
612 "ARTn", "max_iterations", params.artn_options.max_iterations);
613 params.artn_options.ninit =
614 ini.GetInteger("ARTn", "ninit", params.artn_options.ninit);
616 ini.Get("ARTn", "nperp_limitation", params.artn_options.nperp_limitation);
617 params.artn_options.lanczos_min_size = ini.GetInteger(
618 "ARTn", "lanczos_min_size", params.artn_options.lanczos_min_size);
619 params.artn_options.nsmooth =
620 ini.GetInteger("ARTn", "nsmooth", params.artn_options.nsmooth);
621 params.artn_options.filin =
622 ini.Get("ARTn", "filin", params.artn_options.filin);
623
624 // [IRA] //
625 params.ira_options.distance_threshold = ini.GetReal(
626 "IRA", "distance_threshold", params.ira_options.distance_threshold);
627 params.ira_options.symmetry_threshold = ini.GetReal(
628 "IRA", "symmetry_threshold", params.ira_options.symmetry_threshold);
629 params.ira_options.use_pbc =
630 ini.GetBoolean("IRA", "use_pbc", params.ira_options.use_pbc);
631
632 // [GPR Dimer] //
633 params.gpr_dimer_options.rotation_angle = ini.GetReal(
634 "GPR Dimer", "finite_angle", params.gpr_dimer_options.rotation_angle);
635 params.gpr_dimer_options.converged_angle = ini.GetReal(
636 "GPR Dimer", "converged_angle", params.gpr_dimer_options.converged_angle);
638 ini.GetReal("GPR Dimer", "relaxation_converged_angle",
640 params.gpr_dimer_options.init_rotations_max = static_cast<long>(
641 ini.GetInteger("GPR Dimer", "max_initial_rotation_iterations",
643 params.gpr_dimer_options.relax_rotations_max = static_cast<long>(
644 ini.GetInteger("GPR Dimer", "max_relaxation_rotation_iterations",
646 params.gpr_dimer_options.divisor_t_dimer_gp = static_cast<long>(
647 ini.GetInteger("GPR Dimer", "divisor_t_dimer",
649 params.gpr_dimer_options.max_outer_iterations = static_cast<long>(
650 ini.GetInteger("GPR Dimer", "max_outer_iterations",
652 params.gpr_dimer_options.max_inner_iterations = static_cast<long>(
653 ini.GetInteger("GPR Dimer", "max_inner_iterations",
656 ini.GetReal("GPR Dimer", "max_midpoint_displacement",
659 ini.Get("GPR Dimer", "rotation_opt_method",
662 ini.Get("GPR Dimer", "translation_opt_method",
664 params.gpr_dimer_options.active_radius = ini.GetReal(
665 "GPR Dimer", "active_radius", params.gpr_dimer_options.active_radius);
666 params.gpr_dimer_options.dimer_sep = ini.GetReal(
667 "GPR Dimer", "dimer_separation", params.gpr_dimer_options.dimer_sep);
669 ini.GetReal("GPR Dimer", "convex_region_step_size",
671 params.gpr_dimer_options.max_step = ini.GetReal(
672 "GPR Dimer", "max_step_size", params.gpr_dimer_options.max_step);
673 params.gpr_dimer_options.ratio_at_limit = ini.GetReal(
674 "GPR Dimer", "ratio_at_limit", params.gpr_dimer_options.ratio_at_limit);
676 ini.GetBoolean("GPR Dimer", "nogp_initial_rotations",
679 ini.GetBoolean("GPR Dimer", "nogp_init_translations",
682 ini.GetBoolean("GPR Dimer", "has_many_iterations",
684 // GPR Params
686 ini.Get("GPR Dimer", "hyperparameter_opt_method",
688 params.gpr_dimer_options.gpr_params.sigma2 = ini.GetReal(
689 "GPR Dimer", "gpr_variance", params.gpr_dimer_options.gpr_params.sigma2);
691 ini.GetReal("GPR Dimer", "gpr_jitter_variance",
694 ini.GetReal("GPR Dimer", "gpr_noise_variance",
696 params.gpr_dimer_options.gpr_params.prior_mu = ini.GetReal(
697 "GPR Dimer", "prior_mean", params.gpr_dimer_options.gpr_params.prior_mu);
699 ini.GetReal("GPR Dimer", "prior_variance",
702 ini.GetReal("GPR Dimer", "prior_degrees_of_freedom",
704 // GPR Optimization Parameters
706 ini.GetBoolean("GPR Dimer", "check_derivatives",
708 params.gpr_dimer_options.opt_params.max_iterations = static_cast<int>(
709 ini.GetInteger("GPR Dimer", "opt_max_iterations",
712 ini.GetReal("GPR Dimer", "opt_tol_func",
714 params.gpr_dimer_options.opt_params.tol_sol = ini.GetReal(
715 "GPR Dimer", "opt_tol_sol", params.gpr_dimer_options.opt_params.tol_sol);
717 ini.GetReal("GPR Dimer", "opt_lambda_limit",
720 ini.GetReal("GPR Dimer", "opt_lambda_init",
722 // GPR Debugging Parameters
723 params.gpr_dimer_options.debug_params.report_level = static_cast<int>(
724 ini.GetInteger("GPR Dimer", "report_level",
726 params.gpr_dimer_options.debug_params.debug_level = static_cast<int>(
727 ini.GetInteger("GPR Dimer", "debug_level",
730 ini.Get("GPR Dimer", "debug_output_directory",
733 ini.Get("GPR Dimer", "debug_position_basename",
736 ini.Get("GPR Dimer", "debug_energy_basename",
739 ini.Get("GPR Dimer", "debug_gradient_basename",
742 ini.GetReal("GPR Dimer", "debug_midpoint_offset",
744 params.gpr_dimer_options.debug_params.dy = ini.GetReal(
745 "GPR Dimer", "debug_y_step", params.gpr_dimer_options.debug_params.dy);
746 params.gpr_dimer_options.debug_params.dz = ini.GetReal(
747 "GPR Dimer", "debug_z_step", params.gpr_dimer_options.debug_params.dz);
748 // GPR Prune
750 ini.GetBoolean("GPR Dimer", "use_prune",
752 params.gpr_dimer_options.prune_params.begin = static_cast<int>(
753 ini.GetInteger("GPR Dimer", "start_prune_at",
755 params.gpr_dimer_options.prune_params.n_vals = static_cast<int>(
756 ini.GetInteger("GPR Dimer", "nprune_vals",
759 ini.GetReal("GPR Dimer", "prune_threshold",
761
762 // [Prefactor] //
763
764 params.prefactor_options.default_value = ini.GetReal(
765 "Prefactor", "default_value", params.prefactor_options.default_value);
767 ini.GetReal("Prefactor", "max_value", params.prefactor_options.max_value);
769 ini.GetReal("Prefactor", "min_value", params.prefactor_options.min_value);
770 params.prefactor_options.within_radius = ini.GetReal(
771 "Prefactor", "within_radius", params.prefactor_options.within_radius);
773 ini.GetReal("Prefactor", "min_displacement",
775 params.prefactor_options.rate = toLowerCase(
776 ini.Get("Prefactor", "rate_estimation", params.prefactor_options.rate));
777 params.prefactor_options.configuration = toLowerCase(ini.Get(
778 "Prefactor", "configuration", params.prefactor_options.configuration));
779 params.prefactor_options.all_free_atoms = ini.GetBoolean(
780 "Prefactor", "all_free_atoms", params.prefactor_options.all_free_atoms);
781 params.prefactor_options.filter_scheme = toLowerCase(ini.Get(
782 "Prefactor", "filter_scheme", params.prefactor_options.filter_scheme));
783 params.prefactor_options.filter_fraction = ini.GetReal(
784 "Prefactor", "filter_fraction", params.prefactor_options.filter_fraction);
785
786 // [Hessian] //
787 // Prefer phva_atoms; accept legacy atom_list when phva_atoms is absent.
788 if (ini.HasValue("Hessian", "phva_atoms")) {
790 toLowerCase(ini.Get("Hessian", "phva_atoms", "All"));
791 } else if (ini.HasValue("Hessian", "atom_list")) {
793 toLowerCase(ini.Get("Hessian", "atom_list", "All"));
794 }
795 params.hessian_options.zero_freq_value = ini.GetReal(
796 "Hessian", "zero_freq_value", params.hessian_options.zero_freq_value);
797 params.hessian_options.fd_scheme = toLowerCase(
798 ini.Get("Hessian", "fd_scheme", params.hessian_options.fd_scheme));
799 params.hessian_options.resume =
800 ini.GetBoolean("Hessian", "resume", params.hessian_options.resume);
801 params.hessian_options.checkpoint_path = ini.Get(
802 "Hessian", "checkpoint_path", params.hessian_options.checkpoint_path);
803
804 // [Nudged Elastic Band] //
805 const std::string neb_section = "Nudged Elastic Band";
806
807 params.neb_options.image_count =
808 ini.GetInteger(neb_section, "images", params.neb_options.image_count);
809 params.neb_options.max_iterations = ini.GetInteger(
810 neb_section, "max_iterations", params.optimizer_options.max_iterations);
811 params.neb_options.force_tolerance = ini.GetReal(
812 neb_section, "converged_force", params.optimizer_options.converged_force);
813 auto neb_optMethod =
814 magic_enum::enum_cast<OptType>(ini.Get(neb_section, "opt_method", "none"),
815 magic_enum::case_insensitive)
816 .value_or(OptType::Unknown);
817 if (neb_optMethod != OptType::None) {
818 params.neb_options.opt_method = neb_optMethod;
819 }
820 params.neb_options.mmf_peaks.enabled = ini.GetBoolean(
821 neb_section, "setup_mmf_peaks", params.neb_options.mmf_peaks.enabled);
823 ini.GetReal(neb_section, "mmf_peak_tolerance",
825
827 ini.GetReal(neb_section, "spring", params.neb_options.spring.constant);
828 params.neb_options.spring.use_elastic_band = ini.GetBoolean(
829 neb_section, "elastic_band", params.neb_options.spring.use_elastic_band);
830 params.neb_options.spring.doubly_nudged = ini.GetBoolean(
831 neb_section, "doubly_nudged", params.neb_options.spring.doubly_nudged);
833 ini.GetBoolean(neb_section, "doubly_nudged_switching",
835
837 ini.GetBoolean(neb_section, "energy_weighted",
839 params.neb_options.spring.weighting.trigger = ini.GetReal(
840 neb_section, "ew_trigger", params.neb_options.spring.weighting.trigger);
841 params.neb_options.spring.weighting.k_min = ini.GetReal(
842 neb_section, "ew_ksp_min", params.neb_options.spring.weighting.k_min);
843 params.neb_options.spring.weighting.k_max = ini.GetReal(
844 neb_section, "ew_ksp_max", params.neb_options.spring.weighting.k_max);
845
846 params.neb_options.spring.om.enabled = ini.GetBoolean(
847 neb_section, "onsager_machlup", params.neb_options.spring.om.enabled);
848 params.neb_options.spring.om.optimize_k = ini.GetBoolean(
849 neb_section, "om_optimize_k", params.neb_options.spring.om.optimize_k);
850 params.neb_options.spring.om.k_scale = ini.GetReal(
851 neb_section, "om_k_scale", params.neb_options.spring.om.k_scale);
852 params.neb_options.spring.om.k_min =
853 ini.GetReal(neb_section, "om_k_min", params.neb_options.spring.om.k_min);
854 params.neb_options.spring.om.k_max =
855 ini.GetReal(neb_section, "om_k_max", params.neb_options.spring.om.k_max);
856
858 ini.GetBoolean(neb_section, "climbing_image_method",
861 ini.GetBoolean(neb_section, "climbing_image_converged_only",
864 ini.GetBoolean(neb_section, "old_tangent",
866 params.neb_options.climbing_image.trigger_force = ini.GetReal(
867 neb_section, "ci_after", params.neb_options.climbing_image.trigger_force);
869 ini.GetReal(neb_section, "ci_after_rel",
871
872 auto &oci = params.neb_options.climbing_image.ocineb;
873 oci.use_mmf = ini.GetBoolean(neb_section, "ci_mmf", oci.use_mmf);
874 oci.trigger_force =
875 ini.GetReal(neb_section, "ci_mmf_after", oci.trigger_force);
876 oci.trigger_factor =
877 ini.GetReal(neb_section, "ci_mmf_after_rel", oci.trigger_factor);
878 oci.max_steps = ini.GetInteger(neb_section, "ci_mmf_nsteps", oci.max_steps);
879 oci.ci_stability_count = ini.GetInteger(
880 neb_section, "ci_mmf_ci_stability_count", oci.ci_stability_count);
881 oci.angle_tol = ini.GetReal(neb_section, "ci_mmf_angle", oci.angle_tol);
882
883 auto &init = params.neb_options.initialization;
884 init.method =
885 magic_enum::enum_cast<NEBInit>(ini.Get(neb_section, "initializer", ""),
886 magic_enum::case_insensitive)
887 .value_or(NEBInit::LINEAR);
888 init.input_path = ini.Get(neb_section, "initial_path_in", init.input_path);
889 init.max_iterations =
890 ini.GetInteger(neb_section, "init_max_iterations", init.max_iterations);
891 init.nsteps = ini.GetInteger(neb_section, "init_nsteps", init.nsteps);
892 init.max_move = ini.GetReal(neb_section, "init_max_move", init.max_move);
893 init.force_tolerance =
894 ini.GetReal(neb_section, "init_force_threshold", init.force_tolerance);
895 init.sidpp_alpha =
896 ini.GetReal(neb_section, "sidpp_growth_alpha", init.sidpp_alpha);
897 init.sidpp_frontier_tol =
898 ini.GetReal(neb_section, "sidpp_frontier_tol", init.sidpp_frontier_tol);
899 init.sidpp_reparam =
900 ini.GetBoolean(neb_section, "sidpp_reparameterize", init.sidpp_reparam);
901 init.sidpp_ideal_ksp =
902 ini.GetBoolean(neb_section, "sidpp_ideal_ksp", init.sidpp_ideal_ksp);
903 auto neb_ipath_optMethod =
904 magic_enum::enum_cast<OptType>(
905 ini.Get(neb_section, "ipath_opt_method", "none"),
906 magic_enum::case_insensitive)
907 .value_or(OptType::Unknown);
908 if (neb_ipath_optMethod != OptType::None) {
909 params.neb_options.initialization.opt_method = neb_ipath_optMethod;
910 }
911 init.oversampling =
912 ini.GetBoolean(neb_section, "oversampling", init.oversampling);
913 init.oversampling_factor = ini.GetInteger(neb_section, "oversampling_factor",
914 init.oversampling_factor);
915
916 params.neb_options.endpoints.minimize = ini.GetBoolean(
917 neb_section, "minimize_endpoints", params.neb_options.endpoints.minimize);
919 ini.GetBoolean(neb_section, "minimize_endpoints_for_ipath",
921
922 // [Dynamics] //
923
924 params.dynamics_options.time_step_input = ini.GetReal(
925 "Dynamics", "time_step", params.dynamics_options.time_step_input);
929 ini.GetReal("Dynamics", "time", params.dynamics_options.time_input);
930 params.dynamics_options.time =
932 params.dynamics_options.steps = static_cast<long>(std::floor(
933 params.dynamics_options.time / params.dynamics_options.time_step + 0.5));
934 params.thermostat_options.kind =
935 toLowerCase(ini.Get("Dynamics", "thermostat", "andersen"));
936 params.thermostat_options.andersen_alpha = ini.GetReal(
937 "Dynamics", "andersen_alpha", params.thermostat_options.andersen_alpha);
939 ini.GetReal("Dynamics", "andersen_collision_period",
944 ini.GetReal("Dynamics", "nose_mass", params.thermostat_options.nose_mass);
946 ini.GetReal("Dynamics", "langevin_friction",
950 params.constants.timeUnit;
951
952 // [Parallel Replica]
953
955 ini.GetBoolean("Parallel Replica", "stop_after_transition",
958 ini.GetBoolean("Parallel Replica", "refine_transition",
961 ini.GetBoolean("Parallel Replica", "dephase_loop_stop",
964 ini.GetReal("Parallel Replica", "dephase_time",
968 params.constants.timeUnit;
970 ini.GetInteger("Parallel Replica", "dephase_loop_max",
973 ini.GetReal("Parallel Replica", "state_check_interval",
977 params.constants.timeUnit;
979 "Parallel Replica", "state_save_interval",
983 params.constants.timeUnit;
985 ini.GetReal("Parallel Replica", "post_transition_time",
989 params.constants.timeUnit;
990
991 // [Temperature Accelerated Dynamics] //
992
994 ini.GetReal("TAD", "low_temperature", params.tad_options.low_temperature);
996 ini.GetReal("TAD", "min_prefactor", params.tad_options.min_prefactor);
997 params.tad_options.confidence =
998 ini.GetReal("TAD", "confidence", params.tad_options.confidence);
999
1000 // [Replica Exchange] //
1001
1003 ini.Get("Replica Exchange", "temperature_distribution",
1005 params.replica_exchange_options.replicas = ini.GetInteger(
1006 "Replica Exchange", "replicas", params.replica_exchange_options.replicas);
1008 ini.GetInteger("Replica Exchange", "exchange_trials",
1011 ini.GetReal("Replica Exchange", "sampling_time",
1015 params.constants.timeUnit;
1016 params.replica_exchange_options.temperature_low = ini.GetReal(
1017 "Replica Exchange", "temperature_low", params.main_options.temperature);
1019 ini.GetReal("Replica Exchange", "temperature_high",
1022 ini.GetReal("Replica Exchange", "exchange_period",
1026 params.constants.timeUnit;
1027
1028 // [Hyperdynamics] //
1029
1031 ini.GetReal("Hyperdynamics", "bb_rmd_time",
1036 toLowerCase(ini.Get("Hyperdynamics", "bb_boost_atomlist",
1038 params.hyperdynamics_options.dvmax = ini.GetReal(
1039 "Hyperdynamics", "bb_dvmax", params.hyperdynamics_options.dvmax);
1040 params.hyperdynamics_options.qrr =
1041 ini.GetReal("Hyperdynamics", "bb_stretch_threshold",
1042 params.hyperdynamics_options.qrr);
1043 params.hyperdynamics_options.prr = ini.GetReal(
1044 "Hyperdynamics", "bb_ds_curvature", params.hyperdynamics_options.prr);
1045 params.hyperdynamics_options.qcut = ini.GetReal(
1046 "Hyperdynamics", "bb_rcut", params.hyperdynamics_options.qcut);
1048 toLowerCase(ini.Get("Hyperdynamics", "bias_potential",
1050
1051 // [Saddle Search] //
1052
1053 params.saddle_search_options.method = toLowerCase(
1054 ini.Get("Saddle Search", "method", params.saddle_search_options.method));
1056 toLowerCase(ini.Get("Saddle Search", "min_mode_method",
1059 ini.GetReal("Saddle Search", "displace_magnitude",
1062 ini.GetReal("Saddle Search", "displace_radius",
1064 params.saddle_search_options.max_energy = ini.GetReal(
1065 "Saddle Search", "max_energy", params.saddle_search_options.max_energy);
1067 ini.GetInteger("Saddle Search", "max_iterations",
1070 "Saddle Search", "nonnegative_displacement_abort",
1073 ini.GetReal("Saddle Search", "max_single_displace",
1076 ini.GetReal("Saddle Search", "converged_force",
1079 ini.GetReal("Saddle Search", "perp_force_ratio",
1081 params.saddle_search_options.displace_type = toLowerCase(ini.Get(
1082 "Saddle Search", "client_displace_type", eonc::EpiCenters::DISP_LOAD));
1084 ini.GetInteger("Saddle Search", "nonlocal_count_abort",
1087 ini.GetReal("Saddle Search", "nonlocal_distance_abort",
1100 }
1101 // Parse comma-separated atom list
1102 {
1103 std::string atomListStr =
1104 ini.Get("Saddle Search", "displace_atom_list", "");
1105 if (!atomListStr.empty()) {
1106 std::stringstream ss(atomListStr);
1107 std::string token;
1108 while (std::getline(ss, token, ',')) {
1109 size_t start = token.find_first_not_of(" \t");
1110 size_t end = token.find_last_not_of(" \t");
1111 if (start != std::string::npos) {
1113 std::stol(token.substr(start, end - start + 1)));
1114 }
1115 }
1116 }
1117 }
1119 ini.GetBoolean("Saddle Search", "confine_positive",
1123 ini.GetBoolean(
1124 "Saddle Search", "bowl_breakout",
1126 params.saddle_search_options.confine_positive.bowl_active = ini.GetInteger(
1127 "Saddle Search", "bowl_active_atoms",
1130 ini.GetReal("Saddle Search", "confine_positive_min_move",
1133 ini.GetReal("Saddle Search", "confine_positive_scale_ratio",
1136 ini.GetReal("Saddle Search", "confine_positive_boost",
1138 params.saddle_search_options.confine_positive.min_active = ini.GetInteger(
1139 "Saddle Search", "confine_positive_min_active",
1141 }
1145 ini.GetReal("Saddle Search", "dynamics_temperature",
1148 ini.GetReal(
1149 "Saddle Search", "dynamics_state_check_interval",
1153 params.constants.timeUnit;
1155 ini.GetReal("Saddle Search", "dynamics_record_interval",
1159 params.constants.timeUnit;
1160 params.saddle_search_options.dynamics.linear_interpolation = ini.GetBoolean(
1161 "Saddle Search", "dynamics_linear_interpolation",
1164 ini.GetBoolean("Saddle Search", "remove_rotation",
1167 ini.GetReal("Saddle Search", "dynamics_max_init_curvature",
1170 ini.GetReal("Saddle Search", "zero_mode_abort_curvature",
1172
1173 // [Basin Hopping] //
1174
1176 ini.GetReal("Basin Hopping", "displacement",
1179 ini.GetReal("Basin Hopping", "push_apart_distance",
1182 ini.GetReal(
1183 "Basin Hopping", "initial_random_structure_probability",
1185 params.basin_hopping_options.steps = ini.GetInteger(
1186 "Basin Hopping", "steps", params.basin_hopping_options.steps);
1188 ini.GetInteger("Basin Hopping", "quenching_steps",
1191 ini.GetBoolean("Basin Hopping", "single_atom_displace",
1194 ini.GetBoolean("Basin Hopping", "significant_structure",
1197 toLowerCase(ini.Get("Basin Hopping", "displacement_algorithm",
1199 if (params.basin_hopping_options.displacement_algorithm != "standard" &&
1200 params.basin_hopping_options.displacement_algorithm != "linear" &&
1201 params.basin_hopping_options.displacement_algorithm != "quadratic") {
1202 EONC_LOG_ERROR("unknown displacement_algorithm {}",
1204 error = 1;
1205 }
1207 ini.Get("Basin Hopping", "displacement_distribution",
1209 if (params.basin_hopping_options.displacement_distribution != "uniform" &&
1210 params.basin_hopping_options.displacement_distribution != "gaussian") {
1211 EONC_LOG_ERROR("unknown displacement_distribution {}",
1213 error = 1;
1214 }
1216 ini.GetReal("Basin Hopping", "swap_probability",
1218 params.basin_hopping_options.jump_max = ini.GetInteger(
1219 "Basin Hopping", "jump_max", params.basin_hopping_options.jump_max);
1220 params.basin_hopping_options.jump_steps = ini.GetInteger(
1221 "Basin Hopping", "jump_steps", params.basin_hopping_options.jump_steps);
1223 ini.GetBoolean("Basin Hopping", "adjust_displacement",
1226 ini.GetInteger("Basin Hopping", "adjust_period",
1229 ini.GetReal("Basin Hopping", "adjust_fraction",
1232 ini.GetReal("Basin Hopping", "target_ratio",
1235 ini.GetBoolean("Basin Hopping", "write_unique",
1237 params.basin_hopping_options.stop_energy = ini.GetReal(
1238 "Basin Hopping", "stop_energy", params.basin_hopping_options.stop_energy);
1239
1240 // [Global Optimization] //
1241
1243 toLowerCase(ini.Get("Global Optimization", "move_method",
1246 toLowerCase(ini.Get("Global Optimization", "decision_method",
1248 if (params.global_optimization_options.decision_method != "npew" &&
1249 params.global_optimization_options.decision_method != "boltzmann") {
1250 EONC_LOG_ERROR("unknown decision_method {}",
1252 error = 1;
1253 }
1254 params.global_optimization_options.steps = ini.GetInteger(
1255 "Global Optimization", "steps", params.global_optimization_options.steps);
1256 params.global_optimization_options.beta = ini.GetReal(
1257 "Global Optimization", "beta", params.global_optimization_options.beta);
1258 params.global_optimization_options.alpha = ini.GetReal(
1259 "Global Optimization", "alpha", params.global_optimization_options.alpha);
1260 params.global_optimization_options.mdmin = ini.GetInteger(
1261 "Global Optimization", "mdmin", params.global_optimization_options.mdmin);
1263 ini.GetReal("Global Optimization", "target_energy",
1265
1266 // [BGSD] //
1267
1268 params.bgsd_options.alpha =
1269 ini.GetReal("BGSD", "alpha", params.bgsd_options.alpha);
1270 params.bgsd_options.beta =
1271 ini.GetReal("BGSD", "beta", params.bgsd_options.beta);
1273 ini.GetReal("BGSD", "gradientfinitedifference",
1276 ini.GetReal("BGSD", "grad2energyconvergence",
1279 ini.GetReal("BGSD", "grad2forceconvergence",
1281
1282 // [Monte Carlo] //
1283
1284 params.monte_carlo_options.step_size = ini.GetReal(
1285 "Monte Carlo", "step_size", params.monte_carlo_options.step_size);
1286 params.monte_carlo_options.steps = static_cast<int>(
1287 ini.GetInteger("Monte Carlo", "steps", params.monte_carlo_options.steps));
1288
1289 // [OH_TST] //
1290
1291 params.oh_tst_options.reactant_filename = ini.Get(
1292 "OH_TST", "reactant_filename", params.oh_tst_options.reactant_filename);
1293 params.oh_tst_options.product_filename = ini.Get(
1294 "OH_TST", "product_filename", params.oh_tst_options.product_filename);
1295 params.oh_tst_options.time_step =
1296 ini.GetReal("OH_TST", "time_step", params.oh_tst_options.time_step);
1297 params.oh_tst_options.equil_steps = ini.GetInteger(
1298 "OH_TST", "equil_steps", params.oh_tst_options.equil_steps);
1299 params.oh_tst_options.sample_steps = ini.GetInteger(
1300 "OH_TST", "sample_steps", params.oh_tst_options.sample_steps);
1301 params.oh_tst_options.max_planes =
1302 ini.GetInteger("OH_TST", "max_planes", params.oh_tst_options.max_planes);
1303 params.oh_tst_options.plane_mass =
1304 ini.GetReal("OH_TST", "plane_mass", params.oh_tst_options.plane_mass);
1305 params.oh_tst_options.alpha_rot =
1306 ini.GetReal("OH_TST", "alpha_rot", params.oh_tst_options.alpha_rot);
1307 params.oh_tst_options.plane_time_step = ini.GetReal(
1308 "OH_TST", "plane_time_step", params.oh_tst_options.plane_time_step);
1309 params.oh_tst_options.ds_max =
1310 ini.GetReal("OH_TST", "ds_max", params.oh_tst_options.ds_max);
1311 params.oh_tst_options.dtheta_max =
1312 ini.GetReal("OH_TST", "dtheta_max", params.oh_tst_options.dtheta_max);
1313 params.oh_tst_options.force_tol =
1314 ini.GetReal("OH_TST", "force_tol", params.oh_tst_options.force_tol);
1315 params.oh_tst_options.s_init =
1316 ini.GetReal("OH_TST", "s_init", params.oh_tst_options.s_init);
1317 params.oh_tst_options.reactant_md_steps = ini.GetInteger(
1318 "OH_TST", "reactant_md_steps", params.oh_tst_options.reactant_md_steps);
1319 params.oh_tst_options.symmetry_products = ini.Get(
1320 "OH_TST", "symmetry_products", params.oh_tst_options.symmetry_products);
1322 ini.GetReal("OH_TST", "max_delta_a", params.oh_tst_options.max_delta_a);
1323 params.oh_tst_options.thermostat = toLowerCase(
1324 ini.Get("OH_TST", "thermostat", params.oh_tst_options.thermostat));
1325 params.oh_tst_options.gle_a_file =
1326 ini.Get("OH_TST", "gle_a_file", params.oh_tst_options.gle_a_file);
1327 params.oh_tst_options.pmf_scan =
1328 ini.GetBoolean("OH_TST", "pmf_scan", params.oh_tst_options.pmf_scan);
1329 params.oh_tst_options.scan_planes = ini.GetInteger(
1330 "OH_TST", "scan_planes", params.oh_tst_options.scan_planes);
1331
1332 return error;
1333}
1334
1336 // Time unit conversions
1337 double tu = params.constants.timeUnit;
1342
1345 params.dynamics_options.time = params.dynamics_options.time_input / tu;
1346 params.dynamics_options.steps = static_cast<long>(std::floor(
1347 params.dynamics_options.time / params.dynamics_options.time_step + 0.5));
1348
1351
1360
1365
1368
1373
1374 // Cross-group defaults
1378}
1379
1380} // namespace eonc::config
#define EONC_LOG_ERROR(...)
Definition EonLogger.h:262
#define EONC_LOG_WARNING(...)
Definition EonLogger.h:256
struct eonc::Parameters::basin_hopping_options_t basin_hopping_options
struct eonc::Parameters::socket_nwchem_options_t socket_nwchem_options
struct eonc::Parameters::monte_carlo_options_t monte_carlo_options
struct eonc::Parameters::catlearn_options_t catlearn_options
struct eonc::Parameters::optimizer_options_t optimizer_options
struct eonc::Parameters::constants_t constants
struct eonc::Parameters::gp_surrogate_options_t gp_surrogate_options
struct eonc::Parameters::global_optimization_options_t global_optimization_options
struct eonc::Parameters::neb_options_t neb_options
struct eonc::Parameters::hyperdynamics_options_t hyperdynamics_options
struct eonc::Parameters::ira_options_t ira_options
struct eonc::Parameters::gpr_dimer_options_t gpr_dimer_options
struct eonc::Parameters::tad_options_t tad_options
struct eonc::Parameters::ase_nwchem_options_t ase_nwchem_options
struct eonc::Parameters::thermostat_options_t thermostat_options
struct eonc::Parameters::structure_comparison_options_t structure_comparison_options
struct eonc::Parameters::dimer_options_t dimer_options
struct eonc::Parameters::ase_orca_options_t ase_orca_options
struct eonc::Parameters::potential_options_t potential_options
struct eonc::Parameters::replica_exchange_options_t replica_exchange_options
struct eonc::Parameters::debug_options_t debug_options
struct eonc::Parameters::oh_tst_options_t oh_tst_options
struct eonc::Parameters::xtb_options_t xtb_options
struct eonc::Parameters::artn_options_t artn_options
struct eonc::Parameters::ams_options_t ams_options
struct eonc::Parameters::rgpot_options_t rgpot_options
struct eonc::Parameters::zbl_options_t zbl_options
struct eonc::Parameters::saddle_search_options_t saddle_search_options
struct eonc::Parameters::davidson_options_t davidson_options
struct eonc::Parameters::metatomic_options_t metatomic_options
struct eonc::Parameters::prefactor_options_t prefactor_options
struct eonc::Parameters::hessian_options_t hessian_options
struct eonc::Parameters::process_search_options_t process_search_options
struct eonc::Parameters::dynamics_options_t dynamics_options
struct eonc::Parameters::lanczos_options_t lanczos_options
struct eonc::Parameters::bgsd_options_t bgsd_options
struct eonc::Parameters::main_options_t main_options
struct eonc::Parameters::parallel_replica_options_t parallel_replica_options
struct eonc::Parameters::serve_options_t serve_options
const char DISP_RANDOM[]
Definition EpiCenters.h:24
const char DISP_LISTED_ATOMS[]
Definition EpiCenters.h:25
const char DISP_NOT_FCC_OR_HCP[]
Definition EpiCenters.h:21
const char DISP_MIN_COORDINATED[]
Definition EpiCenters.h:22
const char DISP_LOAD[]
Definition EpiCenters.h:20
const char DISP_LAST_ATOM[]
Definition EpiCenters.h:23
int load_ini(INIReader &ini, Parameters &params)
Parse all INI sections into the Parameters struct.
void validate_and_link(Parameters &params)
Resolve cross-group defaults and time unit conversions.
double random(long newSeed=0)
std::optional< std::string_view > convergenceMetricLabel(std::string_view metric)
Display label for a force-convergence metric, or nullopt when the name is none of the three the optim...
void set_write_con_forces(bool enabled) noexcept
Whether written .con frames carry "Forces of Component" sections.
struct eonc::Parameters::ams_options_t::env_t env
std::string phva_atoms
PHVA mobile/active set for the Ritz space; "All" = all free atoms.
Definition Parameters.h:433
bool diagonal_preconditioner
Heuristic | (H v)_i / v_i | preconditioner (not true diag(H); off by default).
Definition Parameters.h:431
DimerRotationBackend rotation_backend
Definition Parameters.h:273
struct eonc::Parameters::gpr_dimer_options_t::gpr_params_t gpr_params
struct eonc::Parameters::gpr_dimer_options_t::debug_params_t debug_params
struct eonc::Parameters::gpr_dimer_options_t::prune_params_t prune_params
struct eonc::Parameters::gpr_dimer_options_t::opt_params_t opt_params
bool writeConForces
Opt-in "Forces of Component" sections in written .con frames (enables force+energy co-load on restart...
Definition Parameters.h:62
struct eonc::Parameters::metatomic_options_t::variants_t variant
struct eonc::Parameters::neb_options_t::climbing_image_options_t::hybrid_dimer_t ocineb
struct eonc::Parameters::neb_options_t::spring_options_t::onsager_machlup_t om
struct eonc::Parameters::neb_options_t::spring_options_t::energy_weighting_t weighting
struct eonc::Parameters::neb_options_t::endpoint_options_t endpoints
struct eonc::Parameters::neb_options_t::path_initialization_t initialization
struct eonc::Parameters::neb_options_t::climbing_image_options_t climbing_image
struct eonc::Parameters::neb_options_t::mmf_peak_options_t mmf_peaks
struct eonc::Parameters::neb_options_t::spring_options_t spring
struct eonc::Parameters::optimizer_options_t::quickmin_t quickmin
struct eonc::Parameters::optimizer_options_t::sd_t sd
struct eonc::Parameters::optimizer_options_t::refine_t refine
struct eonc::Parameters::optimizer_options_t::cg_t cg
struct eonc::Parameters::optimizer_options_t::lbfgs_t lbfgs
std::string backend
"nwchemc", "cpmdc", "metatomic", or "xtb"
Definition Parameters.h:131
struct eonc::Parameters::saddle_search_options_t::dynamics_t dynamics
struct eonc::Parameters::saddle_search_options_t::confine_positive_t confine_positive