46 std::string(equation_name),
47 "FEM for linear elasticity.")
50 "Settings for computing balance.")
52 "Parameters of output stream.")
54 "Linear solver for elasticity.")
57 .make_field_descriptor_type(equation_name)),
59 "Input fields of the equation.")
61 EqData().output_fields.make_output_type(equation_name,
""),
63 "Setting of the field output.")
75 FEObjects::FEObjects(
Mesh *mesh_,
unsigned int fe_order)
76 : q_(
QGauss::make_array(2))
86 xprintf(
PrgErr,
"Unsupported polynomial order %d for finite elements in Elasticity", fe_order);
91 ds_ = std::make_shared<EqualOrderDiscreteSpace>(mesh_,
fe_);
92 dh_ = std::make_shared<DOFHandlerMultiDim>(*mesh_);
94 dh_->distribute_dofs(
ds_);
98 dh_scalar_ = make_shared<DOFHandlerMultiDim>(*mesh_);
99 std::shared_ptr<DiscreteSpace> ds = std::make_shared<EqualOrderDiscreteSpace>( mesh_, fe_p);
104 dh_tensor_ = make_shared<DOFHandlerMultiDim>(*mesh_);
105 std::shared_ptr<DiscreteSpace> dst = std::make_shared<EqualOrderDiscreteSpace>( mesh_, fe_t);
114 template<> std::shared_ptr<FiniteElement<0>> FEObjects::fe<0>() {
return fe_[0_d]; }
115 template<> std::shared_ptr<FiniteElement<1>> FEObjects::fe<1>() {
return fe_[1_d]; }
116 template<> std::shared_ptr<FiniteElement<2>> FEObjects::fe<2>() {
return fe_[2_d]; }
117 template<> std::shared_ptr<FiniteElement<3>> FEObjects::fe<3>() {
return fe_[3_d]; }
130 return young*0.5/(poisson+1.);
136 return young*poisson/((poisson+1.)*(1.-2.*poisson));
145 return Selection(
"Elasticity_BC_Type",
"Types of boundary conditions for mechanics.")
146 .
add_value(bc_type_displacement,
"displacement",
147 "Prescribed displacement.")
148 .
add_value(bc_type_displacement_normal,
"displacement_n",
149 "Prescribed displacement in the normal direction to the boundary.")
151 "Prescribed traction.")
161 "Type of boundary condition.")
163 .input_default(
"\"traction\"")
164 .input_selection( get_bc_type_selection() )
167 *
this+=bc_displacement
168 .name(
"bc_displacement")
169 .description(
"Prescribed displacement on boundary.")
171 .input_default(
"0.0")
176 .description(
"Prescribed traction on boundary.")
178 .input_default(
"0.0")
183 .description(
"Prescribed bulk load.")
184 .units(
UnitSI().N().m(-3) )
185 .input_default(
"0.0")
189 .name(
"young_modulus")
190 .description(
"Young's modulus.")
192 .input_default(
"0.0")
193 .flags_add(in_main_matrix & in_rhs);
196 .name(
"poisson_ratio")
197 .description(
"Poisson's ratio.")
198 .units(
UnitSI().dimensionless() )
199 .input_default(
"0.0")
200 .flags_add(in_main_matrix & in_rhs);
202 *
this+=fracture_sigma
203 .name(
"fracture_sigma")
205 "Coefficient of transfer of forces through fractures.")
207 .input_default(
"1.0")
208 .flags_add(in_main_matrix & in_rhs);
210 *
this += region_id.name(
"region_id")
214 *
this += subdomain.name(
"subdomain")
219 .name(
"cross_section")
220 .units(
UnitSI().m(3).md() )
221 .flags(input_copy & in_time_term & in_main_matrix & in_rhs);
223 *
this+=potential_load
224 .name(
"potential_load")
226 .flags(input_copy & in_rhs);
229 .name(
"displacement")
230 .description(
"Displacement vector field output.")
232 .flags(equation_result);
234 *
this += output_stress
236 .description(
"Stress tensor output.")
238 .flags(equation_result);
240 *
this += output_von_mises_stress
241 .name(
"von_mises_stress")
242 .description(
"von Mises stress output.")
244 .flags(equation_result);
246 *
this += output_cross_section
247 .name(
"cross_section_updated")
248 .description(
"Cross-section after deformation - output.")
250 .flags(equation_result);
252 *
this += output_divergence
253 .name(
"displacement_divergence")
254 .description(
"Displacement divergence output.")
255 .units(
UnitSI().dimensionless() )
256 .flags(equation_result);
259 output_fields += *
this;
266 allocation_done(false)
282 ASSERT( time_from_rec.
is_default() ).error(
"Duplicate key 'time', time in elasticity is already initialized from parent class!");
294 DebugOut().fmt(
"Mechanics: solution size {}\n",
feo->
dh()->n_global_dofs());
342 std::string petsc_default_opts;
343 petsc_default_opts =
"-ksp_type cg -pc_type hypre -pc_hypre_type boomeramg";
380 compute_output_fields<1>();
381 compute_output_fields<2>();
382 compute_output_fields<3>();
403 std::stringstream ss;
420 MatSetOption(*
ls->
get_matrix(), MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE);
427 MessageOut().fmt(
"[mech solver] lin. it: {}, reason: {}, residual: {}\n",
483 DebugOut() <<
"Mechanics: Assembling matrix.\n";
499 DebugOut() <<
"Mechanics: Assembling right hand side.\n";
511 MessageOut().fmt(
"[mech solver] lin. it: {}, reason: {}, residual: {}\n",
541 template<
unsigned int dim>
544 QGauss q(dim, 0), q_sub(dim-1, 0);
549 const unsigned int ndofs =
feo->
fe<dim>()->n_dofs();
560 for (
auto cell :
feo->
dh()->own_range())
562 if (cell.dim() == dim)
564 auto elm = cell.elm();
568 double mu =
lame_mu(young, poisson);
572 LocDofVec dof_indices = cell.get_loc_dof_indices();
578 for (
unsigned int i=0; i<ndofs; i++)
580 stress += (2*mu*
vec.sym_grad(i,0) + lambda*
vec.divergence(i,0)*arma::eye(3,3))*output_vec[dof_indices[i]];
581 div +=
vec.divergence(i,0)*output_vec[dof_indices[i]];
584 arma::mat33 stress_dev = stress - arma::trace(stress)/3*arma::eye(3,3);
585 double von_mises_stress = sqrt(1.5*arma::dot(stress_dev, stress_dev));
586 output_div_vec[dof_indices_scalar[0]] += div;
588 for (
unsigned int i=0; i<3; i++)
589 for (
unsigned int j=0; j<3; j++)
590 output_stress_vec[dof_indices_tensor[i*3+j]] += stress(i,j);
591 output_von_mises_stress_vec[dof_indices_scalar[0]] = von_mises_stress;
595 else if (cell.dim() == dim-1)
597 auto elm = cell.elm();
598 double normal_displacement = 0;
604 double mu =
lame_mu(young, poisson);
607 for (
unsigned int inb=0; inb<elm->n_neighs_vb(); inb++)
609 auto side = elm->neigh_vb[inb]->side();
610 auto cell_side = side->element();
613 feo->
dh()->cell_accessor_from_element(cell_side.idx()).get_loc_dof_indices();
615 for (
unsigned int i=0; i<ndofs; i++)
617 normal_displacement -= arma::dot(vec_side.value(i,0)*output_vec[side_dof_indices[i]], fsv.
normal_vector(0));
618 arma::mat33 grad = -arma::kron(vec_side.value(i,0)*output_vec[side_dof_indices[i]], fsv.
normal_vector(0).t()) / csection;
619 normal_stress += mu*(grad+grad.t()) + lambda*arma::trace(grad)*arma::eye(3,3);
624 for (
unsigned int i=0; i<3; i++)
625 for (
unsigned int j=0; j<3; j++)
626 output_stress_vec[dof_indices_tensor[i*3+j]] += normal_stress(i,j);
627 output_cross_sec_vec[dof_indices_scalar[0]] += normal_displacement;
628 output_div_vec[dof_indices_scalar[0]] += normal_displacement / csection;
658 assemble_volume_integrals<1>();
659 assemble_volume_integrals<2>();
660 assemble_volume_integrals<3>();
664 assemble_fluxes_boundary<1>();
665 assemble_fluxes_boundary<2>();
666 assemble_fluxes_boundary<3>();
670 assemble_matrix_element_side<1>();
671 assemble_matrix_element_side<2>();
672 assemble_matrix_element_side<3>();
679 template<
unsigned int dim>
684 const unsigned int ndofs =
feo->
fe<dim>()->n_dofs(), qsize =
feo->
q<dim>()->size();
688 PetscScalar local_matrix[ndofs*ndofs];
692 for (
auto cell :
feo->
dh()->own_range())
694 if (cell.dim() != dim)
continue;
697 fe_values.
reinit(elm_acc);
698 cell.get_dof_indices(dof_indices);
705 for (
unsigned int i=0; i<ndofs; i++)
706 for (
unsigned int j=0; j<ndofs; j++)
707 local_matrix[i*ndofs+j] = 0;
709 for (
unsigned int k=0; k<qsize; k++)
711 double mu =
lame_mu(young[k], poisson[k]);
713 for (
unsigned int i=0; i<ndofs; i++)
715 for (
unsigned int j=0; j<ndofs; j++)
716 local_matrix[i*ndofs+j] += csection[k]*(
717 2*mu*arma::dot(
vec.sym_grad(j,k),
vec.sym_grad(i,k))
718 + lambda*
vec.divergence(j,k)*
vec.divergence(i,k)
733 assemble_sources<1>();
734 assemble_sources<2>();
735 assemble_sources<3>();
736 assemble_rhs_element_side<1>();
737 assemble_rhs_element_side<2>();
738 assemble_rhs_element_side<3>();
739 assemble_boundary_conditions<1>();
740 assemble_boundary_conditions<2>();
741 assemble_boundary_conditions<3>();
748 template<
unsigned int dim>
753 const unsigned int ndofs =
feo->
fe<dim>()->n_dofs(), qsize =
feo->
q<dim>()->size();
757 PetscScalar local_rhs[ndofs];
762 for (
auto cell :
feo->
dh()->own_range())
764 if (cell.dim() != dim)
continue;
767 fe_values.
reinit(elm_acc);
768 cell.get_dof_indices(dof_indices);
771 fill_n(local_rhs, ndofs, 0);
772 local_source_balance_vector.assign(ndofs, 0);
773 local_source_balance_rhs.assign(ndofs, 0);
780 for (
unsigned int k=0; k<qsize; k++)
782 for (
unsigned int i=0; i<ndofs; i++)
784 arma::dot(load[k],
vec.value(i,k))
785 -potential[k]*
vec.divergence(i,k)
786 )*csection[k]*fe_values.
JxW(k);
813 template<
unsigned int dim>
818 const unsigned int ndofs =
feo->
fe<dim>()->n_dofs(), qsize =
feo->
q<dim-1>()->size();
820 PetscScalar local_matrix[ndofs*ndofs];
824 for (
unsigned int iedg=0; iedg<
feo->
dh()->n_loc_edges(); iedg++)
827 if (edg.
n_sides() > 1)
continue;
829 if (edg.
side(0)->
dim() != dim-1)
continue;
839 fe_values_side.
reinit(*side);
841 for (
unsigned int i=0; i<ndofs; i++)
842 for (
unsigned int j=0; j<ndofs; j++)
843 local_matrix[i*ndofs+j] = 0;
847 for (
unsigned int k=0; k<qsize; k++)
848 for (
unsigned int i=0; i<ndofs; i++)
849 for (
unsigned int j=0; j<ndofs; j++)
854 for (
unsigned int k=0; k<qsize; k++)
855 for (
unsigned int i=0; i<ndofs; i++)
856 for (
unsigned int j=0; j<ndofs; j++)
872 template<
unsigned int dim>
875 if (dim == 1)
return;
881 const unsigned int ndofs_side =
feo->
fe<dim>()->n_dofs();
882 const unsigned int ndofs_sub =
feo->
fe<dim-1>()->n_dofs();
883 const unsigned int qsize =
feo->
q<dim-1>()->size();
887 vector<double> csection_lower(qsize), csection_higher(qsize), young(qsize), poisson(qsize), alpha(qsize);
888 PetscScalar local_matrix[2][2][(ndofs_side)*(ndofs_side)];
894 side_dof_indices[0].resize(ndofs_sub);
895 side_dof_indices[1].resize(ndofs_side);
898 for (
unsigned int inb=0; inb<
feo->
dh()->n_loc_nb(); inb++)
907 fe_values_sub.
reinit(cell_sub);
913 fe_values_side.
reinit(dh_side.side());
916 bool own_element_id[2];
917 own_element_id[0] =
feo->
dh()->cell_accessor_from_element(cell_sub.
idx()).is_own();
918 own_element_id[1] =
feo->
dh()->cell_accessor_from_element(cell.
idx()).is_own();
926 for (
unsigned int n=0; n<2; ++n)
927 for (
unsigned int i=0; i<ndofs_side; i++)
928 for (
unsigned int m=0; m<2; ++m)
929 for (
unsigned int j=0; j<ndofs_side; j++)
930 local_matrix[n][m][i*(ndofs_side)+j] = 0;
933 for (
unsigned int k=0; k<qsize; k++)
936 double mu =
lame_mu(young[k], poisson[k]);
939 for (
int n=0; n<2; n++)
941 if (!own_element_id[n])
continue;
943 for (
unsigned int i=0; i<n_dofs[n]; i++)
945 arma::vec3 vi = (n==0)?arma::zeros(3):vec_side.value(i,k);
946 arma::vec3 vf = (n==1)?arma::zeros(3):vec_sub.value(i,k);
947 arma::mat33 gvft = (n==0)?vec_sub.grad(i,k):arma::zeros(3,3);
949 for (
int m=0; m<2; m++)
950 for (
unsigned int j=0; j<n_dofs[m]; j++) {
951 arma::vec3 ui = (m==0)?arma::zeros(3):vec_side.value(j,k);
952 arma::vec3 uf = (m==1)?arma::zeros(3):vec_sub.value(j,k);
954 double divuit = (m==1)?arma::trace(guit):0;
956 local_matrix[n][m][i*n_dofs[m] + j] +=
957 frac_sigma[k]*csection_higher[k]*(
959 2*csection_higher[k]/csection_lower[k]*(mu*(uf-ui)+(mu+lambda)*(arma::dot(uf-ui,nv)*nv))
960 + mu*arma::trans(guit)*nv
963 - arma::dot(gvft, mu*arma::kron(nv,ui.t()) + lambda*arma::dot(ui,nv)*arma::eye(3,3))
964 )*fe_values_sub.
JxW(k);
971 for (
unsigned int n=0; n<2; ++n)
972 for (
unsigned int m=0; m<2; ++m)
973 ls->
mat_set_values(n_dofs[n], side_dof_indices[n].
data(), n_dofs[m], side_dof_indices[m].
data(), local_matrix[n][m]);
979 template<
unsigned int dim>
982 if (dim == 1)
return;
988 const unsigned int ndofs_side =
feo->
fe<dim>()->n_dofs();
989 const unsigned int ndofs_sub =
feo->
fe<dim-1>()->n_dofs();
990 const unsigned int qsize =
feo->
q<dim-1>()->size();
993 vector<double> frac_sigma(qsize), potential(qsize), csection_higher(qsize);
994 PetscScalar local_rhs[2][ndofs_side];
1000 side_dof_indices[0].resize(ndofs_sub);
1001 side_dof_indices[1].resize(ndofs_side);
1004 for (
unsigned int inb=0; inb<
feo->
dh()->n_loc_nb(); inb++)
1011 feo->
dh()->cell_accessor_from_element(cell_sub.
idx()).get_dof_indices(side_dof_indices[0]);
1012 fe_values_sub.
reinit(cell_sub);
1015 feo->
dh()->cell_accessor_from_element(cell.
idx()).get_dof_indices(side_dof_indices[1]);
1019 bool own_element_id[2];
1020 own_element_id[0] =
feo->
dh()->cell_accessor_from_element(cell_sub.
idx()).is_own();
1021 own_element_id[1] =
feo->
dh()->cell_accessor_from_element(cell.
idx()).is_own();
1027 for (
unsigned int n=0; n<2; ++n)
1028 for (
unsigned int i=0; i<ndofs_side; i++)
1029 local_rhs[n][i] = 0;
1032 for (
unsigned int k=0; k<qsize; k++)
1036 for (
int n=0; n<2; n++)
1038 if (!own_element_id[n])
continue;
1040 for (
unsigned int i=0; i<n_dofs[n]; i++)
1042 arma::vec3 vi = (n==0)?arma::zeros(3):vec_side.value(i,k);
1043 arma::vec3 vf = (n==1)?arma::zeros(3):vec_sub.value(i,k);
1045 local_rhs[n][i] -= frac_sigma[k]*csection_higher[k]*arma::dot(vf-vi,potential[k]*nv)*fe_values_sub.
JxW(k);
1050 for (
unsigned int n=0; n<2; ++n)
1059 template<
unsigned int dim>
1064 const unsigned int ndofs =
feo->
fe<dim>()->n_dofs(), qsize =
feo->
q<dim-1>()->size();
1067 double local_rhs[ndofs];
1079 for (
unsigned int si=0; si<elm->
n_sides(); ++si)
1082 Side side = *cell.elm().side(si);
1084 if (edg.
n_sides() > 1)
continue;
1088 if (side.
dim() != dim-1)
1097 fe_values_side.
reinit(side);
1106 cell.get_dof_indices(side_dof_indices);
1108 fill_n(local_rhs, ndofs, 0);
1109 local_flux_balance_vector.assign(ndofs, 0);
1114 for (
unsigned int k=0; k<qsize; k++)
1115 for (
unsigned int i=0; i<ndofs; i++)
1120 for (
unsigned int k=0; k<qsize; k++)
1121 for (
unsigned int i=0; i<ndofs; i++)
1126 for (
unsigned int k=0; k<qsize; k++)
1128 for (
unsigned int i=0; i<ndofs; i++)
1129 local_rhs[i] += csection[k]*arma::dot(
vec.value(i,k),bc_traction[k] + bc_potential[k]*fe_values_side.
normal_vector(k))*fe_values_side.
JxW(k);
BCField< 3, FieldValue< 3 >::Enum > bc_type
std::shared_ptr< DiscreteSpace > ds_
BCField< 3, FieldValue< 3 >::VectorFixed > bc_displacement
Field< 3, FieldValue< 3 >::TensorFixed > output_stress
unsigned int n_sides() const
Returns number of sides aligned with the edge.
Field< 3, FieldValue< 3 >::Scalar > young_modulus
static const Input::Type::Record & get_input_type()
Main balance input record type.
static auto subdomain(Mesh &mesh) -> IndexField
static constexpr const char * name()
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_von_mises_stress_ptr
Field< 3, FieldValue< 3 >::Scalar > output_von_mises_stress
Transformed quadrature weight for cell sides.
RegionSet get_region_set(const std::string &set_name) const
const FEValuesViews::Vector< spacedim > & vector_view(unsigned int i) const
Accessor to vector values of multicomponent FE.
arma::Col< IntIdx > LocDofVec
unsigned int * boundary_idx_
void assemble_matrix_element_side()
Assembles the fluxes between elements of different dimensions depending on displacement.
static constexpr Mask in_main_matrix
A field is part of main "stiffness matrix" of the equation.
Solver based on the original PETSc solver using MPIAIJ matrix and succesive Schur complement construc...
void inc()
Iterates to next local element.
Field< 3, FieldValue< 3 >::Scalar > region_id
unsigned int side_idx() const
Returns local index of the side on the element.
Field< 3, FieldValue< 3 >::Scalar > output_cross_section
static const Input::Type::Record & get_input_type()
The specification of output stream.
unsigned int get_dof_indices(std::vector< LongIdx > &indices) const
Fill vector of the global indices of dofs associated to the cell.
Edge edge() const
Returns pointer to the edge connected to the side.
void set_from_input(const Input::Record in_rec) override
#define MessageOut()
Macro defining 'message' record of log.
virtual void start_add_assembly()
void output(TimeStep step)
virtual PetscErrorCode mat_zero_entries()
virtual void rhs_set_values(int nrow, int *rows, double *vals)=0
void next_time()
Proceed to the next time according to current estimated time step.
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportDG.
void assemble_rhs()
Assembles the right hand side (forces, boundary conditions, tractions).
arma::vec3 centre() const
Centre of side.
static std::shared_ptr< OutputTime > create_output_stream(const std::string &equation_name, const Input::Record &in_rec, std::string unit_str)
This method delete all object instances of class OutputTime stored in output_streams vector...
LinSys * ls
Linear algebra system for the transport equation.
Fields computed from the mesh data.
virtual void start_allocation()
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::TensorFixed > > output_stress_ptr
Cell accessor allow iterate over DOF handler cells.
Class FEValues calculates finite element data on the actual cells such as shape function values...
virtual void finish_assembly()=0
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
Class FESystem for compound finite elements.
LocDofVec get_loc_dof_indices() const
Returns the local indices of dofs associated to the cell on the local process.
SideIter side(const unsigned int loc_index)
double lame_mu(double young, double poisson)
const RegionDB & region_db() const
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
const Armor::array & point_list() const
Return coordinates of all quadrature points in the actual cell system.
const TimeStep & step(int index=-1) const
void update_solution() override
Computes the solution in one time instant.
std::shared_ptr< DOFHandlerMultiDim > dh()
arma::mat33 mat_t(const arma::mat33 &m, const arma::vec3 &n)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
void assemble_rhs_element_side()
Assemble fluxes between different dimensions that are independent of displacement.
ElementAccessor< 3 > element() const
Returns iterator to the element of the side.
void reinit(const ElementAccessor< spacedim > &cell)
Update cell-dependent data (gradients, Jacobians etc.)
void compute_output_fields()
Input::Record input_rec
Record with input specification.
Field< 3, FieldValue< 3 >::Scalar > potential_load
Potential of an additional (external) load.
Vec rhs
Vector of right hand side.
void view(const char *name="") const
Symmetric Gauss-Legendre quadrature formulae on simplices.
static Input::Type::Record & record_template()
Template Record with common keys for derived equations.
FEM for linear elasticity.
bool allocation_done
Indicates whether matrices have been preallocated.
ElementAccessor< 3 > element()
Transformed quadrature points.
unsigned int dim() const
Returns dimension of the side, that is dimension of the element minus one.
BCField< 3, FieldValue< 3 >::VectorFixed > bc_traction
bool is_boundary() const
Returns true for side on the boundary.
void solve_linear_system()
Solve without updating time step and without output.
void assemble_sources()
Assembles the right hand side vector due to volume sources.
Definitions of basic Lagrangean finite elements with polynomial shape functions.
static constexpr Mask equation_external_output
Match an output field, that can be also copy of other field.
void update_output_fields()
unsigned int n_sides() const
MixedPtr< FiniteElement > fe_
Finite elements for the solution of the mechanics equation.
static auto region_id(Mesh &mesh) -> IndexField
#define START_TIMER(tag)
Starts a timer with specified tag.
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
Field< 3, FieldValue< 3 >::Scalar > output_divergence
void zero_time_step() override
Initialize solution in the zero time.
static constexpr Mask in_rhs
A field is part of the right hand side of the equation.
Shape function gradients.
void output_data()
Postprocesses the solution and writes to output file.
Mat stiffness_matrix
The stiffness matrix.
std::shared_ptr< FiniteElement< dim > > fe()
virtual void value_list(const Armor::array &point_list, const ElementAccessor< spacedim > &elm, std::vector< typename Value::return_type > &value_list) const
double measure() const
Calculate metrics of the side.
virtual const Vec * get_rhs()
virtual PetscErrorCode rhs_zero_entries()
Field< 3, FieldValue< 3 >::VectorFixed > load
void set_solution(Vec sol_vec)
Field< 3, FieldValue< 3 >::Scalar > fracture_sigma
Transition parameter for diffusive transfer on fractures.
void assemble_fluxes_boundary()
Assembles the fluxes on the boundary.
void mark_input_times(const TimeGovernor &tg)
vector< Neighbour > vb_neighbours_
void assemble_boundary_conditions()
Assembles the r.h.s. components corresponding to the Dirichlet boundary conditions for a given space ...
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
Field< 3, FieldValue< 3 >::Scalar > poisson_ratio
void initialize(std::shared_ptr< OutputTime > stream, Mesh *mesh, Input::Record in_rec, const TimeGovernor &tg)
std::shared_ptr< DOFHandlerMultiDim > dh_tensor_
void set_components(const std::vector< string > &names)
EquationOutput output_fields
static const int registrar
Registrar of class to factory.
void set_field(const RegionSet &domain, FieldBasePtr field, double time=0.0)
void next_time()
Pass to next time and update equation data.
bool set_time(const TimeStep &time, LimitSide limit_side)
void initialize() override
EqData data_
Field data for model parameters.
double lame_lambda(double young, double poisson)
static const Input::Type::Selection & get_bc_type_selection()
MixedPtr< FESystem > mixed_fe_system(MixedPtr< FiniteElement > fe, Args &&...args)
Definitions of particular quadrature rules on simplices.
#define WarningOut()
Macro defining 'warning' record of log.
virtual SolveInfo solve()=0
#define END_TIMER(tag)
Ends a timer with specified tag.
static string default_output_field()
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::VectorFixed > > output_field_ptr
static const Input::Type::Record & get_input_type()
Edge edge(uint edge_idx) const
std::shared_ptr< DOFHandlerMultiDim > dh_
Object for distribution of dofs.
void set_mesh(const Mesh &mesh)
void assemble_stiffness_matrix()
Assembles the stiffness matrix.
std::shared_ptr< DOFHandlerMultiDim > dh_scalar()
virtual void mat_set_values(int nrow, int *rows, int ncol, int *cols, double *vals)=0
double JxW(const unsigned int point_no)
Return the product of Jacobian determinant and the quadrature weight at given quadrature point...
Class for representation SI units of Fields.
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_div_ptr
std::shared_ptr< DOFHandlerMultiDim > dh_tensor()
void assemble_volume_integrals()
Assembles the volume integrals into the stiffness matrix.
virtual const Mat * get_matrix()
void calculate_cumulative_balance()
Elasticity(Mesh &init_mesh, const Input::Record in_rec, TimeGovernor *tm=nullptr)
Constructor.
std::shared_ptr< FieldFE< 3, FieldValue< 3 >::Scalar > > output_cross_section_ptr
arma::vec::fixed< spacedim > point(const unsigned int point_no)
Return coordinates of the quadrature point in the actual cell system.
static UnitSI & dimensionless()
Returns dimensionless unit.
#define DebugOut()
Macro defining 'debug' record of log.
static bool print_message_table(ostream &stream, std::string equation_name)
unsigned int idx() const
Return local idx of element in boundary / bulk part of element vector.
virtual double compute_residual()=0
Field< 3, FieldValue< 3 >::VectorFixed > output_field
std::shared_ptr< DOFHandlerMultiDim > dh_scalar_
SideIter side(const unsigned int i) const
Gets side iterator of the i -th side.
Field< 3, FieldValue< 3 >::Scalar > subdomain
Definitions of Raviart-Thomas finite elements.
Side accessor allows to iterate over sides of DOF handler cell.
FieldCommon & output_type(OutputTime::DiscreteSpace rt)
ElementAccessor< 3 > element_accessor()
std::shared_ptr< OutputTime > output_stream_
Mechanics::FEObjects * feo
Finite element objects.
double dirichlet_penalty(SideIter side)
Penalty to enforce boundary value in weak sense.
Transformed quadrature weights.
arma::vec::fixed< spacedim > normal_vector(unsigned int point_no)
Returns the normal vector to a side at given quadrature point.