Flow123d  DF_patch_fe_darcy_complete-579fe1e
assembly_richards.hh
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 assembly_richards.hh
15  * @brief
16  */
17 
18 #ifndef ASSEMBLY_RICHARDS_HH_
19 #define ASSEMBLY_RICHARDS_HH_
20 
23 #include "flow/assembly_lmh.hh"
24 #include "flow/soil_models.hh"
25 #include "fem/element_cache_map.hh"
26 
27 
28 template <unsigned int dim, class TEqData>
30 {
31 public:
32  typedef typename TEqData::EqFields EqFields;
33  typedef TEqData EqData;
34 
35  static constexpr const char * name() { return "Richards_InitCondPostprocess_Assembly"; }
36 
37  /// Constructor.
39  : AssemblyBase<dim>(0, asm_internals), eq_fields_(eq_data->eq_fields_.get()), eq_data_(eq_data),
41  this->used_fields_ += this->eq_fields_->storativity;
42  this->used_fields_ += this->eq_fields_->extra_storativity;
43  this->used_fields_ += this->eq_fields_->genuchten_n_exponent;
44  this->used_fields_ += this->eq_fields_->genuchten_p_head_scale;
45  this->used_fields_ += this->eq_fields_->water_content_residual;
46  this->used_fields_ += this->eq_fields_->water_content_saturated;
47  this->used_fields_ += this->eq_fields_->conductivity;
48  this->used_fields_ += this->eq_fields_->cross_section;
49  }
50 
51  /// Destructor.
53 
54  /// Initialize auxiliary vectors and other data members
55  void initialize() {}
56 
57  inline void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx) {
58  ASSERT_EQ(cell.dim(), dim).error("Dimension of element mismatch!");
59 
61  cr_disc_dofs_ = cell.cell_with_other_dh(this->eq_data_->dh_cr_disc_.get()).get_loc_dof_indices();
62  const DHCellAccessor dh_cell = cell.cell_with_other_dh(this->eq_data_->dh_.get());
63 
64  auto p = *( bulk_integral_->points(element_patch_idx).begin() );
65  bool genuchten_on = reset_soil_model(cell, p);
66  storativity_ = this->eq_fields_->storativity(p)
67  + this->eq_fields_->extra_storativity(p);
68  VectorMPI water_content_vec = this->eq_fields_->water_content_ptr->vec();
69  double diagonal_coef = cell.elm().measure() * eq_fields_->cross_section(p) / cell.elm()->n_sides();
70 
71  for (unsigned int i=0; i<cell.elm()->n_sides(); i++) {
72  const int local_side = cr_disc_dofs_[i];
73  capacity = 0;
74  water_content = 0;
75  phead = this->eq_data_->p_edge_solution.get( edge_indices_[i] );
76 
77  if (genuchten_on) {
78  fadbad::B<double> x_phead(phead);
79  fadbad::B<double> evaluated( this->eq_data_->soil_model_->water_content_diff(x_phead) );
80  evaluated.diff(0,1);
81  water_content = evaluated.val();
82  capacity = x_phead.d(0);
83  }
84  this->eq_data_->capacity.set( cr_disc_dofs_[i], capacity + storativity_ );
85  water_content_vec.set( cr_disc_dofs_[i], water_content + storativity_ * phead);
86 
87  this->eq_data_->balance_->add_mass_values(eq_data_->water_balance_idx, dh_cell, {local_side},
88  {0.0}, diagonal_coef*(water_content + storativity_ * phead) );
89  }
90  }
91 
92  /// Implements @p AssemblyBase::begin.
93  void begin() override
94  {
95  this->eq_data_->balance_->start_mass_assembly(this->eq_data_->water_balance_idx);
96  }
97 
98 
99  /// Implements @p AssemblyBase::end.
100  void end() override
101  {
102  this->eq_data_->balance_->finish_mass_assembly(this->eq_data_->water_balance_idx);
103  }
104 
105 
106 private:
107  bool reset_soil_model(const DHCellAccessor& cell, BulkPoint &p) {
108  bool genuchten_on = (this->eq_fields_->genuchten_p_head_scale.field_result({cell.elm().region()}) != result_zeros);
109  if (genuchten_on) {
110  SoilData soil_data;
111  soil_data.n = this->eq_fields_->genuchten_n_exponent(p);
112  soil_data.alpha = this->eq_fields_->genuchten_p_head_scale(p);
113  soil_data.Qr = this->eq_fields_->water_content_residual(p);
114  soil_data.Qs = this->eq_fields_->water_content_saturated(p);
115  soil_data.Ks = this->eq_fields_->conductivity(p);
116  //soil_data.cut_fraction = 0.99; // set by model
117 
118  this->eq_data_->soil_model_->reset(soil_data);
119  }
120  return genuchten_on;
121  }
122 
123 
124  /// Sub field set contains fields used in calculation.
126 
127  /// Data objects shared with ConvectionTransport
130 
131  LocDofVec cr_disc_dofs_; ///< Vector of local DOF indices pre-computed on different DOF handlers
132  LocDofVec edge_indices_; ///< Dofs of discontinuous fields on element edges.
133  double storativity_;
135 
136  /// Bulk integral of assembly class
137  std::shared_ptr<BulkIntegralAcc<dim>> bulk_integral_;
138 
139  template < template<IntDim...> class DimAssembly>
140  friend class GenericAssembly;
141 };
142 
143 
144 template <unsigned int dim, class TEqData>
145 class MHMatrixAssemblyRichards : public MHMatrixAssemblyLMH<dim, TEqData>
146 {
147 public:
148  typedef typename TEqData::EqFields EqFields;
149  typedef TEqData EqData;
150 
151  static constexpr const char * name() { return "Richards_MHMatrix_Assembly"; }
152 
154  : MHMatrixAssemblyLMH<dim, TEqData>(eq_data, asm_internals), eq_fields_(eq_data->eq_fields_.get()), eq_data_(eq_data) {
155  this->used_fields_ += eq_fields_->cross_section;
156  this->used_fields_ += eq_fields_->conductivity;
157  this->used_fields_ += eq_fields_->anisotropy;
158  this->used_fields_ += eq_fields_->sigma;
159  this->used_fields_ += eq_fields_->water_source_density;
160  this->used_fields_ += eq_fields_->extra_source;
161  this->used_fields_ += eq_fields_->storativity;
162  this->used_fields_ += eq_fields_->extra_storativity;
163  this->used_fields_ += eq_fields_->genuchten_n_exponent;
164  this->used_fields_ += eq_fields_->genuchten_p_head_scale;
165  this->used_fields_ += eq_fields_->water_content_residual;
166  this->used_fields_ += eq_fields_->water_content_saturated;
167  this->used_fields_ += eq_fields_->bc_type;
168  this->used_fields_ += eq_fields_->bc_pressure;
169  this->used_fields_ += eq_fields_->bc_flux;
170  this->used_fields_ += eq_fields_->bc_pressure;
171  this->used_fields_ += eq_fields_->bc_robin_sigma;
172  this->used_fields_ += eq_fields_->bc_switch_pressure;
173  }
174 
175  /// Destructor.
177 
178  /// Initialize auxiliary vectors and other data members
179  void initialize() {
180  //this->balance_ = eq_data_->balance_;
182  }
183 
184 
185  /// Integral over element.
186  inline void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx)
187  {
188  ASSERT_EQ(cell.dim(), dim).error("Dimension of element mismatch!");
189 
190  // evaluation point
191  auto p = *( this->bulk_integral_->points(element_patch_idx).begin() );
192  this->bulk_local_idx_ = cell.local_idx();
193 
194  this->asm_sides(p, this->compute_conductivity(cell, p), element_patch_idx);
195  this->asm_element();
196  this->asm_source_term_richards(cell, p);
197  }
198 
199 
200  /// Assembles between boundary element and corresponding side on bulk element.
201  inline void boundary_side_integral(DHCellSide cell_side)
202  {
203  ASSERT_EQ(cell_side.dim(), dim).error("Dimension of element mismatch!");
204  if (!cell_side.cell().is_own()) return;
205 
206  auto p_side = *( this->bdr_integral_->points(cell_side).begin() );
207  auto p_bdr = p_side.point_bdr(cell_side.cond().element_accessor() );
208  ElementAccessor<3> b_ele = cell_side.side().cond().element_accessor(); // ??
209 
210  this->precompute_boundary_side(cell_side, p_side, p_bdr);
211 
212  if (this->type_==DarcyLMH::EqFields::seepage) {
213  this->use_dirichlet_switch(cell_side, b_ele, p_bdr);
214  }
215 
216  this->boundary_side_integral_in(cell_side, b_ele, p_bdr);
217  }
218 
219 
220  /// Implements @p AssemblyBase::begin.
221  void begin() override
222  {
223  this->begin_mh_matrix();
224  }
225 
226 
227  /// Implements @p AssemblyBase::end.
228  void end() override
229  {
230  this->end_mh_matrix();
231  }
232 
233 
234 protected:
235  /// Part of cell_integral method, specialized in Richards equation
236  inline void asm_source_term_richards(const DHCellAccessor& cell, BulkPoint &p)
237  {
238  update_water_content(cell, p);
239  const ElementAccessor<3> ele = cell.elm();
240 
241  // set lumped source
242  diagonal_coef_ = ele.measure() * eq_fields_->cross_section(p) / ele->n_sides();
243  source_diagonal_ = diagonal_coef_ * ( eq_fields_->water_source_density(p) + eq_fields_->extra_source(p));
244 
245  VectorMPI water_content_vec = eq_fields_->water_content_ptr->vec();
246 
247  const DHCellAccessor cr_cell = cell.cell_with_other_dh(eq_data_->dh_cr_.get());
248  auto loc_dof_vec = cr_cell.get_loc_dof_indices();
249 
250  for (unsigned int i=0; i<ele->n_sides(); i++)
251  {
252 
253  const int local_side = cr_disc_dofs_[i];
254  /*if (this->dirichlet_edge[i] == 0)*/ { //TODO Fix condition evaluating dirichlet_edge
255 
256  water_content_diff_ = -water_content_vec.get(local_side) + eq_data_->water_content_previous_time.get(local_side);
257  mass_diagonal_ = diagonal_coef_ * eq_data_->capacity.get(local_side);
258 
259  /*
260  DebugOut().fmt("w diff: {:g} mass: {:g} w prev: {:g} w time: {:g} c: {:g} p: {:g} z: {:g}",
261  water_content_diff,
262  mass_diagonal * eq_data_->p_edge_solution[local_edge],
263  -eq_data_->water_content_previous_it[local_side],
264  eq_data_->water_content_previous_time[local_side],
265  capacity,
266  eq_data_->p_edge_solution[local_edge],
267  ele.centre()[0] );
268  */
269 
270 
271  mass_rhs_ = mass_diagonal_ * eq_data_->p_edge_solution.get( loc_dof_vec[i] ) / eq_data_->time_step_
272  + diagonal_coef_ * water_content_diff_ / eq_data_->time_step_;
273 
274  /*
275  DBGCOUT(<< "source [" << loc_system_.row_dofs[this->loc_edge_dofs[i]] << ", " << loc_system_.row_dofs[this->loc_edge_dofs[i]]
276  << "] mat: " << -mass_diagonal/this->eq_data_->time_step_
277  << " rhs: " << -source_diagonal_ - mass_rhs
278  << "\n");
279  */
280  eq_data_->loc_system_[cell.local_idx()].add_value(eq_data_->loc_edge_dofs[dim-1][i], eq_data_->loc_edge_dofs[dim-1][i],
281  -mass_diagonal_/eq_data_->time_step_,
283  }
284 
285  eq_data_->balance_->add_mass_values(eq_data_->water_balance_idx, cell, {local_side},
286  {0.0}, diagonal_coef_*water_content_vec.get(local_side));
287  eq_data_->balance_->add_source_values(eq_data_->water_balance_idx, ele.region().bulk_idx(),
288  {this->eq_data_->loc_system_[cell.local_idx()].row_dofs[eq_data_->loc_edge_dofs[dim-1][i]]},
289  {0},{source_diagonal_});
290  }
291  }
292 
293  bool reset_soil_model(const DHCellAccessor& cell, BulkPoint &p) {
294  bool genuchten_on = (this->eq_fields_->genuchten_p_head_scale.field_result({cell.elm().region()}) != result_zeros);
295  if (genuchten_on) {
296  SoilData soil_data;
297  soil_data.n = this->eq_fields_->genuchten_n_exponent(p);
298  soil_data.alpha = this->eq_fields_->genuchten_p_head_scale(p);
299  soil_data.Qr = this->eq_fields_->water_content_residual(p);
300  soil_data.Qs = this->eq_fields_->water_content_saturated(p);
301  soil_data.Ks = this->eq_fields_->conductivity(p);
302  //soil_data.cut_fraction = 0.99; // set by model
303 
304  this->eq_data_->soil_model_->reset(soil_data);
305  }
306  return genuchten_on;
307  }
308 
309 
311  edge_indices_ = cell.cell_with_other_dh(this->eq_data_->dh_cr_.get()).get_loc_dof_indices();
312  cr_disc_dofs_ = cell.cell_with_other_dh(this->eq_data_->dh_cr_disc_.get()).get_loc_dof_indices();
313 
314  bool genuchten_on = reset_soil_model(cell, p);
315  storativity_ = this->eq_fields_->storativity(p)
316  + this->eq_fields_->extra_storativity(p);
317  VectorMPI water_content_vec = this->eq_fields_->water_content_ptr->vec();
318 
319  for (unsigned int i=0; i<cell.elm()->n_sides(); i++) {
320  capacity = 0;
321  water_content = 0;
322  phead = this->eq_data_->p_edge_solution.get( edge_indices_[i] );
323 
324  if (genuchten_on) {
325  fadbad::B<double> x_phead(phead);
326  fadbad::B<double> evaluated( this->eq_data_->soil_model_->water_content_diff(x_phead) );
327  evaluated.diff(0,1);
328  water_content = evaluated.val();
329  capacity = x_phead.d(0);
330  }
331  this->eq_data_->capacity.set( cr_disc_dofs_[i], capacity + storativity_ );
332  water_content_vec.set( cr_disc_dofs_[i], water_content + storativity_ * phead);
333  }
334  }
335 
336  /// Precompute conductivity on bulk point.
338  {
339  bool genuchten_on = reset_soil_model(cell, p);
340 
341  double conductivity = 0;
342  if (genuchten_on) {
343  const DHCellAccessor cr_cell = cell.cell_with_other_dh(eq_data_->dh_cr_.get());
344  auto loc_dof_vec = cr_cell.get_loc_dof_indices();
345 
346  for (unsigned int i=0; i<cell.elm()->n_sides(); i++)
347  {
348  double phead = eq_data_->p_edge_solution.get( loc_dof_vec[i] );
349  conductivity += eq_data_->soil_model_->conductivity(phead);
350  }
351  conductivity /= cell.elm()->n_sides();
352  }
353  else {
354  conductivity = eq_fields_->conductivity(p);
355  }
356  return conductivity;
357  }
358 
359 
360  /// Postprocess velocity after calculating of cell integral.
362  {
363  this->postprocess_velocity(dh_cell, p);
364 
365  this->update_water_content(dh_cell, p);
366 
367  VectorMPI water_content_vec = eq_fields_->water_content_ptr->vec();
368 
369  for (unsigned int i=0; i<dh_cell.elm()->n_sides(); i++) {
370  water_content = water_content_vec.get( this->cr_disc_dofs_[i] );
371  water_content_previous_time = eq_data_->water_content_previous_time.get( this->cr_disc_dofs_[i] );
372 
373  solution[eq_data_->loc_side_dofs[dim-1][i]]
374  += this->edge_source_term_ - this->edge_scale_ * (water_content - water_content_previous_time) / eq_data_->time_step_;
375  }
376 
377  IntIdx p_dof = dh_cell.cell_with_other_dh(eq_data_->dh_p_.get()).get_loc_dof_indices()(0);
378  eq_fields_->conductivity_ptr->vec().set( p_dof, compute_conductivity(dh_cell, p) );
379  }
380 
381 
382  /// Data objects shared with ConvectionTransport
385 
386  LocDofVec cr_disc_dofs_; ///< Vector of local DOF indices pre-computed on different DOF handlers
387  LocDofVec edge_indices_; ///< Dofs of discontinuous fields on element edges.
388  double storativity_;
389  double capacity, phead;
390  double water_content, water_content_previous_time;
391  double diagonal_coef_, source_diagonal_;
392  double water_content_diff_, mass_diagonal_, mass_rhs_;
393 
394  template < template<IntDim...> class DimAssembly>
395  friend class GenericAssembly;
396 };
397 
398 
399 template <unsigned int dim, class TEqData>
401 {
402 public:
403  typedef typename TEqData::EqFields EqFields;
404  typedef TEqData EqData;
405 
406  static constexpr const char * name() { return "Richards_ReconstructSchur_Assembly"; }
407 
409  : MHMatrixAssemblyRichards<dim, TEqData>(eq_data, asm_internals) {
410  }
411 
412  /// Integral over element.
413  inline void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx)
414  {
415  ASSERT_EQ(cell.dim(), dim).error("Dimension of element mismatch!");
416 
417  // evaluation point
418  auto p = *( this->bulk_integral_->points(element_patch_idx).begin() );
419  this->bulk_local_idx_ = cell.local_idx();
420 
421  { // postprocess the velocity
422  this->eq_data_->postprocess_solution_[this->bulk_local_idx_].zeros(this->eq_data_->schur_offset_[dim-1]);
423  this->postprocess_velocity_richards(cell, p, this->eq_data_->postprocess_solution_[this->bulk_local_idx_]);
424  }
425  }
426 
427 
428  /// Assembles between boundary element and corresponding side on bulk element.
430  {}
431 
432  inline void dimjoin_intergral(FMT_UNUSED DHCellAccessor cell_lower_dim, FMT_UNUSED DHCellSide neighb_side)
433  {}
434 
435 
436  /// Implements @p AssemblyBase::begin.
437  void begin() override
438  {
439  this->begin_reconstruct_schur();
440  }
441 
442 
443  /// Implements @p AssemblyBase::end.
444  void end() override
445  {
446  this->end_reconstruct_schur();
447  }
448 protected:
449  template < template<IntDim...> class DimAssembly>
450  friend class GenericAssembly;
451 };
452 
453 
454 
455 #endif /* ASSEMBLY_RICHARDS_HH_ */
456 
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Definition: asserts.hh:333
Quadrature * quad_
Quadrature used in assembling methods.
std::shared_ptr< BulkIntegralAcc< dim > > create_bulk_integral(Quadrature *quad)
ElementAccessor< 3 > element_accessor()
Base point accessor class.
Cell accessor allow iterate over DOF handler cells.
bool is_own() const
Return true if accessor represents own element (false for ghost element)
LocDofVec get_loc_dof_indices() const
Returns the local indices of dofs associated to the cell on the local process.
DHCellAccessor cell_with_other_dh(const DOFHandlerMultiDim *dh) const
Create new accessor with same local idx and given DOF handler. Actual and given DOF handler must be c...
unsigned int dim() const
Return dimension of element appropriate to cell.
ElementAccessor< 3 > elm() const
Return ElementAccessor to element of loc_ele_idx_.
unsigned int local_idx() const
Return local index to element (index of DOF handler).
Side accessor allows to iterate over sides of DOF handler cell.
Side side() const
Return Side of given cell and side_idx.
Boundary cond() const
const DHCellAccessor & cell() const
Return DHCellAccessor appropriate to the side.
unsigned int dim() const
Return dimension of element appropriate to the side.
double measure() const
Computes the measure of the element.
Region region() const
Definition: accessors.hh:198
unsigned int n_sides() const
Definition: elements.h:131
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:159
Generic class of assemblation.
FieldSet used_fields_
Sub field set contains fields used in calculation.
std::shared_ptr< BulkIntegralAcc< dim > > bulk_integral_
Bulk integral of assembly class.
void initialize()
Initialize auxiliary vectors and other data members.
InitCondPostprocessAssembly(EqData *eq_data, AssemblyInternals *asm_internals)
Constructor.
bool reset_soil_model(const DHCellAccessor &cell, BulkPoint &p)
LocDofVec edge_indices_
Dofs of discontinuous fields on element edges.
static constexpr const char * name()
void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx)
LocDofVec cr_disc_dofs_
Vector of local DOF indices pre-computed on different DOF handlers.
EqFields * eq_fields_
Data objects shared with ConvectionTransport.
void end() override
Implements AssemblyBase::end.
void begin() override
Implements AssemblyBase::begin.
void asm_sides(BulkPoint &p, double conductivity, unsigned int element_patch_idx)
Part of cell_integral method, common in all descendants.
void begin_mh_matrix()
Common code of begin method of MH matrix assembly (Darcy and Richards)
void end_reconstruct_schur()
Common code of end method of Reconstruct Schur assembly (Darcy and Richards)
void begin_reconstruct_schur()
Common code of begin method of Reconstruct Schur assembly (Darcy and Richards)
FieldSet used_fields_
Sub field set contains fields used in calculation.
unsigned int bulk_local_idx_
Local idx of bulk element.
void initialize()
Initialize auxiliary vectors and other data members.
void boundary_side_integral_in(DHCellSide cell_side, const ElementAccessor< 3 > &b_ele, BulkPoint &p_bdr)
void asm_element()
Part of cell_integral method, common in all descendants.
DarcyLMH::EqFields::BC_Type type_
Type of boundary condition.
void end_mh_matrix()
Common code of end method of MH matrix assembly (Darcy and Richards)
std::shared_ptr< BulkIntegralAcc< dim > > bulk_integral_
Bulk integral of assembly class.
void use_dirichlet_switch(DHCellSide &cell_side, const ElementAccessor< 3 > &b_ele, BulkPoint &p_bdr)
Update BC switch dirichlet in MH matrix assembly if BC type is seepage.
std::shared_ptr< BoundaryIntegralAcc< dim > > bdr_integral_
Boundary integral of assembly class.
void precompute_boundary_side(DHCellSide &cell_side, BoundaryPoint &p_side, BulkPoint &p_bdr)
Precompute values used in boundary side integral on given DHCellSide.
void boundary_side_integral(DHCellSide cell_side)
Assembles between boundary element and corresponding side on bulk element.
void asm_source_term_richards(const DHCellAccessor &cell, BulkPoint &p)
Part of cell_integral method, specialized in Richards equation.
~MHMatrixAssemblyRichards()
Destructor.
bool reset_soil_model(const DHCellAccessor &cell, BulkPoint &p)
void update_water_content(const DHCellAccessor &cell, BulkPoint &p)
void initialize()
Initialize auxiliary vectors and other data members.
void end() override
Implements AssemblyBase::end.
void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx)
Integral over element.
double compute_conductivity(const DHCellAccessor &cell, BulkPoint &p)
Precompute conductivity on bulk point.
void postprocess_velocity_richards(const DHCellAccessor &dh_cell, BulkPoint &p, arma::vec &solution)
Postprocess velocity after calculating of cell integral.
LocDofVec edge_indices_
Dofs of discontinuous fields on element edges.
EqFields * eq_fields_
Data objects shared with ConvectionTransport.
LocDofVec cr_disc_dofs_
Vector of local DOF indices pre-computed on different DOF handlers.
MHMatrixAssemblyRichards(EqData *eq_data, AssemblyInternals *asm_internals)
static constexpr const char * name()
void begin() override
Implements AssemblyBase::begin.
void end() override
Implements AssemblyBase::end.
void boundary_side_integral(FMT_UNUSED DHCellSide cell_side)
Assembles between boundary element and corresponding side on bulk element.
void cell_integral(DHCellAccessor cell, unsigned int element_patch_idx)
Integral over element.
ReconstructSchurAssemblyRichards(EqData *eq_data, AssemblyInternals *asm_internals)
static constexpr const char * name()
void dimjoin_intergral(FMT_UNUSED DHCellAccessor cell_lower_dim, FMT_UNUSED DHCellSide neighb_side)
void begin() override
Implements AssemblyBase::begin.
unsigned int bulk_idx() const
Returns index of the region in the bulk set.
Definition: region.hh:90
Boundary cond() const
double get(unsigned int pos) const
Return value on given position.
Definition: vector_mpi.hh:105
void set(unsigned int pos, double val)
Set value on given position.
Definition: vector_mpi.hh:111
@ result_zeros
int IntIdx
Definition: index_types.hh:25
arma::Col< IntIdx > LocDofVec
Definition: index_types.hh:28
unsigned int IntDim
A dimension index type.
Definition: mixed.hh:19
ArmaVec< double, N > vec
Definition: armor.hh:933
#define FMT_UNUSED
Definition: posix.h:75
Holds common data shared between GenericAssemblz and Assembly<dim> classes.
double Ks
Definition: soil_models.hh:45
double Qr
Definition: soil_models.hh:42
double n
Definition: soil_models.hh:40
double alpha
Definition: soil_models.hh:41
double Qs
Definition: soil_models.hh:43