OGS
RichardsMechanicsProcess.cpp
Go to the documentation of this file.
1 
12 
13 #include <cassert>
14 
15 #include "MeshLib/Elements/Utils.h"
19 #include "RichardsMechanicsFEM.h"
21 
22 namespace ProcessLib
23 {
24 namespace RichardsMechanics
25 {
26 template <int DisplacementDim>
28  std::string name,
29  MeshLib::Mesh& mesh,
30  std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
31  std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
32  unsigned const integration_order,
33  std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
34  process_variables,
36  SecondaryVariableCollection&& secondary_variables,
37  bool const use_monolithic_scheme)
38  : Process(std::move(name), mesh, std::move(jacobian_assembler), parameters,
39  integration_order, std::move(process_variables),
40  std::move(secondary_variables), use_monolithic_scheme),
41  _process_data(std::move(process_data))
42 {
43  _nodal_forces = MeshLib::getOrCreateMeshProperty<double>(
44  mesh, "NodalForces", MeshLib::MeshItemType::Node, DisplacementDim);
45 
46  _hydraulic_flow = MeshLib::getOrCreateMeshProperty<double>(
47  mesh, "HydraulicFlow", MeshLib::MeshItemType::Node, 1);
48 
49  // TODO (naumov) remove ip suffix. Probably needs modification of the mesh
50  // properties, s.t. there is no "overlapping" with cell/point data.
51  // See getOrCreateMeshProperty.
52  _integration_point_writer.emplace_back(
53  std::make_unique<IntegrationPointWriter>(
54  "sigma_ip",
55  static_cast<int>(mesh.getDimension() == 2 ? 4 : 6) /*n components*/,
56  integration_order, _local_assemblers, &LocalAssemblerIF::getSigma));
57 
58  _integration_point_writer.emplace_back(
59  std::make_unique<IntegrationPointWriter>(
60  "saturation_ip", 1 /*n components*/, integration_order,
62 
63  _integration_point_writer.emplace_back(
64  std::make_unique<IntegrationPointWriter>(
65  "porosity_ip", 1 /*n components*/, integration_order,
67 
68  _integration_point_writer.emplace_back(
69  std::make_unique<IntegrationPointWriter>(
70  "transport_porosity_ip", 1 /*n components*/, integration_order,
72 
73  _integration_point_writer.emplace_back(
74  std::make_unique<IntegrationPointWriter>(
75  "swelling_stress_ip",
76  static_cast<int>(mesh.getDimension() == 2 ? 4 : 6) /*n components*/,
77  integration_order, _local_assemblers,
79 
80  _integration_point_writer.emplace_back(
81  std::make_unique<IntegrationPointWriter>(
82  "epsilon_ip",
83  static_cast<int>(mesh.getDimension() == 2 ? 4 : 6) /*n components*/,
84  integration_order, _local_assemblers,
86 }
87 
88 template <int DisplacementDim>
90 {
91  return false;
92 }
93 
94 template <int DisplacementDim>
97  const int process_id) const
98 {
99  // For the monolithic scheme or the M process (deformation) in the staggered
100  // scheme.
101  if (_use_monolithic_scheme || process_id == 1)
102  {
103  auto const& l = *_local_to_global_index_map;
104  return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
105  &l.getGhostIndices(), &this->_sparsity_pattern};
106  }
107 
108  // For staggered scheme and H process (pressure).
109  auto const& l = *_local_to_global_index_map_with_base_nodes;
110  return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
111  &l.getGhostIndices(), &_sparsity_pattern_with_linear_element};
112 }
113 
114 template <int DisplacementDim>
116 {
117  // Create single component dof in every of the mesh's nodes.
118  _mesh_subset_all_nodes =
119  std::make_unique<MeshLib::MeshSubset>(_mesh, _mesh.getNodes());
120  // Create single component dof in the mesh's base nodes.
121  _base_nodes = MeshLib::getBaseNodes(_mesh.getElements());
122  _mesh_subset_base_nodes =
123  std::make_unique<MeshLib::MeshSubset>(_mesh, _base_nodes);
124 
125  // TODO move the two data members somewhere else.
126  // for extrapolation of secondary variables of stress or strain
127  std::vector<MeshLib::MeshSubset> all_mesh_subsets_single_component{
128  *_mesh_subset_all_nodes};
129  _local_to_global_index_map_single_component =
130  std::make_unique<NumLib::LocalToGlobalIndexMap>(
131  std::move(all_mesh_subsets_single_component),
132  // by location order is needed for output
134 
135  if (_use_monolithic_scheme)
136  {
137  // For pressure, which is the first
138  std::vector<MeshLib::MeshSubset> all_mesh_subsets{
139  *_mesh_subset_base_nodes};
140 
141  // For displacement.
142  const int monolithic_process_id = 0;
143  std::generate_n(std::back_inserter(all_mesh_subsets),
144  getProcessVariables(monolithic_process_id)[1]
145  .get()
146  .getNumberOfGlobalComponents(),
147  [&]() { return *_mesh_subset_all_nodes; });
148 
149  std::vector<int> const vec_n_components{1, DisplacementDim};
150  _local_to_global_index_map =
151  std::make_unique<NumLib::LocalToGlobalIndexMap>(
152  std::move(all_mesh_subsets), vec_n_components,
154  assert(_local_to_global_index_map);
155  }
156  else
157  {
158  // For displacement equation.
159  const int process_id = 1;
160  std::vector<MeshLib::MeshSubset> all_mesh_subsets;
161  std::generate_n(std::back_inserter(all_mesh_subsets),
162  getProcessVariables(process_id)[0]
163  .get()
164  .getNumberOfGlobalComponents(),
165  [&]() { return *_mesh_subset_all_nodes; });
166 
167  std::vector<int> const vec_n_components{DisplacementDim};
168  _local_to_global_index_map =
169  std::make_unique<NumLib::LocalToGlobalIndexMap>(
170  std::move(all_mesh_subsets), vec_n_components,
172 
173  // For pressure equation.
174  // Collect the mesh subsets with base nodes in a vector.
175  std::vector<MeshLib::MeshSubset> all_mesh_subsets_base_nodes{
176  *_mesh_subset_base_nodes};
177  _local_to_global_index_map_with_base_nodes =
178  std::make_unique<NumLib::LocalToGlobalIndexMap>(
179  std::move(all_mesh_subsets_base_nodes),
180  // by location order is needed for output
182 
183  _sparsity_pattern_with_linear_element = NumLib::computeSparsityPattern(
184  *_local_to_global_index_map_with_base_nodes, _mesh);
185 
186  assert(_local_to_global_index_map);
187  assert(_local_to_global_index_map_with_base_nodes);
188  }
189 }
190 
191 template <int DisplacementDim>
193  NumLib::LocalToGlobalIndexMap const& dof_table,
194  MeshLib::Mesh const& mesh,
195  unsigned const integration_order)
196 {
197  using nlohmann::json;
198 
199  const int mechanical_process_id = _use_monolithic_scheme ? 0 : 1;
200  const int deformation_variable_id = _use_monolithic_scheme ? 1 : 0;
202  DisplacementDim, RichardsMechanicsLocalAssembler>(
203  mesh.getDimension(), mesh.getElements(), dof_table,
204  // use displacement process variable to set shape function order
205  getProcessVariables(mechanical_process_id)[deformation_variable_id]
206  .get()
207  .getShapeFunctionOrder(),
208  _local_assemblers, mesh.isAxiallySymmetric(), integration_order,
209  _process_data);
210 
211  auto add_secondary_variable = [&](std::string const& name,
212  int const num_components,
213  auto get_ip_values_function)
214  {
215  _secondary_variables.addSecondaryVariable(
216  name,
217  makeExtrapolator(num_components, getExtrapolator(),
218  _local_assemblers,
219  std::move(get_ip_values_function)));
220  };
221 
222  add_secondary_variable("sigma",
224  DisplacementDim>::RowsAtCompileTime,
225  &LocalAssemblerIF::getIntPtSigma);
226 
227  add_secondary_variable("swelling_stress",
229  DisplacementDim>::RowsAtCompileTime,
230  &LocalAssemblerIF::getIntPtSwellingStress);
231 
232  add_secondary_variable("epsilon",
234  DisplacementDim>::RowsAtCompileTime,
235  &LocalAssemblerIF::getIntPtEpsilon);
236 
237  add_secondary_variable("velocity", DisplacementDim,
238  &LocalAssemblerIF::getIntPtDarcyVelocity);
239 
240  add_secondary_variable("saturation", 1,
241  &LocalAssemblerIF::getIntPtSaturation);
242 
243  add_secondary_variable("micro_saturation", 1,
244  &LocalAssemblerIF::getIntPtMicroSaturation);
245 
246  add_secondary_variable("micro_pressure", 1,
247  &LocalAssemblerIF::getIntPtMicroPressure);
248 
249  add_secondary_variable("porosity", 1, &LocalAssemblerIF::getIntPtPorosity);
250 
251  add_secondary_variable("transport_porosity", 1,
252  &LocalAssemblerIF::getIntPtTransportPorosity);
253 
254  add_secondary_variable("dry_density_solid", 1,
255  &LocalAssemblerIF::getIntPtDryDensitySolid);
256 
257  //
258  // enable output of internal variables defined by material models
259  //
261  LocalAssemblerIF>(_process_data.solid_materials,
262  add_secondary_variable);
263 
264  // Assume all materials have same internal variables.
267  _process_data.solid_materials, _local_assemblers,
268  _integration_point_writer, integration_order);
269 
270  _process_data.element_saturation = MeshLib::getOrCreateMeshProperty<double>(
271  const_cast<MeshLib::Mesh&>(mesh), "saturation_avg",
273 
274  _process_data.element_porosity = MeshLib::getOrCreateMeshProperty<double>(
275  const_cast<MeshLib::Mesh&>(mesh), "porosity_avg",
277 
278  _process_data.element_stresses = MeshLib::getOrCreateMeshProperty<double>(
279  const_cast<MeshLib::Mesh&>(mesh), "stress_avg",
282  DisplacementDim>::RowsAtCompileTime);
283 
284  _process_data.pressure_interpolated =
285  MeshLib::getOrCreateMeshProperty<double>(
286  const_cast<MeshLib::Mesh&>(mesh), "pressure_interpolated",
288 
289  // Set initial conditions for integration point data.
290  for (auto const& ip_writer : _integration_point_writer)
291  {
292  // Find the mesh property with integration point writer's name.
293  auto const& name = ip_writer->name();
294  if (!mesh.getProperties().existsPropertyVector<double>(name))
295  {
296  continue;
297  }
298  auto const& mesh_property =
299  *mesh.getProperties().template getPropertyVector<double>(name);
300 
301  // The mesh property must be defined on integration points.
302  if (mesh_property.getMeshItemType() !=
304  {
305  continue;
306  }
307 
308  auto const ip_meta_data = getIntegrationPointMetaData(mesh, name);
309 
310  // Check the number of components.
311  if (ip_meta_data.n_components !=
312  mesh_property.getNumberOfGlobalComponents())
313  {
314  OGS_FATAL(
315  "Different number of components in meta data ({:d}) than in "
316  "the integration point field data for '{:s}': {:d}.",
317  ip_meta_data.n_components, name,
318  mesh_property.getNumberOfGlobalComponents());
319  }
320 
321  // Now we have a properly named vtk's field data array and the
322  // corresponding meta data.
323  std::size_t position = 0;
324  for (auto& local_asm : _local_assemblers)
325  {
326  std::size_t const integration_points_read =
327  local_asm->setIPDataInitialConditions(
328  name, &mesh_property[position],
329  ip_meta_data.integration_order);
330  if (integration_points_read == 0)
331  {
332  OGS_FATAL(
333  "No integration points read in the integration point "
334  "initial conditions set function for {:s} variable.",
335  name);
336  }
337  position += integration_points_read * ip_meta_data.n_components;
338  }
339  }
340 
341  // Initialize local assemblers after all variables have been set.
342  GlobalExecutor::executeMemberOnDereferenced(&LocalAssemblerIF::initialize,
343  _local_assemblers,
344  *_local_to_global_index_map);
345 }
346 
347 template <int DisplacementDim>
349 {
350  if (_use_monolithic_scheme)
351  {
352  const int monolithic_process_id = 0;
353  initializeProcessBoundaryConditionsAndSourceTerms(
354  *_local_to_global_index_map, monolithic_process_id);
355  return;
356  }
357 
358  // Staggered scheme:
359  // for the equations of pressure
360  const int hydraulic_process_id = 0;
361  initializeProcessBoundaryConditionsAndSourceTerms(
362  *_local_to_global_index_map_with_base_nodes, hydraulic_process_id);
363 
364  // for the equations of deformation.
365  const int mechanical_process_id = 1;
366  initializeProcessBoundaryConditionsAndSourceTerms(
367  *_local_to_global_index_map, mechanical_process_id);
368 }
369 
370 template <int DisplacementDim>
372  setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
373  double const t,
374  int const process_id)
375 {
376  if (process_id != 0)
377  {
378  return;
379  }
380 
381  DBUG("SetInitialConditions RichardsMechanicsProcess.");
382 
383  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
384 
386  &LocalAssemblerIF::setInitialConditions, _local_assemblers,
387  pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
388  _use_monolithic_scheme, process_id);
389 }
390 
391 template <int DisplacementDim>
393  const double t, double const dt, std::vector<GlobalVector*> const& x,
394  std::vector<GlobalVector*> const& xdot, int const process_id,
396 {
397  DBUG("Assemble the equations for RichardsMechanics");
398 
399  std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
400  dof_table = {std::ref(*_local_to_global_index_map)};
401  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
402 
403  // Call global assembler for each local assembly item.
405  _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
406  pv.getActiveElementIDs(), dof_table, t, dt, x, xdot, process_id, M, K,
407  b);
408 }
409 
410 template <int DisplacementDim>
413  const double t, double const dt, std::vector<GlobalVector*> const& x,
414  std::vector<GlobalVector*> const& xdot, const double dxdot_dx,
415  const double dx_dx, int const process_id, GlobalMatrix& M,
417 {
418  std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
419  dof_tables;
420  // For the monolithic scheme
421  if (_use_monolithic_scheme)
422  {
423  DBUG(
424  "Assemble the Jacobian of RichardsMechanics for the monolithic"
425  " scheme.");
426  dof_tables.emplace_back(*_local_to_global_index_map);
427  }
428  else
429  {
430  // For the staggered scheme
431  if (process_id == 0)
432  {
433  DBUG(
434  "Assemble the Jacobian equations of liquid fluid process in "
435  "RichardsMechanics for the staggered scheme.");
436  }
437  else
438  {
439  DBUG(
440  "Assemble the Jacobian equations of mechanical process in "
441  "RichardsMechanics for the staggered scheme.");
442  }
443  dof_tables.emplace_back(*_local_to_global_index_map_with_base_nodes);
444  dof_tables.emplace_back(*_local_to_global_index_map);
445  }
446 
447  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
448 
451  _local_assemblers, pv.getActiveElementIDs(), dof_tables, t, dt, x, xdot,
452  dxdot_dx, dx_dx, process_id, M, K, b, Jac);
453 
454  auto copyRhs = [&](int const variable_id, auto& output_vector)
455  {
456  if (_use_monolithic_scheme)
457  {
458  transformVariableFromGlobalVector(b, variable_id, dof_tables[0],
459  output_vector,
460  std::negate<double>());
461  }
462  else
463  {
464  transformVariableFromGlobalVector(b, 0, dof_tables[process_id],
465  output_vector,
466  std::negate<double>());
467  }
468  };
469  if (_use_monolithic_scheme || process_id == 0)
470  {
471  copyRhs(0, *_hydraulic_flow);
472  }
473  if (_use_monolithic_scheme || process_id == 1)
474  {
475  copyRhs(1, *_nodal_forces);
476  }
477 }
478 
479 template <int DisplacementDim>
481  std::vector<GlobalVector*> const& x, double const t, double const dt,
482  const int process_id)
483 {
484  if (hasMechanicalProcess(process_id))
485  {
486  DBUG("PostTimestep RichardsMechanicsProcess.");
487  auto const dof_tables = getDOFTables(x.size());
488 
489  ProcessLib::ProcessVariable const& pv =
490  getProcessVariables(process_id)[0];
492  &LocalAssemblerIF::postTimestep, _local_assemblers,
493  pv.getActiveElementIDs(), dof_tables, x, t, dt);
494  }
495 }
496 
497 template <int DisplacementDim>
499  computeSecondaryVariableConcrete(const double t, const double dt,
500  std::vector<GlobalVector*> const& x,
501  GlobalVector const& x_dot,
502  int const process_id)
503 {
504  if (process_id != 0)
505  {
506  return;
507  }
508 
509  DBUG("Compute the secondary variables for RichardsMechanicsProcess.");
510  auto const dof_tables = getDOFTables(x.size());
511 
512  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
514  &LocalAssemblerIF::computeSecondaryVariable, _local_assemblers,
515  pv.getActiveElementIDs(), dof_tables, t, dt, x, x_dot, process_id);
516 }
517 
518 template <int DisplacementDim>
519 std::tuple<NumLib::LocalToGlobalIndexMap*, bool> RichardsMechanicsProcess<
520  DisplacementDim>::getDOFTableForExtrapolatorData() const
521 {
522  const bool manage_storage = false;
523  return std::make_tuple(_local_to_global_index_map_single_component.get(),
524  manage_storage);
525 }
526 
527 template <int DisplacementDim>
530  const int process_id) const
531 {
532  if (hasMechanicalProcess(process_id))
533  {
534  return *_local_to_global_index_map;
535  }
536 
537  // For the equation of pressure
538  return *_local_to_global_index_map_with_base_nodes;
539 }
540 
541 template <int DisplacementDim>
542 std::vector<NumLib::LocalToGlobalIndexMap const*>
544  int const number_of_processes) const
545 {
546  std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
547  dof_tables.reserve(number_of_processes);
548  std::generate_n(std::back_inserter(dof_tables), number_of_processes,
549  [&]() { return &getDOFTable(dof_tables.size()); });
550  return dof_tables;
551 }
552 
553 template class RichardsMechanicsProcess<2>;
554 template class RichardsMechanicsProcess<3>;
555 
556 } // namespace RichardsMechanics
557 } // namespace ProcessLib
#define OGS_FATAL(...)
Definition: Error.h:26
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
Global vector based on Eigen vector.
Definition: EigenVector.h:26
bool isAxiallySymmetric() const
Definition: Mesh.h:126
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition: Mesh.h:71
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition: Mesh.h:98
Properties & getProperties()
Definition: Mesh.h:123
bool existsPropertyVector(std::string const &name) const
std::vector< std::size_t > const & getActiveElementIDs() const
std::vector< std::unique_ptr< IntegrationPointWriter > > _integration_point_writer
Definition: Process.h:350
std::vector< std::unique_ptr< LocalAssemblerIF > > _local_assemblers
void assembleConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) override
void assembleWithJacobianConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac) override
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override
Process specific initialization called by initialize().
void computeSecondaryVariableConcrete(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, int const process_id) override
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(const int number_of_processes) const
RichardsMechanicsProcess(std::string name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const &parameters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable >>> &&process_variables, RichardsMechanicsProcessData< DisplacementDim > &&process_data, SecondaryVariableCollection &&secondary_variables, bool const use_monolithic_scheme)
void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &x, double const t, int const process_id) override
void postTimestepConcreteProcess(std::vector< GlobalVector * > const &x, double const t, double const dt, const int process_id) override
NumLib::LocalToGlobalIndexMap const & getDOFTable(const int process_id) const override
Handles configuration of several secondary variables from the project file.
void assembleWithJacobian(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
void assemble(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Definition: KelvinVector.h:48
std::vector< Node * > getBaseNodes(std::vector< Element * > const &elements)
Definition: Utils.h:26
@ BY_LOCATION
Ordering data by spatial location.
GlobalSparsityPattern computeSparsityPattern(LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh)
Computes a sparsity pattern for the given inputs.
void transformVariableFromGlobalVector(GlobalVector const &input_vector, int const variable_id, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, MeshLib::PropertyVector< double > &output_vector, Functor mapFunction)
Definition: DOFTableUtil.h:59
void solidMaterialInternalToSecondaryVariables(std::map< int, std::unique_ptr< MaterialLib::Solids::MechanicsBase< DisplacementDim >>> const &solid_materials, AddSecondaryVariableCallback const &add_secondary_variable)
void solidMaterialInternalVariablesToIntegrationPointWriter(std::map< int, std::unique_ptr< MaterialLib::Solids::MechanicsBase< DisplacementDim >>> const &solid_materials, std::vector< std::unique_ptr< LocalAssemblerInterface >> const &local_assemblers, std::vector< std::unique_ptr< IntegrationPointWriter >> &integration_point_writer, int const integration_order)
void createLocalAssemblers(const unsigned, std::vector< MeshLib::Element * > const &mesh_elements, NumLib::LocalToGlobalIndexMap const &dof_table, const unsigned shapefunction_order, std::vector< std::unique_ptr< LocalAssemblerInterface >> &local_assemblers, ExtraCtorArgs &&... extra_ctor_args)
IntegrationPointMetaData getIntegrationPointMetaData(MeshLib::Mesh const &mesh, std::string const &name)
std::pair< std::vector< GlobalVector * >, std::vector< GlobalVector * > > setInitialConditions(double const t0, std::vector< std::unique_ptr< ProcessData >> const &per_process_data)
Definition: TimeLoop.cpp:216
SecondaryVariableFunctions makeExtrapolator(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, typename NumLib::ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection >::IntegrationPointValuesMethod integration_point_values_method)
static void executeSelectedMemberOnDereferenced(Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeSelectedMemberDereferenced(Object &object, Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeMemberOnDereferenced(Method method, Container const &container, Args &&... args)
virtual std::vector< double > getSwellingStress() const =0
virtual std::vector< double > getSaturation() const =0
virtual std::vector< double > getSigma() const =0
virtual std::vector< double > getPorosity() const =0
virtual std::vector< double > getTransportPorosity() const =0
virtual std::vector< double > getEpsilon() const =0