OGS
CreateSmallDeformationProcess.cpp
Go to the documentation of this file.
1
12
13#include <cassert>
14
19#include "ParameterLib/Utils.h"
23
24namespace ProcessLib
25{
26namespace LIE
27{
28namespace SmallDeformation
29{
30template <int DisplacementDim>
31std::unique_ptr<Process> createSmallDeformationProcess(
32 std::string const& name,
33 MeshLib::Mesh& mesh,
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,
40 BaseLib::ConfigTree const& config)
41{
43 config.checkConfigParameter("type", "SMALL_DEFORMATION_WITH_LIE");
44 DBUG("Create SmallDeformationProcess with LIE.");
45
48 auto const pv_conf = config.getConfigSubtree("process_variables");
50 auto range =
52 pv_conf.getConfigParameterList<std::string>("process_variable");
53 std::vector<std::reference_wrapper<ProcessVariable>> per_process_variables;
54
55 std::size_t n_var_du = 0;
56 for (std::string const& pv_name : range)
57 {
58 if (pv_name != "displacement" &&
59 !pv_name.starts_with("displacement_jump"))
60 {
62 "Found a process variable name '{:s}'. It should be "
63 "'displacement' or 'displacement_jumpN' or "
64 "'displacement_junctionN'",
65 pv_name);
66 }
67 if (pv_name.starts_with("displacement_jump"))
68 {
69 n_var_du++;
70 }
71
72 auto variable = std::find_if(variables.cbegin(), variables.cend(),
73 [&pv_name](ProcessVariable const& v)
74 { return v.getName() == pv_name; });
75
76 if (variable == variables.end())
77 {
79 "Could not find process variable '{:s}' in the provided "
80 "variables "
81 "list for config tag <{:s}>.",
82 pv_name, "process_variable");
83 }
84 DBUG("Found process variable '{:s}' for config tag <{:s}>.",
85 variable->getName(), "process_variable");
86
87 per_process_variables.emplace_back(
88 const_cast<ProcessVariable&>(*variable));
89 }
90
91 if (n_var_du < 1)
92 {
93 OGS_FATAL("No displacement jump variables are specified");
94 }
95
96 DBUG("Associate displacement with process variable '{:s}'.",
97 per_process_variables.back().get().getName());
98
99 if (per_process_variables.back().get().getNumberOfGlobalComponents() !=
100 DisplacementDim)
101 {
102 OGS_FATAL(
103 "Number of components of the process variable '{:s}' is different "
104 "from the displacement dimension: got {:d}, expected {:d}",
105 per_process_variables.back().get().getName(),
106 per_process_variables.back().get().getNumberOfGlobalComponents(),
107 DisplacementDim);
108 }
109 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
110 process_variables;
111 process_variables.push_back(std::move(per_process_variables));
112
114 auto solid_constitutive_relations =
115 MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>(
116 parameters, local_coordinate_system, config);
117
118 // Fracture constitutive relation.
119 // read type;
120 auto const fracture_model_config =
122 config.getConfigSubtree("fracture_model");
123
124 auto const frac_type =
126 fracture_model_config.peekConfigParameter<std::string>("type");
127
128 std::unique_ptr<MaterialLib::Fracture::FractureModelBase<DisplacementDim>>
129 fracture_model = nullptr;
130 if (frac_type == "LinearElasticIsotropic")
131 {
133 DisplacementDim>(parameters, fracture_model_config);
134 }
135 else if (frac_type == "Coulomb")
136 {
137 fracture_model = MaterialLib::Fracture::createCoulomb<DisplacementDim>(
138 parameters, fracture_model_config);
139 }
140 else if (frac_type == "CohesiveZoneModeI")
141 {
142 fracture_model =
144 DisplacementDim>(parameters, fracture_model_config);
145 }
146 else
147 {
148 OGS_FATAL(
149 "Cannot construct fracture constitutive relation of given type "
150 "'{:s}'.",
151 frac_type);
152 }
153
154 // Fracture properties
155 std::vector<FractureProperty> fracture_properties;
156 for (
157 auto fracture_properties_config :
159 config.getConfigSubtreeList("fracture_properties"))
160 {
161 fracture_properties.emplace_back(
162 fracture_properties.size(),
164 fracture_properties_config.getConfigParameter<int>("material_id"),
165 ParameterLib::findParameter<double>(
167 fracture_properties_config, "initial_aperture", parameters, 1,
168 &mesh));
169 }
170
171 if (n_var_du < fracture_properties.size())
172 {
173 OGS_FATAL(
174 "The number of displacement jumps and the number of "
175 "<fracture_properties> are not consistent");
176 }
177
178 // Reference temperature
179 const auto& reference_temperature =
181 config.getConfigParameter<double>(
182 "reference_temperature", std::numeric_limits<double>::quiet_NaN());
183
185 materialIDs(mesh), std::move(solid_constitutive_relations),
186 std::move(fracture_model), std::move(fracture_properties),
187 reference_temperature);
188
189 SecondaryVariableCollection secondary_variables;
190
191 ProcessLib::createSecondaryVariables(config, secondary_variables);
192
193 return std::make_unique<SmallDeformationProcess<DisplacementDim>>(
194 std::move(name), mesh, std::move(jacobian_assembler), parameters,
195 integration_order, std::move(process_variables),
196 std::move(process_data), std::move(secondary_variables));
197}
198
199template std::unique_ptr<Process> createSmallDeformationProcess<2>(
200 std::string const& name,
201 MeshLib::Mesh& mesh,
202 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
203 std::vector<ProcessVariable> const& variables,
204 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
205 std::optional<ParameterLib::CoordinateSystem> const&
206 local_coordinate_system,
207 unsigned const integration_order,
208 BaseLib::ConfigTree const& config);
209
210template std::unique_ptr<Process> createSmallDeformationProcess<3>(
211 std::string const& name,
212 MeshLib::Mesh& mesh,
213 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
214 std::vector<ProcessVariable> const& variables,
215 std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
216 std::optional<ParameterLib::CoordinateSystem> const&
217 local_coordinate_system,
218 unsigned const integration_order,
219 BaseLib::ConfigTree const& config);
220
221} // namespace SmallDeformation
222} // namespace LIE
223} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
T peekConfigParameter(std::string const &param) const
T getConfigParameter(std::string const &param) const
Range< SubtreeIterator > getConfigSubtreeList(std::string const &root) const
ConfigTree getConfigSubtree(std::string const &root) const
Range< ValueIterator< T > > getConfigParameterList(std::string const &param) const
void checkConfigParameter(std::string const &param, std::string_view const value) 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 &parameters, BaseLib::ConfigTree const &config)
std::unique_ptr< FractureModelBase< DisplacementDim > > createLinearElasticIsotropic(std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, BaseLib::ConfigTree const &config)
template std::unique_ptr< Process > createSmallDeformationProcess< 2 >(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config)
std::unique_ptr< Process > createSmallDeformationProcess(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config)
template std::unique_ptr< Process > createSmallDeformationProcess< 3 >(std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system, unsigned const integration_order, BaseLib::ConfigTree const &config)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)