NEML2 2.1.0
Loading...
Searching...
No Matches
Factory.h
1// Copyright 2024, UChicago Argonne, LLC
2// All Rights Reserved
3// Software Name: NEML2 -- the New Engineering material Model Library, version 2
4// By: Argonne National Laboratory
5// OPEN SOURCE LICENSE (MIT)
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in
15// all copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23// THE SOFTWARE.
24
25#pragma once
26
27#include "neml2/misc/errors.h"
28#include "neml2/base/InputFile.h"
29
30namespace neml2
31{
32// Forward decl
33class Settings;
34class Factory;
35class NEML2Object;
36class EquationSystem;
37class Solver;
38class Data;
39class Model;
40class Driver;
41class WorkScheduler;
42
49{
50public:
52
54 InputFile & input_file() { return _input_file; }
55
57 const InputFile & input_file() const { return _input_file; }
58
60 const std::shared_ptr<Settings> & settings() const { return _input_file.settings(); }
61
63 bool has_object(const std::string & section, const std::string & name);
64
81 template <class T>
82 std::shared_ptr<T> get_object(const std::string & section,
83 const std::string & name,
84 const OptionSet & additional_options = OptionSet(),
85 bool force_create = true);
86
88 template <class T = EquationSystem>
89 std::shared_ptr<T> get_es(const std::string & name);
91 template <class T = Solver>
92 std::shared_ptr<T> get_solver(const std::string & name);
94 template <class T = Data>
95 std::shared_ptr<T> get_data(const std::string & name);
97 template <class T = Model>
98 std::shared_ptr<T> get_model(const std::string & name);
100 template <class T = Driver>
101 std::shared_ptr<T> get_driver(const std::string & name);
103 template <class T = WorkScheduler>
104 std::shared_ptr<T> get_scheduler(const std::string & name);
105
107 void clear();
108
114 void print(std::ostream & os = std::cout);
115
116protected:
123 void create_object(const std::string & section, const OptionSet & options);
124
125private:
127 bool options_compatible(const std::shared_ptr<NEML2Object> & obj, const OptionSet & opts) const;
128
130 InputFile _input_file;
131
136 std::map<std::string, std::map<std::string, std::vector<std::shared_ptr<NEML2Object>>>> _objects;
137};
138
139template <class T>
140std::shared_ptr<T>
141Factory::get_object(const std::string & section,
142 const std::string & name,
143 const OptionSet & additional_options,
144 bool force_create)
145{
146 if (input_file().data().empty())
147 throw FactoryException("The input file is empty.");
148
149 // Easy if it already exists
150 if (!force_create)
151 if (_objects.count(section) && _objects.at(section).count(name))
152 for (const auto & neml2_obj : _objects[section][name])
153 {
154 // Check for option clash
155 if (!options_compatible(neml2_obj, additional_options))
156 continue;
157
158 // Check for object type
159 auto obj = std::dynamic_pointer_cast<T>(neml2_obj);
160 if (!obj)
161 throw FactoryException(
162 "Found object named " + name + " under section " + section +
163 ". But dynamic cast failed. Did you specify the correct object type?");
164
165 return obj;
166 }
167
168 // Otherwise try to create it
169 for (const auto & options : _input_file[section])
170 if (options.first == name)
171 {
172 auto new_options = options.second;
173 new_options.set_private<Factory *>("_factory", this);
174 new_options.set_private<std::shared_ptr<Settings>>("_settings", settings());
175 new_options += additional_options;
176 create_object(section, new_options);
177 break;
178 }
179
180 if (!_objects.count(section) || !_objects.at(section).count(name))
181 throw FactoryException("Failed to get object named " + name + " under section " + section +
182 ". Check to make sure the object is defined in the input file.");
183
184 auto obj = std::dynamic_pointer_cast<T>(_objects[section][name].back());
185
186 if (!obj)
187 throw FactoryException("Found object named " + name + " under section " + section +
188 ". But dynamic cast failed. Did you specify the correct object type?");
189
190 return obj;
191}
192
193template <class T>
194std::shared_ptr<T>
195Factory::get_es(const std::string & name)
196{
197 return get_object<T>("EquationSystems", name);
198}
199
200template <class T>
201std::shared_ptr<T>
202Factory::get_solver(const std::string & name)
203{
204 return get_object<T>("Solvers", name);
205}
206
207template <class T>
208std::shared_ptr<T>
209Factory::get_data(const std::string & name)
210{
211 return get_object<T>("Data", name);
212}
213
214template <class T>
215std::shared_ptr<T>
216Factory::get_model(const std::string & name)
217{
218 return get_object<T>("Models", name);
219}
220
221template <class T>
222std::shared_ptr<T>
223Factory::get_driver(const std::string & name)
224{
225 return get_object<T>("Drivers", name);
226}
227
228template <class T>
229std::shared_ptr<T>
230Factory::get_scheduler(const std::string & name)
231{
232 return get_object<T>("Schedulers", name);
233}
234} // namespace neml2
Definition Data.h:40
The Driver drives the execution of a NEML2 Model.
Definition Driver.h:44
Base class for manufacturable objects under the EquationSystems section.
Definition EquationSystem.h:33
Definition errors.h:73
Definition Factory.h:49
std::shared_ptr< T > get_object(const std::string &section, const std::string &name, const OptionSet &additional_options=OptionSet(), bool force_create=true)
Retrive an object pointer under the given section with the given object name.
Definition Factory.h:141
std::shared_ptr< T > get_driver(const std::string &name)
Get a driver by its name.
Definition Factory.h:223
std::shared_ptr< T > get_data(const std::string &name)
Get a data by its name.
Definition Factory.h:209
void create_object(const std::string &section, const OptionSet &options)
Manufacture a single NEML2Object.
std::shared_ptr< T > get_es(const std::string &name)
Get an equation system by its name.
Definition Factory.h:195
const std::shared_ptr< Settings > & settings() const
Global settings.
Definition Factory.h:60
Factory(InputFile)
std::shared_ptr< T > get_model(const std::string &name)
Get a model by its name.
Definition Factory.h:216
std::shared_ptr< T > get_scheduler(const std::string &name)
Get a scheduler by its name.
Definition Factory.h:230
bool has_object(const std::string &section, const std::string &name)
Check if an object with the given name exists under the given section.
InputFile & input_file()
Get the input file.
Definition Factory.h:54
const InputFile & input_file() const
Get the input file.
Definition Factory.h:57
void clear()
Delete all factories and destruct all the objects.
std::shared_ptr< T > get_solver(const std::string &name)
Get a solver by its name.
Definition Factory.h:202
void print(std::ostream &os=std::cout)
List all the manufactured objects.
A data structure that holds options of multiple objects.
Definition InputFile.h:37
The base class for all constitutive models.
Definition Model.h:82
The base class of all "manufacturable" objects in the NEML2 library.
Definition NEML2Object.h:52
A custom map-like data structure. The keys are strings, and the values can be nonhomogeneously typed.
Definition OptionSet.h:54
Definition Settings.h:35
The solver solves a system of equations.
Definition Solver.h:37
Scheduler for work dispatching.
Definition WorkScheduler.h:48
Definition DiagnosticsInterface.h:31
std::string name(ElasticConstant p)