Flow123d  DF_patch_fe_mechanics-5faa023
elasticity.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 transport_dg.cc
15  * @brief Discontinuous Galerkin method for equation of transport with dispersion.
16  * @author Jan Stebel
17  */
18 
19 #include "system/sys_profiler.hh"
20 #include "mechanics/elasticity.hh"
22 
23 #include "io/output_time.hh"
25 #include "fem/fe_values.hh"
26 #include "fem/fe_p.hh"
27 #include "fem/fe_rt.hh"
28 #include "fem/fe_system.hh"
29 #include "fields/field_fe.hh"
30 #include "la/linsys_PETSC.hh"
31 #include "la/linsys_PERMON.hh"
32 #include "coupling/balance.hh"
33 #include "mesh/neighbours.h"
35 
36 #include "fields/multi_field.hh"
37 #include "fields/generic_field.hh"
38 #include "fields/field_model.hh"
39 #include "input/factory.hh"
40 
41 
42 
43 
44 using namespace Input::Type;
45 
46 
47 
49  std::string equation_name = std::string(name_) + "_FE";
50  return IT::Record(
51  std::string(equation_name),
52  "FEM for linear elasticity.")
55  .declare_key("balance", Balance::get_input_type(), Default("{}"),
56  "Settings for computing balance.")
58  "Parameters of output stream.")
60  "Linear solver for elasticity.")
61  .declare_key("input_fields", Array(
63  .make_field_descriptor_type(equation_name)),
65  "Input fields of the equation.")
66  .declare_key("output",
67  EqFields().output_fields.make_output_type(equation_name, ""),
68  IT::Default("{ \"fields\": [ \"displacement\" ] }"),
69  "Setting of the field output.")
70  .declare_key("contact", Bool(), IT::Default("false"), "Indicates the use of contact conditions on fractures.")
71  .close();
72 }
73 
74 const int Elasticity::registrar =
75  Input::register_class< Elasticity, Mesh &, const Input::Record>(std::string(name_) + "_FE") +
77 
78 
79 
80 double lame_mu(double young, double poisson)
81 {
82  return young*0.5/(poisson+1.);
83 }
84 
85 
86 double lame_lambda(double young, double poisson)
87 {
88  return young*poisson/((poisson+1.)*(1.-2.*poisson));
89 }
90 
91 // Functor computing lame_mu
92 struct fn_lame_mu {
93  inline double operator() (double young, double poisson) {
94  return young * 0.5 / (poisson+1.);
95  }
96 };
97 
98 // Functor computing lame_lambda
100  inline double operator() (double young, double poisson) {
101  return young * poisson / ((poisson+1.)*(1.-2.*poisson));
102  }
103 };
104 
105 // Functor computing base of dirichlet_penalty (without dividing by side meassure)
107  inline double operator() (double lame_mu, double lame_lambda) {
108  return 1e3 * (2 * lame_mu + lame_lambda);
109  }
110 };
111 
112 
114 {
115  return 2*lame_mu(p)*strain_tensor + lame_lambda(p)*arma::trace(strain_tensor)*arma::eye(3,3);
116 }
117 
118 
119 
120 
122  return Selection("Elasticity_BC_Type", "Types of boundary conditions for mechanics.")
123  .add_value(bc_type_displacement, "displacement",
124  "Prescribed displacement.")
125  .add_value(bc_type_displacement_normal, "displacement_n",
126  "Prescribed displacement in the normal direction to the boundary.")
127  .add_value(bc_type_traction, "traction",
128  "Prescribed traction.")
129  .add_value(bc_type_stress, "stress",
130  "Prescribed stress tensor.")
131  .close();
132 }
133 
134 
136 {
137  *this+=bc_type
138  .name("bc_type")
139  .description(
140  "Type of boundary condition.")
141  .units( UnitSI::dimensionless() )
142  .input_default("\"traction\"")
143  .input_selection( get_bc_type_selection() )
145 
146  *this+=bc_displacement
147  .name("bc_displacement")
148  .description("Prescribed displacement on boundary.")
149  .units( UnitSI().m() )
150  .input_default("0.0")
151  .flags_add(in_rhs);
152 
153  *this+=bc_traction
154  .name("bc_traction")
155  .description("Prescribed traction on boundary.")
156  .units( UnitSI().Pa() )
157  .input_default("0.0")
158  .flags_add(in_rhs);
159 
160  *this+=bc_stress
161  .name("bc_stress")
162  .description("Prescribed stress on boundary.")
163  .units( UnitSI().Pa() )
164  .input_default("0.0")
165  .flags_add(in_rhs);
166 
167  *this+=load
168  .name("load")
169  .description("Prescribed bulk load.")
170  .units( UnitSI().N().m(-3) )
171  .input_default("0.0")
172  .flags_add(in_rhs);
173 
174  *this+=young_modulus
175  .name("young_modulus")
176  .description("Young's modulus.")
177  .units( UnitSI().Pa() )
178  .input_default("0.0")
179  .flags_add(in_main_matrix & in_rhs);
180 
181  *this+=poisson_ratio
182  .name("poisson_ratio")
183  .description("Poisson's ratio.")
184  .units( UnitSI().dimensionless() )
185  .input_default("0.0")
186  .flags_add(in_main_matrix & in_rhs);
187 
188  *this+=fracture_sigma
189  .name("fracture_sigma")
190  .description(
191  "Coefficient of transfer of forces through fractures.")
192  .units( UnitSI::dimensionless() )
193  .input_default("1.0")
194  .flags_add(in_main_matrix & in_rhs);
195 
196  *this+=initial_stress
197  .name("initial_stress")
198  .description("Initial stress tensor.")
199  .units( UnitSI().Pa() )
200  .input_default("0.0")
201  .flags_add(in_rhs);
202 
203  *this += region_id.name("region_id")
204  .units( UnitSI::dimensionless())
206 
207  *this += subdomain.name("subdomain")
208  .units( UnitSI::dimensionless() )
210 
211  *this+=cross_section
212  .name("cross_section")
213  .units( UnitSI().m(3).md() )
214  .flags(input_copy & in_time_term & in_main_matrix & in_rhs);
215 
216  *this+=cross_section_min
217  .name("cross_section_min")
218  .description("Minimal cross-section of fractures.")
219  .units( UnitSI().m(3).md() )
220  .input_default("0.0");
221 
222  *this+=potential_load
223  .name("potential_load")
224  .units( UnitSI().m() )
225  .flags(input_copy & in_rhs);
226 
227  *this+=output_field
228  .name("displacement")
229  .description("Displacement vector field output.")
230  .units( UnitSI().m() )
231  .flags(equation_result);
232 
233  *this += output_stress
234  .name("stress")
235  .description("Stress tensor output.")
236  .units( UnitSI().Pa() )
237  .flags(equation_result);
238 
239  *this += output_von_mises_stress
240  .name("von_mises_stress")
241  .description("von Mises stress output.")
242  .units( UnitSI().Pa() )
243  .flags(equation_result);
244 
245  *this += output_mean_stress
246  .name("mean_stress")
247  .description("mean stress output.")
248  .units( UnitSI().Pa() )
249  .flags(equation_result);
250 
251  *this += output_cross_section
252  .name("cross_section_updated")
253  .description("Cross-section after deformation - output.")
254  .units( UnitSI().m() )
255  .flags(equation_result);
256 
257  *this += output_divergence
258  .name("displacement_divergence")
259  .description("Displacement divergence output.")
260  .units( UnitSI().dimensionless() )
261  .flags(equation_result);
262 
263  *this += lame_mu.name("lame_mu")
264  .description("Field lame_mu.")
265  .input_default("0.0")
266  .units( UnitSI().Pa() );
267 
268  *this += lame_lambda.name("lame_lambda")
269  .description("Field lame_lambda.")
270  .input_default("0.0")
271  .units( UnitSI().Pa() );
272 
273  *this += dirichlet_penalty.name("dirichlet_penalty")
274  .description("Field dirichlet_penalty.")
275  .input_default("0.0")
276  .units( UnitSI().Pa() );
277 
278  // add all input fields to the output list
279  output_fields += *this;
280 
281  this->add_coords_field();
282  this->set_default_fieldset();
283 
284 }
285 
287 {
288  ASSERT_EQ(quad_order(), 1).error("Unsupported polynomial order for finite elements in Elasticity");
289  MixedPtr<FE_P> fe_p( quad_order() );
291 
292  std::shared_ptr<DiscreteSpace> ds = std::make_shared<EqualOrderDiscreteSpace>(mesh, fe);
293  dh_ = std::make_shared<DOFHandlerMultiDim>(*mesh);
294 
295  dh_->distribute_dofs(ds);
296 }
297 
299 {
300  ASSERT_EQ(quad_order(), 0).error("Unsupported polynomial order for output in Elasticity");
301 
302  MixedPtr<FE_P_disc> fe_p_disc( quad_order() );
303  dh_scalar_ = make_shared<DOFHandlerMultiDim>(*mesh);
304  std::shared_ptr<DiscreteSpace> ds_scalar = std::make_shared<EqualOrderDiscreteSpace>( mesh, fe_p_disc);
305  dh_scalar_->distribute_dofs(ds_scalar);
306 
307 
309  dh_tensor_ = make_shared<DOFHandlerMultiDim>(*mesh);
310  std::shared_ptr<DiscreteSpace> dst = std::make_shared<EqualOrderDiscreteSpace>( mesh, fe_t);
311  dh_tensor_->distribute_dofs(dst);
312 }
313 
314 
315 Elasticity::Elasticity(Mesh & init_mesh, const Input::Record in_rec, TimeGovernor *tm)
316  : EquationBase(init_mesh, in_rec),
317  input_rec(in_rec),
318  stiffness_assembly_(nullptr),
319  rhs_assembly_(nullptr),
320  constraint_assembly_(nullptr),
321  output_fields_assembly_(nullptr)
322 {
323  // Can not use name() + "constructor" here, since START_TIMER only accepts const char *
324  // due to constexpr optimization.
325  START_TIMER("Mechanics constructor");
326 
327  eq_data_ = std::make_shared<EqData>();
328  output_eq_data_ = std::make_shared<OutputEqData>();
329  eq_fields_ = std::make_shared<EqFields>();
330  this->eq_fieldset_ = eq_fields_;
331 
332  auto time_rec = in_rec.val<Input::Record>("time");
333  if (tm == nullptr)
334  {
335  time_ = new TimeGovernor(time_rec);
336  }
337  else
338  {
339  TimeGovernor time_from_rec(time_rec);
340  ASSERT( time_from_rec.is_default() ).error("Duplicate key 'time', time in elasticity is already initialized from parent class!");
341  time_ = tm;
342  }
343 
344 
345  // Set up physical parameters.
346  eq_fields_->set_mesh(init_mesh);
349  eq_data_->balance_ = this->balance();
350 
351  // create finite element structures and distribute DOFs
352  eq_data_->create_dh(mesh_);
353  output_eq_data_->create_dh(mesh_);
354  DebugOut().fmt("Mechanics: solution size {}\n", eq_data_->dh_->n_global_dofs());
355  END_TIMER("Mechanics constructor");
356 }
357 
358 
360 {
361  output_stream_ = OutputTime::create_output_stream("mechanics", input_rec.val<Input::Record>("output_stream"), time().get_unit_conversion());
362 
363  eq_fields_->set_components({"displacement"});
364  eq_fields_->set_input_list( input_rec.val<Input::Array>("input_fields"), time() );
365 
366 // balance_ = std::make_shared<Balance>("mechanics", mesh_);
367 // balance_->init_from_input(input_rec.val<Input::Record>("balance"), *time_);
368  // initialization of balance object
369 // eq_data_->balance_idx_ = {
370 // balance_->add_quantity("force_x"),
371 // balance_->add_quantity("force_y"),
372 // balance_->add_quantity("force_z")
373 // };
374 // balance_->units(UnitSI().kg().m().s(-2));
375 
376  // create shared pointer to a FieldFE, pass FE data and push this FieldFE to output_field on all regions
377  eq_fields_->output_field_ptr = create_field_fe<3, FieldValue<3>::VectorFixed>(eq_data_->dh_);
378  eq_fields_->output_field.set(eq_fields_->output_field_ptr, 0.);
379 
380  // setup output stress
381  eq_fields_->output_stress_ptr = create_field_fe<3, FieldValue<3>::TensorFixed>(output_eq_data_->dh_tensor_);
382  eq_fields_->output_stress.set(eq_fields_->output_stress_ptr, 0.);
383 
384  // setup output von Mises stress
385  eq_fields_->output_von_mises_stress_ptr = create_field_fe<3, FieldValue<3>::Scalar>(output_eq_data_->dh_scalar_);
386  eq_fields_->output_von_mises_stress.set(eq_fields_->output_von_mises_stress_ptr, 0.);
387 
388  // setup output mean stress
389  eq_fields_->output_mean_stress_ptr = create_field_fe<3, FieldValue<3>::Scalar>(output_eq_data_->dh_scalar_);
390  eq_fields_->output_mean_stress.set(eq_fields_->output_mean_stress_ptr, 0.);
391 
392  // setup output cross-section
393  eq_fields_->output_cross_section_ptr = create_field_fe<3, FieldValue<3>::Scalar>(output_eq_data_->dh_scalar_);
394  eq_fields_->output_cross_section.set(eq_fields_->output_cross_section_ptr, 0.);
395 
396  // setup output divergence
398  eq_fields_->output_divergence.set(eq_fields_->output_div_ptr, 0.);
399 
400  // read optional user fields
401  Input::Array user_fields_arr;
402  if (input_rec.opt_val("user_fields", user_fields_arr)) {
403  this->init_user_fields(user_fields_arr, eq_fields_->output_fields);
404  }
405 
406  eq_fields_->output_fields.set_mesh(*mesh_);
407  eq_fields_->output_field.output_type(OutputTime::CORNER_DATA);
408 
409  // set time marks for writing the output
410  eq_fields_->output_fields.initialize(output_stream_, mesh_, input_rec.val<Input::Record>("output"), this->time());
411 
412  // set instances of FieldModel
413  eq_fields_->lame_mu.set(Model<3, FieldValue<3>::Scalar>::create(fn_lame_mu(), eq_fields_->young_modulus, eq_fields_->poisson_ratio), 0.0);
414  eq_fields_->lame_lambda.set(Model<3, FieldValue<3>::Scalar>::create(fn_lame_lambda(), eq_fields_->young_modulus, eq_fields_->poisson_ratio), 0.0);
415  eq_fields_->dirichlet_penalty.set(Model<3, FieldValue<3>::Scalar>::create(fn_dirichlet_penalty(), eq_fields_->lame_mu, eq_fields_->lame_lambda), 0.0);
416 
417  // equation default PETSc solver options
418  std::string petsc_default_opts;
419  petsc_default_opts = "-ksp_type cg -pc_type hypre -pc_hypre_type boomeramg";
420 
421  // allocate matrix and vector structures
422  LinSys *ls;
423  has_contact_ = input_rec.val<bool>("contact");
424  if (has_contact_) {
425 #ifndef FLOW123D_HAVE_PERMON
426  ASSERT(false).error("Flow123d was not built with PERMON library, therefore contact conditions are unsupported.");
427 #endif //FLOW123D_HAVE_PERMON
428  ls = new LinSys_PERMON(eq_data_->dh_->distr().get(), petsc_default_opts);
429 
430  // allocate constraint matrix and vector
431  unsigned int n_own_constraints = 0; // count locally owned cells with neighbours
432  for (auto cell : eq_data_->dh_->own_range())
433  if (cell.elm()->n_neighs_vb() > 0)
434  n_own_constraints++;
435  unsigned int n_constraints = 0; // count all cells with neighbours
436  for (auto elm : mesh_->elements_range())
437  if (elm->n_neighs_vb() > 0)
438  eq_data_->constraint_idx[elm.idx()] = n_constraints++;
439  unsigned int nnz = eq_data_->dh_->ds()->fe()[1_d]->n_dofs()*mesh_->max_edge_sides(1) +
440  eq_data_->dh_->ds()->fe()[2_d]->n_dofs()*mesh_->max_edge_sides(2) +
441  eq_data_->dh_->ds()->fe()[3_d]->n_dofs()*mesh_->max_edge_sides(3);
442  MatCreateAIJ(PETSC_COMM_WORLD, n_own_constraints, eq_data_->dh_->lsize(), PETSC_DECIDE, PETSC_DECIDE, nnz, 0, nnz, 0, &eq_data_->constraint_matrix);
443  VecCreateMPI(PETSC_COMM_WORLD, n_own_constraints, PETSC_DECIDE, &eq_data_->constraint_vec);
444  ((LinSys_PERMON*)ls)->set_inequality(eq_data_->constraint_matrix,eq_data_->constraint_vec);
445 
447  } else {
448  ls = new LinSys_PETSC(eq_data_->dh_->distr().get(), petsc_default_opts);
449  ((LinSys_PETSC*)ls)->set_initial_guess_nonzero();
450  }
451  ls->set_from_input( input_rec.val<Input::Record>("solver") );
452  ls->set_solution(eq_fields_->output_field_ptr->vec().petsc_vec());
453  eq_data_->ls = ls;
454 
458 
459  // initialization of balance object
460 // balance_->allocate(eq_data_->dh_->distr()->lsize(),
461 // max(feo->fe<1>()->n_dofs(), max(feo->fe<2>()->n_dofs(), feo->fe<3>()->n_dofs())));
462 
463 }
464 
465 
467 {
468 // delete time_;
469 
470  if (stiffness_assembly_!=nullptr) delete stiffness_assembly_;
471  if (rhs_assembly_!=nullptr) delete rhs_assembly_;
472  if (constraint_assembly_ != nullptr) delete constraint_assembly_;
474 
475  eq_data_.reset();
476  eq_fields_.reset();
477 }
478 
479 
480 
482 {
483  eq_fields_->set_time(time_->step(), LimitSide::right);
484 
485  // update ghost values of solution vector and prepare dependent fields
486  eq_fields_->output_field_ptr->vec().local_to_ghost_begin();
487  eq_fields_->output_stress_ptr->vec().zero_entries();
488  eq_fields_->output_cross_section_ptr->vec().zero_entries();
489  eq_fields_->output_div_ptr->vec().zero_entries();
490  eq_fields_->output_field_ptr->vec().local_to_ghost_end();
491 
492  // compute new output fields depending on solution (stress, divergence etc.)
494 
495  // update ghost values of computed fields
496  eq_fields_->output_stress_ptr->vec().local_to_ghost_begin();
497  eq_fields_->output_von_mises_stress_ptr->vec().local_to_ghost_begin();
498  eq_fields_->output_mean_stress_ptr->vec().local_to_ghost_begin();
499  eq_fields_->output_cross_section_ptr->vec().local_to_ghost_begin();
500  eq_fields_->output_div_ptr->vec().local_to_ghost_begin();
501  eq_fields_->output_stress_ptr->vec().local_to_ghost_end();
502  eq_fields_->output_von_mises_stress_ptr->vec().local_to_ghost_end();
503  eq_fields_->output_mean_stress_ptr->vec().local_to_ghost_end();
504  eq_fields_->output_cross_section_ptr->vec().local_to_ghost_end();
505  eq_fields_->output_div_ptr->vec().local_to_ghost_end();
506 }
507 
508 
509 
510 
512 {
513  START_TIMER("Mechanics zero time step");
514  eq_fields_->mark_input_times( *time_ );
515  eq_fields_->set_time(time_->step(), LimitSide::right);
516  std::stringstream ss; // print warning message with table of uninitialized fields
517  if ( FieldCommon::print_message_table(ss, "mechanics") ) {
518  WarningOut() << ss.str();
519  }
520 
521  preallocate();
522 
523 
524  // after preallocation we assemble the matrices and vectors required for balance of forces
525 // for (auto subst_idx : eq_data_->balance_idx_)
526 // balance_->calculate_instant(subst_idx, eq_data_->ls->get_solution());
527 
528 // update_solution();
529  eq_data_->ls->start_add_assembly();
530  MatSetOption(*eq_data_->ls->get_matrix(), MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE);
531  eq_data_->ls->mat_zero_entries();
532  eq_data_->ls->rhs_zero_entries();
535  eq_data_->ls->finish_assembly();
536  LinSys::SolveInfo si = eq_data_->ls->solve();
537  MessageOut().fmt("[mech solver] lin. it: {}, reason: {}, residual: {}\n",
538  si.n_iterations, si.converged_reason, eq_data_->ls->compute_residual());
539  output_data();
540  END_TIMER("Mechanics zero time step");
541 }
542 
543 
544 
546 {
547  // preallocate system matrix
548  eq_data_->ls->start_allocation();
551 
552  if (has_contact_)
554 }
555 
556 
557 
559 {
560  time_->next_time();
561  time_->view("MECH");
562 
563 }
564 
565 
566 
568 {
569  START_TIMER("Mechanics step");
570  START_TIMER("data reinit");
571  eq_fields_->set_time(time_->step(), LimitSide::right);
572  END_TIMER("data reinit");
573 
574  // assemble stiffness matrix
575  if (eq_data_->ls->get_matrix() == NULL
576  || eq_fields_->subset(FieldFlag::in_main_matrix).changed())
577  {
578  DebugOut() << "Mechanics: Assembling matrix.\n";
579  eq_data_->ls->start_add_assembly();
580  eq_data_->ls->mat_zero_entries();
582  eq_data_->ls->finish_assembly();
583  }
584 
585  // assemble right hand side (due to sources and boundary conditions)
586  if (eq_data_->ls->get_rhs() == NULL
587  || eq_fields_->subset(FieldFlag::in_rhs).changed())
588  {
589  DebugOut() << "Mechanics: Assembling right hand side.\n";
590  eq_data_->ls->start_add_assembly();
591  eq_data_->ls->rhs_zero_entries();
593  eq_data_->ls->finish_assembly();
594  }
595 
596  START_TIMER("solve");
597  LinSys::SolveInfo si = eq_data_->ls->solve();
598  MessageOut().fmt("[mech solver] lin. it: {}, reason: {}, residual: {}\n",
599  si.n_iterations, si.converged_reason, eq_data_->ls->compute_residual());
600  END_TIMER("solve");
601  END_TIMER("Mechanics step");
602 }
603 
604 
605 
606 
607 
608 
610 {
611  START_TIMER("Mechanics output");
612 
613  // gather the solution from all processors
614  eq_fields_->output_fields.set_time( this->time().step(), LimitSide::left);
615  //if (eq_fields_->output_fields.is_field_output_time(eq_fields_->output_field, this->time().step()) )
617  eq_fields_->output_fields.output(this->time().step());
618 
619 // START_TIMER("Mechanics-balance");
620 // balance_->calculate_instant(subst_idx, eq_data_->ls->get_solution());
621 // balance_->output();
622 // END_TIMER("Mechanics-balance");
623 
624  END_TIMER("Mechanics output");
625 }
626 
627 
628 
629 
631 {
632 // if (balance_->cumulative())
633 // {
634 // balance_->calculate_cumulative(subst_idx, eq_data_->ls->get_solution());
635 // }
636 }
637 
638 
640 {
641  MatZeroEntries(eq_data_->constraint_matrix);
642  VecZeroEntries(eq_data_->constraint_vec);
644  MatAssemblyBegin(eq_data_->constraint_matrix, MAT_FINAL_ASSEMBLY);
645  MatAssemblyEnd(eq_data_->constraint_matrix, MAT_FINAL_ASSEMBLY);
646  VecAssemblyBegin(eq_data_->constraint_vec);
647  VecAssemblyEnd(eq_data_->constraint_vec);
648 }
649 
650 
#define ASSERT(expr)
Definition: asserts.hh:351
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Definition: asserts.hh:333
static const Input::Type::Record & get_input_type()
Main balance input record type.
Definition: balance.cc:53
Base point accessor class.
Definition: eval_subset.hh:55
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:286
static const Input::Type::Selection & get_bc_type_selection()
Definition: elasticity.cc:121
arma::mat33 stress_tensor(BulkPoint &p, const arma::mat33 &strain_tensor)
Definition: elasticity.cc:113
void create_dh(Mesh *mesh)
Create DOF handler objects.
Definition: elasticity.cc:298
std::shared_ptr< EqData > eq_data_
Data for model parameters.
Definition: elasticity.hh:260
static const int registrar
Registrar of class to factory.
Definition: elasticity.hh:245
GenericAssembly< RhsAssemblyElasticity > * rhs_assembly_
Definition: elasticity.hh:290
void update_output_fields()
Definition: elasticity.cc:481
void assemble_constraint_matrix()
Definition: elasticity.cc:639
GenericAssembly< OutpuFieldsAssemblyElasticity > * output_fields_assembly_
Definition: elasticity.hh:292
GenericAssembly< StiffnessAssemblyElasticity > * stiffness_assembly_
general assembly objects, hold assembly objects of appropriate dimension
Definition: elasticity.hh:289
void solve_linear_system()
Solve without updating time step and without output.
Definition: elasticity.cc:567
std::shared_ptr< OutputTime > output_stream_
Definition: elasticity.hh:276
void initialize() override
Definition: elasticity.cc:359
Input::Record input_rec
Record with input specification.
Definition: elasticity.hh:279
void calculate_cumulative_balance()
Definition: elasticity.cc:630
void output_data()
Postprocesses the solution and writes to output file.
Definition: elasticity.cc:609
~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:266
GenericAssembly< ConstraintAssemblyElasticity > * constraint_assembly_
Definition: elasticity.hh:291
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
std::shared_ptr< OutputEqData > output_eq_data_
Data for output parameters.
Definition: elasticity.hh:263
std::shared_ptr< EqFields > eq_fields_
Fields for model parameters.
Definition: elasticity.hh:257
void preallocate()
Definition: elasticity.cc:545
void next_time()
Pass to next time and update equation data.
Definition: elasticity.cc:558
std::shared_ptr< Balance > balance() const
Definition: equation.hh:189
static Input::Type::Record & record_template()
Template Record with common keys for derived equations.
Definition: equation.cc:39
std::shared_ptr< FieldSet > eq_fieldset_
Definition: equation.hh:249
void init_user_fields(Input::Array user_fields, FieldSet &output_fields)
Definition: equation.cc:84
TimeGovernor * time_
Definition: equation.hh:241
static Input::Type::Record & user_fields_template(std::string equation_name)
Template Record with common key user_fields for derived equations.
Definition: equation.cc:46
Mesh * mesh_
Definition: equation.hh:240
TimeGovernor & time()
Definition: equation.hh:151
static bool print_message_table(ostream &stream, std::string equation_name)
Definition: field_common.cc:95
static constexpr Mask equation_external_output
Match an output field, that can be also copy of other field.
Definition: field_flag.hh:58
static constexpr Mask in_rhs
A field is part of the right hand side of the equation.
Definition: field_flag.hh:51
static constexpr Mask in_main_matrix
A field is part of main "stiffness matrix" of the equation.
Definition: field_flag.hh:49
void assemble(std::shared_ptr< DOFHandlerMultiDim > dh) override
General assemble methods.
static auto region_id(Mesh &mesh) -> IndexField
static auto subdomain(Mesh &mesh) -> IndexField
Accessor to input data conforming to declared Array.
Definition: accessors.hh:566
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
bool opt_val(const string &key, Ret &value) const
const Ret val(const string &key) const
Class for declaration of inputs sequences.
Definition: type_base.hh:339
Class for declaration of the input of type Bool.
Definition: type_base.hh:452
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
static Default obligatory()
The factory function to make an empty default value which is obligatory.
Definition: type_record.hh:110
Record type proxy class.
Definition: type_record.hh:182
unsigned int size() const
Returns number of keys in the Record.
Definition: type_record.hh:602
Record & close() const
Close the Record for further declarations of keys.
Definition: type_record.cc:304
Record & copy_keys(const Record &other)
Copy keys from other record.
Definition: type_record.cc:216
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
Template for classes storing finite set of named values.
Selection & add_value(const int value, const std::string &key, const std::string &description="", TypeBase::attribute_map attributes=TypeBase::attribute_map())
Adds one new value with name given by key to the Selection.
const Selection & close() const
Close the Selection, no more values can be added.
static const Input::Type::Record & get_input_type()
Definition: linsys_PETSC.cc:32
void set_solution(Vec sol_vec)
Definition: linsys.hh:290
virtual void set_from_input(const Input::Record in_rec)
Definition: linsys.hh:641
Range< ElementAccessor< 3 > > elements_range() const
Returns range of mesh elements.
Definition: mesh.cc:1174
unsigned int max_edge_sides(unsigned int dim) const
Definition: mesh.h:145
Definition: mesh.h:362
static const Input::Type::Record & get_input_type()
The specification of output stream.
Definition: output_time.cc:38
static std::shared_ptr< OutputTime > create_output_stream(const std::string &equation_name, const Input::Record &in_rec, const std::shared_ptr< TimeUnitConversion > &time_unit_conv)
This method delete all object instances of class OutputTime stored in output_streams vector.
Definition: output_time.cc:187
Basic time management functionality for unsteady (and steady) solvers (class Equation).
void view(const char *name="") const
const TimeStep & step(int index=-1) const
void next_time()
Proceed to the next time according to current estimated time step.
Class for representation SI units of Fields.
Definition: unit_si.hh:40
static UnitSI & dimensionless()
Returns dimensionless unit.
Definition: unit_si.cc:55
double lame_mu(double young, double poisson)
Definition: elasticity.cc:80
double lame_lambda(double young, double poisson)
Definition: elasticity.cc:86
FEM for linear elasticity.
Definitions of basic Lagrangean finite elements with polynomial shape functions.
Definitions of Raviart-Thomas finite elements.
Class FESystem for compound finite elements.
MixedPtr< FESystem > mixed_fe_system(MixedPtr< FiniteElement > fe, Args &&... args)
Definition: fe_system.hh:176
Class FEValues calculates finite element data on the actual cells such as shape function values,...
@ FETensor
@ FEVector
PERMON QP solvers and FETI.
Solver based on the original PETSc solver using MPIAIJ matrix and succesive Schur complement construc...
#define WarningOut()
Macro defining 'warning' record of log.
Definition: logger.hh:278
#define MessageOut()
Macro defining 'message' record of log.
Definition: logger.hh:275
#define DebugOut()
Macro defining 'debug' record of log.
Definition: logger.hh:284
double Scalar
Definition: op_accessors.hh:25
Definitions of particular quadrature rules on simplices.
int converged_reason
Definition: linsys.hh:108
#define END_TIMER(tag)
Ends a timer with specified tag.
#define START_TIMER(tag)
Starts a timer with specified tag.