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