28 namespace SmallDeformation
30 template <
int DisplacementDim>
34 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
35 std::vector<ProcessVariable>
const& variables,
36 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
37 std::optional<ParameterLib::CoordinateSystem>
const&
38 local_coordinate_system,
39 unsigned const integration_order,
44 DBUG(
"Create SmallDeformationProcess with LIE.");
52 std::vector<std::reference_wrapper<ProcessVariable>> per_process_variables;
54 std::size_t n_var_du = 0;
55 for (std::string
const& pv_name : range)
57 if (pv_name !=
"displacement" && pv_name.find(
"displacement_jump") != 0)
60 "Found a process variable name '{:s}'. It should be "
61 "'displacement' or 'displacement_jumpN' or "
62 "'displacement_junctionN'");
64 if (pv_name.find(
"displacement_jump") == 0)
69 auto variable = std::find_if(variables.cbegin(), variables.cend(),
71 { return v.getName() == pv_name; });
73 if (variable == variables.end())
76 "Could not find process variable '{:s}' in the provided "
78 "list for config tag <{:s}>.",
79 pv_name,
"process_variable");
81 DBUG(
"Found process variable '{:s}' for config tag <{:s}>.",
82 variable->getName(),
"process_variable");
84 per_process_variables.emplace_back(
90 OGS_FATAL(
"No displacement jump variables are specified");
93 DBUG(
"Associate displacement with process variable '{:s}'.",
94 per_process_variables.back().get().getName());
96 if (per_process_variables.back().get().getNumberOfGlobalComponents() !=
100 "Number of components of the process variable '{:s}' is different "
101 "from the displacement dimension: got {:d}, expected {:d}",
102 per_process_variables.back().get().getName(),
103 per_process_variables.back().get().getNumberOfGlobalComponents(),
106 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
108 process_variables.push_back(std::move(per_process_variables));
110 auto solid_constitutive_relations =
111 MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>(
112 parameters, local_coordinate_system, config);
116 auto const fracture_model_config =
120 auto const frac_type =
124 std::unique_ptr<MaterialLib::Fracture::FractureModelBase<DisplacementDim>>
125 fracture_model =
nullptr;
126 if (frac_type ==
"LinearElasticIsotropic")
129 DisplacementDim>(parameters, fracture_model_config);
131 else if (frac_type ==
"Coulomb")
133 fracture_model = MaterialLib::Fracture::createCoulomb<DisplacementDim>(
134 parameters, fracture_model_config);
136 else if (frac_type ==
"CohesiveZoneModeI")
140 DisplacementDim>(parameters, fracture_model_config);
145 "Cannot construct fracture constitutive relation of given type "
151 std::vector<FractureProperty> fracture_properties;
153 auto fracture_properties_config :
157 fracture_properties.emplace_back(
158 fracture_properties.size(),
160 fracture_properties_config.getConfigParameter<
int>(
"material_id"),
161 ParameterLib::findParameter<double>(
163 fracture_properties_config,
"initial_aperture", parameters, 1,
167 if (n_var_du < fracture_properties.size())
170 "The number of displacement jumps and the number of "
171 "<fracture_properties> are not consistent");
178 "reference_temperature", std::numeric_limits<double>::quiet_NaN());
181 materialIDs(mesh), std::move(solid_constitutive_relations),
182 std::move(fracture_model), std::move(fracture_properties),
189 return std::make_unique<SmallDeformationProcess<DisplacementDim>>(
190 std::move(
name), mesh, std::move(jacobian_assembler), parameters,
191 integration_order, std::move(process_variables),
192 std::move(process_data), std::move(secondary_variables));
198 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
199 std::vector<ProcessVariable>
const& variables,
200 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
201 std::optional<ParameterLib::CoordinateSystem>
const&
202 local_coordinate_system,
203 unsigned const integration_order,
209 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
210 std::vector<ProcessVariable>
const& variables,
211 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
212 std::optional<ParameterLib::CoordinateSystem>
const&
213 local_coordinate_system,
214 unsigned const integration_order,
void DBUG(char const *fmt, Args const &... args)
T peekConfigParameter(std::string const ¶m) const
void checkConfigParameter(std::string const ¶m, T const &value) const
T getConfigParameter(std::string const ¶m) const
Range< SubtreeIterator > getConfigSubtreeList(std::string const &root) const
ConfigTree getConfigSubtree(std::string const &root) const
Range< ValueIterator< T > > getConfigParameterList(std::string const ¶m) const
Handles configuration of several secondary variables from the project file.
std::unique_ptr< FractureModelBase< DisplacementDim > > createCohesiveZoneModeI(std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const ¶meters, BaseLib::ConfigTree const &config)
std::unique_ptr< FractureModelBase< DisplacementDim > > createLinearElasticIsotropic(std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const ¶meters, BaseLib::ConfigTree const &config)
PropertyVector< int > const * materialIDs(Mesh const &mesh)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)