OGS
HydroMechanicsProcess.cpp
Go to the documentation of this file.
1 
11 #include "HydroMechanicsProcess.h"
12 
13 #include <cassert>
14 
15 #include "HydroMechanicsFEM.h"
17 #include "MeshLib/Elements/Utils.h"
21 #include "ProcessLib/Process.h"
22 namespace ProcessLib
23 {
24 namespace HydroMechanics
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  _integration_point_writer.emplace_back(
50  std::make_unique<IntegrationPointWriter>(
51  "sigma_ip",
52  static_cast<int>(mesh.getDimension() == 2 ? 4 : 6) /*n components*/,
53  integration_order, _local_assemblers, &LocalAssemblerIF::getSigma));
54 
55  _integration_point_writer.emplace_back(
56  std::make_unique<IntegrationPointWriter>(
57  "epsilon_ip",
58  static_cast<int>(mesh.getDimension() == 2 ? 4 : 6) /*n components*/,
59  integration_order, _local_assemblers,
61 }
62 
63 template <int DisplacementDim>
65 {
66  return false;
67 }
68 
69 template <int DisplacementDim>
72  const int process_id) const
73 {
74  // For the monolithic scheme or the M process (deformation) in the staggered
75  // scheme.
76  if (_use_monolithic_scheme || process_id == 1)
77  {
78  auto const& l = *_local_to_global_index_map;
79  return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
80  &l.getGhostIndices(), &this->_sparsity_pattern};
81  }
82 
83  // For staggered scheme and H process (pressure).
84  auto const& l = *_local_to_global_index_map_with_base_nodes;
85  return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
86  &l.getGhostIndices(), &_sparsity_pattern_with_linear_element};
87 }
88 
89 template <int DisplacementDim>
91 {
92  // Create single component dof in every of the mesh's nodes.
93  _mesh_subset_all_nodes =
94  std::make_unique<MeshLib::MeshSubset>(_mesh, _mesh.getNodes());
95  // Create single component dof in the mesh's base nodes.
96  _base_nodes = MeshLib::getBaseNodes(_mesh.getElements());
97  _mesh_subset_base_nodes =
98  std::make_unique<MeshLib::MeshSubset>(_mesh, _base_nodes);
99 
100  // TODO move the two data members somewhere else.
101  // for extrapolation of secondary variables of stress or strain
102  std::vector<MeshLib::MeshSubset> all_mesh_subsets_single_component{
103  *_mesh_subset_all_nodes};
104  _local_to_global_index_map_single_component =
105  std::make_unique<NumLib::LocalToGlobalIndexMap>(
106  std::move(all_mesh_subsets_single_component),
107  // by location order is needed for output
109 
110  if (_use_monolithic_scheme)
111  {
112  // For pressure, which is the first
113  std::vector<MeshLib::MeshSubset> all_mesh_subsets{
114  *_mesh_subset_base_nodes};
115 
116  // For displacement.
117  const int monolithic_process_id = 0;
118  std::generate_n(std::back_inserter(all_mesh_subsets),
119  getProcessVariables(monolithic_process_id)[1]
120  .get()
121  .getNumberOfGlobalComponents(),
122  [&]() { return *_mesh_subset_all_nodes; });
123 
124  std::vector<int> const vec_n_components{1, DisplacementDim};
125  _local_to_global_index_map =
126  std::make_unique<NumLib::LocalToGlobalIndexMap>(
127  std::move(all_mesh_subsets), vec_n_components,
129  assert(_local_to_global_index_map);
130  }
131  else
132  {
133  // For displacement equation.
134  const int process_id = 1;
135  std::vector<MeshLib::MeshSubset> all_mesh_subsets;
136  std::generate_n(std::back_inserter(all_mesh_subsets),
137  getProcessVariables(process_id)[0]
138  .get()
139  .getNumberOfGlobalComponents(),
140  [&]() { return *_mesh_subset_all_nodes; });
141 
142  std::vector<int> const vec_n_components{DisplacementDim};
143  _local_to_global_index_map =
144  std::make_unique<NumLib::LocalToGlobalIndexMap>(
145  std::move(all_mesh_subsets), vec_n_components,
147 
148  // For pressure equation.
149  // Collect the mesh subsets with base nodes in a vector.
150  std::vector<MeshLib::MeshSubset> all_mesh_subsets_base_nodes{
151  *_mesh_subset_base_nodes};
152  _local_to_global_index_map_with_base_nodes =
153  std::make_unique<NumLib::LocalToGlobalIndexMap>(
154  std::move(all_mesh_subsets_base_nodes),
155  // by location order is needed for output
157 
158  _sparsity_pattern_with_linear_element = NumLib::computeSparsityPattern(
159  *_local_to_global_index_map_with_base_nodes, _mesh);
160 
161  assert(_local_to_global_index_map);
162  assert(_local_to_global_index_map_with_base_nodes);
163  }
164 }
165 
166 template <int DisplacementDim>
168  NumLib::LocalToGlobalIndexMap const& dof_table,
169  MeshLib::Mesh const& mesh,
170  unsigned const integration_order)
171 {
172  const int mechanical_process_id = _use_monolithic_scheme ? 0 : 1;
173  const int deformation_variable_id = _use_monolithic_scheme ? 1 : 0;
175  DisplacementDim, HydroMechanicsLocalAssembler>(
176  mesh.getDimension(), mesh.getElements(), dof_table,
177  // use displacement process variable to set shape function order
178  getProcessVariables(mechanical_process_id)[deformation_variable_id]
179  .get()
180  .getShapeFunctionOrder(),
181  _local_assemblers, mesh.isAxiallySymmetric(), integration_order,
182  _process_data);
183 
184  auto add_secondary_variable = [&](std::string const& name,
185  int const num_components,
186  auto get_ip_values_function)
187  {
188  _secondary_variables.addSecondaryVariable(
189  name,
190  makeExtrapolator(num_components, getExtrapolator(),
191  _local_assemblers,
192  std::move(get_ip_values_function)));
193  };
194 
195  add_secondary_variable("sigma",
197  DisplacementDim>::RowsAtCompileTime,
198  &LocalAssemblerIF::getIntPtSigma);
199 
200  add_secondary_variable("epsilon",
202  DisplacementDim>::RowsAtCompileTime,
203  &LocalAssemblerIF::getIntPtEpsilon);
204 
205  add_secondary_variable("velocity", DisplacementDim,
206  &LocalAssemblerIF::getIntPtDarcyVelocity);
207 
208  //
209  // enable output of internal variables defined by material models
210  //
212  LocalAssemblerIF>(_process_data.solid_materials,
213  add_secondary_variable);
214 
215  _process_data.pressure_interpolated =
216  MeshLib::getOrCreateMeshProperty<double>(
217  const_cast<MeshLib::Mesh&>(mesh), "pressure_interpolated",
219 
220  _process_data.principal_stress_vector[0] =
221  MeshLib::getOrCreateMeshProperty<double>(
222  const_cast<MeshLib::Mesh&>(mesh), "principal_stress_vector_1",
224 
225  _process_data.principal_stress_vector[1] =
226  MeshLib::getOrCreateMeshProperty<double>(
227  const_cast<MeshLib::Mesh&>(mesh), "principal_stress_vector_2",
229 
230  _process_data.principal_stress_vector[2] =
231  MeshLib::getOrCreateMeshProperty<double>(
232  const_cast<MeshLib::Mesh&>(mesh), "principal_stress_vector_3",
234 
235  _process_data.principal_stress_values =
236  MeshLib::getOrCreateMeshProperty<double>(
237  const_cast<MeshLib::Mesh&>(mesh), "principal_stress_values",
239 
240  _process_data.permeability = MeshLib::getOrCreateMeshProperty<double>(
241  const_cast<MeshLib::Mesh&>(mesh), "permeability",
244 
245  // Set initial conditions for integration point data.
246  for (auto const& ip_writer : _integration_point_writer)
247  {
248  // Find the mesh property with integration point writer's name.
249  auto const& name = ip_writer->name();
250  if (!mesh.getProperties().existsPropertyVector<double>(name))
251  {
252  continue;
253  }
254  auto const& mesh_property =
255  *mesh.getProperties().template getPropertyVector<double>(name);
256 
257  // The mesh property must be defined on integration points.
258  if (mesh_property.getMeshItemType() !=
260  {
261  continue;
262  }
263 
264  auto const ip_meta_data = getIntegrationPointMetaData(mesh, name);
265 
266  // Check the number of components.
267  if (ip_meta_data.n_components !=
268  mesh_property.getNumberOfGlobalComponents())
269  {
270  OGS_FATAL(
271  "Different number of components in meta data ({:d}) than in "
272  "the integration point field data for '{:s}': {:d}.",
273  ip_meta_data.n_components, name,
274  mesh_property.getNumberOfGlobalComponents());
275  }
276 
277  // Now we have a properly named vtk's field data array and the
278  // corresponding meta data.
279  std::size_t position = 0;
280  for (auto& local_asm : _local_assemblers)
281  {
282  std::size_t const integration_points_read =
283  local_asm->setIPDataInitialConditions(
284  name, &mesh_property[position],
285  ip_meta_data.integration_order);
286  if (integration_points_read == 0)
287  {
288  OGS_FATAL(
289  "No integration points read in the integration point "
290  "initial conditions set function.");
291  }
292  position += integration_points_read * ip_meta_data.n_components;
293  }
294  }
295 
296  // Initialize local assemblers after all variables have been set.
297  GlobalExecutor::executeMemberOnDereferenced(&LocalAssemblerIF::initialize,
298  _local_assemblers,
299  *_local_to_global_index_map);
300 }
301 
302 template <int DisplacementDim>
304 {
305  if (_use_monolithic_scheme)
306  {
307  const int process_id_of_hydromechanics = 0;
308  initializeProcessBoundaryConditionsAndSourceTerms(
309  *_local_to_global_index_map, process_id_of_hydromechanics);
310  return;
311  }
312 
313  // Staggered scheme:
314  // for the equations of pressure
315  const int hydraulic_process_id = 0;
316  initializeProcessBoundaryConditionsAndSourceTerms(
317  *_local_to_global_index_map_with_base_nodes, hydraulic_process_id);
318 
319  // for the equations of deformation.
320  const int mechanical_process_id = 1;
321  initializeProcessBoundaryConditionsAndSourceTerms(
322  *_local_to_global_index_map, mechanical_process_id);
323 }
324 
325 template <int DisplacementDim>
327  const double t, double const dt, std::vector<GlobalVector*> const& x,
328  std::vector<GlobalVector*> const& xdot, int const process_id,
330 {
331  DBUG("Assemble the equations for HydroMechanics");
332 
333  // Note: This assembly function is for the Picard nonlinear solver. Since
334  // only the Newton-Raphson method is employed to simulate coupled HM
335  // processes in this class, this function is actually not used so far.
336 
337  std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
338  dof_table = {std::ref(*_local_to_global_index_map)};
339 
340  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
341 
343  _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
344  pv.getActiveElementIDs(), dof_table, t, dt, x, xdot, process_id, M, K,
345  b);
346 }
347 
348 template <int DisplacementDim>
351  const double t, double const dt, std::vector<GlobalVector*> const& x,
352  std::vector<GlobalVector*> const& xdot, const double dxdot_dx,
353  const double dx_dx, int const process_id, GlobalMatrix& M,
355 {
356  std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
357  dof_tables;
358  // For the monolithic scheme
359  if (_use_monolithic_scheme)
360  {
361  DBUG(
362  "Assemble the Jacobian of HydroMechanics for the monolithic "
363  "scheme.");
364  dof_tables.emplace_back(*_local_to_global_index_map);
365  }
366  else
367  {
368  // For the staggered scheme
369  if (process_id == 0)
370  {
371  DBUG(
372  "Assemble the Jacobian equations of liquid fluid process in "
373  "HydroMechanics for the staggered scheme.");
374  }
375  else
376  {
377  DBUG(
378  "Assemble the Jacobian equations of mechanical process in "
379  "HydroMechanics for the staggered scheme.");
380  }
381  dof_tables.emplace_back(*_local_to_global_index_map_with_base_nodes);
382  dof_tables.emplace_back(*_local_to_global_index_map);
383  }
384 
385  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
386 
389  _local_assemblers, pv.getActiveElementIDs(), dof_tables, t, dt, x, xdot,
390  dxdot_dx, dx_dx, process_id, M, K, b, Jac);
391 
392  auto copyRhs = [&](int const variable_id, auto& output_vector)
393  {
394  if (_use_monolithic_scheme)
395  {
396  transformVariableFromGlobalVector(b, variable_id, dof_tables[0],
397  output_vector,
398  std::negate<double>());
399  }
400  else
401  {
402  transformVariableFromGlobalVector(b, 0, dof_tables[process_id],
403  output_vector,
404  std::negate<double>());
405  }
406  };
407  if (_use_monolithic_scheme || process_id == 0)
408  {
409  copyRhs(0, *_hydraulic_flow);
410  }
411  if (_use_monolithic_scheme || process_id == 1)
412  {
413  copyRhs(1, *_nodal_forces);
414  }
415 }
416 
417 template <int DisplacementDim>
419  std::vector<GlobalVector*> const& x, double const t, double const dt,
420  const int process_id)
421 {
422  DBUG("PreTimestep HydroMechanicsProcess.");
423 
424  if (hasMechanicalProcess(process_id))
425  {
426  ProcessLib::ProcessVariable const& pv =
427  getProcessVariables(process_id)[0];
429  &LocalAssemblerIF::preTimestep, _local_assemblers,
430  pv.getActiveElementIDs(), *_local_to_global_index_map,
431  *x[process_id], t, dt);
432  }
433 }
434 
435 template <int DisplacementDim>
437  std::vector<GlobalVector*> const& x, double const t, double const dt,
438  const int process_id)
439 {
440  if (process_id != 0)
441  {
442  return;
443  }
444 
445  DBUG("PostTimestep HydroMechanicsProcess.");
446  std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
447  auto const n_processes = x.size();
448  dof_tables.reserve(n_processes);
449  for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
450  {
451  dof_tables.push_back(&getDOFTable(process_id));
452  }
453 
454  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
456  &LocalAssemblerIF::postTimestep, _local_assemblers,
457  pv.getActiveElementIDs(), dof_tables, x, t, dt);
458 }
459 
460 template <int DisplacementDim>
462  GlobalVector const& x, GlobalVector const& xdot, const double t,
463  double const dt, const int process_id)
464 {
465  DBUG("PostNonLinearSolver HydroMechanicsProcess.");
466  // Calculate strain, stress or other internal variables of mechanics.
467  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
469  &LocalAssemblerIF::postNonLinearSolver, _local_assemblers,
470  pv.getActiveElementIDs(), getDOFTable(process_id), x, xdot, t, dt,
471  _use_monolithic_scheme, process_id);
472 }
473 
474 template <int DisplacementDim>
476  setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
477  double const t,
478  int const process_id)
479 {
480  if (process_id != _process_data.hydraulic_process_id)
481  {
482  return;
483  }
484 
485  DBUG("Set initial conditions of HydroMechanicsProcess.");
486 
487  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
489  &LocalAssemblerIF::setInitialConditions, _local_assemblers,
490  pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
491  _use_monolithic_scheme, process_id);
492 }
493 
494 template <int DisplacementDim>
496  double const t, double const dt, std::vector<GlobalVector*> const& x,
497  GlobalVector const& x_dot, const int process_id)
498 {
499  if (process_id != 0)
500  {
501  return;
502  }
503 
504  DBUG("Compute the secondary variables for HydroMechanicsProcess.");
505  std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
506  auto const n_processes = x.size();
507  dof_tables.reserve(n_processes);
508  for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
509  {
510  dof_tables.push_back(&getDOFTable(process_id));
511  }
512 
513  ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
515  &LocalAssemblerIF::computeSecondaryVariable, _local_assemblers,
516  pv.getActiveElementIDs(), dof_tables, t, dt, x, x_dot, process_id);
517 }
518 
519 template <int DisplacementDim>
520 std::tuple<NumLib::LocalToGlobalIndexMap*, bool>
522 {
523  const bool manage_storage = false;
524  return std::make_tuple(_local_to_global_index_map_single_component.get(),
525  manage_storage);
526 }
527 
528 template <int DisplacementDim>
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 class HydroMechanicsProcess<2>;
542 template class HydroMechanicsProcess<3>;
543 
544 } // namespace HydroMechanics
545 } // 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
void postNonLinearSolverConcreteProcess(GlobalVector const &x, GlobalVector const &xdot, const double t, double const dt, int const process_id) override
std::vector< std::unique_ptr< LocalAssemblerIF > > _local_assemblers
HydroMechanicsProcess(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, HydroMechanicsProcessData< DisplacementDim > &&process_data, SecondaryVariableCollection &&secondary_variables, bool const use_monolithic_scheme)
void preTimestepConcreteProcess(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
void postTimestepConcreteProcess(std::vector< GlobalVector * > const &x, const double t, const double dt, int const process_id) override
MeshLib::PropertyVector< double > * _nodal_forces
void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &x, double const t, int const process_id) override
MeshLib::PropertyVector< double > * _hydraulic_flow
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
void assembleWithJacobianConcreteProcess(const double t, double const, 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
void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override
Process specific initialization called by initialize().
void assembleConcreteProcess(const double t, double const, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) override
void computeSecondaryVariableConcrete(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, const int process_id) override
std::tuple< NumLib::LocalToGlobalIndexMap *, bool > getDOFTableForExtrapolatorData() const override
std::vector< std::size_t > const & getActiveElementIDs() const
std::vector< std::unique_ptr< IntegrationPointWriter > > _integration_point_writer
Definition: Process.h:350
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
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Definition: KelvinVector.h:23
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 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 > getEpsilon() const =0
virtual std::vector< double > getSigma() const =0