OGS
CreateBoundaryCondition.cpp
Go to the documentation of this file.
1
12
13#include "BaseLib/Error.h"
15#include "BoundaryCondition.h"
33
34namespace ProcessLib
35{
36std::unique_ptr<BoundaryCondition> createBoundaryCondition(
37 const BoundaryConditionConfig& config,
38 const NumLib::LocalToGlobalIndexMap& dof_table,
39 const MeshLib::Mesh& bulk_mesh, const int variable_id,
40 const unsigned integration_order, const unsigned shapefunction_order,
41 const std::vector<std::unique_ptr<ParameterLib::ParameterBase>>& parameters,
42 const Process& process,
43 [[maybe_unused]] std::vector<std::reference_wrapper<ProcessVariable>> const&
44 all_process_variables_for_this_process,
45 std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
46{
47 // Surface mesh and bulk mesh must have equal axial symmetry flags!
48 if (config.boundary_mesh.isAxiallySymmetric() !=
49 bulk_mesh.isAxiallySymmetric())
50 {
52 "The boundary mesh {:s} axially symmetric but the bulk mesh {:s}. "
53 "Both must have an equal axial symmetry property.",
54 config.boundary_mesh.isAxiallySymmetric() ? "is" : "is not",
55 bulk_mesh.isAxiallySymmetric() ? "is" : "is not");
56 }
57
59 auto const type = config.config.peekConfigParameter<std::string>("type");
60
61 if (bool const component_id_required =
62 !(type == "NormalTraction" || type == "ReleaseNodalForce");
63 component_id_required && !config.component_id.has_value())
64 {
66 "Specifying the component id (<component>) for a boundary "
67 "condition of type {} is mandatory.",
68 type);
69 }
70
71 if (type == "Dirichlet")
72 {
74 config.config, config.boundary_mesh, dof_table, variable_id,
75 *config.component_id, parameters);
76 }
77 if (type == "DirichletWithinTimeInterval")
78 {
80 config.config, config.boundary_mesh, dof_table, variable_id,
81 *config.component_id, parameters);
82 }
83 if (type == "TimeDecayDirichlet")
84 {
86 variable_id, *config.component_id, config.config,
87 config.boundary_mesh, dof_table, parameters);
88 }
89 if (type == "Neumann")
90 {
92 config.config, config.boundary_mesh, dof_table, variable_id,
93 *config.component_id, integration_order, shapefunction_order,
94 bulk_mesh.getDimension(), parameters);
95 }
96 if (type == "Robin")
97 {
99 config.config, config.boundary_mesh, dof_table, variable_id,
100 *config.component_id, integration_order, shapefunction_order,
101 bulk_mesh.getDimension(), parameters);
102 }
103 if (type == "VariableDependentNeumann")
104 {
106 config.config, config.boundary_mesh, dof_table, variable_id,
107 *config.component_id, integration_order, shapefunction_order,
108 bulk_mesh.getDimension(), parameters);
109 }
110
111 if (type == "Python")
112 {
114 config.config, config.boundary_mesh, dof_table, bulk_mesh,
115 variable_id, *config.component_id, integration_order,
116 shapefunction_order, all_process_variables_for_this_process);
117 }
118
119 //
120 // Special boundary conditions
121 //
122 if (type == "ConstraintDirichlet")
123 {
125 config.config, config.boundary_mesh, dof_table, variable_id,
126 integration_order, *config.component_id, parameters, process);
127 }
128 if (type == "PrimaryVariableConstraintDirichlet")
129 {
131 config.config, config.boundary_mesh, dof_table, variable_id,
132 *config.component_id, parameters);
133 }
134 if (type == "WellboreCompensateNeumann")
135 {
137 config.config, config.boundary_mesh, dof_table, variable_id,
138 *config.component_id, integration_order, shapefunction_order,
139 bulk_mesh.getDimension(), media);
140 }
141 if (type == "SolutionDependentDirichlet")
142 {
144 config.config, config.boundary_mesh, dof_table, variable_id,
145 *config.component_id, parameters);
146 }
147 if (type == "HCNonAdvectiveFreeComponentFlowBoundary")
148 {
150 config.config, config.boundary_mesh, dof_table, variable_id,
151 *config.component_id, integration_order, parameters,
152 bulk_mesh.getDimension(), process, shapefunction_order);
153 }
154 if (type == "NormalTraction")
155 {
156 switch (bulk_mesh.getDimension())
157 {
158 case 2:
161 config.config, config.boundary_mesh, dof_table,
162 variable_id, integration_order, shapefunction_order,
163 parameters);
164 case 3:
167 config.config, config.boundary_mesh, dof_table,
168 variable_id, integration_order, shapefunction_order,
169 parameters);
170 default:
171 OGS_FATAL(
172 "NormalTractionBoundaryCondition can not be instantiated "
173 "for mesh dimensions other than two or three. "
174 "{}-dimensional mesh was given.",
175 bulk_mesh.getDimension());
176 }
177 }
178 if (type == "PhaseFieldIrreversibleDamageOracleBoundaryCondition")
179 {
180 return ProcessLib::
183 config.config, dof_table, bulk_mesh, variable_id,
184 *config.component_id);
185 }
186 if (type == "ReleaseNodalForce")
187 {
190 bulk_mesh.getDimension(), variable_id, config, config.boundary_mesh,
191 dof_table, parameters);
192 }
193 OGS_FATAL("Unknown boundary condition type: `{:s}'.", type);
194}
195
196} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
T peekConfigParameter(std::string const &param) const
bool isAxiallySymmetric() const
Definition Mesh.h:139
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:90
std::unique_ptr< NormalTractionBoundaryCondition< GlobalDim, NormalTractionBoundaryConditionLocalAssembler > > createNormalTractionBoundaryCondition(BaseLib::ConfigTree const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table, int const variable_id, unsigned const integration_order, unsigned const shapefunction_order, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< VariableDependentNeumannBoundaryCondition > createVariableDependentNeumannBoundaryCondition(BaseLib::ConfigTree 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(BaseLib::ConfigTree 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< RobinBoundaryCondition > createRobinBoundaryCondition(BaseLib::ConfigTree 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< PhaseFieldIrreversibleDamageOracleBoundaryCondition > createPhaseFieldIrreversibleDamageOracleBoundaryCondition(BaseLib::ConfigTree const &config, NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, int const variable_id, int const component_id)
std::unique_ptr< WellboreCompensateNeumannBoundaryCondition > createWellboreCompensateNeumannBoundaryCondition(BaseLib::ConfigTree 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::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::unique_ptr< BoundaryCondition > createDirichletBoundaryConditionWithinTimeInterval(BaseLib::ConfigTree 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< BoundaryCondition > createTimeDecayDirichletBoundaryCondition(int const variable_id, int const component_id, BaseLib::ConfigTree const &config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< DirichletBoundaryCondition > createDirichletBoundaryCondition(BaseLib::ConfigTree 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< ConstraintDirichletBoundaryCondition > createConstraintDirichletBoundaryCondition(BaseLib::ConfigTree 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)
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::unique_ptr< PythonBoundaryCondition > createPythonBoundaryCondition(BaseLib::ConfigTree 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< NeumannBoundaryCondition > createNeumannBoundaryCondition(BaseLib::ConfigTree 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< HCNonAdvectiveFreeComponentFlowBoundaryCondition > createHCNonAdvectiveFreeComponentFlowBoundaryCondition(BaseLib::ConfigTree const &config, 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)
std::unique_ptr< BoundaryCondition > createReleaseNodalForce(unsigned const global_dim, int const variable_id, BoundaryConditionConfig const &bc_config, MeshLib::Mesh const &bc_mesh, NumLib::LocalToGlobalIndexMap const &dof_table_bulk, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters)
std::unique_ptr< PrimaryVariableConstraintDirichletBoundaryCondition > createPrimaryVariableConstraintDirichletBoundaryCondition(BaseLib::ConfigTree 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)