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 <cstdint>
25#include <ctime>
26#include <sstream>
27#include <stdexcept>
28#include <string>
29
30#include "eon/EonLogger.h"
31#include "eon/PIQTST.h"
32
33namespace {
34std::string toLowerCase(std::string s) {
35 for (std::string::size_type i = 0; i < s.length(); ++i) {
36 s[i] = tolower(s[i]);
37 }
38 return s;
39}
40} // namespace
41
42namespace eonc::config {
43
44int load_ini(INIReader &ini, Parameters &params) {
45 int error = 0;
46
47 // [Main] //
48
50 magic_enum::enum_cast<JobType>(ini.Get("Main", "job", ""),
51 magic_enum::case_insensitive)
52 .value_or(JobType::Unknown);
54 ini.GetReal("Main", "temperature",
55 ParametersLoadAccess::main_options(params).temperature);
57 ini.GetInteger("Main", "random_seed",
58 ParametersLoadAccess::main_options(params).randomSeed);
60 ini.GetBoolean("Main", "checkpoint",
61 ParametersLoadAccess::main_options(params).checkpoint);
62 ParametersLoadAccess::main_options(params).quiet = ini.GetBoolean(
63 "Main", "quiet", ParametersLoadAccess::main_options(params).quiet);
64 ParametersLoadAccess::main_options(params).writeLog = ini.GetBoolean(
65 "Main", "write_log", ParametersLoadAccess::main_options(params).writeLog);
67 ini.GetBoolean("Main", "write_con_forces",
68 ParametersLoadAccess::main_options(params).writeConForces);
69 // Process-wide io mode; same pattern as the RNG seeding below.
71 ParametersLoadAccess::main_options(params).writeConForces);
73 ini.GetReal("Main", "finite_difference",
74 ParametersLoadAccess::main_options(params).finiteDifference);
75 // Initialize random generator
76 if (ParametersLoadAccess::main_options(params).randomSeed < 0) {
77 unsigned i = static_cast<unsigned>(std::time(nullptr));
80 } else {
82 }
84 ini.GetInteger("Main", "max_force_calls",
85 ParametersLoadAccess::main_options(params).maxForceCalls);
87 ini.GetBoolean("Main", "remove_net_force",
88 ParametersLoadAccess::main_options(params).removeNetForce);
89 ParametersLoadAccess::main_options(params).parallel = ini.GetBoolean(
90 "Main", "parallel", ParametersLoadAccess::main_options(params).parallel);
91
92 // [Potential] //
93
94 std::string potTok = ini.Get("Potential", "potential", "");
95 // Schema / old configs: ase_nwcem is ASE_NWCHEM; socket_nwchem is
96 // SocketNWChem (magic_enum already matches the latter).
97 if (potTok == "ase_nwcem" || potTok == "ASE_NWCEM") {
98 potTok = "ase_nwchem";
99 }
101 magic_enum::enum_cast<PotType>(potTok, magic_enum::case_insensitive)
102 .value_or(PotType::UNKNOWN);
104 "Potential", "mpi_poll_period",
105 ParametersLoadAccess::potential_options(params).MPIPollPeriod);
107 ini.GetBoolean(
108 "Potential", "lammps_logging",
109 ParametersLoadAccess::potential_options(params).LAMMPSLogging);
111 static_cast<int>(ini.GetInteger(
112 "Potential", "lammps_threads",
113 ParametersLoadAccess::potential_options(params).LAMMPSThreads));
115 "Potential", "emt_rasmussen",
116 ParametersLoadAccess::potential_options(params).EMTRasmussen);
118 ini.Get("Potential", "ext_pot_path",
119 ParametersLoadAccess::potential_options(params).extPotPath);
121 ini.Get("Potential", "potentials_path",
122 ParametersLoadAccess::potential_options(params).potentialsPath);
123
124 if (params.potential_options().potential == PotType::MPI ||
127 } else {
129 }
131 "Potential", "log_potential",
132 ParametersLoadAccess::potential_options(params).LogPotential);
134 "Potential", "thread_safe",
135 ParametersLoadAccess::potential_options(params).thread_safe);
136
137 // [AMS]
138 if (params.potential_options().potential == PotType::AMS) {
140 "AMS", "engine", ParametersLoadAccess::ams_options(params).engine);
142 ini.Get("AMS", "forcefield",
143 ParametersLoadAccess::ams_options(params).forcefield);
145 ini.Get("AMS", "resources",
146 ParametersLoadAccess::ams_options(params).resources);
148 "AMS", "model", ParametersLoadAccess::ams_options(params).model);
150 ini.Get("AMS", "xc", ParametersLoadAccess::ams_options(params).xc);
152 "AMS", "basis", ParametersLoadAccess::ams_options(params).basis);
153 }
154 // [AMS_IO]
157 "AMS_IO", "engine", ParametersLoadAccess::ams_options(params).engine);
159 ini.Get("AMS_IO", "forcefield",
160 ParametersLoadAccess::ams_options(params).forcefield);
162 "AMS_IO", "model", ParametersLoadAccess::ams_options(params).model);
164 ini.Get("AMS_IO", "xc", ParametersLoadAccess::ams_options(params).xc);
165 }
166 // [AMS_ENV]
170 ini.Get("AMS_ENV", "amshome",
171 ParametersLoadAccess::ams_options(params).env.amshome);
173 ini.Get("AMS_ENV", "scm_tmpdir",
174 ParametersLoadAccess::ams_options(params).env.scm_tmpdir);
176 ini.Get("AMS_ENV", "scmlicense",
177 ParametersLoadAccess::ams_options(params).env.scmlicense);
179 ini.Get("AMS_ENV", "scm_pythondir",
180 ParametersLoadAccess::ams_options(params).env.scm_pythondir);
182 ini.Get("AMS_ENV", "amsbin",
183 ParametersLoadAccess::ams_options(params).env.amsbin);
185 ini.Get("AMS_ENV", "amsresources",
186 ParametersLoadAccess::ams_options(params).env.amsresources);
187 }
188 // [XTBPot]
189 if (params.potential_options().potential == PotType::XTB) {
191 ini.Get("XTBPot", "paramset",
192 ParametersLoadAccess::xtb_options(params).paramset);
193 ParametersLoadAccess::xtb_options(params).acc = ini.GetReal(
194 "XTBPot", "accuracy", ParametersLoadAccess::xtb_options(params).acc);
196 ini.GetReal("XTBPot", "electronic_temperature",
197 ParametersLoadAccess::xtb_options(params).elec_temperature);
199 ini.GetInteger("XTBPot", "max_iterations",
200 ParametersLoadAccess::xtb_options(params).maxiter);
201 ParametersLoadAccess::xtb_options(params).uhf = ini.GetInteger(
202 "XTBPot", "uhf", ParametersLoadAccess::xtb_options(params).uhf);
203 ParametersLoadAccess::xtb_options(params).charge = ini.GetReal(
204 "XTBPot", "charge", ParametersLoadAccess::xtb_options(params).charge);
205 }
206 // [ZBLPot]
207 if (params.potential_options().potential == PotType::ZBL) {
209 ini.GetReal("ZBLPot", "cut_inner",
210 ParametersLoadAccess::zbl_options(params).cut_inner);
212 ini.GetReal("ZBLPot", "cut_global",
213 ParametersLoadAccess::zbl_options(params).cut_global);
214 if (ParametersLoadAccess::zbl_options(params).cut_inner >
215 ParametersLoadAccess::zbl_options(params).cut_global) {
216 throw std::runtime_error(
217 "Switching function must begin before the global cutoff!");
218 }
219 }
220 // [D3Pot] / [D4Pot]: rgpot 3.1 Grimme DFT-D
224 ini.Get("D3Pot", "functional",
225 ini.Get("D4Pot", "functional",
226 ParametersLoadAccess::dftd_options(params).functional));
227 ParametersLoadAccess::dftd_options(params).atm = ini.GetBoolean(
228 "D3Pot", "atm",
229 ini.GetBoolean("D4Pot", "atm",
232 ini.Get("D3Pot", "damping",
233 ParametersLoadAccess::dftd_options(params).d3_damping);
235 ini.GetReal("D4Pot", "charge",
236 ParametersLoadAccess::dftd_options(params).d4_charge);
237 }
238 if (params.potential_options().potential == PotType::EXPR) {
240 ini.Get("ExprPot", "expression",
241 ParametersLoadAccess::expr_options(params).expression);
243 "ExprPot", "terms", ParametersLoadAccess::expr_options(params).terms);
244 }
246 ParametersLoadAccess::mopac_options(params).charge = static_cast<int>(
247 ini.GetInteger("MOPACPot", "charge",
249 ParametersLoadAccess::mopac_options(params).spin = static_cast<int>(
250 ini.GetInteger("MOPACPot", "spin",
252 ParametersLoadAccess::mopac_options(params).model = static_cast<int>(
253 ini.GetInteger("MOPACPot", "model",
256 ini.Get("MOPACPot", "engine_path",
257 ParametersLoadAccess::mopac_options(params).engine_path);
258 }
259 // [SocketNWChemPot]
262 ini.Get("SocketNWChemPot", "host",
264 ParametersLoadAccess::socket_nwchem_options(params).port = ini.GetInteger(
265 "SocketNWChemPot", "port",
268 ini.GetInteger(
269 "SocketNWChemPot", "mem_in_gb",
272 ini.Get("SocketNWChemPot", "nwchem_settings",
274 .nwchem_settings);
276 ini.Get("SocketNWChemPot", "unix_socket_path",
278 .unix_socket_path);
280 ini.GetBoolean("SocketNWChemPot", "unix_socket_mode",
282 .unix_socket_mode);
284 ini.GetBoolean("SocketNWChemPot", "make_template_input",
286 .make_template_input);
287 }
288
289 // [RgpotPot] — in-process NWChemPot/CPMDPot (also accept legacy [RGPot] keys)
291 const char *sec = "RgpotPot";
292 // Prefer [RgpotPot]; fall back to [RGPot] field names used by direct-link
293 // design
295 sec, "backend", ParametersLoadAccess::rgpot_options(params).backend);
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",
307 ParametersLoadAccess::rgpot_options(params).scf_type));
309 sec, "functional",
310 ini.Get(sec, "cpmd_functional",
311 ParametersLoadAccess::rgpot_options(params).functional));
312 // cutOffRy is the schema name. cutoff_ry and cpmd_cut_off_ry still load.
314 sec, "cutOffRy",
315 ini.GetReal(
316 sec, "cutoff_ry",
317 ini.GetReal(
318 sec, "cpmd_cut_off_ry",
319 ParametersLoadAccess::rgpot_options(params).cutoff_ry)));
320 ParametersLoadAccess::rgpot_options(params).charge = ini.GetInteger(
321 sec, "charge",
322 ini.GetInteger(sec, "nwchem_charge",
324 ParametersLoadAccess::rgpot_options(params).multiplicity = ini.GetInteger(
325 sec, "multiplicity",
326 ini.GetInteger(
327 sec, "nwchem_multiplicity",
328 ParametersLoadAccess::rgpot_options(params).multiplicity));
330 ini.Get(sec, "engine_path",
331 ParametersLoadAccess::rgpot_options(params).engine_path);
333 ini.Get(sec, "engine_library",
334 ParametersLoadAccess::rgpot_options(params).engine_library);
336 ini.Get(sec, "engine_root",
337 ParametersLoadAccess::rgpot_options(params).engine_root);
339 sec, "title", ParametersLoadAccess::rgpot_options(params).title);
341 ini.GetInteger(sec, "memory_mb",
342 ParametersLoadAccess::rgpot_options(params).memory_mb);
344 ini.Get(sec, "scratch_dir",
345 ParametersLoadAccess::rgpot_options(params).scratch_dir);
347 ini.Get(sec, "input_block",
348 ParametersLoadAccess::rgpot_options(params).input_block);
350 ini.Get(sec, "permanent_dir",
351 ParametersLoadAccess::rgpot_options(params).permanent_dir);
353 ini.Get(sec, "params_path",
354 ParametersLoadAccess::rgpot_options(params).params_path);
356 ini.GetInteger(
357 sec, "ranks_per_image",
358 ParametersLoadAccess::rgpot_options(params).ranks_per_image);
360 ini.Get(sec, "model_path",
361 ParametersLoadAccess::rgpot_options(params).model_path);
363 sec, "device", ParametersLoadAccess::rgpot_options(params).device);
365 ini.Get(sec, "length_unit",
366 ParametersLoadAccess::rgpot_options(params).length_unit);
368 sec, "extensions_directory",
369 ParametersLoadAccess::rgpot_options(params).extensions_directory);
371 ini.GetBoolean(
372 sec, "check_consistency",
373 ParametersLoadAccess::rgpot_options(params).check_consistency);
375 ini.GetReal(
376 sec, "uncertainty_threshold",
377 ParametersLoadAccess::rgpot_options(params).uncertainty_threshold);
379 ini.GetBoolean(sec, "torch_determinism_strict",
381 .torch_determinism_strict);
382 // XTB dlopen knobs (also accept [XTBPot] when backend=xtb)
384 sec, "paramset",
385 ini.Get(sec, "xtb_paramset",
386 ParametersLoadAccess::rgpot_options(params).xtb_paramset));
388 sec, "accuracy",
389 ini.GetReal(sec, "xtb_accuracy",
390 ParametersLoadAccess::rgpot_options(params).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",
404 static_cast<double>(
407 static_cast<int>(ini.GetInteger(
408 sec, "uhf",
409 ini.GetInteger(
410 sec, "xtb_uhf",
411 ParametersLoadAccess::rgpot_options(params).xtb_uhf)));
412 const std::string be =
413 toLowerCase(ParametersLoadAccess::rgpot_options(params).backend);
414 if (be == "xtb" || be == "xtbpot" || be == "gfn" || be == "gfnxtb") {
416 ini.Get("XTBPot", "paramset",
417 ParametersLoadAccess::rgpot_options(params).xtb_paramset);
419 ini.GetReal("XTBPot", "accuracy",
420 ParametersLoadAccess::rgpot_options(params).xtb_accuracy);
422 ini.GetReal("XTBPot", "electronic_temperature",
424 .xtb_electronic_temperature);
426 static_cast<int>(ini.GetInteger(
427 "XTBPot", "max_iterations",
428 ParametersLoadAccess::rgpot_options(params).xtb_max_iterations));
429 ParametersLoadAccess::rgpot_options(params).xtb_uhf = static_cast<int>(
430 ini.GetInteger("XTBPot", "uhf",
431 ParametersLoadAccess::rgpot_options(params).xtb_uhf));
433 ini.GetReal("XTBPot", "charge",
434 ParametersLoadAccess::rgpot_options(params).xtb_charge);
435 }
436 // [RgpotPot] is the backend switch. [cpmd] is the scalar CPMD message
437 // and overrides that section when the backend is CPMD. A params_path
438 // file, applied later, owns the same fields and is not overwritten
439 // by either section. input_block from here is appended to the file.
440 if (be == "cpmd" || be == "cpmdc" || be == "cpmdpot") {
441 auto &rg = ParametersLoadAccess::rgpot_options(params);
442 rg.functional =
443 ini.Get("cpmd", "functional",
444 ini.Get("cpmd", "cpmd_functional", rg.functional));
445 rg.cutoff_ry = ini.GetReal(
446 "cpmd", "cutOffRy",
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);
454 }
455 }
456
457 // [Debug] //
458
460 ini.GetBoolean("Debug", "write_movies",
461 ParametersLoadAccess::debug_options(params).write_movies);
463 ini.GetInteger(
464 "Debug", "write_movies_interval",
465 ParametersLoadAccess::debug_options(params).write_movies_interval);
467 ini.GetBoolean(
468 "Debug", "write_deprecated_outs",
469 ParametersLoadAccess::debug_options(params).write_deprecated_outs);
471 ini.GetBoolean(
472 "Debug", "estimate_neb_eigenvalues",
473 ParametersLoadAccess::debug_options(params).estimate_neb_eigenvalues);
475 toLowerCase(ini.Get("Debug", "neb_mmf_estimator",
476 ParametersLoadAccess::debug_options(params).neb_mmf));
477
478 // [Structure Comparison] //
479
482 ini.GetReal("Structure Comparison", "distance_difference",
484 .distance_difference);
486 ini.GetReal("Structure Comparison", "neighbor_cutoff",
488 .neighbor_cutoff);
490 ini.GetBoolean("Structure Comparison", "check_rotation",
492 .check_rotation);
494 ini.GetReal("Structure Comparison", "energy_difference",
496 .energy_difference);
499 ini.GetBoolean("Structure Comparison", "indistinguishable_atoms",
501 .indistinguishable_atoms);
504 ini.GetBoolean("Structure Comparison", "remove_translation",
506 .remove_translation);
507
508 // [Process Search] //
509
511 ini.GetBoolean(
512 "Process Search", "minimize_first",
513 ParametersLoadAccess::process_search_options(params).minimize_first);
515 ini.GetReal("Process Search", "minimization_offset",
517 .minimization_offset);
518
519 // [Optimizers] //
520 auto inp_optMethod =
521 magic_enum::enum_cast<OptType>(ini.Get("Optimizer", "opt_method", "none"),
522 magic_enum::case_insensitive)
523 .value_or(OptType::Unknown);
524 if (inp_optMethod != OptType::None) {
525 ParametersLoadAccess::optimizer_options(params).method = inp_optMethod;
526 }
527
529 toLowerCase(ini.Get(
530 "Optimizer", "convergence_metric",
531 ParametersLoadAccess::optimizer_options(params).convergence_metric));
533 ParametersLoadAccess::optimizer_options(params).convergence_metric)) {
535 *label;
536 } else {
538 "unknown convergence_metric {}",
539 ParametersLoadAccess::optimizer_options(params).convergence_metric);
540 error = 1;
541 }
542
543 if (ini.HasSection("Refine")) {
545 magic_enum::enum_cast<OptType>(ini.Get("Refine", "opt_method", ""),
546 magic_enum::case_insensitive)
547 .value_or(OptType::None);
549 ini.GetReal(
550 "Refine", "threshold",
551 ParametersLoadAccess::optimizer_options(params).refine.threshold);
552 }
553
555 "Optimizer", "converged_force",
556 ParametersLoadAccess::optimizer_options(params).converged_force);
558 static_cast<size_t>(ini.GetInteger(
559 "Optimizer", "max_iterations",
560 ParametersLoadAccess::optimizer_options(params).max_iterations));
562 ini.GetReal("Optimizer", "max_move",
564 // Handle each optimizer separately
565 if (ini.HasSection("QuickMin")) {
567 ini.GetReal(
568 "QuickMin", "time_step",
569 ParametersLoadAccess::optimizer_options(params).time_step_input);
574 ini.GetBoolean("Optimizer", "qm_steepest_descent",
576 .quickmin.steepest_descent);
577 }
578 if (ini.HasSection("FIRE")) {
579 EONC_LOG_WARNING("Overwriting QuickMin timestep with Fire timestep!!");
581 ini.GetReal(
582 "FIRE", "time_step",
583 ParametersLoadAccess::optimizer_options(params).time_step_input);
588 ini.GetReal("FIRE", "time_step_max",
590 .max_time_step_input);
594 }
595 // 2014 optbench INI puts lbfgs_* on [Optimizer]. Prefer [LBFGS] when present.
596 {
597 const char *lbfgs_sec = ini.HasSection("LBFGS") ? "LBFGS" : "Optimizer";
599 ini.GetInteger(
600 lbfgs_sec, "lbfgs_memory",
601 ParametersLoadAccess::optimizer_options(params).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);
612 lbfgs.auto_scale =
613 ini.GetBoolean(lbfgs_sec, "lbfgs_auto_scale", lbfgs.auto_scale);
614 lbfgs.angle_reset =
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);
618 lbfgs.curvature =
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);
622 lbfgs.secant =
623 toLowerCase(ini.Get(lbfgs_sec, "lbfgs_secant", lbfgs.secant));
624 lbfgs.precon =
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));
628 lbfgs.accept =
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);
632 lbfgs.cautious_eps =
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);
637 lbfgs.precon_mu =
638 ini.GetReal(lbfgs_sec, "lbfgs_precon_mu", lbfgs.precon_mu);
639 lbfgs.precon_rcut =
640 ini.GetReal(lbfgs_sec, "lbfgs_precon_rcut", lbfgs.precon_rcut);
641 }
642 {
644 xtsci.method =
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));
652 xtsci.highs =
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)));
658 }
659 xtsci.highs = ini.GetBoolean("Optimizer", "xtsci_highs", xtsci.highs);
661 }
662 if (ini.HasSection("CG")) {
664 ini.GetBoolean(
665 "CG", "cg_no_overshooting",
666 ParametersLoadAccess::optimizer_options(params).cg.no_overshooting);
668 ini.GetBoolean("CG", "cg_knock_out_max_move",
670 .cg.knock_out_max_move);
672 ini.GetBoolean(
673 "CG", "cg_line_search",
674 ParametersLoadAccess::optimizer_options(params).cg.line_search);
676 ini.GetReal(
677 "CG", "cg_line_converged",
678 ParametersLoadAccess::optimizer_options(params).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);
687 }
688 if (ini.HasSection("SD")) {
690 ini.GetReal("SD", "sd_alpha",
693 ini.GetBoolean(
694 "SD", "sd_twopoint",
695 ParametersLoadAccess::optimizer_options(params).sd.two_point);
696 }
697
698 // [Dimer] //
699
701 ini.GetReal("Dimer", "finite_angle",
702 ParametersLoadAccess::dimer_options(params).rotation_angle);
704 ini.GetBoolean("Dimer", "improved",
705 ParametersLoadAccess::dimer_options(params).improved);
707 ini.GetReal("Dimer", "converged_angle",
708 ParametersLoadAccess::dimer_options(params).converged_angle);
710 "Dimer", "max_iterations",
711 ParametersLoadAccess::dimer_options(params).max_iterations);
712 if (auto dimerOpt = magic_enum::enum_cast<OptType>(
713 ini.Get("Dimer", "opt_method", "cg"), magic_enum::case_insensitive);
714 dimerOpt && *dimerOpt != OptType::Unknown && *dimerOpt != OptType::None) {
716 }
718 ini.GetInteger("Dimer", "rotations_min",
719 ParametersLoadAccess::dimer_options(params).rotations_min);
721 ini.GetInteger("Dimer", "rotations_max",
722 ParametersLoadAccess::dimer_options(params).rotations_max);
724 ini.GetReal("Dimer", "torque_min",
725 ParametersLoadAccess::dimer_options(params).torque_min);
727 ini.GetReal("Dimer", "torque_max",
728 ParametersLoadAccess::dimer_options(params).torque_max);
730 "Dimer", "remove_rotation",
731 ParametersLoadAccess::dimer_options(params).remove_rotation);
733 ini.GetReal("Dimer", "lor_residual_tol",
734 ParametersLoadAccess::dimer_options(params).lor_residual_tol);
735 {
736 const auto rotTok =
737 toLowerCase(ini.Get("Dimer", "rotation_backend", "classical"));
739 magic_enum::enum_cast<DimerRotationBackend>(
740 rotTok, magic_enum::case_insensitive)
742 }
743
744 // GP Surrogate Parameters
746 ini.GetBoolean("Surrogate", "use_surrogate", false);
747 if (ParametersLoadAccess::gp_surrogate_options(params).enabled) {
751 }
753 "Surrogate", "gp_uncertainty",
755 if (ini.HasSection("Surrogate")) {
757 magic_enum::enum_cast<PotType>(ini.Get("Surrogate", "potential", ""),
758 magic_enum::case_insensitive)
759 .value_or(PotType::UNKNOWN);
761 throw std::runtime_error("We only support catlearn for GP right now");
762 }
763 }
764 // [CatLearn]
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");
776 ParametersLoadAccess::catlearn_options(params).parallel = ini.GetBoolean(
777 "CatLearn", "parallel_hyperparameter_opt", "catl_parallel");
778 }
779 // [ASE_ORCA]
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));
791 }
792 // [ASE_NWCHEM]
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",
800 ParametersLoadAccess::ase_nwchem_options(params).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",
813 }
814 // [Metatomic]
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",
830 ParametersLoadAccess::metatomic_options(params).energy_output);
832 ini.Get("Metatomic", "energy_uncertainty_output",
834 .energy_uncertainty_output);
836 ini.Get("Metatomic", "force_output",
837 ParametersLoadAccess::metatomic_options(params).force_output);
839 ini.GetBoolean("Metatomic", "non_conservative", false);
841 ini.GetBoolean("Metatomic", "random_rotation", false);
843 static_cast<long>(
844 ini.GetInteger("Metatomic", "n_symmetry_rotations", 0));
846 ini.GetBoolean("Metatomic", "deterministic", true);
848 ini.GetBoolean("Metatomic", "deterministic_strict", false);
849 auto &_variant = ParametersLoadAccess::metatomic_options(params).variant;
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", "");
855 }
856 // [Serve]
857 if (ini.HasSection("Serve")) {
859 "Serve", "host", ParametersLoadAccess::serve_options(params).host);
861 static_cast<uint16_t>(ini.GetInteger(
862 "Serve", "port", ParametersLoadAccess::serve_options(params).port));
863 ParametersLoadAccess::serve_options(params).replicas = static_cast<size_t>(
864 ini.GetInteger("Serve", "replicas",
865 ParametersLoadAccess::serve_options(params).replicas));
867 static_cast<uint16_t>(ini.GetInteger(
868 "Serve", "gateway_port",
869 ParametersLoadAccess::serve_options(params).gateway_port));
871 ini.Get("Serve", "endpoints",
872 ParametersLoadAccess::serve_options(params).endpoints);
873 }
874
875 // GP_NEB only
877 ini.GetBoolean("Surrogate", "gp_linear_path_always",
879 .linear_path_always);
880 // [Lanczos] //
881
883 ini.GetReal("Lanczos", "tolerance",
884 ParametersLoadAccess::lanczos_options(params).tolerance);
886 "Lanczos", "max_iterations",
887 ParametersLoadAccess::lanczos_options(params).max_iterations);
889 ini.GetBoolean("Lanczos", "quit_early",
890 ParametersLoadAccess::lanczos_options(params).quit_early);
891 if (ini.HasValue("Lanczos", "phva_atoms")) {
893 toLowerCase(ini.Get("Lanczos", "phva_atoms", "All"));
894 }
895
896 // [Davidson] //
898 ini.GetReal("Davidson", "tolerance",
901 ini.GetInteger(
902 "Davidson", "max_iterations",
903 ParametersLoadAccess::davidson_options(params).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"));
911 }
912
913 // [ARTn] //
915 ini.GetReal("ARTn", "push_step_size",
916 ParametersLoadAccess::artn_options(params).push_step_size);
918 ini.GetReal("ARTn", "force_threshold",
919 ParametersLoadAccess::artn_options(params).force_threshold);
921 ini.GetInteger("ARTn", "max_iterations",
922 ParametersLoadAccess::artn_options(params).max_iterations);
923 ParametersLoadAccess::artn_options(params).ninit = ini.GetInteger(
924 "ARTn", "ninit", ParametersLoadAccess::artn_options(params).ninit);
926 ini.Get("ARTn", "nperp_limitation",
927 ParametersLoadAccess::artn_options(params).nperp_limitation);
929 "ARTn", "lanczos_min_size",
930 ParametersLoadAccess::artn_options(params).lanczos_min_size);
931 ParametersLoadAccess::artn_options(params).nsmooth = ini.GetInteger(
932 "ARTn", "nsmooth", ParametersLoadAccess::artn_options(params).nsmooth);
934 "ARTn", "filin", ParametersLoadAccess::artn_options(params).filin);
935
936 // [IRA] //
938 ini.GetReal("IRA", "distance_threshold",
939 ParametersLoadAccess::ira_options(params).distance_threshold);
941 ini.GetReal("IRA", "symmetry_threshold",
942 ParametersLoadAccess::ira_options(params).symmetry_threshold);
943 ParametersLoadAccess::ira_options(params).use_pbc = ini.GetBoolean(
944 "IRA", "use_pbc", ParametersLoadAccess::ira_options(params).use_pbc);
945
946 // [GPR Dimer] //
948 "GPR Dimer", "finite_angle",
949 ParametersLoadAccess::gpr_dimer_options(params).rotation_angle);
951 "GPR Dimer", "converged_angle",
952 ParametersLoadAccess::gpr_dimer_options(params).converged_angle);
954 ini.GetReal(
955 "GPR Dimer", "relaxation_converged_angle",
956 ParametersLoadAccess::gpr_dimer_options(params).relax_conv_angle);
958 static_cast<long>(ini.GetInteger(
959 "GPR Dimer", "max_initial_rotation_iterations",
960 ParametersLoadAccess::gpr_dimer_options(params).init_rotations_max));
962 static_cast<long>(ini.GetInteger(
963 "GPR Dimer", "max_relaxation_rotation_iterations",
964 ParametersLoadAccess::gpr_dimer_options(params).relax_rotations_max));
966 static_cast<long>(ini.GetInteger(
967 "GPR Dimer", "divisor_t_dimer",
968 ParametersLoadAccess::gpr_dimer_options(params).divisor_t_dimer_gp));
970 .max_outer_iterations = static_cast<long>(ini.GetInteger(
971 "GPR Dimer", "max_outer_iterations",
972 ParametersLoadAccess::gpr_dimer_options(params).max_outer_iterations));
974 .max_inner_iterations = static_cast<long>(ini.GetInteger(
975 "GPR Dimer", "max_inner_iterations",
976 ParametersLoadAccess::gpr_dimer_options(params).max_inner_iterations));
978 ini.GetReal(
979 "GPR Dimer", "max_midpoint_displacement",
980 ParametersLoadAccess::gpr_dimer_options(params).midpoint_max_disp);
982 ini.Get("GPR Dimer", "rotation_opt_method",
983 ParametersLoadAccess::gpr_dimer_options(params).rot_opt_method);
985 ini.Get("GPR Dimer", "translation_opt_method",
986 ParametersLoadAccess::gpr_dimer_options(params).trans_opt_method);
988 "GPR Dimer", "active_radius",
989 ParametersLoadAccess::gpr_dimer_options(params).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",
1001 ParametersLoadAccess::gpr_dimer_options(params).ratio_at_limit);
1003 "GPR Dimer", "nogp_initial_rotations",
1004 ParametersLoadAccess::gpr_dimer_options(params).init_rot_gp);
1006 ini.GetBoolean(
1007 "GPR Dimer", "nogp_init_translations",
1008 ParametersLoadAccess::gpr_dimer_options(params).init_trans_gp);
1010 ini.GetBoolean(
1011 "GPR Dimer", "has_many_iterations",
1012 ParametersLoadAccess::gpr_dimer_options(params).many_iterations);
1013 // GPR Params
1015 ini.Get("GPR Dimer", "hyperparameter_opt_method",
1017 .gpr_params.hyper_opt_method);
1019 ini.GetReal(
1020 "GPR Dimer", "gpr_variance",
1021 ParametersLoadAccess::gpr_dimer_options(params).gpr_params.sigma2);
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);
1031 ini.GetReal(
1032 "GPR Dimer", "prior_mean",
1033 ParametersLoadAccess::gpr_dimer_options(params).gpr_params.prior_mu);
1035 ini.GetReal("GPR Dimer", "prior_variance",
1037 .gpr_params.prior_sigma2);
1039 ini.GetReal(
1040 "GPR Dimer", "prior_degrees_of_freedom",
1041 ParametersLoadAccess::gpr_dimer_options(params).gpr_params.prior_nu);
1042 // GPR Optimization Parameters
1044 ini.GetBoolean("GPR Dimer", "check_derivatives",
1046 .opt_params.check_derivatives);
1048 static_cast<int>(
1049 ini.GetInteger("GPR Dimer", "opt_max_iterations",
1051 .opt_params.max_iterations));
1053 ini.GetReal(
1054 "GPR Dimer", "opt_tol_func",
1055 ParametersLoadAccess::gpr_dimer_options(params).opt_params.tol_func);
1057 ini.GetReal(
1058 "GPR Dimer", "opt_tol_sol",
1059 ParametersLoadAccess::gpr_dimer_options(params).opt_params.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);
1068 // GPR Debugging Parameters
1070 static_cast<int>(
1071 ini.GetInteger("GPR Dimer", "report_level",
1073 .debug_params.report_level));
1075 static_cast<int>(
1076 ini.GetInteger("GPR Dimer", "debug_level",
1078 .debug_params.debug_level));
1080 ini.Get(
1081 "GPR Dimer", "debug_output_directory",
1082 ParametersLoadAccess::gpr_dimer_options(params).debug_params.out_dir);
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",
1102 ParametersLoadAccess::gpr_dimer_options(params).debug_params.dy);
1104 "GPR Dimer", "debug_z_step",
1105 ParametersLoadAccess::gpr_dimer_options(params).debug_params.dz);
1106 // GPR Prune
1108 ini.GetBoolean("GPR Dimer", "use_prune",
1110 .prune_params.use_prune);
1112 static_cast<int>(ini.GetInteger(
1113 "GPR Dimer", "start_prune_at",
1114 ParametersLoadAccess::gpr_dimer_options(params).prune_params.begin));
1116 static_cast<int>(ini.GetInteger(
1117 "GPR Dimer", "nprune_vals",
1118 ParametersLoadAccess::gpr_dimer_options(params).prune_params.n_vals));
1120 ini.GetReal("GPR Dimer", "prune_threshold",
1122 .prune_params.threshold);
1123
1124 // [Prefactor] //
1125
1127 "Prefactor", "default_value",
1128 ParametersLoadAccess::prefactor_options(params).default_value);
1130 ini.GetReal("Prefactor", "max_value",
1131 ParametersLoadAccess::prefactor_options(params).max_value);
1133 ini.GetReal("Prefactor", "min_value",
1134 ParametersLoadAccess::prefactor_options(params).min_value);
1136 "Prefactor", "within_radius",
1137 ParametersLoadAccess::prefactor_options(params).within_radius);
1139 ini.GetReal(
1140 "Prefactor", "min_displacement",
1141 ParametersLoadAccess::prefactor_options(params).min_displacement);
1142 ParametersLoadAccess::prefactor_options(params).rate = toLowerCase(
1143 ini.Get("Prefactor", "rate_estimation",
1146 ini.Get("Prefactor", "configuration",
1147 ParametersLoadAccess::prefactor_options(params).configuration));
1149 ini.GetBoolean(
1150 "Prefactor", "all_free_atoms",
1151 ParametersLoadAccess::prefactor_options(params).all_free_atoms);
1153 ini.Get("Prefactor", "filter_scheme",
1154 ParametersLoadAccess::prefactor_options(params).filter_scheme));
1156 "Prefactor", "filter_fraction",
1157 ParametersLoadAccess::prefactor_options(params).filter_fraction);
1158
1159 // [Hessian] //
1160 // Prefer phva_atoms; accept legacy atom_list when phva_atoms is absent.
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"));
1167 }
1169 "Hessian", "zero_freq_value",
1170 ParametersLoadAccess::hessian_options(params).zero_freq_value);
1172 ini.Get("Hessian", "fd_scheme",
1173 ParametersLoadAccess::hessian_options(params).fd_scheme));
1175 ini.GetBoolean("Hessian", "resume",
1178 ini.Get("Hessian", "checkpoint_path",
1179 ParametersLoadAccess::hessian_options(params).checkpoint_path);
1181 ini.GetBoolean("Hessian", "write_modes",
1182 ParametersLoadAccess::hessian_options(params).write_modes);
1183
1184 // [Nudged Elastic Band] //
1185 const std::string neb_section = "Nudged Elastic Band";
1186
1188 ini.GetInteger(neb_section, "images",
1189 ParametersLoadAccess::neb_options(params).image_count);
1191 ini.GetBoolean(
1192 neb_section, "solid_state",
1193 ParametersLoadAccess::neb_options(params).solid_state.enabled);
1195 ini.GetReal(neb_section, "solid_state_weight",
1196 ParametersLoadAccess::neb_options(params).solid_state.weight);
1198 neb_section, "solid_state_pressure",
1199 ParametersLoadAccess::neb_options(params).solid_state.pressure);
1200 ParametersLoadAccess::neb_options(params).max_iterations = ini.GetInteger(
1201 neb_section, "max_iterations",
1202 ParametersLoadAccess::optimizer_options(params).max_iterations);
1204 neb_section, "converged_force",
1205 ParametersLoadAccess::optimizer_options(params).converged_force);
1206 auto neb_optMethod =
1207 magic_enum::enum_cast<OptType>(ini.Get(neb_section, "opt_method", "none"),
1208 magic_enum::case_insensitive)
1209 .value_or(OptType::Unknown);
1210 if (neb_optMethod != OptType::None) {
1211 ParametersLoadAccess::neb_options(params).opt_method = neb_optMethod;
1212 }
1213 ParametersLoadAccess::neb_options(params).mmf_peaks.enabled = ini.GetBoolean(
1214 neb_section, "setup_mmf_peaks",
1215 ParametersLoadAccess::neb_options(params).mmf_peaks.enabled);
1217 neb_section, "mmf_peak_tolerance",
1218 ParametersLoadAccess::neb_options(params).mmf_peaks.tolerance);
1220 ini.GetBoolean(neb_section, "match_endpoints",
1221 ParametersLoadAccess::neb_options(params).match_endpoints);
1222 ParametersLoadAccess::neb_options(params).match_method = toLowerCase(
1223 ini.Get(neb_section, "match_method",
1224 ParametersLoadAccess::neb_options(params).match_method));
1225
1227 ini.GetReal(neb_section, "spring",
1228 ParametersLoadAccess::neb_options(params).spring.constant);
1230 ini.GetBoolean(
1231 neb_section, "elastic_band",
1232 ParametersLoadAccess::neb_options(params).spring.use_elastic_band);
1234 ini.GetBoolean(
1235 neb_section, "doubly_nudged",
1236 ParametersLoadAccess::neb_options(params).spring.doubly_nudged);
1238 ini.GetBoolean(
1239 neb_section, "doubly_nudged_switching",
1240 ParametersLoadAccess::neb_options(params).spring.use_switching);
1241
1243 ini.GetBoolean(
1244 neb_section, "energy_weighted",
1245 ParametersLoadAccess::neb_options(params).spring.weighting.enabled);
1247 ini.GetReal(
1248 neb_section, "ew_trigger",
1249 ParametersLoadAccess::neb_options(params).spring.weighting.trigger);
1251 ini.GetReal(
1252 neb_section, "ew_ksp_min",
1253 ParametersLoadAccess::neb_options(params).spring.weighting.k_min);
1255 ini.GetReal(
1256 neb_section, "ew_ksp_max",
1257 ParametersLoadAccess::neb_options(params).spring.weighting.k_max);
1258
1259 ParametersLoadAccess::neb_options(params).spring.om.enabled = ini.GetBoolean(
1260 neb_section, "onsager_machlup",
1261 ParametersLoadAccess::neb_options(params).spring.om.enabled);
1263 ini.GetBoolean(
1264 neb_section, "om_optimize_k",
1265 ParametersLoadAccess::neb_options(params).spring.om.optimize_k);
1267 ini.GetReal(neb_section, "om_k_scale",
1268 ParametersLoadAccess::neb_options(params).spring.om.k_scale);
1270 ini.GetReal(neb_section, "om_k_min",
1271 ParametersLoadAccess::neb_options(params).spring.om.k_min);
1273 ini.GetReal(neb_section, "om_k_max",
1274 ParametersLoadAccess::neb_options(params).spring.om.k_max);
1275
1277 ini.GetBoolean(
1278 neb_section, "climbing_image_method",
1279 ParametersLoadAccess::neb_options(params).climbing_image.enabled);
1281 ini.GetBoolean(neb_section, "climbing_image_converged_only",
1283 .climbing_image.converged_only);
1285 ini.GetReal(
1286 neb_section, "climbing_image_band_slack",
1287 ParametersLoadAccess::neb_options(params).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);
1300
1302 oci.use_mmf = ini.GetBoolean(neb_section, "ci_mmf", oci.use_mmf);
1303 oci.trigger_force =
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);
1313
1314 auto &zoom = ParametersLoadAccess::neb_options(params).zoom;
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);
1335
1337 init.method =
1338 magic_enum::enum_cast<NEBInit>(ini.Get(neb_section, "initializer", ""),
1339 magic_enum::case_insensitive)
1340 .value_or(NEBInit::LINEAR);
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);
1348 init.sidpp_alpha =
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)
1360 .value_or(OptType::Unknown);
1361 if (neb_ipath_optMethod != OptType::None) {
1363 neb_ipath_optMethod;
1364 }
1365 init.oversampling =
1366 ini.GetBoolean(neb_section, "oversampling", init.oversampling);
1367 init.oversampling_factor = ini.GetInteger(neb_section, "oversampling_factor",
1368 init.oversampling_factor);
1369
1370 ParametersLoadAccess::neb_options(params).endpoints.minimize = ini.GetBoolean(
1371 neb_section, "minimize_endpoints",
1372 ParametersLoadAccess::neb_options(params).endpoints.minimize);
1374 ini.GetBoolean(
1375 neb_section, "minimize_endpoints_for_ipath",
1376 ParametersLoadAccess::neb_options(params).endpoints.use_path_file);
1377
1378 // [Dynamics] //
1379
1381 "Dynamics", "time_step",
1382 ParametersLoadAccess::dynamics_options(params).time_step_input);
1387 ini.GetReal("Dynamics", "time",
1388 ParametersLoadAccess::dynamics_options(params).time_input);
1392 if (ParametersLoadAccess::dynamics_options(params).time_step > 0.0) {
1394 static_cast<long>(std::floor(
1396 ParametersLoadAccess::dynamics_options(params).time_step +
1397 0.5));
1398 } else {
1400 }
1402 toLowerCase(ini.Get("Dynamics", "thermostat", "andersen"));
1404 "Dynamics", "andersen_alpha",
1405 ParametersLoadAccess::thermostat_options(params).andersen_alpha);
1407 ini.GetReal(
1408 "Dynamics", "andersen_collision_period",
1409 ParametersLoadAccess::thermostat_options(params).andersen_tcol_input);
1414 ini.GetReal("Dynamics", "nose_mass",
1417 ini.GetReal("Dynamics", "langevin_friction",
1419 .langevin_friction_input);
1423 {
1425 th.path_beads = ini.GetInteger("Dynamics", "path_beads", th.path_beads);
1426 th.path_springs =
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);
1433 const double timeUnit = ParametersLoadAccess::constants(params).timeUnit;
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));
1439 if (seed < 0) {
1440 throw std::invalid_argument("[Dynamics] path_seed must be non-negative");
1441 }
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 " +
1446 th.path_springs);
1447 }
1448 }
1449
1450 // [Parallel Replica]
1451
1453 ini.GetBoolean(
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",
1475 .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",
1496 .corr_time_input);
1500
1501 // [Temperature Accelerated Dynamics] //
1502
1504 ini.GetReal("TAD", "low_temperature",
1505 ParametersLoadAccess::tad_options(params).low_temperature);
1507 ini.GetReal("TAD", "min_prefactor",
1508 ParametersLoadAccess::tad_options(params).min_prefactor);
1510 ini.GetReal("TAD", "confidence",
1511 ParametersLoadAccess::tad_options(params).confidence);
1512
1513 // [Replica Exchange] //
1514
1517 toLowerCase(ini.Get("Replica Exchange", "temperature_distribution",
1519 .temperature_distribution));
1521 ini.GetInteger(
1522 "Replica Exchange", "replicas",
1525 ini.GetInteger("Replica Exchange", "exchange_trials",
1527 .exchange_trials);
1529 ini.GetReal("Replica Exchange", "sampling_time",
1531 .sampling_time_input);
1537 ini.GetReal("Replica Exchange", "temperature_low",
1538 ParametersLoadAccess::main_options(params).temperature);
1540 ini.GetReal("Replica Exchange", "temperature_high",
1542 .temperature_high);
1544 ini.GetReal("Replica Exchange", "exchange_period",
1546 .exchange_period_input);
1551
1552 // [Hyperdynamics] //
1553
1555 ini.GetReal(
1556 "Hyperdynamics", "bb_rmd_time",
1557 ParametersLoadAccess::hyperdynamics_options(params).rmd_time_input);
1562 toLowerCase(ini.Get(
1563 "Hyperdynamics", "bb_boost_atomlist",
1564 ParametersLoadAccess::hyperdynamics_options(params).boost_atom_list));
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",
1580 ParametersLoadAccess::hyperdynamics_options(params).bias_potential));
1581
1582 // [Saddle Search] //
1583
1585 ini.Get("Saddle Search", "method",
1588 toLowerCase(ini.Get(
1589 "Saddle Search", "min_mode_method",
1590 ParametersLoadAccess::saddle_search_options(params).minmode_method));
1592 ini.GetReal("Saddle Search", "displace_magnitude",
1594 .displace_magnitude);
1596 ini.GetReal(
1597 "Saddle Search", "displace_radius",
1598 ParametersLoadAccess::saddle_search_options(params).displace_radius);
1600 "Saddle Search", "max_energy",
1603 ini.GetInteger(
1604 "Saddle Search", "max_iterations",
1605 ParametersLoadAccess::optimizer_options(params).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);
1616 ini.GetReal(
1617 "Saddle Search", "converged_force",
1618 ParametersLoadAccess::optimizer_options(params).converged_force);
1620 ini.GetReal(
1621 "Saddle Search", "perp_force_ratio",
1622 ParametersLoadAccess::saddle_search_options(params).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);
1634 if (params.saddle_search_options().displace_type !=
1646 }
1647 // Parse comma-separated atom list
1648 {
1649 std::string atomListStr =
1650 ini.Get("Saddle Search", "displace_atom_list", "");
1651 if (!atomListStr.empty()) {
1652 std::stringstream ss(atomListStr);
1653 std::string token;
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) {
1659 .displace_atom_list.push_back(
1660 std::stol(token.substr(start, end - start + 1)));
1661 }
1662 }
1663 }
1664 }
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);
1700 }
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);
1732 ini.GetBoolean(
1733 "Saddle Search", "remove_rotation",
1734 ParametersLoadAccess::saddle_search_options(params).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);
1745
1746 // [Basin Hopping] //
1747
1749 ini.GetReal(
1750 "Basin Hopping", "displacement",
1751 ParametersLoadAccess::basin_hopping_options(params).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",
1765 ini.GetInteger(
1766 "Basin Hopping", "quenching_steps",
1767 ParametersLoadAccess::basin_hopping_options(params).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));
1780 if (params.basin_hopping_options().displacement_algorithm != "standard" &&
1781 params.basin_hopping_options().displacement_algorithm != "linear" &&
1782 params.basin_hopping_options().displacement_algorithm != "quadratic") {
1783 EONC_LOG_ERROR("unknown displacement_algorithm {}",
1785 .displacement_algorithm);
1786 error = 1;
1787 }
1790 toLowerCase(ini.Get("Basin Hopping", "displacement_distribution",
1792 .displacement_distribution));
1793 if (params.basin_hopping_options().displacement_distribution != "uniform" &&
1794 params.basin_hopping_options().displacement_distribution != "gaussian") {
1795 EONC_LOG_ERROR("unknown displacement_distribution {}",
1797 .displacement_distribution);
1798 error = 1;
1799 }
1801 ini.GetReal(
1802 "Basin Hopping", "swap_probability",
1803 ParametersLoadAccess::basin_hopping_options(params).swap_probability);
1805 "Basin Hopping", "jump_max",
1808 ini.GetInteger(
1809 "Basin Hopping", "jump_steps",
1812 ini.GetBoolean("Basin Hopping", "adjust_displacement",
1814 .adjust_displacement);
1816 ini.GetInteger(
1817 "Basin Hopping", "adjust_period",
1818 ParametersLoadAccess::basin_hopping_options(params).adjust_period);
1820 ini.GetReal(
1821 "Basin Hopping", "adjust_fraction",
1822 ParametersLoadAccess::basin_hopping_options(params).adjust_fraction);
1824 ini.GetReal(
1825 "Basin Hopping", "target_ratio",
1826 ParametersLoadAccess::basin_hopping_options(params).target_ratio);
1828 ini.GetBoolean(
1829 "Basin Hopping", "write_unique",
1830 ParametersLoadAccess::basin_hopping_options(params).write_unique);
1832 "Basin Hopping", "stop_energy",
1834
1835 // [Global Optimization] //
1836
1838 .move_method = toLowerCase(ini.Get(
1839 "Global Optimization", "move_method",
1842 toLowerCase(
1843 ini.Get("Global Optimization", "decision_method",
1845 .decision_method));
1846 if (params.global_optimization_options().decision_method != "npew" &&
1847 params.global_optimization_options().decision_method != "boltzmann") {
1848 EONC_LOG_ERROR("unknown decision_method {}",
1850 .decision_method);
1851 error = 1;
1852 }
1854 ini.GetInteger(
1855 "Global Optimization", "steps",
1858 "Global Optimization", "beta",
1861 "Global Optimization", "alpha",
1864 ini.GetInteger(
1865 "Global Optimization", "mdmin",
1868 ini.GetReal("Global Optimization", "target_energy",
1870 .target_energy);
1871
1872 // [BGSD] //
1873
1874 ParametersLoadAccess::bgsd_options(params).alpha = ini.GetReal(
1875 "BGSD", "alpha", ParametersLoadAccess::bgsd_options(params).alpha);
1876 ParametersLoadAccess::bgsd_options(params).beta = ini.GetReal(
1877 "BGSD", "beta", ParametersLoadAccess::bgsd_options(params).beta);
1879 ini.GetReal("BGSD", "gradientfinitedifference",
1881 .gradient_finite_difference);
1883 ini.GetReal(
1884 "BGSD", "grad2energyconvergence",
1885 ParametersLoadAccess::bgsd_options(params).grad2energy_convergence);
1887 ini.GetReal(
1888 "BGSD", "grad2forceconvergence",
1889 ParametersLoadAccess::bgsd_options(params).grad2force_convergence);
1890
1891 // [Monte Carlo] //
1892
1894 ini.GetReal("Monte Carlo", "step_size",
1896 ParametersLoadAccess::monte_carlo_options(params).steps = static_cast<int>(
1897 ini.GetInteger("Monte Carlo", "steps",
1899
1900 // [Instanton] //
1901 {
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);
1910 o.beta_hbar_omega =
1911 ini.GetReal("Instanton", "beta_hbar_omega", o.beta_hbar_omega);
1912 o.max_iterations =
1913 ini.GetInteger("Instanton", "max_iterations", o.max_iterations);
1914 o.force_tolerance =
1915 ini.GetReal("Instanton", "force_tolerance", o.force_tolerance);
1916 o.hessian_stride =
1917 ini.GetInteger("Instanton", "hessian_stride", o.hessian_stride);
1918 o.saddle_filename =
1919 ini.Get("Instanton", "saddle_filename", o.saddle_filename);
1920 o.temperature = ini.GetReal("Instanton", "temperature", o.temperature);
1921 o.temperatures.clear();
1922 {
1923 const std::string list = ini.Get("Instanton", "temperatures", "");
1924 std::stringstream ss(list);
1925 std::string token;
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) {
1930 continue;
1931 }
1932 try {
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 "
1938 "values, not " +
1939 token);
1940 }
1941 }
1942 }
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);
1951 }
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);
1959 }
1960 if (o.mode != "splitting" && o.mode != "rate") {
1961 throw std::invalid_argument("[Instanton] mode must be splitting or rate, "
1962 "not " +
1963 o.mode);
1964 }
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);
1972 o.pi_thermostat =
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);
1976 o.pi_pile_scale =
1977 ini.GetReal("Instanton", "pi_pile_scale", o.pi_pile_scale);
1978 o.pi_seed = ini.GetInteger("Instanton", "pi_seed", o.pi_seed);
1979 o.pi_direction =
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);
1992 }
1993
1994 // [OH_TST] //
1995
1997 ini.Get("OH_TST", "reactant_filename",
1998 ParametersLoadAccess::oh_tst_options(params).reactant_filename);
2000 ini.Get("OH_TST", "product_filename",
2001 ParametersLoadAccess::oh_tst_options(params).product_filename);
2003 ini.GetReal("OH_TST", "time_step",
2004 ParametersLoadAccess::oh_tst_options(params).time_step);
2006 ini.GetInteger("OH_TST", "equil_steps",
2007 ParametersLoadAccess::oh_tst_options(params).equil_steps);
2009 ini.GetInteger("OH_TST", "sample_steps",
2010 ParametersLoadAccess::oh_tst_options(params).sample_steps);
2012 ini.GetInteger("OH_TST", "max_planes",
2013 ParametersLoadAccess::oh_tst_options(params).max_planes);
2015 ini.GetReal("OH_TST", "plane_mass",
2016 ParametersLoadAccess::oh_tst_options(params).plane_mass);
2018 ini.GetReal("OH_TST", "alpha_rot",
2019 ParametersLoadAccess::oh_tst_options(params).alpha_rot);
2021 ini.GetReal("OH_TST", "plane_time_step",
2022 ParametersLoadAccess::oh_tst_options(params).plane_time_step);
2023 ParametersLoadAccess::oh_tst_options(params).ds_max = ini.GetReal(
2024 "OH_TST", "ds_max", ParametersLoadAccess::oh_tst_options(params).ds_max);
2026 ini.GetReal("OH_TST", "dtheta_max",
2027 ParametersLoadAccess::oh_tst_options(params).dtheta_max);
2029 ini.GetReal("OH_TST", "force_tol",
2030 ParametersLoadAccess::oh_tst_options(params).force_tol);
2031 ParametersLoadAccess::oh_tst_options(params).s_init = ini.GetReal(
2032 "OH_TST", "s_init", ParametersLoadAccess::oh_tst_options(params).s_init);
2034 ini.GetInteger(
2035 "OH_TST", "reactant_md_steps",
2036 ParametersLoadAccess::oh_tst_options(params).reactant_md_steps);
2038 ini.Get("OH_TST", "symmetry_products",
2039 ParametersLoadAccess::oh_tst_options(params).symmetry_products);
2041 ini.GetReal("OH_TST", "max_delta_a",
2042 ParametersLoadAccess::oh_tst_options(params).max_delta_a);
2044 ini.Get("OH_TST", "thermostat",
2045 ParametersLoadAccess::oh_tst_options(params).thermostat));
2047 ini.Get("OH_TST", "gle_a_file",
2048 ParametersLoadAccess::oh_tst_options(params).gle_a_file);
2050 ini.GetBoolean("OH_TST", "pmf_scan",
2051 ParametersLoadAccess::oh_tst_options(params).pmf_scan);
2053 ini.GetInteger("OH_TST", "scan_planes",
2054 ParametersLoadAccess::oh_tst_options(params).scan_planes);
2055
2056 return error;
2057}
2058
2060 // Time unit conversions
2061 double tu = ParametersLoadAccess::constants(params).timeUnit;
2066
2071 if (ParametersLoadAccess::dynamics_options(params).time_step > 0.0) {
2073 static_cast<long>(std::floor(
2075 ParametersLoadAccess::dynamics_options(params).time_step +
2076 0.5));
2077 } else {
2079 }
2080
2083 tu;
2084
2088 tu;
2092 tu;
2096 tu;
2099 tu;
2100
2104 tu;
2107
2110
2115 tu;
2119 tu;
2120
2121 // Cross-group defaults
2126}
2127
2128} // namespace eonc::config
#define EONC_LOG_ERROR(...)
Definition EonLogger.h:261
#define EONC_LOG_WARNING(...)
Definition EonLogger.h:255
const gp_surrogate_options_t & gp_surrogate_options() const
const potential_options_t & potential_options() const
const saddle_search_options_t & saddle_search_options() const
const global_optimization_options_t & global_optimization_options() const
const basin_hopping_options_t & basin_hopping_options() const
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.
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 four the optimi...
void set_write_con_forces(bool enabled) noexcept
Whether written .con frames carry "Forces of Component" sections.
void validateOptions(const instanton_options_t &o)
Throws std::invalid_argument on an inconsistent [Instanton] pi_* key.
Definition PIQTSTJob.cpp:31
double random(long newSeed=0)
static gp_surrogate_options_t & gp_surrogate_options(Parameters &p)
static lanczos_options_t & lanczos_options(Parameters &p)
static ase_nwchem_options_t & ase_nwchem_options(Parameters &p)
static hyperdynamics_options_t & hyperdynamics_options(Parameters &p)
static monte_carlo_options_t & monte_carlo_options(Parameters &p)
static xtb_options_t & xtb_options(Parameters &p)
static thermostat_options_t & thermostat_options(Parameters &p)
static dimer_options_t & dimer_options(Parameters &p)
static socket_nwchem_options_t & socket_nwchem_options(Parameters &p)
static replica_exchange_options_t & replica_exchange_options(Parameters &p)
static constants_t & constants(Parameters &p)
static dftd_options_t & dftd_options(Parameters &p)
static ase_orca_options_t & ase_orca_options(Parameters &p)
static ira_options_t & ira_options(Parameters &p)
static debug_options_t & debug_options(Parameters &p)
static hessian_options_t & hessian_options(Parameters &p)
static instanton_options_t & instanton_options(Parameters &p)
static saddle_search_options_t & saddle_search_options(Parameters &p)
static dynamics_options_t & dynamics_options(Parameters &p)
static structure_comparison_options_t & structure_comparison_options(Parameters &p)
static main_options_t & main_options(Parameters &p)
static oh_tst_options_t & oh_tst_options(Parameters &p)
static gpr_dimer_options_t & gpr_dimer_options(Parameters &p)
static prefactor_options_t & prefactor_options(Parameters &p)
static bgsd_options_t & bgsd_options(Parameters &p)
static process_search_options_t & process_search_options(Parameters &p)
static ams_options_t & ams_options(Parameters &p)
static neb_options_t & neb_options(Parameters &p)
static tad_options_t & tad_options(Parameters &p)
static artn_options_t & artn_options(Parameters &p)
static expr_options_t & expr_options(Parameters &p)
static global_optimization_options_t & global_optimization_options(Parameters &p)
static mopac_options_t & mopac_options(Parameters &p)
static optimizer_options_t & optimizer_options(Parameters &p)
static rgpot_options_t & rgpot_options(Parameters &p)
static metatomic_options_t & metatomic_options(Parameters &p)
static serve_options_t & serve_options(Parameters &p)
static davidson_options_t & davidson_options(Parameters &p)
static basin_hopping_options_t & basin_hopping_options(Parameters &p)
static potential_options_t & potential_options(Parameters &p)
static parallel_replica_options_t & parallel_replica_options(Parameters &p)
static catlearn_options_t & catlearn_options(Parameters &p)
static zbl_options_t & zbl_options(Parameters &p)
struct eonc::ams_options_t::env_t env
bool diagonal_preconditioner
Heuristic | (H v)_i / v_i | preconditioner (not true diag(H); off by default).
std::string phva_atoms
PHVA mobile/active set for the Ritz space; "All" = all free atoms.
DimerRotationBackend rotation_backend
struct eonc::gpr_dimer_options_t::prune_params_t prune_params
struct eonc::gpr_dimer_options_t::gpr_params_t gpr_params
struct eonc::gpr_dimer_options_t::debug_params_t debug_params
struct eonc::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...
struct eonc::metatomic_options_t::variants_t variant
double band_slack
When converged_only is on, the rest of the band may still be this many times the force tolerance.
struct eonc::neb_options_t::climbing_image_options_t::hybrid_dimer_t ocineb
double pressure
Hydrostatic pressure in eV/Angstrom^3.
struct eonc::neb_options_t::spring_options_t::energy_weighting_t weighting
struct eonc::neb_options_t::spring_options_t::onsager_machlup_t om
std::string match_method
"ira" uses IRACompare. "hungarian" is accepted and falls back to ira.
struct eonc::neb_options_t::climbing_image_options_t climbing_image
struct eonc::neb_options_t::zoom_options_t zoom
struct eonc::neb_options_t::endpoint_options_t endpoints
struct eonc::neb_options_t::spring_options_t spring
struct eonc::neb_options_t::solid_state_options_t solid_state
bool match_endpoints
Permute+rotate the reactant onto the product before interpolation.
struct eonc::neb_options_t::path_initialization_t initialization
struct eonc::neb_options_t::mmf_peak_options_t mmf_peaks
struct eonc::optimizer_options_t::sd_t sd
struct eonc::optimizer_options_t::refine_t refine
struct eonc::optimizer_options_t::quickmin_t quickmin
struct eonc::optimizer_options_t::xtsci_t xtsci
struct eonc::optimizer_options_t::cg_t cg
struct eonc::optimizer_options_t::lbfgs_t lbfgs
bool thread_safe
When false, NEB/dimer/process_search never share one Potential across threads, even if the backend re...
std::string backend
"nwchemc", "cpmdc", "metatomic", or "xtb"
struct eonc::saddle_search_options_t::dynamics_t dynamics
std::vector< long > displace_atom_list
struct eonc::saddle_search_options_t::confine_positive_t confine_positive