Loading...
Searching...
No Matches
Parameters.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/Parameters.h"
13#include "eon/ParametersINI.h"
14#include "eon/ParametersJSON.h"
15#include "eon/ParametersSSOT.h"
16#include "magic_enum/magic_enum.hpp"
17
18#include <INIReader.h>
19
20#include <cerrno>
21#include <cstdio>
22#include <cstring>
23
24#include "eon/EonLogger.h"
25
27 // Covered groups: defaults originate from schema/eon_params.capnp via
28 // apply_ssot_defaults (codegen). Uncovered groups still use NSDMI.
30 // Resolve computed fields via validate_and_link.
32}
33
34int Parameters::load(std::string filename) {
35 INIReader ini(filename);
36 if (ini.ParseError() < 0) {
37 EONC_LOG_ERROR("Can't load INI file: {}", filename);
38 return 1;
39 }
40
41 int error = eonc::config::load_ini(ini, *this);
42
43 // Sanity Checks
44 if (parallel_replica_options.state_check_interval > dynamics_options.time &&
45 magic_enum::enum_name<JobType>(main_options.job) == "parallel_replica") {
46 EONC_LOG_ERROR("[Parallel Replica] state_check_interval must be <= time");
47 error = 1;
48 }
49
50 if (!neb_options.initialization.input_path.empty() &&
51 neb_options.initialization.method == NEBInit::LINEAR) {
53 "[Nudged Elastic Band] 'initial_path_in' is provided, but "
54 "'initializer' defaults to linear. "
55 "Ensure this is intentional, as the loaded path will not be "
56 "used without initializer set to file.");
57 }
58
59 if (saddle_search_options.dynamics.record_interval_input >
60 saddle_search_options.dynamics.state_check_interval_input) {
61 EONC_LOG_ERROR("[Saddle Search] dynamics_record_interval must be <= "
62 "dynamics_state_check_interval");
63 error = 1;
64 }
65
66 if (potential_options.potential == PotType::AMS ||
68 if (ams_options.forcefield.empty() && ams_options.model.empty() &&
69 ams_options.xc.empty()) {
70 EONC_LOG_ERROR("[AMS] Must provide atleast forcefield or model or xc");
71 error = 1;
72 }
73
74 if (!ams_options.forcefield.empty() && !ams_options.model.empty() &&
75 !ams_options.xc.empty()) {
76 EONC_LOG_ERROR("[AMS] Must provide either forcefield or model");
77 error = 1;
78 }
79 }
80
81 return error;
82}
83
85 // Legacy FILE* overload: read into string buffer, use INIReader buffer ctor
86 fseek(file, 0, SEEK_END);
87 long size = ftell(file);
88 fseek(file, 0, SEEK_SET);
89
90 std::string buffer(size, '\0');
91 fread(buffer.data(), 1, size, file);
92
93 INIReader ini(buffer.c_str(), buffer.size());
94 if (ini.ParseError() < 0) {
95 EONC_LOG_ERROR("Couldn't parse the ini file from FILE*");
96 return 1;
97 }
98
99 int error = eonc::config::load_ini(ini, *this);
100 // Same validation as the filename overload
101 // (duplicated intentionally for now; will be extracted to validate())
102 if (parallel_replica_options.state_check_interval > dynamics_options.time &&
103 magic_enum::enum_name<JobType>(main_options.job) == "parallel_replica") {
104 EONC_LOG_ERROR("[Parallel Replica] state_check_interval must be <= time");
105 error = 1;
106 }
107 if (saddle_search_options.dynamics.record_interval_input >
108 saddle_search_options.dynamics.state_check_interval_input) {
109 EONC_LOG_ERROR("[Saddle Search] dynamics_record_interval must be <= "
110 "dynamics_state_check_interval");
111 error = 1;
112 }
113 return error;
114}
115
116int Parameters::load_json(const std::string &json_str) {
117 return eonc::config::load_json(json_str, *this);
118}
119
120std::string Parameters::to_json() const {
121 return eonc::config::to_json(*this).dump(2);
122}
#define EONC_LOG_ERROR(...)
Definition EonLogger.h:262
#define EONC_LOG_WARNING(...)
Definition EonLogger.h:256
int load_json(const std::string &json_str)
struct eonc::Parameters::neb_options_t neb_options
int load(std::string filename)
std::string to_json() const
struct eonc::Parameters::potential_options_t potential_options
struct eonc::Parameters::ams_options_t ams_options
struct eonc::Parameters::saddle_search_options_t saddle_search_options
struct eonc::Parameters::dynamics_options_t dynamics_options
struct eonc::Parameters::main_options_t main_options
struct eonc::Parameters::parallel_replica_options_t parallel_replica_options
int load_ini(INIReader &ini, Parameters &params)
Parse all INI sections into the Parameters struct.
void apply_ssot_defaults(Parameters &p)
Apply SSoT defaults for covered groups (Main, Potential, Optimizer, Structure Comparison,...
json to_json(const Parameters &p)
Serialize all Parameters to JSON.
void validate_and_link(Parameters &params)
Resolve cross-group defaults and time unit conversions.
int load_json(const std::string &json_str, Parameters &params)
Load Parameters from a JSON string. Returns 0 on success.