Flow123d  JS_before_hm-2152-gf87f4aac4
hm_iterative.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file hm_iterative.cc
15  * @brief
16  * @author Jan Stebel
17  */
18 
19 #include "hm_iterative.hh"
20 #include "system/sys_profiler.hh"
21 #include "input/input_type.hh"
22 #include "flow/richards_lmh.hh"
23 #include "fields/field_fe.hh" // for create_field_fe()
24 
25 
26 FLOW123D_FORCE_LINK_IN_CHILD(coupling_iterative)
27 
28 
29 namespace it = Input::Type;
30 
31 
33  return it::Record("Coupling_Iterative",
34  "Record with data for iterative coupling of flow and mechanics.\n")
38  .declare_key("flow_equation", RichardsLMH::get_input_type(),
40  "Flow equation, provides the velocity field as a result.")
41  .declare_key("mechanics_equation", Elasticity::get_input_type(),
42  "Mechanics, provides the displacement field.")
43  .declare_key("input_fields", it::Array(
45  .make_field_descriptor_type("Coupling_Iterative")),
47  "Input fields of the HM coupling.")
48  .declare_key( "iteration_parameter", it::Double(), it::Default("1"),
49  "Tuning parameter for iterative splitting. Its default value "
50  "corresponds to a theoretically optimal value with fastest convergence." )
51  .declare_key( "max_it", it::Integer(0), it::Default("100"),
52  "Maximal count of HM iterations." )
53  .declare_key( "min_it", it::Integer(0), it::Default("1"),
54  "Minimal count of HM iterations." )
55  .declare_key( "a_tol", it::Double(0), it::Default("0"),
56  "Absolute tolerance for difference in HM iteration." )
57  .declare_key( "r_tol", it::Double(0), it::Default("1e-7"),
58  "Relative tolerance for difference in HM iteration." )
59  .close();
60 }
61 
62 
63 const int HM_Iterative::registrar = Input::register_class< HM_Iterative, Mesh &, const Input::Record >("Coupling_Iterative")
65 
66 
68 {
69  *this += alpha.name("biot_alpha")
70  .description("Biot poroelastic coefficient.")
71  .units(UnitSI().dimensionless())
72  .input_default("0.0")
74 
75  *this += density.name("fluid_density")
76  .description("Volumetric mass density of the fluid.")
77  .units(UnitSI().kg().m(-3))
78  .input_default("0.0")
80 
81  *this += gravity.name("gravity")
82  .description("Gravitational acceleration constant.")
83  .units(UnitSI().m().s(-2))
84  .input_default("9.81")
86 
87  *this += beta.name("relaxation_beta")
88  .description("Parameter of numerical method for iterative solution of hydro-mechanical coupling.")
89  .units(UnitSI().dimensionless())
91 
92  *this += pressure_potential.name("pressure_potential")
93  .description("Coupling term entering the mechanics equation.")
94  .units(UnitSI().m())
96 
97  *this += ref_pressure_potential.name("ref_pressure_potential")
98  .description("Pressure potential on boundary (taking into account the flow boundary condition.")
99  .units(UnitSI().m())
101 
102  *this += flow_source.name("extra_flow_source")
103  .description("Coupling term entering the flow equation.")
104  .units(UnitSI().s(-1))
106 }
107 
108 
110 {
111  // initialize coupling fields with FieldFE
112  set_mesh(mesh);
113 
114  potential_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(mesh, MixedPtr<FE_CR>());
115  pressure_potential.set(potential_ptr_, 0.0);
116 
117  ref_potential_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(mesh, MixedPtr<FE_CR>());
118  ref_pressure_potential.set(ref_potential_ptr_, 0.0);
119 
120  beta_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(mesh, MixedPtr<FE_P_disc>(0));
121  beta.set(beta_ptr_, 0.0);
122 
123  flow_source_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(beta_ptr_->get_dofhandler());
124  flow_source.set(flow_source_ptr_, 0.0);
125 
126  old_pressure_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(beta_ptr_->get_dofhandler());
127  old_iter_pressure_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(beta_ptr_->get_dofhandler());
128  div_u_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(beta_ptr_->get_dofhandler());
129  old_div_u_ptr_ = create_field_fe<3, FieldValue<3>::Scalar>(beta_ptr_->get_dofhandler());
130 }
131 
132 
133 
135 : DarcyFlowInterface(mesh, in_record),
136  IterativeCoupling(in_record)
137 {
138  START_TIMER("HM constructor");
139  using namespace Input;
140 
141  time_ = new TimeGovernor(in_record.val<Record>("time"));
142  ASSERT( time_->is_default() == false ).error("Missing key 'time' in Coupling_Iterative.");
143 
144  // setup flow equation
145  Record flow_rec = in_record.val<Record>("flow_equation");
146  // Need explicit template types here, since reference is used (automatically passing by value)
147  flow_ = std::make_shared<RichardsLMH>(*mesh_, flow_rec, time_);
148  flow_->initialize();
149  std::stringstream ss; // print warning message with table of uninitialized fields
150  if ( FieldCommon::print_message_table(ss, "flow") )
151  WarningOut() << ss.str();
152 
153  // setup mechanics
154  Record mech_rec = in_record.val<Record>("mechanics_equation");
155  mechanics_ = std::make_shared<Elasticity>(*mesh_, mech_rec, this->time_);
156  mechanics_->eq_fields()["cross_section"].copy_from(flow_->eq_fields()["cross_section"]);
157  mechanics_->initialize();
158 
159  // read parameters controlling the iteration
160  beta_ = in_record.val<double>("iteration_parameter");
161 
162  this->eq_fieldset_ = &data_;
163 
164  // setup input fields
165  data_.set_input_list( in_record.val<Input::Array>("input_fields"), time() );
166 
169 }
170 
171 
173 {
174 }
175 
176 
177 template<int dim, class Value>
178 void copy_field(const FieldCommon &from_field_common, FieldFE<dim, Value> &to_field)
179 {
180  auto dh = to_field.get_dofhandler();
181  auto vec = to_field.vec();
182  Field<dim,Value> from_field;
183  from_field.copy_from(from_field_common);
184 
185  for ( auto cell : dh->own_range() )
186  vec.set( cell.local_idx(), from_field.value(cell.elm().centre(), cell.elm()) );
187 }
188 
189 
190 
192 {
194  std::stringstream ss;
195  if ( FieldCommon::print_message_table(ss, "coupling_iterative") )
196  WarningOut() << ss.str();
197 
198  flow_->zero_time_step();
200  mechanics_->zero_time_step();
201 
202  copy_field(*flow_->eq_fields().field("pressure_p0"), *data_.old_pressure_ptr_);
203  copy_field(*flow_->eq_fields().field("pressure_p0"), *data_.old_iter_pressure_ptr_);
204  copy_field(mechanics_->eq_fields().output_divergence, *data_.old_div_u_ptr_);
205  copy_field(mechanics_->eq_fields().output_divergence, *data_.div_u_ptr_);
206 }
207 
208 
210 {
211  time_->next_time();
212  time_->view("HM");
214 
215  solve_step();
216 }
217 
219 {
220  // pass displacement (divergence) to flow
221  // and solve flow problem
223  flow_->solve_time_step(false);
224 
225  // pass pressure to mechanics and solve mechanics
227  mechanics_->solve_linear_system();
228 }
229 
230 
232 {
233  mechanics_->update_output_fields();
234  copy_field(mechanics_->eq_fields().output_divergence, *data_.div_u_ptr_);
235  copy_field(*flow_->eq_fields().field("pressure_p0"), *data_.old_iter_pressure_ptr_);
236 }
237 
238 
240 {
241  flow_->accept_time_step();
242  flow_->output_data();
243  mechanics_->output_data();
244 
245  copy_field(*flow_->eq_fields().field("pressure_p0"), *data_.old_pressure_ptr_);
246  copy_field(mechanics_->eq_fields().output_divergence, *data_.old_div_u_ptr_);
247 }
248 
249 
251 {
252  auto potential_vec_ = data_.potential_ptr_->vec();
253  auto ref_potential_vec_ = data_.ref_potential_ptr_->vec();
254  auto dh = data_.potential_ptr_->get_dofhandler();
255  Field<3, FieldValue<3>::Scalar> field_edge_pressure;
256  field_edge_pressure.copy_from(*flow_->eq_fields().field("pressure_edge"));
257 
258  for ( auto ele : dh->local_range() )
259  {
260  auto elm = ele.elm();
261  LocDofVec dof_indices = ele.get_loc_dof_indices();
262  for ( auto side : ele.side_range() )
263  {
264  double alpha = data_.alpha.value(side.centre(), elm);
265  double density = data_.density.value(side.centre(), elm);
266  double gravity = data_.gravity.value(side.centre(), elm);
267  double pressure = field_edge_pressure.value(side.centre(), elm);
268  double potential = -alpha*density*gravity*pressure;
269 
270  potential_vec_.set( dof_indices[side.side_idx()], potential );
271 
272  // The reference potential is applied only on dirichlet and total_flux b.c.,
273  // i.e. where only mechanical traction is prescribed.
274  if (side.side().is_boundary() &&
275  (flow_->eq_fields().bc_type.value(side.centre(), side.cond().element_accessor()) == DarcyMH::EqFields::dirichlet ||
276  flow_->eq_fields().bc_type.value(side.centre(), side.cond().element_accessor()) == DarcyMH::EqFields::total_flux)
277  )
278  {
279  double bc_pressure = flow_->eq_fields().bc_pressure.value(side.centre(), side.cond().element_accessor());
280  ref_potential_vec_.set(dof_indices[side.side_idx()], -alpha*density*gravity*bc_pressure);
281  }
282  else
283  ref_potential_vec_.set(dof_indices[side.side_idx()], 0);
284  }
285  }
286 
287  potential_vec_.local_to_ghost_begin();
288  potential_vec_.local_to_ghost_end();
289  ref_potential_vec_.local_to_ghost_begin();
290  ref_potential_vec_.local_to_ghost_end();
294 }
295 
296 
298 {
299  auto beta_vec = data_.beta_ptr_->vec();
300  auto src_vec = data_.flow_source_ptr_->vec();
301  auto dh = data_.beta_ptr_->get_dofhandler();
302  Field<3,FieldValue<3>::Scalar> field_ele_pressure;
303  field_ele_pressure.copy_from(*flow_->eq_fields().field("pressure_p0"));
304  for ( auto ele : dh->local_range() )
305  {
306  auto elm = ele.elm();
307 
308  double alpha = data_.alpha.value(elm.centre(), elm);
309  double young = mechanics_->eq_fields().young_modulus.value(elm.centre(), elm);
310  double poisson = mechanics_->eq_fields().poisson_ratio.value(elm.centre(), elm);
311  double beta = beta_*0.5*alpha*alpha/(2*lame_mu(young, poisson)/elm.dim() + lame_lambda(young, poisson));
312 
313  double old_p = data_.old_pressure_ptr_->value(elm.centre(), elm);
314  double p = field_ele_pressure.value(elm.centre(), elm);
315  double div_u = data_.div_u_ptr_->value(elm.centre(), elm);
316  double old_div_u = data_.old_div_u_ptr_->value(elm.centre(), elm);
317  double src = (beta*(p-old_p) + alpha*(old_div_u - div_u)) / time_->dt();
318 
319  beta_vec.set(ele.local_idx(), beta);
320  src_vec.set(ele.local_idx(), src);
321  }
322 
323  beta_vec.local_to_ghost_begin();
324  src_vec.local_to_ghost_begin();
325  beta_vec.local_to_ghost_end();
326  src_vec.local_to_ghost_end();
329  flow_->set_extra_storativity(data_.beta);
330  flow_->set_extra_source(data_.flow_source);
331 }
332 
333 
334 void HM_Iterative::compute_iteration_error(double& abs_error, double& rel_error)
335 {
336  auto dh = data_.beta_ptr_->get_dofhandler();
337  double p_dif2 = 0, p_norm2 = 0;
338  Field<3,FieldValue<3>::Scalar> field_ele_pressure;
339  field_ele_pressure.copy_from(*flow_->eq_fields().field("pressure_p0"));
340  for (auto cell : dh->own_range())
341  {
342  auto elm = cell.elm();
343  double new_p = field_ele_pressure.value(elm.centre(), elm);
344  double old_p = data_.old_iter_pressure_ptr_->value(elm.centre(), elm);
345  p_dif2 += pow(new_p - old_p, 2)*elm.measure();
346  p_norm2 += pow(old_p, 2)*elm.measure();
347  }
348 
349  double send_data[] = { p_dif2, p_norm2 };
350  double recv_data[2];
351  MPI_Allreduce(&send_data, &recv_data, 2, MPI_DOUBLE, MPI_SUM, PETSC_COMM_WORLD);
352  abs_error = sqrt(recv_data[0]);
353  rel_error = abs_error / (sqrt(recv_data[1]) + std::numeric_limits<double>::min());
354 
355  MessageOut().fmt("HM Iteration {} abs. difference: {} rel. difference: {}\n"
356  "--------------------------------------------------------",
357  iteration(), abs_error, rel_error);
358 
359  if(iteration() >= max_it_ && (abs_error > a_tol_ || rel_error > r_tol_))
360  MessageOut().fmt("HM solver did not converge in {} iterations.\n", iteration());
361 }
362 
363 
364 
366  flow_.reset();
367  mechanics_.reset();
368 }
369 
370 
371 
FieldCommon::units
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
Definition: field_common.hh:152
LimitSide::right
@ right
HM_Iterative::get_input_type
static const Input::Type::Record & get_input_type()
Define input record.
Definition: hm_iterative.cc:32
HM_Iterative::EqData::old_iter_pressure_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > old_iter_pressure_ptr_
Definition: hm_iterative.hh:151
FieldFlag::in_rhs
static constexpr Mask in_rhs
A field is part of the right hand side of the equation.
Definition: field_flag.hh:51
LocDofVec
arma::Col< IntIdx > LocDofVec
Definition: index_types.hh:28
IterativeCoupling::solve_step
void solve_step()
Definition: hm_iterative.hh:64
EquationBase::mesh_
Mesh * mesh_
Definition: equation.hh:220
HM_Iterative::EqData::beta_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > beta_ptr_
Definition: hm_iterative.hh:148
HM_Iterative::EqData::old_div_u_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > old_div_u_ptr_
Definition: hm_iterative.hh:153
IterativeCoupling::iteration
unsigned int iteration()
Definition: hm_iterative.hh:80
Armor::vec
ArmaVec< double, N > vec
Definition: armor.hh:885
TimeGovernor::dt
double dt() const
Definition: time_governor.hh:565
FieldSet::set_time
bool set_time(const TimeStep &time, LimitSide limit_side)
Definition: field_set.cc:245
Input
Abstract linear system class.
Definition: balance.hh:40
HM_Iterative::flow_
std::shared_ptr< RichardsLMH > flow_
steady or unsteady water flow simulator based on MH scheme
Definition: hm_iterative.hh:182
ASSERT
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
Definition: asserts.hh:347
EquationBase::time_
TimeGovernor * time_
Definition: equation.hh:221
Input::Type::Integer
Class for declaration of the integral input data.
Definition: type_base.hh:483
IterativeCoupling
Definition: hm_iterative.hh:38
Input::Record::val
const Ret val(const string &key) const
Definition: accessors_impl.hh:31
richards_lmh.hh
EquationBase::time
TimeGovernor & time()
Definition: equation.hh:149
FieldSet::set_input_list
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
Definition: field_set.hh:289
HM_Iterative::registrar
static const int registrar
Definition: hm_iterative.hh:179
Input::Type::Double
Class for declaration of the input data that are floating point numbers.
Definition: type_base.hh:534
FLOW123D_FORCE_LINK_IN_CHILD
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
Definition: global_defs.h:157
MPI_DOUBLE
#define MPI_DOUBLE
Definition: mpi.h:156
HM_Iterative::zero_time_step
void zero_time_step() override
Definition: hm_iterative.cc:191
HM_Iterative::EqData::ref_pressure_potential
Field< 3, FieldValue< 3 >::Scalar > ref_pressure_potential
Potential of reference (prescribed) pressure from flow b.c. TODO: Swith to BCField when possible.
Definition: hm_iterative.hh:142
HM_Iterative::EqData
Definition: hm_iterative.hh:128
FieldCommon::flags
FieldCommon & flags(FieldFlag::Flags::Mask mask)
Definition: field_common.hh:191
HM_Iterative::mechanics_
std::shared_ptr< Elasticity > mechanics_
solute transport with chemistry through operator splitting
Definition: hm_iterative.hh:185
field_fe.hh
FieldCommon::set_time_result_changed
void set_time_result_changed()
Manually mark flag that the field has been changed.
Definition: field_common.hh:734
copy_field
void copy_field(const FieldCommon &from_field_common, FieldFE< dim, Value > &to_field)
Definition: hm_iterative.cc:178
HM_Iterative::EqData::pressure_potential
Field< 3, FieldValue< 3 >::Scalar > pressure_potential
Potential -alpha*pressure whose gradient is passed to mechanics as additional load.
Definition: hm_iterative.hh:141
FieldFlag::equation_external_output
static constexpr Mask equation_external_output
Match an output field, that can be also copy of other field.
Definition: field_flag.hh:58
HM_Iterative::EqData::flow_source_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > flow_source_ptr_
Definition: hm_iterative.hh:149
HM_Iterative::EqData::initialize
void initialize(Mesh &mesh)
Definition: hm_iterative.cc:109
HM_Iterative::update_after_converged
void update_after_converged() override
Save data after iterations have finished.
Definition: hm_iterative.cc:239
FieldCommon::flags_add
FieldCommon & flags_add(FieldFlag::Flags::Mask mask)
Definition: field_common.hh:197
HM_Iterative::EqData::div_u_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > div_u_ptr_
Definition: hm_iterative.hh:152
FieldFE::get_dofhandler
std::shared_ptr< DOFHandlerMultiDim > get_dofhandler() const
Definition: field_fe.hh:177
IterativeCoupling::a_tol_
double a_tol_
Absolute tolerance for difference between two succeeding iterations.
Definition: hm_iterative.hh:105
Input::Type::Record::size
unsigned int size() const
Returns number of keys in the Record.
Definition: type_record.hh:602
EquationBase::mesh
Mesh & mesh()
Definition: equation.hh:179
Input::Type::Default
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
Input::Type::Record::derive_from
virtual Record & derive_from(Abstract &parent)
Method to derive new Record from an AbstractRecord parent.
Definition: type_record.cc:196
hm_iterative.hh
HM_Iterative::HM_Iterative
HM_Iterative(Mesh &mesh, Input::Record in_record)
Definition: hm_iterative.cc:134
HM_Iterative::EqData::old_pressure_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > old_pressure_ptr_
Definition: hm_iterative.hh:150
Input::Record
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
FieldFlag::equation_result
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
Definition: field_flag.hh:55
IterativeCoupling::record_template
static const Input::Type::Record & record_template()
Definition: hm_iterative.hh:41
sys_profiler.hh
HM_Iterative::EqData::potential_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > potential_ptr_
FieldFE for pressure_potential field.
Definition: hm_iterative.hh:146
TimeGovernor
Basic time management functionality for unsteady (and steady) solvers (class Equation).
Definition: time_governor.hh:317
HM_Iterative::update_potential
void update_potential()
Definition: hm_iterative.cc:250
TimeGovernor::step
const TimeStep & step(int index=-1) const
Definition: time_governor.cc:756
FieldFE::vec
VectorMPI & vec()
Definition: field_fe.hh:181
Input::Type::Default::obligatory
static Default obligatory()
The factory function to make an empty default value which is obligatory.
Definition: type_record.hh:110
HM_Iterative::compute_iteration_error
void compute_iteration_error(double &abs_error, double &rel_error) override
Compute absolute and relative error in the solution.
Definition: hm_iterative.cc:334
FieldCommon
Common abstract parent of all Field<...> classes.
Definition: field_common.hh:76
FieldCommon::print_message_table
static bool print_message_table(ostream &stream, std::string equation_name)
Definition: field_common.cc:96
UnitSI
Class for representation SI units of Fields.
Definition: unit_si.hh:40
HM_Iterative::EqData::ref_potential_ptr_
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > ref_potential_ptr_
Definition: hm_iterative.hh:147
Input::Type::Record::declare_key
Record & declare_key(const string &key, std::shared_ptr< TypeBase > type, const Default &default_value, const string &description, TypeBase::attribute_map key_attributes=TypeBase::attribute_map())
Declares a new key of the Record.
Definition: type_record.cc:503
HM_Iterative::update_flow_fields
void update_flow_fields()
Definition: hm_iterative.cc:297
DarcyFlowInterface::get_input_type
static Input::Type::Abstract & get_input_type()
Definition: darcy_flow_interface.hh:23
HM_Iterative::update_solution
void update_solution() override
Definition: hm_iterative.cc:209
TimeGovernor::view
void view(const char *name="") const
Definition: time_governor.cc:772
Input::Type::Record::close
Record & close() const
Close the Record for further declarations of keys.
Definition: type_record.cc:304
Input::Type
Definition: balance.hh:41
HM_Iterative::beta_
double beta_
Tuning parameter for iterative splitting.
Definition: hm_iterative.hh:190
Input::Type::Record
Record type proxy class.
Definition: type_record.hh:182
MPI_SUM
#define MPI_SUM
Definition: mpi.h:196
Field::value
virtual const Value::return_type & value(const Point &p, const ElementAccessor< spacedim > &elm) const
Definition: field.hh:449
HM_Iterative::initialize
void initialize() override
Definition: hm_iterative.cc:172
FieldCommon::input_default
FieldCommon & input_default(const string &input_default)
Definition: field_common.hh:139
input_type.hh
FieldFE
Definition: field.hh:61
Mesh
Definition: mesh.h:355
DarcyMH::EqFields::total_flux
@ total_flux
Definition: darcy_flow_mh.hh:152
HM_Iterative::~HM_Iterative
~HM_Iterative()
Definition: hm_iterative.cc:365
HM_Iterative::EqData::alpha
Field< 3, FieldValue< 3 >::Scalar > alpha
Biot coefficient.
Definition: hm_iterative.hh:135
IterativeCoupling::r_tol_
double r_tol_
Relative tolerance for difference between two succeeding iterations.
Definition: hm_iterative.hh:108
Input::Type::Record::copy_keys
Record & copy_keys(const Record &other)
Copy keys from other record.
Definition: type_record.cc:216
Input::Type::Array
Class for declaration of inputs sequences.
Definition: type_base.hh:339
RichardsLMH::get_input_type
static const Input::Type::Record & get_input_type()
Definition: richards_lmh.cc:83
MPI_Allreduce
#define MPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm)
Definition: mpi.h:612
HM_Iterative::EqData::gravity
Field< 3, FieldValue< 3 >::Scalar > gravity
Standard gravity.
Definition: hm_iterative.hh:137
Input::Array
Accessor to input data conforming to declared Array.
Definition: accessors.hh:566
WarningOut
#define WarningOut()
Macro defining 'warning' record of log.
Definition: logger.hh:278
lame_mu
double lame_mu(double young, double poisson)
Definition: elasticity.cc:77
EquationBase::record_template
static Input::Type::Record & record_template()
Template Record with common keys for derived equations.
Definition: equation.cc:35
HM_Iterative::EqData::flow_source
Field< 3, FieldValue< 3 >::Scalar > flow_source
Definition: hm_iterative.hh:143
MixedPtr
Definition: mixed.hh:247
HM_Iterative::EqData::beta
Field< 3, FieldValue< 3 >::Scalar > beta
Definition: hm_iterative.hh:138
TimeGovernor::is_default
bool is_default()
Definition: time_governor.hh:388
HM_Iterative::data_
EqData data_
Definition: hm_iterative.hh:187
EquationBase::eq_fieldset_
FieldSet * eq_fieldset_
Definition: equation.hh:229
HM_Iterative::update_after_iteration
void update_after_iteration() override
Save data (e.g. solution fields) for the next iteration.
Definition: hm_iterative.cc:231
HM_Iterative::EqData::EqData
EqData()
Definition: hm_iterative.cc:67
Elasticity::get_input_type
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportDG.
Definition: elasticity.cc:47
HM_Iterative::solve_iteration
void solve_iteration() override
Solve equations and update data (fields).
Definition: hm_iterative.cc:218
lame_lambda
double lame_lambda(double young, double poisson)
Definition: elasticity.cc:83
FieldCommon::description
FieldCommon & description(const string &description)
Definition: field_common.hh:127
Field
Class template representing a field with values dependent on: point, element, and region.
Definition: field.hh:93
DarcyMH::EqFields::dirichlet
@ dirichlet
Definition: darcy_flow_mh.hh:151
HM_Iterative::EqData::density
Field< 3, FieldValue< 3 >::Scalar > density
Density of fluid.
Definition: hm_iterative.hh:136
TimeGovernor::next_time
void next_time()
Proceed to the next time according to current estimated time step.
Definition: time_governor.cc:670
IterativeCoupling::max_it_
unsigned int max_it_
Maximal number of iterations.
Definition: hm_iterative.hh:102
Field::copy_from
void copy_from(const FieldCommon &other) override
Definition: field.impl.hh:367
START_TIMER
#define START_TIMER(tag)
Starts a timer with specified tag.
Definition: sys_profiler.hh:115
DarcyFlowInterface
Definition: darcy_flow_interface.hh:15
FieldCommon::name
FieldCommon & name(const string &name)
Definition: field_common.hh:120
MessageOut
#define MessageOut()
Macro defining 'message' record of log.
Definition: logger.hh:275