Flow123d  DF_patch_fe_darcy_complete-579fe1e
transport_dg.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 transport_dg.hh
15  * @brief Discontinuous Galerkin method for equation of transport with dispersion.
16  * @author Jan Stebel
17  */
18 
19 #ifndef TRANSPORT_DG_HH_
20 #define TRANSPORT_DG_HH_
21 
22 #include <math.h> // for fabs
23 #include <string.h> // for memcpy
24 #include <algorithm> // for max
25 
26 #include <string> // for operator<<
27 #include <vector> // for vector
28 #include <armadillo>
29 #include "fem/update_flags.hh" // for operator|
30 #include "fields/field_values.hh" // for FieldValue<>::Scalar
31 #include "fields/field.hh"
32 #include "fields/field_fe.hh"
33 #include "fields/multi_field.hh"
34 #include "la/vector_mpi.hh"
36 #include "la/linsys.hh"
37 #include "input/accessors.hh" // for ExcAccessorForNullStorage
38 #include "input/accessors_impl.hh" // for Record::val
39 #include "input/storage.hh" // for ExcStorageTypeMismatch
40 #include "input/type_base.hh" // for Array
41 #include "input/type_generic.hh" // for Instance
42 #include "input/type_record.hh" // for Record::ExcRecordKeyNo...
43 #include "system/index_types.hh" // for LongIdx
44 #include "mesh/accessors.hh" // for ElementAccessor, SIdeIter
45 #include "mesh/elements.h" // for Element::dim, Element:...
46 #include "mesh/neighbours.h" // for Neighbour::element
47 #include "mpi.h" // for MPI_Comm_rank
48 #include "petscmat.h" // for Mat, MatDestroy
49 #include "petscvec.h" // for Vec, VecDestroy, VecSc...
50 #include "transport/concentration_model.hh" // for ConcentrationTransport...
51 #include "transport/heat_model.hh" // for HeatTransferModel, Hea...
52 #include "tools/mixed.hh"
53 class DiscreteSpace;
54 class Distribution;
55 class OutputTime;
56 class DOFHandlerMultiDim;
58 template<unsigned int dim, class TEqData> class MassAssemblyDG;
59 template<unsigned int dim, class TEqData> class StiffnessAssemblyDG;
60 template<unsigned int dim, class TEqData> class SourcesAssemblyDG;
61 template<unsigned int dim, class TEqData> class BdrConditionAssemblyDG;
62 template<unsigned int dim, class TEqData> class InitConditionAssemblyDG;
63 template<unsigned int dim, class TEqData> class InitProjectionAssemblyDG;
64 template< template<IntDim...> class DimAssembly> class GenericAssembly;
65 template<unsigned int dim> class FiniteElement;
66 template<unsigned int dim, unsigned int spacedim> class Mapping;
67 class Quadrature;
68 namespace Input { namespace Type { class Selection; } }
69 class ElementCacheMap;
70 
71 /*class FEObjects {
72 public:
73 
74  inline FEObjects(Mesh *mesh_, unsigned int fe_order)
75  {
76  fe = MixedPtr<FE_P_disc>(fe_order);
77  fe_rt = MixedPtr<FE_RT0>();
78  q = MixedPtr<QGauss>(2*fe_order);
79 
80  auto ds = std::make_shared<EqualOrderDiscreteSpace>(mesh_, fe);
81  dh = std::make_shared<DOFHandlerMultiDim>(*mesh_);
82  dh->distribute_dofs(ds_);
83  }
84 
85  ~FEObjects();
86 
87  MixedPtr<FiniteElement> fe;
88  MixedPtr<FiniteElement> fe_rt;
89  MixedPtr<Quadrature> q;
90 
91  /// Object for distribution of dofs.
92  std::shared_ptr<DOFHandlerMultiDim> dh;
93 };*/
94 
95 
96 
97 /**
98  * @brief Transport with dispersion implemented using discontinuous Galerkin method.
99  *
100  * TransportDG implements the discontinuous Galerkin method for the transport and diffusion of substances.
101  * The concentration @f$ c_i ~[kg/m^3]@f$ of the i-th substance is governed by the advection-diffusion equation
102  * @f[
103  * \partial_t c_i + \mathbf v\cdot\nabla c_i - \mathrm{div}(D\nabla c_i) = F \mbox{ in }\Omega^d,
104  * @f]
105  * where @f$\mathbf v@f$ is the fluid velocity and @f$\Omega^d@f$ the @f$d@f$-dimensional domain, respectively.
106  * The hydrodynamic dispersivity tensor @f$\mathbf D ~[m^2/s]@f$ is given by:
107  * @f[
108  * \mathbf D = D_m\mathbf I + |\mathbf v|\left(\alpha_T\mathbf I + (\alpha_L-\alpha_T)\frac{\mathbf v\otimes\mathbf v}{|\mathbf v|^2}\right).
109  * @f]
110  * The molecular dispersivity @f$D_m~[m^2/s]@f$, as well as the longitudal and transversal dispersivity @f$\alpha_L,~\alpha_T~[m]@f$ are input parameters of the model.
111  *
112  * For lower dimensions @f$d=1,2@f$ the advection-diffusion equation is multiplied by the fracture cross-cut @f$\delta^d~[m^{3-d}]@f$.
113  *
114  * The boundary @f$\partial\Omega^d@f$ is divided into three disjoint parts @f$\Gamma^d_D\cup\Gamma^d_N\cup\Gamma^d_F@f$.
115  * We prescribe the following boundary conditions:
116  * @f{eqnarray*}{
117  * c_i^d &= c_{iD}^d &\mbox{ on }\Gamma^d_D \mbox{ (Dirichlet)},\\
118  * \mathbf D^d\nabla c_i^d\cdot\mathbf n &= 0 &\mbox{ on }\Gamma^d_N \mbox{ (Neumann)},
119  * @f}
120  * The transfer of mass through fractures is described by the transmission conditions on @f$\Gamma^d_F@f$:
121  * @f[
122  * -\mathbf D^d\nabla c_i^d\cdot\mathbf n = \sigma(c_i^d-c_i^{d-1}) + \left\{\begin{array}{cl}0 &\mbox{ if }\mathbf v^d\cdot\mathbf n\ge 0\\\mathbf v^d\cdot\mathbf n(c_i^{d-1}-c_i^d) & \mbox{ if }\mathbf v^d\cdot\mathbf n<0\end{array}\right.,\qquad
123  * F^{d-1} = (\sigma + |\mathbf v^d\cdot\mathbf n|)(c_i^d-c_i^{d-1}).
124  * @f]
125  * Here @f$\mathbf n@f$ stands for the unit outward normal vector to @f$\partial\Omega^d@f$.
126  * The coefficient @f$\sigma@f$ determines the transfer of mass through fractures due to diffusion.
127  *
128  * @ingroup transport_mod
129  *
130  */
131 template<class Model>
132 class TransportDG : public Model
133 {
134 public:
135 
137 
138  class EqFields : public Model::ModelEqFields {
139  public:
140 
141  EqFields();
142 
143  MultiField<3, FieldValue<3>::Scalar> fracture_sigma; ///< Transition parameter for diffusive transfer on fractures (for each substance).
144  MultiField<3, FieldValue<3>::Scalar> dg_penalty; ///< Penalty enforcing inter-element continuity of solution (for each substance).
147 
149  };
150 
151 
152  class EqData : public Model::ModelEqData {
153  public:
155 
156  EqData(std::shared_ptr<EqFields> eq_fields) : eq_fields_(eq_fields), ls(nullptr) {}
157 
158  inline void set_time_governor(TimeGovernor *time) {
159  ASSERT_PTR(time);
160  this->time_ = time;
161  }
162 
163  /// Getter of dg_order
164  inline unsigned int quad_order() const {
165  return dg_order;
166  }
167 
168  /// Shared pointer of EqFields
169  std::shared_ptr<EqFields> eq_fields_;
170 
171  /// @name Parameters of the numerical method
172  // @{
173 
174  /// DG variant ((non-)symmetric/incomplete
176 
177  /// Polynomial order of finite elements.
178  unsigned int dg_order;
179 
180  // @}
181 
182 
183  /// Auxiliary vectors for calculation of sources in balance due to retardation (e.g. sorption).
185 
186  /// Linear algebra system for the transport equation.
188 
189  /// Linear algebra system for the time derivative (actually it is used only for handling the matrix structures).
191 
192  /// @name Auxiliary fields used during assembly
193  // @{
194 
195  /// Maximal number of edge sides (evaluate from dim 1,2,3)
196  unsigned int max_edg_sides;
197 
198  // @}
199 
200  /// Object for distribution of dofs.
201  std::shared_ptr<DOFHandlerMultiDim> dh_;
202 
203  /// Vector of solution data.
205 
207  std::shared_ptr<DOFHandlerMultiDim> dh_p0;
209  std::shared_ptr<Balance> balance_;
210  };
211 
212  template<unsigned int dim> using MassAssemblyDim = MassAssemblyDG<dim, EqData>;
213  template<unsigned int dim> using StiffnessAssemblyDim = StiffnessAssemblyDG<dim, EqData>;
214  template<unsigned int dim> using SourcesAssemblyDim = SourcesAssemblyDG<dim, EqData>;
218 
219  enum DGVariant {
220  // Non-symmetric weighted interior penalty DG
222 
223  // Incomplete weighted interior penalty DG
225 
226  // Symmetric weighted interior penalty DG
227  symmetric = 1
228  };
229 
230  /**
231  * @brief Constructor.
232  * @param init_mesh computational mesh
233  * @param in_rec input record
234  */
235  TransportDG(Mesh &init_mesh, const Input::Record in_rec);
236  /**
237 
238  * @brief Declare input record type for the equation TransportDG.
239  */
240  static const Input::Type::Record & get_input_type();
241 
242  /**
243  * @brief Input type for the DG variant selection.
244  */
246 
247  /**
248  * @brief Initialize solution in the zero time.
249  */
250  void zero_time_step() override;
251 
253  { return false; }
254 
255  /**
256  * @brief Computes the solution in one time instant.
257  */
258  void update_solution() override;
259 
260  /**
261  * @brief Postprocesses the solution and writes to output file.
262  */
263  void output_data();
264 
265  /**
266  * @brief Destructor.
267  */
268  ~TransportDG() override;
269 
270  void initialize() override;
271 
273 
274  /// Return PETSc vector with solution for sbi-th component.
275  Vec get_component_vec(unsigned int sbi)
276  { return eq_data_->ls[sbi]->get_solution(); }
277 
278  /// Getter for P0 interpolation by FieldFE.
280  { return eq_data_->conc_fe;}
281 
282  /// Compute P0 interpolation of the solution (used in reaction term).
284 
285  void update_after_reactions(bool solution_changed);
286 
287  /// Access to balance object of Model
288  inline std::shared_ptr<Balance> balance() const {
289  return Model::balance_;
290  }
291 
292  inline typename Model::ModelEqFields &eq_fields() { return *eq_fields_; }
293 
294  inline typename Model::ModelEqData &eq_data() { return *eq_data_; }
295 
296 private:
297  /// Registrar of class to factory
298  static const int registrar;
299 
300  void preallocate();
301 
302  /**
303  * @brief Calculates the dispersivity (diffusivity) tensor from the velocity field.
304  *
305  * @param K The computed dispersivity tensor.
306  * @param velocity The velocity field (at quadrature points).
307  * @param Dm Molecular diffusivities.
308  * @param alphaL Longitudal dispersivities.
309  * @param alphaT Transversal dispersivities.
310  * @param porosity Porosities.
311  * @param cross_cut Cross-cuts of higher dimension.
312  */
313 // void calculate_dispersivity_tensor(arma::mat33 &K, const arma::vec3 &velocity,
314 // double Dm, double alphaL, double alphaT, double porosity,
315 // double cross_cut);
316 
317  /**
318  * @brief Sets the initial condition.
319  *
320  * This method just calls AssemblyDG::prepare_initial_condition() for each elements.
321  */
322  void set_initial_condition();
323 
324 
325 
327 
328 
329 
330  /// @name Physical parameters
331  // @{
332 
333  /// Fields for model parameters.
334  std::shared_ptr<EqFields> eq_fields_;
335 
336  /// Data for model parameters.
337  std::shared_ptr<EqData> eq_data_;
338 
339  // @}
340 
341 
342 
343  /// @name Solution of algebraic system
344  // @{
345 
346  /// Vector of right hand side.
348 
349  /// The stiffness matrix.
351 
352  /// The mass matrix.
354 
355  /// Mass from previous time instant (necessary when coefficients of mass matrix change in time).
357  // @}
358 
359 
360  /// @name Output to file
361  // @{
362 
363  /// Array for storing the output solution data.
364  //vector<double*> output_solution;
365 
366  /// Record with input specification.
368 
369  ofstream reg_stat_stream;
370 
371 
372  // @}
373 
374 
375  /// @name Auxiliary fields used during assembly
376  // @{
377 
378  /// Temporary values of increments due to retardation (e.g. sorption)
380 
381  // @}
382 
383 
384 
385 
386  /// @name Other
387  // @{
388 
389  /// Indicates whether matrices have been preallocated.
391 
393  // @}
394 
395  /// general assembly objects, hold assembly objects of appropriate dimension
401 };
402 
403 
404 
405 
406 
407 
408 #endif /* TRANSPORT_DG_HH_ */
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR) only for debug mode.
Definition: asserts.hh:341
Provides the numbering of the finite element degrees of freedom on the computational mesh.
Definition: dofhandler.hh:151
Directing class of FieldValueCache.
Class template representing a field with values dependent on: point, element, and region.
Definition: field.hh:92
Abstract class for the description of a general finite element on a reference simplex in dim dimensio...
Generic class of assemblation.
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
Record type proxy class.
Definition: type_record.hh:182
Template for classes storing finite set of named values.
Definition: mesh.h:362
Class for representation of a vector of fields of the same physical quantity.
Definition: multi_field.hh:87
The class for outputting data during time.
Definition: output_time.hh:51
Base class for quadrature rules on simplices in arbitrary dimensions.
Definition: quadrature.hh:48
Basic time management functionality for unsteady (and steady) solvers (class Equation).
FieldFEScalarVec conc_fe
TransportDG< Model >::EqFields EqFields
std::shared_ptr< EqFields > eq_fields_
Shared pointer of EqFields.
std::shared_ptr< DOFHandlerMultiDim > dh_
Object for distribution of dofs.
std::vector< VectorMPI > output_vec
Vector of solution data.
EqData(std::shared_ptr< EqFields > eq_fields)
LinSys ** ls_dt
Linear algebra system for the time derivative (actually it is used only for handling the matrix struc...
std::shared_ptr< DOFHandlerMultiDim > dh_p0
int dg_variant
DG variant ((non-)symmetric/incomplete.
TimeGovernor * time_
void set_time_governor(TimeGovernor *time)
std::shared_ptr< Balance > balance_
unsigned int dg_order
Polynomial order of finite elements.
LinSys ** ls
Linear algebra system for the transport equation.
std::vector< Vec > ret_vec
Auxiliary vectors for calculation of sources in balance due to retardation (e.g. sorption).
unsigned int quad_order() const
Getter of dg_order.
unsigned int max_edg_sides
Maximal number of edge sides (evaluate from dim 1,2,3)
Field< 3, FieldValue< 3 >::Scalar > region_id
MultiField< 3, FieldValue< 3 >::Scalar > dg_penalty
Penalty enforcing inter-element continuity of solution (for each substance).
EquationOutput output_fields
Field< 3, FieldValue< 3 >::Scalar > subdomain
MultiField< 3, FieldValue< 3 >::Scalar > fracture_sigma
Transition parameter for diffusive transfer on fractures (for each substance).
Transport with dispersion implemented using discontinuous Galerkin method.
std::vector< std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > > FieldFEScalarVec
void update_solution() override
Computes the solution in one time instant.
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportDG.
Definition: transport_dg.cc:78
std::vector< Vec > mass_vec
Mass from previous time instant (necessary when coefficients of mass matrix change in time).
bool allocation_done
Indicates whether matrices have been preallocated.
void output_region_statistics()
Vec get_component_vec(unsigned int sbi)
Return PETSc vector with solution for sbi-th component.
Input::Record input_rec
Array for storing the output solution data.
void zero_time_step() override
Initialize solution in the zero time.
std::shared_ptr< EqFields > eq_fields_
Fields for model parameters.
void initialize() override
GenericAssembly< MassAssemblyDim > * mass_assembly_
general assembly objects, hold assembly objects of appropriate dimension
static const Input::Type::Selection & get_dg_variant_selection_input_type()
Input type for the DG variant selection.
Definition: transport_dg.cc:52
GenericAssemblyBase * init_assembly_
vector< double > ret_sources
Temporary values of increments due to retardation (e.g. sorption)
FieldFEScalarVec & get_p0_interpolation()
Getter for P0 interpolation by FieldFE.
GenericAssembly< SourcesAssemblyDim > * sources_assembly_
GenericAssembly< BdrConditionAssemblyDim > * bdr_cond_assembly_
Model::ModelEqData & eq_data()
TransportDG(Mesh &init_mesh, const Input::Record in_rec)
Constructor.
~TransportDG() override
Destructor.
std::vector< Vec > rhs
Vector of right hand side.
bool init_projection
GenericAssembly< StiffnessAssemblyDim > * stiffness_assembly_
vector< double > ret_sources_prev
std::vector< Mat > stiffness_matrix
The stiffness matrix.
void compute_p0_interpolation()
Compute P0 interpolation of the solution (used in reaction term).
void output_data()
Postprocesses the solution and writes to output file.
static const int registrar
Registrar of class to factory.
ofstream reg_stat_stream
void calculate_cumulative_balance()
std::shared_ptr< Balance > balance() const
Access to balance object of Model.
std::vector< Mat > mass_matrix
The mass matrix.
void preallocate()
void set_initial_condition()
Calculates the dispersivity (diffusivity) tensor from the velocity field.
std::shared_ptr< EqData > eq_data_
Data for model parameters.
void update_after_reactions(bool solution_changed)
Model::ModelEqFields & eq_fields()
bool evaluate_time_constraint(double &)
Discontinuous Galerkin method for equation of transport with dispersion.
Discontinuous Galerkin method for equation of transport with dispersion.
Wrappers for linear systems based on MPIAIJ and MATIS format.
unsigned int IntDim
A dimension index type.
Definition: mixed.hh:19
Abstract linear system class.
Definition: balance.hh:40
Enum type UpdateFlags indicates which quantities are to be recomputed on each finite element cell.