OGS
CreateRichardsMechanicsProcess.cpp
Go to the documentation of this file.
1 
12 
13 #include <cassert>
14 
17 #include "MaterialLib/MPL/Medium.h"
21 #include "ParameterLib/Utils.h"
26 
27 namespace ProcessLib
28 {
29 namespace RichardsMechanics
30 {
32  std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
33 {
34  std::array const required_medium_properties = {
41  std::array const required_liquid_properties = {
43  std::array const required_solid_properties = {MaterialPropertyLib::density};
44 
45  for (auto const& m : media)
46  {
47  checkRequiredProperties(*m.second, required_medium_properties);
48  checkRequiredProperties(m.second->phase("AqueousLiquid"),
49  required_liquid_properties);
50  checkRequiredProperties(m.second->phase("Solid"),
51  required_solid_properties);
52  }
53 }
54 
55 template <int DisplacementDim>
56 std::unique_ptr<Process> createRichardsMechanicsProcess(
57  std::string name,
58  MeshLib::Mesh& mesh,
59  std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
60  std::vector<ProcessVariable> const& variables,
61  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
62  std::optional<ParameterLib::CoordinateSystem> const&
63  local_coordinate_system,
64  unsigned const integration_order,
65  BaseLib::ConfigTree const& config,
66  std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
67 {
69  config.checkConfigParameter("type", "RICHARDS_MECHANICS");
70  DBUG("Create RichardsMechanicsProcess.");
71 
72  auto const coupling_scheme =
74  config.getConfigParameterOptional<std::string>("coupling_scheme");
75  const bool use_monolithic_scheme =
76  !(coupling_scheme && (*coupling_scheme == "staggered"));
77 
78  // Process variable.
79 
81  auto const pv_config = config.getConfigSubtree("process_variables");
82 
83  ProcessVariable* variable_p;
84  ProcessVariable* variable_u;
85  std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
86  process_variables;
87  if (use_monolithic_scheme) // monolithic scheme.
88  {
89  auto per_process_variables = findProcessVariables(
90  variables, pv_config,
91  {
92  "pressure",
94  "displacement"});
95  variable_p = &per_process_variables[0].get();
96  variable_u = &per_process_variables[1].get();
97  process_variables.push_back(std::move(per_process_variables));
98  }
99  else // staggered scheme.
100  {
101  using namespace std::string_literals;
102  for (auto const& variable_name : {"pressure"s, "displacement"s})
103  {
104  auto per_process_variables =
105  findProcessVariables(variables, pv_config, {variable_name});
106  process_variables.push_back(std::move(per_process_variables));
107  }
108  variable_p = &process_variables[0][0].get();
109  variable_u = &process_variables[1][0].get();
110  }
111 
112  DBUG("Associate displacement with process variable '{:s}'.",
113  variable_u->getName());
114 
115  if (variable_u->getNumberOfGlobalComponents() != DisplacementDim)
116  {
117  OGS_FATAL(
118  "Number of components of the process variable '{:s}' is different "
119  "from the displacement dimension: got {:d}, expected {:d}",
120  variable_u->getName(),
121  variable_u->getNumberOfGlobalComponents(),
122  DisplacementDim);
123  }
124 
125  DBUG("Associate pressure with process variable '{:s}'.",
126  variable_p->getName());
127  if (variable_p->getNumberOfGlobalComponents() != 1)
128  {
129  OGS_FATAL(
130  "Pressure process variable '{:s}' is not a scalar variable but has "
131  "{:d} components.",
132  variable_p->getName(),
133  variable_p->getNumberOfGlobalComponents());
134  }
135 
136  auto solid_constitutive_relations =
137  MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>(
138  parameters, local_coordinate_system, config);
139 
140  // Specific body force
141  Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
142  {
143  std::vector<double> const b =
145  config.getConfigParameter<std::vector<double>>(
146  "specific_body_force");
147  if (b.size() != DisplacementDim)
148  {
149  OGS_FATAL(
150  "The size of the specific body force vector does not match the "
151  "displacement dimension. Vector size is {:d}, displacement "
152  "dimension is {:d}",
153  b.size(), DisplacementDim);
154  }
155 
156  std::copy_n(b.data(), b.size(), specific_body_force.data());
157  }
158 
159  auto media_map =
161  DBUG("Check the media properties of RichardsMechanics process ...");
162  checkMPLProperties(media);
163  DBUG("Media properties verified.");
164 
165  // Initial stress conditions
166  auto const initial_stress = ParameterLib::findOptionalTagParameter<double>(
168  config, "initial_stress", parameters,
169  // Symmetric tensor size, 4 or 6, not a Kelvin vector.
171  &mesh);
172 
173  std::optional<MicroPorosityParameters> micro_porosity_parameters;
174  if (auto const micro_porosity_config =
176  config.getConfigSubtreeOptional("micro_porosity"))
177  {
178  micro_porosity_parameters = MicroPorosityParameters{
181  micro_porosity_config->getConfigSubtree("nonlinear_solver")),
183  micro_porosity_config->getConfigParameter<double>(
184  "mass_exchange_coefficient")};
185  }
186 
187  auto const mass_lumping =
189  config.getConfigParameter<bool>("mass_lumping", false);
190 
191  auto const explicit_hm_coupling_in_unsaturated_zone =
193  config.getConfigParameter<bool>(
194  "explicit_hm_coupling_in_unsaturated_zone", false);
195 
197  materialIDs(mesh),
198  std::move(media_map),
199  std::move(solid_constitutive_relations),
200  initial_stress,
201  specific_body_force,
202  micro_porosity_parameters,
203  mass_lumping,
204  explicit_hm_coupling_in_unsaturated_zone};
205 
206  SecondaryVariableCollection secondary_variables;
207 
208  ProcessLib::createSecondaryVariables(config, secondary_variables);
209 
210  return std::make_unique<RichardsMechanicsProcess<DisplacementDim>>(
211  std::move(name), mesh, std::move(jacobian_assembler), parameters,
212  integration_order, std::move(process_variables),
213  std::move(process_data), std::move(secondary_variables),
214  use_monolithic_scheme);
215 }
216 
217 template std::unique_ptr<Process> createRichardsMechanicsProcess<2>(
218  std::string name,
219  MeshLib::Mesh& mesh,
220  std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
221  std::vector<ProcessVariable> const& variables,
222  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
223  std::optional<ParameterLib::CoordinateSystem> const&
224  local_coordinate_system,
225  unsigned const integration_order,
226  BaseLib::ConfigTree const& config,
227  std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
228 
229 template std::unique_ptr<Process> createRichardsMechanicsProcess<3>(
230  std::string name,
231  MeshLib::Mesh& mesh,
232  std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
233  std::vector<ProcessVariable> const& variables,
234  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
235  std::optional<ParameterLib::CoordinateSystem> const&
236  local_coordinate_system,
237  unsigned const integration_order,
238  BaseLib::ConfigTree const& config,
239  std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
240 
241 } // namespace RichardsMechanics
242 } // namespace ProcessLib
#define OGS_FATAL(...)
Definition: Error.h:26
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
void checkConfigParameter(std::string const &param, T const &value) const
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
Definition: ConfigTree.cpp:155
std::optional< T > getConfigParameterOptional(std::string const &param) const
T getConfigParameter(std::string const &param) const
ConfigTree getConfigSubtree(std::string const &root) const
Definition: ConfigTree.cpp:146
std::string const & getName() const
int getNumberOfGlobalComponents() const
Returns the number of components of the process variable.
Handles configuration of several secondary variables from the project file.
std::unique_ptr< MaterialSpatialDistributionMap > createMaterialSpatialDistributionMap(std::map< int, std::shared_ptr< Medium >> const &media, MeshLib::Mesh const &mesh)
void checkRequiredProperties(Component const &c, Container const &required_properties)
Definition: Component.h:96
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Definition: KelvinVector.h:23
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition: Mesh.cpp:258
NewtonRaphsonSolverParameters createNewtonRaphsonSolverParameters(BaseLib::ConfigTree const &config)
std::unique_ptr< Process > createRichardsMechanicsProcess(std::string 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::map< int, std::shared_ptr< MaterialPropertyLib::Medium >> const &media)
template std::unique_ptr< Process > createRichardsMechanicsProcess< 2 >(std::string 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::map< int, std::shared_ptr< MaterialPropertyLib::Medium >> const &media)
template std::unique_ptr< Process > createRichardsMechanicsProcess< 3 >(std::string 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::map< int, std::shared_ptr< MaterialPropertyLib::Medium >> const &media)
void checkMPLProperties(std::map< int, std::shared_ptr< MaterialPropertyLib::Medium >> const &media)
std::vector< std::reference_wrapper< ProcessVariable > > findProcessVariables(std::vector< ProcessVariable > const &variables, BaseLib::ConfigTree const &pv_config, std::initializer_list< std::string > tags)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)