Flow123d  JS_constraints-e651b99
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 "tools/mixed.hh"
32 
33 class Distribution;
34 class OutputTime;
35 class DOFHandlerMultiDim;
36 template<unsigned int dim> class FiniteElement;
37 class Elasticity;
38 template<unsigned int dim, class EqData> class StiffnessAssemblyElasticity;
39 template<unsigned int dim, class EqData> class RhsAssemblyElasticity;
40 template<unsigned int dim, class EqData> class ConstraintAssemblyElasticity;
41 template<unsigned int dim, class EqData> class OutpuFieldsAssemblyElasticity;
42 template< template<IntDim...> class DimAssembly> class GenericAssembly;
43 
44 
45 
46 
47 class Elasticity : public EquationBase
48 {
49 public:
50 
51  class EqFields : public FieldSet {
52  public:
53 
54  enum Bc_types {
59  };
60 
61  EqFields();
62 
64 
65  arma::mat33 stress_tensor(BulkPoint &p, const arma::mat33 &strain_tensor);
66 
74  Field<3, FieldValue<3>::Scalar> fracture_sigma; ///< Transition parameter for diffusive transfer on fractures.
76 
77  /// Pointer to DarcyFlow field cross_section
80  Field<3, FieldValue<3>::Scalar > potential_load; ///< Potential of an additional (external) load.
81  Field<3, FieldValue<3>::Scalar > ref_potential_load; ///< Potential of reference external load on boundary. TODO: Switch to BCField when possible.
84 
91 
92  /// @name Instances of FieldModel used in assembly methods
93  // @{
94 
98 
99  // @}
100 
101  std::shared_ptr<FieldFE<3, FieldValue<3>::VectorFixed> > output_field_ptr;
102  std::shared_ptr<FieldFE<3, FieldValue<3>::TensorFixed> > output_stress_ptr;
107 
109 
110  };
111 
112  /// Data of equation parameters
113  class EqData {
114  public:
116 
117  EqData(shared_ptr<EqFields> eq_fields)
118  : eq_fields_(eq_fields), 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  /// Shared pointer of EqFields
135  std::shared_ptr<EqFields> eq_fields_;
136 
137  /// Objects for distribution of dofs.
138  std::shared_ptr<DOFHandlerMultiDim> dh_;
139 
140  /// @name Solution of algebraic system
141  // @{
142 
143  /// Linear algebraic system.
145 
148 
149  // map local element -> constraint index
151 
152  // @}
153 
154  /// Shared Balance object
155  std::shared_ptr<Balance> balance_;
156 
157  };
158 
159 
160  /// Data of output parameters
161  class OutputEqData {
162  public:
164 
165  OutputEqData(shared_ptr<EqFields> eq_fields)
166  : eq_fields_(eq_fields) {}
167 
169 
170  /// Create DOF handler objects
171  void create_dh(Mesh * mesh);
172 
173  /// Returns quad_order
174  inline unsigned int quad_order() const {
175  return 0;
176  }
177 
178  /// Shared pointer of EqFields
179  std::shared_ptr<EqFields> eq_fields_;
180 
181  /// Objects for distribution of dofs.
182  std::shared_ptr<DOFHandlerMultiDim> dh_scalar_;
183  std::shared_ptr<DOFHandlerMultiDim> dh_tensor_;
184 
185  };
186 
188  template<unsigned int dim> using RhsAssemblyDim = RhsAssemblyElasticity<dim, EqData>;
191 
192 
193  /**
194  * @brief Constructor.
195  * @param init_mesh computational mesh
196  * @param in_rec input record
197  * @param tm time governor (if nullptr then it is created from input record)
198  */
199  Elasticity(Mesh &init_mesh, const Input::Record in_rec, TimeGovernor *tm = nullptr);
200  /**
201 
202  * @brief Declare input record type for the equation TransportDG.
203  */
204  static const Input::Type::Record & get_input_type();
205 
206  /**
207  * @brief Initialize solution in the zero time.
208  */
209  void zero_time_step() override;
210 
211  /// Pass to next time and update equation data.
212  void next_time();
213 
214  /// Solve without updating time step and without output.
215  void solve_linear_system();
216 
217  /**
218  * @brief Postprocesses the solution and writes to output file.
219  */
220  void output_data();
221 
222  /**
223  * @brief Destructor.
224  */
225  ~Elasticity();
226 
227  void initialize() override;
228 
229  // Recompute fields for output (stress, divergence etc.)
230  void update_output_fields();
231 
232  void set_potential_load(const Field<3, FieldValue<3>::Scalar> &potential,
233  const Field<3, FieldValue<3>::Scalar> &ref_potential)
234  {
235  eq_fields_->potential_load = potential;
236  eq_fields_->ref_potential_load = ref_potential;
237  }
238 
240 
241  const Vec &get_solution()
242  { return eq_data_->ls->get_solution(); }
243 
244  inline EqFields &eq_fields() { return *eq_fields_; }
245 
246  inline EqData &eq_data() { return *eq_data_; }
247 
248 
249 
251 
252 
253 
254 
255 private:
256  /// Registrar of class to factory
257  static const int registrar;
258 
259  void preallocate();
260 
261 
263 
264 
265  /// @name Physical parameters
266  // @{
267 
268  /// Fields for model parameters.
269  std::shared_ptr<EqFields> eq_fields_;
270 
271  /// Data for model parameters.
272  std::shared_ptr<EqData> eq_data_;
273 
274  /// Data for output parameters.
275  std::shared_ptr<OutputEqData> output_eq_data_;
276 
277  /// Indicator of contact conditions on fractures.
279 
280 
281  // @}
282 
283 
284 
285  /// @name Output to file
286  // @{
287 
288  std::shared_ptr<OutputTime> output_stream_;
289 
290  /// Record with input specification.
292 
293 
294  // @}
295 
296 
297  static constexpr const char * name_ = "Mechanics_LinearElasticity";
298 
299 
300  /// general assembly objects, hold assembly objects of appropriate dimension
305 
306 };
307 
308 
309 
310 
311 
312 
313 
314 #endif /* ELASTICITY_HH_ */
Base point accessor class.
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:113
unsigned int quad_order() const
Returns quad_order.
Definition: elasticity.hh:130
std::shared_ptr< EqFields > eq_fields_
Shared pointer of EqFields.
Definition: elasticity.hh:135
LinSys * ls
Linear algebraic system.
Definition: elasticity.hh:144
EqData(shared_ptr< EqFields > eq_fields)
Definition: elasticity.hh:117
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:285
std::shared_ptr< DOFHandlerMultiDim > dh_
Objects for distribution of dofs.
Definition: elasticity.hh:138
std::map< LongIdx, LongIdx > constraint_idx
Definition: elasticity.hh:150
std::shared_ptr< Balance > balance_
Shared Balance object.
Definition: elasticity.hh:155
Elasticity::EqFields EqFields
Definition: elasticity.hh:115
Field< 3, FieldValue< 3 >::Scalar > potential_load
Potential of an additional (external) load.
Definition: elasticity.hh:80
Field< 3, FieldValue< 3 >::TensorFixed > output_stress
Definition: elasticity.hh:86
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::TensorFixed > > output_stress_ptr
Definition: elasticity.hh:102
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_von_mises_stress_ptr
Definition: elasticity.hh:103
Field< 3, FieldValue< 3 >::Scalar > cross_section_min
Definition: elasticity.hh:79
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_cross_section_ptr
Definition: elasticity.hh:105
Field< 3, FieldValue< 3 >::Scalar > subdomain
Definition: elasticity.hh:83
Field< 3, FieldValue< 3 >::Scalar > region_id
Definition: elasticity.hh:82
EquationOutput output_fields
Definition: elasticity.hh:108
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::VectorFixed > > output_field_ptr
Definition: elasticity.hh:101
BCField< 3, FieldValue< 3 >::Enum > bc_type
Definition: elasticity.hh:67
Field< 3, FieldValue< 3 >::Scalar > lame_lambda
Definition: elasticity.hh:96
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_div_ptr
Definition: elasticity.hh:106
Field< 3, FieldValue< 3 >::Scalar > output_mean_stress
Definition: elasticity.hh:88
BCField< 3, FieldValue< 3 >::VectorFixed > bc_displacement
Definition: elasticity.hh:68
Field< 3, FieldValue< 3 >::Scalar > poisson_ratio
Definition: elasticity.hh:73
Field< 3, FieldValue< 3 >::VectorFixed > output_field
Definition: elasticity.hh:85
Field< 3, FieldValue< 3 >::TensorFixed > initial_stress
Definition: elasticity.hh:75
static const Input::Type::Selection & get_bc_type_selection()
Definition: elasticity.cc:120
BCField< 3, FieldValue< 3 >::VectorFixed > bc_traction
Definition: elasticity.hh:69
Field< 3, FieldValue< 3 >::Scalar > output_von_mises_stress
Definition: elasticity.hh:87
Field< 3, FieldValue< 3 >::Scalar > ref_potential_load
Potential of reference external load on boundary. TODO: Switch to BCField when possible.
Definition: elasticity.hh:81
Field< 3, FieldValue< 3 >::VectorFixed > load
Definition: elasticity.hh:71
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_mean_stress_ptr
Definition: elasticity.hh:104
arma::mat33 stress_tensor(BulkPoint &p, const arma::mat33 &strain_tensor)
Definition: elasticity.cc:112
Field< 3, FieldValue< 3 >::Scalar > output_divergence
Definition: elasticity.hh:90
Field< 3, FieldValue< 3 >::Scalar > fracture_sigma
Transition parameter for diffusive transfer on fractures.
Definition: elasticity.hh:74
Field< 3, FieldValue< 3 >::Scalar > young_modulus
Definition: elasticity.hh:72
Field< 3, FieldValue< 3 >::Scalar > dirichlet_penalty
Definition: elasticity.hh:97
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
Definition: elasticity.hh:78
Field< 3, FieldValue< 3 >::Scalar > output_cross_section
Definition: elasticity.hh:89
BCField< 3, FieldValue< 3 >::TensorFixed > bc_stress
Definition: elasticity.hh:70
Field< 3, FieldValue< 3 >::Scalar > lame_mu
Definition: elasticity.hh:95
Data of output parameters.
Definition: elasticity.hh:161
std::shared_ptr< EqFields > eq_fields_
Shared pointer of EqFields.
Definition: elasticity.hh:179
std::shared_ptr< DOFHandlerMultiDim > dh_scalar_
Objects for distribution of dofs.
Definition: elasticity.hh:182
std::shared_ptr< DOFHandlerMultiDim > dh_tensor_
Definition: elasticity.hh:183
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:297
OutputEqData(shared_ptr< EqFields > eq_fields)
Definition: elasticity.hh:165
unsigned int quad_order() const
Returns quad_order.
Definition: elasticity.hh:174
Elasticity::EqFields EqFields
Definition: elasticity.hh:163
GenericAssembly< RhsAssemblyDim > * rhs_assembly_
Definition: elasticity.hh:302
std::shared_ptr< EqData > eq_data_
Data for model parameters.
Definition: elasticity.hh:272
static const int registrar
Registrar of class to factory.
Definition: elasticity.hh:257
void update_output_fields()
Definition: elasticity.cc:480
GenericAssembly< StiffnessAssemblyDim > * stiffness_assembly_
general assembly objects, hold assembly objects of appropriate dimension
Definition: elasticity.hh:301
void assemble_constraint_matrix()
Definition: elasticity.cc:638
GenericAssembly< OutpuFieldsAssemblyDim > * output_fields_assembly_
Definition: elasticity.hh:304
static constexpr const char * name_
Definition: elasticity.hh:297
EqFields & eq_fields()
Definition: elasticity.hh:244
void solve_linear_system()
Solve without updating time step and without output.
Definition: elasticity.cc:566
std::shared_ptr< OutputTime > output_stream_
Definition: elasticity.hh:288
void initialize() override
Definition: elasticity.cc:358
void set_potential_load(const Field< 3, FieldValue< 3 >::Scalar > &potential, const Field< 3, FieldValue< 3 >::Scalar > &ref_potential)
Definition: elasticity.hh:232
Input::Record input_rec
Record with input specification.
Definition: elasticity.hh:291
void calculate_cumulative_balance()
Definition: elasticity.cc:629
void output_data()
Postprocesses the solution and writes to output file.
Definition: elasticity.cc:608
~Elasticity()
Destructor.
Definition: elasticity.cc:465
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportDG.
Definition: elasticity.cc:47
bool has_contact_
Indicator of contact conditions on fractures.
Definition: elasticity.hh:278
Elasticity(Mesh &init_mesh, const Input::Record in_rec, TimeGovernor *tm=nullptr)
Constructor.
Definition: elasticity.cc:314
void zero_time_step() override
Initialize solution in the zero time.
Definition: elasticity.cc:510
const Vec & get_solution()
Definition: elasticity.hh:241
Elasticity FactoryBaseType
Definition: elasticity.hh:250
std::shared_ptr< OutputEqData > output_eq_data_
Data for output parameters.
Definition: elasticity.hh:275
std::shared_ptr< EqFields > eq_fields_
Fields for model parameters.
Definition: elasticity.hh:269
EqData & eq_data()
Definition: elasticity.hh:246
void preallocate()
Definition: elasticity.cc:544
GenericAssembly< ConstraintAssemblyDim > * constraint_assembly_
Definition: elasticity.hh:303
void next_time()
Pass to next time and update equation data.
Definition: elasticity.cc:557
Mesh & mesh()
Definition: equation.hh:181
Container for various descendants of FieldCommonBase.
Definition: field_set.hh:160
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
Definition: op_accessors.hh:25
Definitions of particular quadrature rules on simplices.