OpenPFC  0.1.4
Phase Field Crystal simulation framework
Loading...
Searching...
No Matches
field_modifier_registry.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 VTT Technical Research Centre of Finland Ltd
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
17#ifndef PFC_UI_FIELD_MODIFIER_REGISTRY_HPP
18#define PFC_UI_FIELD_MODIFIER_REGISTRY_HPP
19
20#include "errors.hpp"
21#include "from_json.hpp"
30#include <functional>
31#include <memory>
32#include <string>
33#include <unordered_map>
34
35namespace pfc {
36namespace ui {
37
38using FieldModifier_p = std::unique_ptr<FieldModifier>;
39
50public:
51 using CreatorFunction = std::function<FieldModifier_p(const json &)>;
52
61
68 void register_modifier(const std::string &type, CreatorFunction creator) {
69 modifiers[type] = creator;
70 }
71
79 FieldModifier_p create_modifier(const std::string &type, const json &data) {
80 auto it = modifiers.find(type);
81 if (it != modifiers.end()) {
82 return it->second(data);
83 }
84 throw std::invalid_argument(format_unknown_modifier_error(type));
85 }
86
87private:
92
93 std::unordered_map<std::string, CreatorFunction>
94 modifiers;
96};
97
107template <typename T> void register_field_modifier(const std::string &type) {
108 FieldModifierRegistry::get_instance().register_modifier(
109 type, [](const json &params) -> std::unique_ptr<T> {
110 std::unique_ptr<T> modifier = std::make_unique<T>();
111 from_json(params, *modifier);
112 return modifier;
113 });
114}
115
128std::unique_ptr<FieldModifier> create_field_modifier(const std::string &type,
129 const json &params) {
130 return FieldModifierRegistry::get_instance().create_modifier(type, params);
131}
132
152 // Initial conditions
158 // Boundary conditions
161 // Register other field modifiers here ...
162 }
163};
164
165static FieldModifierInitializer
166 fieldModifierInitializer;
170} // namespace ui
171} // namespace pfc
172
173#endif // PFC_UI_FIELD_MODIFIER_REGISTRY_HPP
A registry for field modifiers used in the application.
Definition field_modifier_registry.hpp:49
static FieldModifierRegistry & get_instance()
Get the singleton instance of the FieldModifierRegistry.
Definition field_modifier_registry.hpp:57
FieldModifier_p create_modifier(const std::string &type, const json &data)
Create an instance of a field modifier based on its registered type.
Definition field_modifier_registry.hpp:79
void register_modifier(const std::string &type, CreatorFunction creator)
Register a field modifier with its creator function.
Definition field_modifier_registry.hpp:68
Constant value initial condition.
Helpful error message formatting for JSON configuration validation.
std::string format_unknown_modifier_error(const std::string &invalid_type, const std::string &context="field modifier")
Format error for unknown field modifier type.
Definition errors.hpp:289
Base class for initial conditions and boundary conditions.
void register_field_modifier(const std::string &type)
Register a field modifier type with the FieldModifierRegistry.
Definition field_modifier_registry.hpp:107
std::unique_ptr< FieldModifier > create_field_modifier(const std::string &type, const json &params)
Create an instance of a field modifier based on its type.
Definition field_modifier_registry.hpp:128
Read initial conditions from binary file.
Fixed boundary condition with smooth transition.
JSON deserialization functions for OpenPFC types.
Moving boundary condition that tracks solidification front.
Random distribution of crystalline seeds initial condition.
Regular grid of crystalline seeds initial condition.
Single spherical crystalline seed initial condition.
Helper struct for registering field modifiers during static initialization.
Definition field_modifier_registry.hpp:143
FieldModifierInitializer()
Constructor for FieldModifierInitializer.
Definition field_modifier_registry.hpp:151
Represents the global simulation domain (the "world").
Definition world.hpp:91