Theseus
Compressible flow solver
Loading...
Searching...
No Matches
ConditionFactory.hpp
Go to the documentation of this file.
1// Copyright (c) 2025-2026 Board of Trustees of the University of Illinois
2//
3// This file is part of Theseus.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6#pragma once
7
8#include <map>
9#include <string>
10#include <functional>
11#include <iostream>
12
13#include "mfem.hpp"
14
15namespace Prandtl
16{
17
18 // Aliases for an initial condition function.
19 using IC_Function0 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>()>;
20 using IC_Function1 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>(mfem::real_t)>;
21 using IC_Function2 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>(mfem::real_t, mfem::real_t)>;
22 using IC_Function3 = std::function<std::function<void(const mfem::Vector&,
23 mfem::Vector&)>(mfem::real_t, mfem::real_t, mfem::real_t)>;
24 using IC_Function4 = std::function<std::function<void(const mfem::Vector&,
25 mfem::Vector&)>(mfem::real_t, mfem::real_t,
26 mfem::real_t, mfem::real_t)>;
27 using IC_Function5 = std::function<std::function<void(const mfem::Vector&,
28 mfem::Vector&)>(mfem::real_t, mfem::real_t, mfem::real_t,
29 mfem::real_t, mfem::real_t)>;
30
31 // Aliases for boundary condition function functions, vectors, and scalars.
32 using BC_VectorFunction0 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>()>;
33 using BC_VectorFunction1 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>(mfem::real_t)>;
34 using BC_VectorFunction2 = std::function<std::function<void(const mfem::Vector&, mfem::Vector&)>(mfem::real_t, mfem::real_t)>;
35
36 using BC_ScalarFunction0 = std::function<std::function<mfem::real_t(const mfem::Vector&)>()>;
37 using BC_ScalarFunction1 = std::function<std::function<mfem::real_t(const mfem::Vector&)>(mfem::real_t)>;
38 using BC_ScalarFunction2 = std::function<std::function<mfem::real_t(const mfem::Vector&)>(mfem::real_t, mfem::real_t)>;
39
40 using BC_VectorTDFunction0 = std::function<std::function<void(const mfem::Vector&, mfem::real_t, mfem::Vector&)>()>;
41 using BC_VectorTDFunction1 = std::function<std::function<void(const mfem::Vector&, mfem::real_t,
42 mfem::Vector&)>(mfem::real_t)>;
43 using BC_VectorTDFunction2 = std::function<std::function<void(const mfem::Vector&, mfem::real_t,
44 mfem::Vector&)>(mfem::real_t, mfem::real_t)>;
45
46 using BC_ScalarTDFunction0 = std::function<std::function<mfem::real_t(const mfem::Vector&, mfem::real_t)>()>;
47 using BC_ScalarTDFunction1 = std::function<std::function<mfem::real_t(const mfem::Vector&, mfem::real_t)>(mfem::real_t)>;
48 using BC_ScalarTDFunction2 = std::function<std::function<mfem::real_t(const mfem::Vector&,
49 mfem::real_t)>(mfem::real_t, mfem::real_t)>;
50
51 using BC_Scalar = mfem::real_t;
52 using BC_Vector = mfem::Vector;
53
54
56 {
57 public:
59 {
60 static ConditionFactory instance;
61 return instance;
62 }
63
64 // Registration of initial condition function no parameters.
65 void RegisterInitialCondition0(const std::string &key, IC_Function0 func)
66 {
67 initialConditions0_[key] = func;
68 }
69
70 // Registration of initial condition function with one parameter
71 void RegisterInitialCondition1(const std::string &key, IC_Function1 func)
72 {
73 initialConditions1_[key] = func;
74 }
75
76 // Registration of initial condition function with two parameters
77 void RegisterInitialCondition2(const std::string &key, IC_Function2 func)
78 {
79 initialConditions2_[key] = func;
80 }
81
82 // Registration of initial condition function with three parameters
83 void RegisterInitialCondition3(const std::string &key, IC_Function3 func)
84 {
85 initialConditions3_[key] = func;
86 }
87
88 // Registration of initial condition function with four parameters
89 void RegisterInitialCondition4(const std::string &key, IC_Function4 func)
90 {
91 initialConditions4_[key] = func;
92 }
93
94 // Registration of initial condition function with five parameters
95 void RegisterInitialCondition5(const std::string &key, IC_Function5 func)
96 {
97 initialConditions5_[key] = func;
98 }
99
100 // Lookup initial condition function
101 IC_Function0 GetInitialCondition0(const std::string &key)
102 {
103 return initialConditions0_.at(key);
104 }
105
106 // Lookup initial condition function with one parameter
107 IC_Function1 GetInitialCondition1(const std::string &key)
108 {
109 return initialConditions1_.at(key);
110 }
111
112 // Lookup initial condition function with two parameters
113 IC_Function2 GetInitialCondition2(const std::string &key)
114 {
115 return initialConditions2_.at(key);
116 }
117
118 // Lookup initial condition function with three parameters
119 IC_Function3 GetInitialCondition3(const std::string &key)
120 {
121 return initialConditions3_.at(key);
122 }
123
124 // Lookup initial condition function with four parameters
125 IC_Function4 GetInitialCondition4(const std::string &key)
126 {
127 return initialConditions4_.at(key);
128 }
129
130 // Lookup initial condition function with five parameters
131 IC_Function5 GetInitialCondition5(const std::string &key)
132 {
133 return initialConditions5_.at(key);
134 }
135
136 // Registration of vector function boundary conditions with no parameters
138 {
139 boundaryConditionsVectorFunction0_[key] = func;
140 }
141
142 // Registration of scalar function boundary conditions with no parameters
144 {
145 boundaryConditionsScalarFunction0_[key] = func;
146 }
147
148 // Registration of vector function boundary conditions with one parameter
150 {
151 boundaryConditionsVectorFunction1_[key] = func;
152 }
153
154 // Registration of scalar function boundary conditions with one parameter
156 {
157 boundaryConditionsScalarFunction1_[key] = func;
158 }
159
160 // Registration of vector function boundary conditions with two parameters
162 {
163 boundaryConditionsVectorFunction2_[key] = func;
164 }
165
166 // Registration of scalar function boundary conditions with two parameters
168 {
169 boundaryConditionsScalarFunction2_[key] = func;
170 }
171
172 // Registration of vector time-dependent function boundary conditions with no parameters
174 {
175 boundaryConditionsVectorTDFunction0_[key] = func;
176 }
177
178 // Registration of scalar time-dependent function boundary conditions with no parameters
180 {
181 boundaryConditionsScalarTDFunction0_[key] = func;
182 }
183
184 // Registration of vector time-dependent function boundary conditions with one parameter
186 {
187 boundaryConditionsVectorTDFunction1_[key] = func;
188 }
189
190 // Registration of scalar time-dependent function boundary conditions with one parameter
192 {
193 boundaryConditionsScalarTDFunction1_[key] = func;
194 }
195
196 // Registration of vector time-dependent function boundary conditions with two parameters
198 {
199 boundaryConditionsVectorTDFunction2_[key] = func;
200 }
201
202 // Registration of scalar time-dependent function boundary conditions with two parameters
204 {
205 boundaryConditionsScalarTDFunction2_[key] = func;
206 }
207
208 // Registration of vector boundary conditions
209 void RegisterVectorBoundaryCondition(const std::string &key, BC_Vector vector)
210 {
211 boundaryConditionsVector_[key] = vector;
212 }
213
214 // Registration of scalar boundary conditions
215 void RegisterScalarBoundaryCondition(const std::string &key, BC_Scalar scalar)
216 {
217 boundaryConditionsScalar_[key] = scalar;
218 }
219
220 // Lookup vector functionboundary condition with no parameters
222 {
223 return boundaryConditionsVectorFunction0_.at(key);
224 }
225
226 // Lookup scalar function boundary condition with no parameters
228 {
229 return boundaryConditionsScalarFunction0_.at(key);
230 }
231
232 // Lookup vector function boundary condition with one parameter
234 {
235 return boundaryConditionsVectorFunction1_.at(key);
236 }
237
238 // Lookup scalar function boundary condition with one parameter
240 {
241 return boundaryConditionsScalarFunction1_.at(key);
242 }
243
244 // Lookup vector function boundary condition with two parameters
246 {
247 return boundaryConditionsVectorFunction2_.at(key);
248 }
249
250 // Lookup scalar function boundary condition with two parameters
252 {
253 return boundaryConditionsScalarFunction2_.at(key);
254 }
255
256 // Lookup vector time-dependent function boundary condition with no parameters
258 {
259 return boundaryConditionsVectorTDFunction0_.at(key);
260 }
261
262 // Lookup scalar time-dependent function boundary condition with no parameters
264 {
265 return boundaryConditionsScalarTDFunction0_.at(key);
266 }
267
268 // Lookup vector time-dependent function boundary condition with one parameter
270 {
271 return boundaryConditionsVectorTDFunction1_.at(key);
272 }
273
274 // Lookup scalar time-dependent function boundary condition with one parameter
276 {
277 return boundaryConditionsScalarTDFunction1_.at(key);
278 }
279
280 // Lookup vector time-dependent function boundary condition with two parameters
282 {
283 return boundaryConditionsVectorTDFunction2_.at(key);
284 }
285
286 // Lookup scalar time-dependent function boundary condition with two parameters
288 {
289 return boundaryConditionsScalarTDFunction2_.at(key);
290 }
291
292 // Lookup vector boundary condition
293 BC_Vector GetVectorBoundaryCondition(const std::string &key)
294 {
295 return boundaryConditionsVector_.at(key);
296 }
297
298 // Lookup scalar boundary condition
299 BC_Scalar GetScalarBoundaryCondition(const std::string &key)
300 {
301 return boundaryConditionsScalar_.at(key);
302 }
303
304
305 private:
307
308 std::map<std::string, IC_Function0> initialConditions0_;
309 std::map<std::string, IC_Function1> initialConditions1_;
310 std::map<std::string, IC_Function2> initialConditions2_;
311 std::map<std::string, IC_Function3> initialConditions3_;
312 std::map<std::string, IC_Function4> initialConditions4_;
313 std::map<std::string, IC_Function5> initialConditions5_;
314
315 std::map<std::string, BC_VectorFunction0> boundaryConditionsVectorFunction0_;
316 std::map<std::string, BC_VectorFunction1> boundaryConditionsVectorFunction1_;
317 std::map<std::string, BC_VectorFunction2> boundaryConditionsVectorFunction2_;
318
319 std::map<std::string, BC_ScalarFunction0> boundaryConditionsScalarFunction0_;
320 std::map<std::string, BC_ScalarFunction1> boundaryConditionsScalarFunction1_;
321 std::map<std::string, BC_ScalarFunction2> boundaryConditionsScalarFunction2_;
322
323 std::map<std::string, BC_VectorTDFunction0> boundaryConditionsVectorTDFunction0_;
324 std::map<std::string, BC_VectorTDFunction1> boundaryConditionsVectorTDFunction1_;
325 std::map<std::string, BC_VectorTDFunction2> boundaryConditionsVectorTDFunction2_;
326
327 std::map<std::string, BC_ScalarTDFunction0> boundaryConditionsScalarTDFunction0_;
328 std::map<std::string, BC_ScalarTDFunction1> boundaryConditionsScalarTDFunction1_;
329 std::map<std::string, BC_ScalarTDFunction2> boundaryConditionsScalarTDFunction2_;
330
331 std::map<std::string, BC_Vector> boundaryConditionsVector_;
332
333 std::map<std::string, BC_Scalar> boundaryConditionsScalar_;
334
335 };
336
337} // namespace Theseus
Definition ConditionFactory.hpp:56
BC_ScalarFunction2 GetScalarFunctionBoundaryCondition2(const std::string &key)
Definition ConditionFactory.hpp:251
void RegisterVectorFunctionBoundaryCondition2(const std::string &key, BC_VectorFunction2 func)
Definition ConditionFactory.hpp:161
void RegisterVectorFunctionBoundaryCondition0(const std::string &key, BC_VectorFunction0 func)
Definition ConditionFactory.hpp:137
void RegisterVectorBoundaryCondition(const std::string &key, BC_Vector vector)
Definition ConditionFactory.hpp:209
void RegisterScalarTDFunctionBoundaryCondition0(const std::string &key, BC_ScalarTDFunction0 func)
Definition ConditionFactory.hpp:179
void RegisterVectorTDFunctionBoundaryCondition0(const std::string &key, BC_VectorTDFunction0 func)
Definition ConditionFactory.hpp:173
IC_Function1 GetInitialCondition1(const std::string &key)
Definition ConditionFactory.hpp:107
BC_ScalarTDFunction0 GetScalarTDFunctionBoundaryCondition0(const std::string &key)
Definition ConditionFactory.hpp:263
void RegisterInitialCondition0(const std::string &key, IC_Function0 func)
Definition ConditionFactory.hpp:65
BC_VectorTDFunction1 GetVectorTDFunctionBoundaryCondition1(const std::string &key)
Definition ConditionFactory.hpp:269
void RegisterScalarFunctionBoundaryCondition1(const std::string &key, BC_ScalarFunction1 func)
Definition ConditionFactory.hpp:155
BC_VectorTDFunction2 GetVectorTDFunctionBoundaryCondition2(const std::string &key)
Definition ConditionFactory.hpp:281
BC_VectorFunction0 GetVectorFunctionBoundaryCondition0(const std::string &key)
Definition ConditionFactory.hpp:221
IC_Function5 GetInitialCondition5(const std::string &key)
Definition ConditionFactory.hpp:131
void RegisterInitialCondition5(const std::string &key, IC_Function5 func)
Definition ConditionFactory.hpp:95
BC_ScalarFunction0 GetScalarFunctionBoundaryCondition0(const std::string &key)
Definition ConditionFactory.hpp:227
IC_Function4 GetInitialCondition4(const std::string &key)
Definition ConditionFactory.hpp:125
IC_Function3 GetInitialCondition3(const std::string &key)
Definition ConditionFactory.hpp:119
void RegisterScalarBoundaryCondition(const std::string &key, BC_Scalar scalar)
Definition ConditionFactory.hpp:215
static ConditionFactory & Instance()
Definition ConditionFactory.hpp:58
BC_Vector GetVectorBoundaryCondition(const std::string &key)
Definition ConditionFactory.hpp:293
void RegisterScalarTDFunctionBoundaryCondition2(const std::string &key, BC_ScalarTDFunction2 func)
Definition ConditionFactory.hpp:203
BC_VectorTDFunction0 GetVectorTDFunctionBoundaryCondition0(const std::string &key)
Definition ConditionFactory.hpp:257
void RegisterVectorTDFunctionBoundaryCondition2(const std::string &key, BC_VectorTDFunction2 func)
Definition ConditionFactory.hpp:197
BC_VectorFunction1 GetVectorFunctionBoundaryCondition1(const std::string &key)
Definition ConditionFactory.hpp:233
void RegisterVectorTDFunctionBoundaryCondition1(const std::string &key, BC_VectorTDFunction1 func)
Definition ConditionFactory.hpp:185
BC_ScalarFunction1 GetScalarFunctionBoundaryCondition1(const std::string &key)
Definition ConditionFactory.hpp:239
IC_Function2 GetInitialCondition2(const std::string &key)
Definition ConditionFactory.hpp:113
void RegisterInitialCondition3(const std::string &key, IC_Function3 func)
Definition ConditionFactory.hpp:83
void RegisterScalarFunctionBoundaryCondition2(const std::string &key, BC_ScalarFunction2 func)
Definition ConditionFactory.hpp:167
BC_Scalar GetScalarBoundaryCondition(const std::string &key)
Definition ConditionFactory.hpp:299
BC_ScalarTDFunction2 GetScalarTDFunctionBoundaryCondition2(const std::string &key)
Definition ConditionFactory.hpp:287
IC_Function0 GetInitialCondition0(const std::string &key)
Definition ConditionFactory.hpp:101
void RegisterInitialCondition2(const std::string &key, IC_Function2 func)
Definition ConditionFactory.hpp:77
void RegisterInitialCondition4(const std::string &key, IC_Function4 func)
Definition ConditionFactory.hpp:89
BC_ScalarTDFunction1 GetScalarTDFunctionBoundaryCondition1(const std::string &key)
Definition ConditionFactory.hpp:275
BC_VectorFunction2 GetVectorFunctionBoundaryCondition2(const std::string &key)
Definition ConditionFactory.hpp:245
void RegisterScalarFunctionBoundaryCondition0(const std::string &key, BC_ScalarFunction0 func)
Definition ConditionFactory.hpp:143
void RegisterScalarTDFunctionBoundaryCondition1(const std::string &key, BC_ScalarTDFunction1 func)
Definition ConditionFactory.hpp:191
void RegisterVectorFunctionBoundaryCondition1(const std::string &key, BC_VectorFunction1 func)
Definition ConditionFactory.hpp:149
void RegisterInitialCondition1(const std::string &key, IC_Function1 func)
Definition ConditionFactory.hpp:71
Definition ConditionFactory.hpp:16
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t, mfem::real_t)> IC_Function2
Definition ConditionFactory.hpp:21
std::function< std::function< mfem::real_t(const mfem::Vector &, mfem::real_t)>()> BC_ScalarTDFunction0
Definition ConditionFactory.hpp:46
std::function< std::function< void(const mfem::Vector &, mfem::real_t, mfem::Vector &)>(mfem::real_t, mfem::real_t)> BC_VectorTDFunction2
Definition ConditionFactory.hpp:44
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t, mfem::real_t, mfem::real_t, mfem::real_t)> IC_Function4
Definition ConditionFactory.hpp:26
std::function< std::function< void(const mfem::Vector &, mfem::real_t, mfem::Vector &)>()> BC_VectorTDFunction0
Definition ConditionFactory.hpp:40
mfem::real_t BC_Scalar
Definition ConditionFactory.hpp:51
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t, mfem::real_t, mfem::real_t, mfem::real_t, mfem::real_t)> IC_Function5
Definition ConditionFactory.hpp:29
std::function< std::function< void(const mfem::Vector &, mfem::real_t, mfem::Vector &)>(mfem::real_t)> BC_VectorTDFunction1
Definition ConditionFactory.hpp:42
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>()> BC_VectorFunction0
Definition ConditionFactory.hpp:32
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t)> IC_Function1
Definition ConditionFactory.hpp:20
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>()> IC_Function0
Definition ConditionFactory.hpp:19
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t, mfem::real_t)> BC_VectorFunction2
Definition ConditionFactory.hpp:34
std::function< std::function< mfem::real_t(const mfem::Vector &, mfem::real_t)>(mfem::real_t)> BC_ScalarTDFunction1
Definition ConditionFactory.hpp:47
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t)> BC_VectorFunction1
Definition ConditionFactory.hpp:33
std::function< std::function< void(const mfem::Vector &, mfem::Vector &)>(mfem::real_t, mfem::real_t, mfem::real_t)> IC_Function3
Definition ConditionFactory.hpp:23
std::function< std::function< mfem::real_t(const mfem::Vector &, mfem::real_t)>(mfem::real_t, mfem::real_t)> BC_ScalarTDFunction2
Definition ConditionFactory.hpp:49
std::function< std::function< mfem::real_t(const mfem::Vector &)>(mfem::real_t, mfem::real_t)> BC_ScalarFunction2
Definition ConditionFactory.hpp:38
std::function< std::function< mfem::real_t(const mfem::Vector &)>(mfem::real_t)> BC_ScalarFunction1
Definition ConditionFactory.hpp:37
std::function< std::function< mfem::real_t(const mfem::Vector &)>()> BC_ScalarFunction0
Definition ConditionFactory.hpp:36
mfem::Vector BC_Vector
Definition ConditionFactory.hpp:52