Flow123d  DF_patch_fe_mechanics-8d0e131
elasticity.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 elasticity.hh
15  * @brief FEM for linear elasticity.
16  * @author Jan Stebel
17  */
18 
19 #ifndef ELASTICITY_HH_
20 #define ELASTICITY_HH_
21 
22 #include "fields/bc_field.hh"
23 #include "fields/field.hh"
24 #include "fields/field_fe.hh"
25 #include "fields/multi_field.hh"
26 #include "la/linsys.hh"
27 #include "la/vector_mpi.hh"
29 #include "coupling/equation.hh"
30 #include "fem/fe_values_views.hh"
31 #include "tools/mixed.hh"
33 
34 class Distribution;
35 class OutputTime;
36 class DOFHandlerMultiDim;
37 template<unsigned int dim> class FiniteElement;
38 class Elasticity;
39 template<unsigned int dim> class StiffnessAssemblyElasticity;
40 template<unsigned int dim> class RhsAssemblyElasticity;
41 template<unsigned int dim> class ConstraintAssemblyElasticity;
42 template<unsigned int dim> class OutpuFieldsAssemblyElasticity;
43 template< template<IntDim...> class DimAssembly> class GenericAssembly;
44 
45 
46 
47 
48 class Elasticity : public EquationBase
49 {
50 public:
51 
52  class EqFields : public FieldSet {
53  public:
54 
55  enum Bc_types {
60  };
61 
62  EqFields();
63 
65 
66  arma::mat33 stress_tensor(BulkPoint &p, const arma::mat33 &strain_tensor);
67 
75  Field<3, FieldValue<3>::Scalar> fracture_sigma; ///< Transition parameter for diffusive transfer on fractures.
77 
78  /// Pointer to DarcyFlow field cross_section
81  Field<3, FieldValue<3>::Scalar > potential_load; ///< Potential of an additional (external) load.
82  Field<3, FieldValue<3>::Scalar > ref_potential_load; ///< Potential of reference external load on boundary. TODO: Switch to BCField when possible.
85 
92 
93  /// @name Instances of FieldModel used in assembly methods
94  // @{
95 
99 
100  // @}
101 
102  std::shared_ptr<FieldFE<3, FieldValue<3>::VectorFixed> > output_field_ptr;
103  std::shared_ptr<FieldFE<3, FieldValue<3>::TensorFixed> > output_stress_ptr;
108 
110 
111  };
112 
113  /// Data of equation parameters
114  class EqData {
115  public:
116 
118  : ls(nullptr), constraint_matrix(nullptr), constraint_vec(nullptr) {}
119 
121  if (ls!=nullptr) delete ls;
122  if (constraint_matrix!=nullptr) MatDestroy(&constraint_matrix);
123  if (constraint_vec!=nullptr) VecDestroy(&constraint_vec);
124  }
125 
126  /// Create DOF handler objects
127  void create_dh(Mesh * mesh);
128 
129  /// Returns quad_order
130  inline unsigned int quad_order() const {
131  return 1;
132  }
133 
134  /// Objects for distribution of dofs.
135  std::shared_ptr<DOFHandlerMultiDim> dh_;
136 
137  /// @name Solution of algebraic system
138  // @{
139 
140  /// Linear algebraic system.
142 
145 
146  // map local element -> constraint index
148 
149  // @}
150 
151  /// Shared Balance object
152  std::shared_ptr<Balance> balance_;
153 
154  };
155 
156 
157  /// Data of output parameters
158  class OutputEqData {
159  public:
160 
162  {}
163 
165 
166  /// Create DOF handler objects
167  void create_dh(Mesh * mesh);
168 
169  /// Returns quad_order
170  inline unsigned int quad_order() const {
171  return 0;
172  }
173 
174  /// Objects for distribution of dofs.
175  std::shared_ptr<DOFHandlerMultiDim> dh_scalar_;
176  std::shared_ptr<DOFHandlerMultiDim> dh_tensor_;
177 
178  };
179 
180 
181  /**
182  * @brief Constructor.
183  * @param init_mesh computational mesh
184  * @param in_rec input record
185  * @param tm time governor (if nullptr then it is created from input record)
186  */
187  Elasticity(Mesh &init_mesh, const Input::Record in_rec, TimeGovernor *tm = nullptr);
188  /**
189 
190  * @brief Declare input record type for the equation TransportDG.
191  */
192  static const Input::Type::Record & get_input_type();
193 
194  /**
195  * @brief Initialize solution in the zero time.
196  */
197  void zero_time_step() override;
198 
199  /**
200  * @brief Computes the solution in one time instant.
201  */
202  void update_solution() override;
203 
204  /// Pass to next time and update equation data.
205  void next_time();
206 
207  /// Solve without updating time step and without output.
208  void solve_linear_system();
209 
210  /**
211  * @brief Postprocesses the solution and writes to output file.
212  */
213  void output_data();
214 
215  /**
216  * @brief Destructor.
217  */
218  ~Elasticity();
219 
220  void initialize() override;
221 
222  // Recompute fields for output (stress, divergence etc.)
223  void update_output_fields();
224 
225  void set_potential_load(const Field<3, FieldValue<3>::Scalar> &potential,
226  const Field<3, FieldValue<3>::Scalar> &ref_potential)
227  {
228  eq_fields_->potential_load = potential;
229  eq_fields_->ref_potential_load = ref_potential;
230  }
231 
233 
234  const Vec &get_solution()
235  { return eq_data_->ls->get_solution(); }
236 
237  inline EqFields &eq_fields() { return *eq_fields_; }
238 
239  inline EqData &eq_data() { return *eq_data_; }
240 
241 
242 
244 
245 
246 
247 
248 private:
249  /// Registrar of class to factory
250  static const int registrar;
251 
252  void preallocate();
253 
254 
256 
257 
258  /// @name Physical parameters
259  // @{
260 
261  /// Fields for model parameters.
262  std::shared_ptr<EqFields> eq_fields_;
263 
264  /// Data for model parameters.
265  std::shared_ptr<EqData> eq_data_;
266 
267  /// Data for output parameters.
268  std::shared_ptr<OutputEqData> output_eq_data_;
269 
270  /// Indicator of contact conditions on fractures.
272 
273 
274  // @}
275 
276 
277 
278  /// @name Output to file
279  // @{
280 
281  std::shared_ptr<OutputTime> output_stream_;
282 
283  /// Record with input specification.
285 
286 
287  // @}
288 
289 
290  static constexpr const char * name_ = "Mechanics_LinearElasticity";
291 
292 
293  /// general assembly objects, hold assembly objects of appropriate dimension
298 
299 };
300 
301 
302 
303 
304 
305 
306 
307 #endif /* ELASTICITY_HH_ */
Base point accessor class.
Definition: eval_subset.hh:55
Provides the numbering of the finite element degrees of freedom on the computational mesh.
Definition: dofhandler.hh:151
Data of equation parameters.
Definition: elasticity.hh:114
unsigned int quad_order() const
Returns quad_order.
Definition: elasticity.hh:130
LinSys * ls
Linear algebraic system.
Definition: elasticity.hh:141
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:286
std::shared_ptr< DOFHandlerMultiDim > dh_
Objects for distribution of dofs.
Definition: elasticity.hh:135
std::map< LongIdx, LongIdx > constraint_idx
Definition: elasticity.hh:147
std::shared_ptr< Balance > balance_
Shared Balance object.
Definition: elasticity.hh:152
Field< 3, FieldValue< 3 >::Scalar > potential_load
Potential of an additional (external) load.
Definition: elasticity.hh:81
Field< 3, FieldValue< 3 >::TensorFixed > output_stress
Definition: elasticity.hh:87
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::TensorFixed > > output_stress_ptr
Definition: elasticity.hh:103
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_von_mises_stress_ptr
Definition: elasticity.hh:104
Field< 3, FieldValue< 3 >::Scalar > cross_section_min
Definition: elasticity.hh:80
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_cross_section_ptr
Definition: elasticity.hh:106
Field< 3, FieldValue< 3 >::Scalar > subdomain
Definition: elasticity.hh:84
Field< 3, FieldValue< 3 >::Scalar > region_id
Definition: elasticity.hh:83
EquationOutput output_fields
Definition: elasticity.hh:109
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::VectorFixed > > output_field_ptr
Definition: elasticity.hh:102
BCField< 3, FieldValue< 3 >::Enum > bc_type
Definition: elasticity.hh:68
Field< 3, FieldValue< 3 >::Scalar > lame_lambda
Definition: elasticity.hh:97
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_div_ptr
Definition: elasticity.hh:107
Field< 3, FieldValue< 3 >::Scalar > output_mean_stress
Definition: elasticity.hh:89
BCField< 3, FieldValue< 3 >::VectorFixed > bc_displacement
Definition: elasticity.hh:69
Field< 3, FieldValue< 3 >::Scalar > poisson_ratio
Definition: elasticity.hh:74
Field< 3, FieldValue< 3 >::VectorFixed > output_field
Definition: elasticity.hh:86
Field< 3, FieldValue< 3 >::TensorFixed > initial_stress
Definition: elasticity.hh:76
static const Input::Type::Selection & get_bc_type_selection()
Definition: elasticity.cc:121
BCField< 3, FieldValue< 3 >::VectorFixed > bc_traction
Definition: elasticity.hh:70
Field< 3, FieldValue< 3 >::Scalar > output_von_mises_stress
Definition: elasticity.hh:88
Field< 3, FieldValue< 3 >::Scalar > ref_potential_load
Potential of reference external load on boundary. TODO: Switch to BCField when possible.
Definition: elasticity.hh:82
Field< 3, FieldValue< 3 >::VectorFixed > load
Definition: elasticity.hh:72
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_mean_stress_ptr
Definition: elasticity.hh:105
arma::mat33 stress_tensor(BulkPoint &p, const arma::mat33 &strain_tensor)
Definition: elasticity.cc:113
Field< 3, FieldValue< 3 >::Scalar > output_divergence
Definition: elasticity.hh:91
Field< 3, FieldValue< 3 >::Scalar > fracture_sigma
Transition parameter for diffusive transfer on fractures.
Definition: elasticity.hh:75
Field< 3, FieldValue< 3 >::Scalar > young_modulus
Definition: elasticity.hh:73
Field< 3, FieldValue< 3 >::Scalar > dirichlet_penalty
Definition: elasticity.hh:98
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
Definition: elasticity.hh:79
Field< 3, FieldValue< 3 >::Scalar > output_cross_section
Definition: elasticity.hh:90
BCField< 3, FieldValue< 3 >::TensorFixed > bc_stress
Definition: elasticity.hh:71
Field< 3, FieldValue< 3 >::Scalar > lame_mu
Definition: elasticity.hh:96
Data of output parameters.
Definition: elasticity.hh:158
std::shared_ptr< DOFHandlerMultiDim > dh_scalar_
Objects for distribution of dofs.
Definition: elasticity.hh:175
std::shared_ptr< DOFHandlerMultiDim > dh_tensor_
Definition: elasticity.hh:176
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:298
unsigned int quad_order() const
Returns quad_order.
Definition: elasticity.hh:170
std::shared_ptr< EqData > eq_data_
Data for model parameters.
Definition: elasticity.hh:265
static const int registrar
Registrar of class to factory.
Definition: elasticity.hh:250
void update_solution() override
Computes the solution in one time instant.
Definition: elasticity.cc:558
GenericAssembly< RhsAssemblyElasticity > * rhs_assembly_
Definition: elasticity.hh:295
void update_output_fields()
Definition: elasticity.cc:481
void assemble_constraint_matrix()
Definition: elasticity.cc:651
GenericAssembly< OutpuFieldsAssemblyElasticity > * output_fields_assembly_
Definition: elasticity.hh:297
static constexpr const char * name_
Definition: elasticity.hh:290
EqFields & eq_fields()
Definition: elasticity.hh:237
GenericAssembly< StiffnessAssemblyElasticity > * stiffness_assembly_
general assembly objects, hold assembly objects of appropriate dimension
Definition: elasticity.hh:294
void solve_linear_system()
Solve without updating time step and without output.
Definition: elasticity.cc:581
std::shared_ptr< OutputTime > output_stream_
Definition: elasticity.hh:281
void initialize() override
Definition: elasticity.cc:359
void set_potential_load(const Field< 3, FieldValue< 3 >::Scalar > &potential, const Field< 3, FieldValue< 3 >::Scalar > &ref_potential)
Definition: elasticity.hh:225
Input::Record input_rec
Record with input specification.
Definition: elasticity.hh:284
void calculate_cumulative_balance()
Definition: elasticity.cc:642
void output_data()
Postprocesses the solution and writes to output file.
Definition: elasticity.cc:621
~Elasticity()
Destructor.
Definition: elasticity.cc:466
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportDG.
Definition: elasticity.cc:48
bool has_contact_
Indicator of contact conditions on fractures.
Definition: elasticity.hh:271
GenericAssembly< ConstraintAssemblyElasticity > * constraint_assembly_
Definition: elasticity.hh:296
Elasticity(Mesh &init_mesh, const Input::Record in_rec, TimeGovernor *tm=nullptr)
Constructor.
Definition: elasticity.cc:315
void zero_time_step() override
Initialize solution in the zero time.
Definition: elasticity.cc:511
const Vec & get_solution()
Definition: elasticity.hh:234
Elasticity FactoryBaseType
Definition: elasticity.hh:243
std::shared_ptr< OutputEqData > output_eq_data_
Data for output parameters.
Definition: elasticity.hh:268
std::shared_ptr< EqFields > eq_fields_
Fields for model parameters.
Definition: elasticity.hh:262
EqData & eq_data()
Definition: elasticity.hh:239
void preallocate()
Definition: elasticity.cc:544
void next_time()
Pass to next time and update equation data.
Definition: elasticity.cc:572
Mesh & mesh()
Definition: equation.hh:181
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:159
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
The class for outputting data during time.
Definition: output_time.hh:51
Basic time management functionality for unsteady (and steady) solvers (class Equation).
Abstract base class for equation clasess.
Wrappers for linear systems based on MPIAIJ and MATIS format.
unsigned int IntDim
A dimension index type.
Definition: mixed.hh:19
double Scalar
Definitions of particular quadrature rules on simplices.