OGS
CreateBoundaryCondition.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include "BaseLib/Error.h"
8#include "BoundaryCondition.h"
27
28namespace ProcessLib
29{
30std::vector<std::unique_ptr<BoundaryCondition>> createBoundaryCondition(
31 const BoundaryConditionConfig& config,
32 const NumLib::LocalToGlobalIndexMap& dof_table,
33 const MeshLib::Mesh& bulk_mesh, const int variable_id,
34 const unsigned integration_order, const unsigned shapefunction_order,
35 const std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
36 const Process& process,
37 [[maybe_unused]] std::vector<std::reference_wrapper<ProcessVariable>> const&
38 all_process_variables_for_this_process,
39 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
40{
41 // Surface mesh and bulk mesh must have equal axial symmetry flags!
42 for (auto const& i : config.boundary_meshes)
43 {
44 if (i.get().isAxiallySymmetric() != bulk_mesh.isAxiallySymmetric())
45 {
47 "The boundary mesh {:s} axially symmetric but the bulk mesh "
48 "{:s}. "
49 "Both must have an equal axial symmetry property.",
50 i.get().isAxiallySymmetric() ? "is" : "is not",
51 bulk_mesh.isAxiallySymmetric() ? "is" : "is not");
52 }
53 }
54
55 std::vector<std::unique_ptr<BoundaryCondition>> boundary_conditions;
56
58 auto const type = config.config.peekConfigParameter<std::string>("type");
59
60 if (bool const component_id_required =
61 !(type == "NormalTraction" || type == "ReleaseNodalForce");
62 component_id_required && !config.component_id.has_value())
63 {
65 "Specifying the component id (<component>) for a boundary "
66 "condition of type {} is mandatory.",
67 type);
68 }
69
70 if (type == "Dirichlet")
71 {
72 auto const parameter_name = parseDirichletBCConfig(config.config);
73 std::vector<std::unique_ptr<BoundaryCondition>> dirichlet_conditions;
74 for (auto const& bc_mesh : config.boundary_meshes)
75 {
76 dirichlet_conditions.push_back(
78 parameter_name, bc_mesh, dof_table, variable_id,
79 *config.component_id, parameters));
80 }
81 return dirichlet_conditions;
82 }
83 if (type == "DirichletWithinTimeInterval")
84 {
85 auto const config_args =
87 config.config);
88 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
89 for (auto const& bc_mesh : config.boundary_meshes)
90 {
91 conditions.push_back(
93 config_args, bc_mesh, dof_table, variable_id,
94 *config.component_id, parameters));
95 }
96 return conditions;
97 }
98 if (type == "TimeDecayDirichlet")
99 {
100 auto const config_args =
102 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
103 for (auto const& bc_mesh : config.boundary_meshes)
104 {
105 conditions.push_back(
107 config_args, variable_id, *config.component_id, bc_mesh,
108 dof_table, parameters));
109 }
110 return conditions;
111 }
112 if (type == "Neumann")
113 {
114 auto const config_args = parseNeumannBoundaryCondition(config.config);
115 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
116 for (auto const& bc_mesh : config.boundary_meshes)
117 {
119 config_args, bc_mesh, dof_table, variable_id,
120 *config.component_id, integration_order, shapefunction_order,
121 bulk_mesh.getDimension(), parameters));
122 }
123 return conditions;
124 }
125 if (type == "Robin")
126 {
127 auto const config_args = parseRobinBoundaryCondition(config.config);
128 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
129 for (auto const& bc_mesh : config.boundary_meshes)
130 {
131 conditions.push_back(ProcessLib::createRobinBoundaryCondition(
132 config_args, bc_mesh, dof_table, variable_id,
133 *config.component_id, integration_order, shapefunction_order,
134 bulk_mesh.getDimension(), parameters));
135 }
136 return conditions;
137 }
138 if (type == "VariableDependentNeumann")
139 {
140 auto const config_args =
142 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
143 for (auto const& bc_mesh : config.boundary_meshes)
144 {
145 conditions.push_back(
147 config_args, bc_mesh, dof_table, variable_id,
148 *config.component_id, integration_order,
149 shapefunction_order, bulk_mesh.getDimension(), parameters));
150 }
151 return conditions;
152 }
153 if (type == "Python")
154 {
155 auto const config_args = parsePythonBoundaryCondition(config.config);
156 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
157 for (auto const& bc_mesh : config.boundary_meshes)
158 {
160 config_args, bc_mesh, dof_table, bulk_mesh, variable_id,
161 *config.component_id, integration_order, shapefunction_order,
162 all_process_variables_for_this_process));
163 }
164 return conditions;
165 }
166
167 //
168 // Special boundary conditions
169 //
170 if (type == "ConstraintDirichlet")
171 {
172 auto const config_args =
174 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
175 for (auto const& bc_mesh : config.boundary_meshes)
176 {
177 conditions.push_back(
179 config_args, bc_mesh, dof_table, variable_id,
180 integration_order, *config.component_id, parameters,
181 process));
182 }
183 return conditions;
184 }
185 if (type == "PrimaryVariableConstraintDirichlet")
186 {
187 auto const config_args =
189 config.config);
190 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
191 for (auto const& bc_mesh : config.boundary_meshes)
192 {
193 conditions.push_back(
195 config_args, bc_mesh, dof_table, variable_id,
196 *config.component_id, parameters));
197 }
198 return conditions;
199 }
200 if (type == "WellboreCompensateNeumann")
201 {
202 auto const config_args =
204 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
205 for (auto const& bc_mesh : config.boundary_meshes)
206 {
207 conditions.push_back(
209 config_args, bc_mesh, dof_table, variable_id,
210 *config.component_id, integration_order,
211 shapefunction_order, bulk_mesh.getDimension(), media));
212 }
213 return conditions;
214 }
215 if (type == "SolutionDependentDirichlet")
216 {
217 auto const config_args =
219 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
220 for (auto const& bc_mesh : config.boundary_meshes)
221 {
222 conditions.push_back(
224 config_args, bc_mesh, dof_table, variable_id,
225 *config.component_id, parameters));
226 }
227 return conditions;
228 }
229 if (type == "HCNonAdvectiveFreeComponentFlowBoundary")
230 {
231 auto const boundary_permeability_name =
233 config.config);
234 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
235 for (auto const& bc_mesh : config.boundary_meshes)
236 {
237 conditions.push_back(
239 boundary_permeability_name, bc_mesh, dof_table, variable_id,
240 *config.component_id, integration_order, parameters,
241 bulk_mesh.getDimension(), process, shapefunction_order));
242 }
243 return conditions;
244 }
245 if (type == "NormalTraction")
246 {
247 auto const parameter_name = NormalTractionBoundaryCondition::
249 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
250 for (auto const& bc_mesh : config.boundary_meshes)
251 {
252 switch (bulk_mesh.getDimension())
253 {
254 case 2:
255 conditions.push_back(
257 createNormalTractionBoundaryCondition<2>(
258 parameter_name, bc_mesh, bulk_mesh, dof_table,
259 variable_id, integration_order,
260 shapefunction_order, parameters));
261 break;
262 case 3:
263 conditions.push_back(
265 createNormalTractionBoundaryCondition<3>(
266 parameter_name, bc_mesh, bulk_mesh, dof_table,
267 variable_id, integration_order,
268 shapefunction_order, parameters));
269 break;
270 default:
271 OGS_FATAL(
272 "NormalTractionBoundaryCondition can not be "
273 "instantiated for mesh dimensions other than two or "
274 "three. {}-dimensional mesh was given.",
275 bulk_mesh.getDimension());
276 }
277 }
278 return conditions;
279 }
280 if (type == "PhaseFieldIrreversibleDamageOracleBoundaryCondition")
281 {
283 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
284 conditions.push_back(
287 dof_table, bulk_mesh, variable_id, *config.component_id));
288 return conditions;
289 }
290 if (type == "ReleaseNodalForce")
291 {
292 auto const decay_parameter_name = parseReleaseNodalForce(config);
293 std::vector<std::unique_ptr<BoundaryCondition>> conditions;
294 for (auto const& bc_mesh : config.boundary_meshes)
295 {
296 conditions.push_back(ProcessLib::createReleaseNodalForce(
298 bulk_mesh.getDimension(), variable_id, decay_parameter_name,
299 config, bc_mesh, dof_table, parameters));
300 }
301 return conditions;
302 }
303 OGS_FATAL("Unknown boundary condition type: `{:s}'.", type);
304}
305
306} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
T peekConfigParameter(std::string const &param) const
bool isAxiallySymmetric() const
Definition Mesh.h:128
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:79
std::string parseNormalTractionBoundaryCondition(BaseLib::ConfigTree const &config)
std::unique_ptr< RobinBoundaryCondition > createRobinBoundaryCondition(RobinBoundaryConditionConfig const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, int const component_id, unsigned const integration_order, unsigned const shapefunction_order, unsigned const global_dim, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< PythonBoundaryCondition > createPythonBoundaryCondition(PythonBoundaryConditionConfig const &config, MeshLib::Mesh const &boundary_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, MeshLib::Mesh const &bulk_mesh, int const variable_id, int const component_id, unsigned const integration_order, unsigned const shapefunction_order, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process)
Creates a new PythonBoundaryCondition object.
std::unique_ptr< ConstraintDirichletBoundaryCondition > createConstraintDirichletBoundaryCondition(ConstraintDirichletBoundaryConditionConfig const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, int const variable_id, unsigned const integration_order, int const component_id, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, Process const &constraining_process)
RobinBoundaryConditionConfig parseRobinBoundaryCondition(BaseLib::ConfigTree const &config)
TimeDecayDirichletBoundaryConditionConfig parseTimeDecayDirichletBoundaryConditionConfig(BaseLib::ConfigTree const &config)
std::string parseReleaseNodalForce(BoundaryConditionConfig const &bc_config)
VariableDependentNeumannConfig parseVariableDependentNeumannBoundaryCondition(BaseLib::ConfigTree const &config)
std::string parseHCNonAdvectiveFreeComponentFlowBoundaryCondition(BaseLib::ConfigTree const &config)
void parsePhaseFieldIrreversibleDamageOracleBoundaryCondition(BaseLib::ConfigTree const &config)
PrimaryVariableConstraintDirichletBoundaryConditionConfig parsePrimaryVariableConstraintDirichletBoundaryCondition(BaseLib::ConfigTree const &config)
WellboreCompensateCoefficients parseWellboreCompensateNeumannBoundaryCondition(BaseLib::ConfigTree const &config)
std::unique_ptr< BoundaryCondition > createDirichletBoundaryConditionWithinTimeInterval(DirichletBoundaryConditionConfig const &config_args, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, int const variable_id, int const component_id, const std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters)
PythonBoundaryConditionConfig parsePythonBoundaryCondition(BaseLib::ConfigTree const &config)
std::string parseDirichletBCConfig(BaseLib::ConfigTree const &config)
std::unique_ptr< BoundaryCondition > createTimeDecayDirichletBoundaryCondition(TimeDecayDirichletBoundaryConditionConfig const &config, int const variable_id, int const component_id, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< NeumannBoundaryCondition > createNeumannBoundaryCondition(NeumannBoundaryConditionConfig const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, int const component_id, unsigned const integration_order, unsigned const shapefunction_order, unsigned const global_dim, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< SolutionDependentDirichletBoundaryCondition > createSolutionDependentDirichletBoundaryCondition(SolutionDependentDirichletBoundaryConditionConfig const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, int const variable_id, int const component_id, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< DirichletBoundaryCondition > createDirichletBoundaryCondition(std::string const &parameter_name, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, int const variable_id, int const component_id, const std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters)
SolutionDependentDirichletBoundaryConditionConfig parseSolutionDependentDirichletBoundaryCondition(BaseLib::ConfigTree const &config)
std::unique_ptr< BoundaryCondition > createReleaseNodalForce(unsigned const global_dim, int const variable_id, std::string const &decay_parameter_name, BoundaryConditionConfig const &bc_config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
DirichletBoundaryConditionConfig parseDirichletBoundaryConditionWithinTimeIntervalConfig(BaseLib::ConfigTree const &config)
NeumannBoundaryConditionConfig parseNeumannBoundaryCondition(BaseLib::ConfigTree const &config)
std::unique_ptr< PhaseFieldIrreversibleDamageOracleBoundaryCondition > createPhaseFieldIrreversibleDamageOracleBoundaryCondition(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, int const variable_id, int const component_id)
std::unique_ptr< PrimaryVariableConstraintDirichletBoundaryCondition > createPrimaryVariableConstraintDirichletBoundaryCondition(PrimaryVariableConstraintDirichletBoundaryConditionConfig const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, int const variable_id, int const component_id, const std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters)
std::unique_ptr< WellboreCompensateNeumannBoundaryCondition > createWellboreCompensateNeumannBoundaryCondition(WellboreCompensateCoefficients const &coefficients, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, int const component_id, unsigned const integration_order, unsigned const shapefunction_order, unsigned const global_dim, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::unique_ptr< HCNonAdvectiveFreeComponentFlowBoundaryCondition > createHCNonAdvectiveFreeComponentFlowBoundaryCondition(std::string const &boundary_permeability_name, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, int const component_id, unsigned const integration_order, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, unsigned const global_dim, Process const &process, unsigned const shapefunction_order)
ConstraintDirichletBoundaryConditionConfig parseConstraintDirichletBoundaryCondition(BaseLib::ConfigTree const &config)
std::unique_ptr< VariableDependentNeumannBoundaryCondition > createVariableDependentNeumannBoundaryCondition(VariableDependentNeumannConfig const &coefficients, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, int const component_id, unsigned const integration_order, unsigned const shapefunction_order, unsigned const global_dim, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::vector< std::unique_ptr< BoundaryCondition > > createBoundaryCondition(const BoundaryConditionConfig &config, const NumLib::LocalToGlobalIndexMap &dof_table, const MeshLib::Mesh &bulk_mesh, const int variable_id, const unsigned integration_order, const unsigned shapefunction_order, const std::vector< std::unique_ptr< ParameterLib::ParameterBase > > &parameters, const Process &process, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::vector< std::reference_wrapper< const MeshLib::Mesh > > boundary_meshes