Loading [MathJax]/extensions/MathMenu.js
OGS
ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim > Class Template Reference

Detailed Description

template<typename ShapeFunction, int DisplacementDim>
class ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >

Definition at line 107 of file PhaseFieldFEM.h.

#include <PhaseFieldFEM.h>

Inheritance diagram for ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >:
[legend]
Collaboration diagram for ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >:
[legend]

Public Types

using ShapeMatricesType
 
using ShapeMatrices = typename ShapeMatricesType::ShapeMatrices
 
using BMatricesType = BMatrixPolicyType<ShapeFunction, DisplacementDim>
 
using NodalForceVectorType = typename BMatricesType::NodalForceVectorType
 
using DeformationVector
 
using PhaseFieldVector
 
using PhaseFieldMatrix
 
using NodalMatrixType = typename ShapeMatricesType::NodalMatrixType
 
using NodalVectorType = typename ShapeMatricesType::NodalVectorType
 
using IpData
 

Public Member Functions

 PhaseFieldLocalAssembler (PhaseFieldLocalAssembler const &)=delete
 
 PhaseFieldLocalAssembler (PhaseFieldLocalAssembler &&)=delete
 
 PhaseFieldLocalAssembler (MeshLib::Element const &e, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, PhaseFieldProcessData< DisplacementDim > &process_data)
 
std::size_t setIPDataInitialConditions (std::string_view const name, double const *values, int const integration_order) override
 Returns number of read integration points.
 
void assemble (double const, double const, std::vector< double > const &, std::vector< double > const &, std::vector< double > &, std::vector< double > &, std::vector< double > &) override
 
void assembleWithJacobianForStaggeredScheme (double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
 
void initializeConcrete () override
 
void postTimestepConcrete (Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, int const) override
 
void computeCrackIntegral (std::size_t mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double &crack_volume) override
 
void computeEnergy (std::size_t mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double &elastic_energy, double &surface_energy, double &pressure_work) override
 
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix (const unsigned integration_point) const override
 Provides the shape matrix at the given integration point.
 
std::vector< double > getSigma () const override
 
std::vector< double > getEpsilon () const override
 
- Public Member Functions inherited from ProcessLib::PhaseField::PhaseFieldLocalAssemblerInterface
- Public Member Functions inherited from ProcessLib::LocalAssemblerInterface
virtual ~LocalAssemblerInterface ()=default
 
virtual void setInitialConditions (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, int const process_id)
 
virtual void initialize (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
 
virtual void preAssemble (double const, double const, std::vector< double > const &)
 
virtual void assembleForStaggeredScheme (double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data)
 
virtual void assembleWithJacobian (double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
 
virtual void computeSecondaryVariable (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_prev, int const process_id)
 
virtual void preTimestep (std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table, GlobalVector const &x, double const t, double const delta_t)
 
virtual void postTimestep (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
 
void postNonLinearSolver (std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, double const t, double const dt, int const process_id)
 
virtual Eigen::Vector3d getFlux (MathLib::Point3d const &, double const, std::vector< double > const &) const
 
virtual Eigen::Vector3d getFlux (MathLib::Point3d const &, double const, std::vector< std::vector< double > > const &) const
 Fits to staggered scheme.
 
virtual std::optional< VectorSegmentgetVectorDeformationSegment () const
 
- Public Member Functions inherited from NumLib::ExtrapolatableElement
virtual ~ExtrapolatableElement ()=default
 

Private Member Functions

std::vector< double > const & getIntPtSigma (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
std::vector< double > const & getIntPtSigmaTensile (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
std::vector< double > const & getIntPtSigmaCompressive (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
std::vector< double > const & getIntPtEpsilon (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
std::vector< double > const & getIntPtEpsilonTensile (const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
 
void assembleWithJacobianPhaseFieldEquations (double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
 
void assembleWithJacobianForDeformationEquations (double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
 

Private Attributes

PhaseFieldProcessData< DisplacementDim > & _process_data
 
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
 
NumLib::GenericIntegrationMethod const & _integration_method
 
MeshLib::Element const & _element
 
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
 
bool const _is_axially_symmetric
 

Static Private Attributes

static constexpr int displacement_index = 0
 
static constexpr int displacement_size
 
static constexpr int phasefield_index
 
static constexpr int phasefield_size = ShapeFunction::NPOINTS
 
static const int phase_process_id = 1
 
static const int mechanics_process_id = 0
 

Member Typedef Documentation

◆ BMatricesType

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::BMatricesType = BMatrixPolicyType<ShapeFunction, DisplacementDim>

Definition at line 123 of file PhaseFieldFEM.h.

◆ DeformationVector

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::DeformationVector
Initial value:
typename ShapeMatricesType::template VectorType<displacement_size>

Definition at line 127 of file PhaseFieldFEM.h.

◆ IpData

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::IpData
Initial value:
IntegrationPointData<BMatricesType, ShapeMatricesType, DisplacementDim>

Definition at line 136 of file PhaseFieldFEM.h.

◆ NodalForceVectorType

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::NodalForceVectorType = typename BMatricesType::NodalForceVectorType

Definition at line 125 of file PhaseFieldFEM.h.

◆ NodalMatrixType

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::NodalMatrixType = typename ShapeMatricesType::NodalMatrixType

Definition at line 134 of file PhaseFieldFEM.h.

◆ NodalVectorType

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::NodalVectorType = typename ShapeMatricesType::NodalVectorType

Definition at line 135 of file PhaseFieldFEM.h.

◆ PhaseFieldMatrix

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::PhaseFieldMatrix
Initial value:
typename ShapeMatricesType::template MatrixType<phasefield_size,

Definition at line 131 of file PhaseFieldFEM.h.

◆ PhaseFieldVector

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::PhaseFieldVector
Initial value:
typename ShapeMatricesType::template VectorType<phasefield_size>

Definition at line 129 of file PhaseFieldFEM.h.

◆ ShapeMatrices

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::ShapeMatrices = typename ShapeMatricesType::ShapeMatrices

Definition at line 122 of file PhaseFieldFEM.h.

◆ ShapeMatricesType

template<typename ShapeFunction , int DisplacementDim>
using ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::ShapeMatricesType

Constructor & Destructor Documentation

◆ PhaseFieldLocalAssembler() [1/3]

template<typename ShapeFunction , int DisplacementDim>
ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::PhaseFieldLocalAssembler ( PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim > const & )
delete

◆ PhaseFieldLocalAssembler() [2/3]

template<typename ShapeFunction , int DisplacementDim>
ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::PhaseFieldLocalAssembler ( PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim > && )
delete

◆ PhaseFieldLocalAssembler() [3/3]

template<typename ShapeFunction , int DisplacementDim>
ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::PhaseFieldLocalAssembler ( MeshLib::Element const & e,
std::size_t const ,
NumLib::GenericIntegrationMethod const & integration_method,
bool const is_axially_symmetric,
PhaseFieldProcessData< DisplacementDim > & process_data )
inline

Definition at line 142 of file PhaseFieldFEM.h.

148 : _process_data(process_data),
149 _integration_method(integration_method),
150 _element(e),
151 _is_axially_symmetric(is_axially_symmetric)
152 {
153 unsigned const n_integration_points =
155
156 _ip_data.reserve(n_integration_points);
157 _secondary_data.N.resize(n_integration_points);
158
159 auto& solid_material =
161 _process_data.solid_materials,
162 _process_data.material_ids,
163 e.getID());
164
165 auto const shape_matrices =
167 DisplacementDim>(e, is_axially_symmetric,
169
171 x_position.setElementID(_element.getID());
172
173 for (unsigned ip = 0; ip < n_integration_points; ip++)
174 {
175 _ip_data.emplace_back(solid_material);
176 auto& ip_data = _ip_data[ip];
177 ip_data.integration_weight =
179 shape_matrices[ip].integralMeasure * shape_matrices[ip].detJ;
180
181 static const int kelvin_vector_size =
183 DisplacementDim);
184 ip_data.eps_tensile.setZero(kelvin_vector_size);
185 ip_data.eps.setZero(kelvin_vector_size);
186 ip_data.eps_prev.resize(kelvin_vector_size);
187 ip_data.D.setZero(kelvin_vector_size, kelvin_vector_size);
188
189 ip_data.sigma_tensile.setZero(kelvin_vector_size);
190 ip_data.sigma_compressive.setZero(kelvin_vector_size);
191 ip_data.sigma.setZero(kelvin_vector_size);
192 ip_data.strain_energy_tensile = 0.0;
193 ip_data.elastic_energy = 0.0;
194
195 ip_data.N = shape_matrices[ip].N;
196 ip_data.dNdx = shape_matrices[ip].dNdx;
197
198 _secondary_data.N[ip] = shape_matrices[ip].N;
199 }
200 }
constexpr double getWeight() const
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:89
MathLib::WeightedPoint const & getWeightedPoint(unsigned const igp) const
void setElementID(std::size_t element_id)
PhaseFieldProcessData< DisplacementDim > & _process_data
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
NumLib::GenericIntegrationMethod const & _integration_method
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
auto & selectSolidConstitutiveRelation(SolidMaterialsMap const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N

References ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_element, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_integration_method, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_ip_data, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_process_data, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_secondary_data, MeshLib::Element::getID(), NumLib::GenericIntegrationMethod::getNumberOfPoints(), MathLib::WeightedPoint::getWeight(), NumLib::GenericIntegrationMethod::getWeightedPoint(), NumLib::initShapeMatrices(), MathLib::KelvinVector::kelvin_vector_dimensions(), ProcessLib::PhaseField::SecondaryData< ShapeMatrixType >::N, MaterialLib::Solids::selectSolidConstitutiveRelation(), and ParameterLib::SpatialPosition::setElementID().

Member Function Documentation

◆ assemble()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::assemble ( double const ,
double const ,
std::vector< double > const & ,
std::vector< double > const & ,
std::vector< double > & ,
std::vector< double > & ,
std::vector< double > &  )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 208 of file PhaseFieldFEM.h.

214 {
215 OGS_FATAL(
216 "PhaseFieldLocalAssembler: assembly without jacobian is not "
217 "implemented.");
218 }
#define OGS_FATAL(...)
Definition Error.h:26

References OGS_FATAL.

◆ assembleWithJacobianForDeformationEquations()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::assembleWithJacobianForDeformationEquations ( double const t,
double const dt,
Eigen::VectorXd const & local_x,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
private

Definition at line 43 of file PhaseFieldFEM-impl.h.

47{
48 using DeformationMatrix =
49 typename ShapeMatricesType::template MatrixType<displacement_size,
51 auto const d = local_x.template segment<phasefield_size>(phasefield_index);
52 auto const u =
53 local_x.template segment<displacement_size>(displacement_index);
54
56 local_Jac_data, displacement_size, displacement_size);
57
59 local_b_data, displacement_size);
60
62 x_position.setElementID(_element.getID());
63
64 auto local_pressure = 0.0;
65 if (_process_data.pressurized_crack)
66 {
67 local_pressure = _process_data.unity_pressure;
68 }
69
70 int const n_integration_points = _integration_method.getNumberOfPoints();
71 for (int ip = 0; ip < n_integration_points; ip++)
72 {
73 auto const& w = _ip_data[ip].integration_weight;
74 auto const& N = _ip_data[ip].N;
75 auto const& dNdx = _ip_data[ip].dNdx;
76
77 auto const x_coord =
79 _element, N);
80
81 auto const& B =
82 LinearBMatrix::computeBMatrix<DisplacementDim,
83 ShapeFunction::NPOINTS,
85 dNdx, N, x_coord, _is_axially_symmetric);
86
87 auto& eps = _ip_data[ip].eps;
88 eps.noalias() = B * u;
89 double const k = _process_data.residual_stiffness(t, x_position)[0];
90 double const ls = _process_data.crack_length_scale(t, x_position)[0];
91 double const d_ip = N.dot(d);
92 double const degradation =
93 _process_data.degradation_derivative->degradation(d_ip, k, ls);
94 _ip_data[ip].updateConstitutiveRelation(
95 t, x_position, dt, u, degradation,
96 _process_data.energy_split_model);
97
98 auto& sigma = _ip_data[ip].sigma;
99 auto const& D = _ip_data[ip].D;
100
101 typename ShapeMatricesType::template MatrixType<DisplacementDim,
103 N_u = ShapeMatricesType::template MatrixType<
104 DisplacementDim, displacement_size>::Zero(DisplacementDim,
106
107 for (int i = 0; i < DisplacementDim; ++i)
108 {
109 N_u.template block<1, displacement_size / DisplacementDim>(
110 i, i * displacement_size / DisplacementDim)
111 .noalias() = N;
112 }
113
114 auto const rho_sr = _process_data.solid_density(t, x_position)[0];
115 auto const& b = _process_data.specific_body_force;
116
117 local_rhs.noalias() -=
118 (B.transpose() * sigma - N_u.transpose() * rho_sr * b -
119 local_pressure * N_u.transpose() * dNdx * d) *
120 w;
121 local_Jac.noalias() += B.transpose() * D * B * w;
122 }
123}
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
double interpolateXCoordinate(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
BMatrixType computeBMatrix(DNDX_Type const &dNdx, N_Type const &N, const double radius, const bool is_axially_symmetric)
Fills a B-matrix based on given shape function dN/dx values.

References ProcessLib::LinearBMatrix::computeBMatrix(), MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), NumLib::interpolateXCoordinate(), and ParameterLib::SpatialPosition::setElementID().

◆ assembleWithJacobianForStaggeredScheme()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::assembleWithJacobianForStaggeredScheme ( double const t,
double const dt,
Eigen::VectorXd const & local_x,
Eigen::VectorXd const & local_x_prev,
int const process_id,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
overridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 23 of file PhaseFieldFEM-impl.h.

28{
29 // For the equations with phase field.
30 if (process_id == phase_process_id)
31 {
32 assembleWithJacobianPhaseFieldEquations(t, dt, local_x, local_b_data,
33 local_Jac_data);
34 return;
35 }
36
37 // For the equations with deformation
38 assembleWithJacobianForDeformationEquations(t, dt, local_x, local_b_data,
39 local_Jac_data);
40}
void assembleWithJacobianForDeformationEquations(double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianPhaseFieldEquations(double const t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)

◆ assembleWithJacobianPhaseFieldEquations()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::assembleWithJacobianPhaseFieldEquations ( double const t,
double const dt,
Eigen::VectorXd const & local_x,
std::vector< double > & local_b_data,
std::vector< double > & local_Jac_data )
private

Definition at line 126 of file PhaseFieldFEM-impl.h.

131{
132 auto const d = local_x.template segment<phasefield_size>(phasefield_index);
133 auto const u =
134 local_x.template segment<displacement_size>(displacement_index);
135
137 local_Jac_data, phasefield_size, phasefield_size);
139 local_b_data, phasefield_size);
140
142 x_position.setElementID(_element.getID());
143
144 auto local_pressure = 0.0;
145 if (_process_data.static_pressurized_crack)
146 {
147 local_pressure = _process_data.unity_pressure;
148 }
149 else if (_process_data.propagating_pressurized_crack)
150 {
151 local_pressure = _process_data.pressure;
152 }
153
154 double const k = _process_data.residual_stiffness(t, x_position)[0];
155 double const ls = _process_data.crack_length_scale(t, x_position)[0];
156 double const gc = _process_data.crack_resistance(t, x_position)[0];
157
158 int const n_integration_points = _integration_method.getNumberOfPoints();
159 for (int ip = 0; ip < n_integration_points; ip++)
160 {
161 auto const& w = _ip_data[ip].integration_weight;
162 auto const& N = _ip_data[ip].N;
163 auto const& dNdx = _ip_data[ip].dNdx;
164
165 double const d_ip = N.dot(d);
166 double const degradation =
167 _process_data.degradation_derivative->degradation(d_ip, k, ls);
168 double const degradation_df1 =
169 _process_data.degradation_derivative->degradationDf1(d_ip, k, ls);
170 double const degradation_df2 =
171 _process_data.degradation_derivative->degradationDf2(d_ip, k, ls);
172 auto const x_coord =
174 _element, N);
175 auto const& B =
176 LinearBMatrix::computeBMatrix<DisplacementDim,
177 ShapeFunction::NPOINTS,
179 dNdx, N, x_coord, _is_axially_symmetric);
180
181 auto& eps = _ip_data[ip].eps;
182 eps.noalias() = B * u;
183 _ip_data[ip].updateConstitutiveRelation(
184 t, x_position, dt, u, degradation,
185 _process_data.energy_split_model);
186
187 auto const& strain_energy_tensile = _ip_data[ip].strain_energy_tensile;
188
189 auto& ip_data = _ip_data[ip];
190 ip_data.strain_energy_tensile = strain_energy_tensile;
191
192 typename ShapeMatricesType::template MatrixType<DisplacementDim,
194 N_u = ShapeMatricesType::template MatrixType<
195 DisplacementDim, displacement_size>::Zero(DisplacementDim,
197
198 for (int i = 0; i < DisplacementDim; ++i)
199 {
200 N_u.template block<1, displacement_size / DisplacementDim>(
201 i, i * displacement_size / DisplacementDim)
202 .noalias() = N;
203 }
204
205 local_Jac.noalias() +=
206 (N.transpose() * N * degradation_df2 * strain_energy_tensile) * w;
207
208 local_rhs.noalias() -=
209 (N.transpose() * degradation_df1 * strain_energy_tensile -
210 local_pressure * dNdx.transpose() * N_u * u) *
211 w;
212
214 decltype(dNdx), decltype(N), decltype(w), decltype(d),
215 decltype(local_Jac), decltype(local_rhs)>(
216 dNdx, N, w, d, local_Jac, local_rhs, gc, ls,
217 _process_data.phasefield_model);
218 }
219}
void calculateCrackLocalJacobianAndResidual(T_DNDX &dNdx, T_N &N, T_W &w, T_D &d, T_LOCAL_JAC &local_Jac, T_LOCAL_RHS local_rhs, double const gc, double const ls, PhaseFieldModel &phasefield_model)

References ProcessLib::LinearBMatrix::computeBMatrix(), MathLib::createZeroedMatrix(), MathLib::createZeroedVector(), NumLib::interpolateXCoordinate(), and ParameterLib::SpatialPosition::setElementID().

◆ computeCrackIntegral()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::computeCrackIntegral ( std::size_t mesh_item_id,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_tables,
std::vector< GlobalVector * > const & x,
double const t,
double & crack_volume )
overridevirtual

Implements ProcessLib::PhaseField::PhaseFieldLocalAssemblerInterface.

Definition at line 222 of file PhaseFieldFEM-impl.h.

228{
229 std::vector<std::vector<GlobalIndexType>> indices_of_processes;
230 indices_of_processes.reserve(dof_tables.size());
231 std::transform(dof_tables.begin(), dof_tables.end(),
232 std::back_inserter(indices_of_processes),
233 [&](auto const dof_table)
234 { return NumLib::getIndices(mesh_item_id, *dof_table); });
235
236 auto local_coupled_xs = getCoupledLocalSolutions(x, indices_of_processes);
237 assert(local_coupled_xs.size() == displacement_size + phasefield_size);
238
239 auto const d = Eigen::Map<PhaseFieldVector const>(
240 &local_coupled_xs[phasefield_index], phasefield_size);
241 auto const u = Eigen::Map<DeformationVector const>(
242 &local_coupled_xs[displacement_index], displacement_size);
243
245 x_position.setElementID(_element.getID());
246
247 int const n_integration_points = _integration_method.getNumberOfPoints();
248 for (int ip = 0; ip < n_integration_points; ip++)
249 {
250 auto const& w = _ip_data[ip].integration_weight;
251 auto const& N = _ip_data[ip].N;
252 auto const& dNdx = _ip_data[ip].dNdx;
253
254 typename ShapeMatricesType::template MatrixType<DisplacementDim,
256 N_u = ShapeMatricesType::template MatrixType<
257 DisplacementDim, displacement_size>::Zero(DisplacementDim,
259
260 for (int i = 0; i < DisplacementDim; ++i)
261 {
262 N_u.template block<1, displacement_size / DisplacementDim>(
263 i, i * displacement_size / DisplacementDim)
264 .noalias() = N;
265 }
266
267 crack_volume += (N_u * u).dot(dNdx * d) * w;
268 }
269}
std::vector< double > getCoupledLocalSolutions(std::vector< GlobalVector * > const &global_solutions, std::vector< std::vector< GlobalIndexType > > const &indices)

References ProcessLib::getCoupledLocalSolutions(), and ParameterLib::SpatialPosition::setElementID().

◆ computeEnergy()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::computeEnergy ( std::size_t mesh_item_id,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & dof_tables,
std::vector< GlobalVector * > const & x,
double const t,
double & elastic_energy,
double & surface_energy,
double & pressure_work )
overridevirtual

Implements ProcessLib::PhaseField::PhaseFieldLocalAssemblerInterface.

Definition at line 272 of file PhaseFieldFEM-impl.h.

277{
278 std::vector<std::vector<GlobalIndexType>> indices_of_processes;
279 indices_of_processes.reserve(dof_tables.size());
280 std::transform(dof_tables.begin(), dof_tables.end(),
281 std::back_inserter(indices_of_processes),
282 [&](auto const dof_table)
283 { return NumLib::getIndices(mesh_item_id, *dof_table); });
284
285 auto const local_coupled_xs =
286 getCoupledLocalSolutions(x, indices_of_processes);
287 assert(local_coupled_xs.size() == displacement_size + phasefield_size);
288
289 auto const d = Eigen::Map<PhaseFieldVector const>(
290 &local_coupled_xs[phasefield_index], phasefield_size);
291 auto const u = Eigen::Map<DeformationVector const>(
292 &local_coupled_xs[displacement_index], displacement_size);
293
295 x_position.setElementID(_element.getID());
296
297 double element_elastic_energy = 0.0;
298 double element_surface_energy = 0.0;
299 double element_pressure_work = 0.0;
300
301 double const gc = _process_data.crack_resistance(t, x_position)[0];
302 double const ls = _process_data.crack_length_scale(t, x_position)[0];
303 int const n_integration_points = _integration_method.getNumberOfPoints();
304 for (int ip = 0; ip < n_integration_points; ip++)
305 {
306 auto const& w = _ip_data[ip].integration_weight;
307 auto const& N = _ip_data[ip].N;
308 auto const& dNdx = _ip_data[ip].dNdx;
309 auto pressure_ip = _process_data.pressure;
310
311 typename ShapeMatricesType::template MatrixType<DisplacementDim,
313 N_u = ShapeMatricesType::template MatrixType<
314 DisplacementDim, displacement_size>::Zero(DisplacementDim,
316
317 for (int i = 0; i < DisplacementDim; ++i)
318 {
319 N_u.template block<1, displacement_size / DisplacementDim>(
320 i, i * displacement_size / DisplacementDim)
321 .noalias() = N;
322 }
323
324 element_elastic_energy += _ip_data[ip].elastic_energy * w;
325
326 double const d_ip = N.dot(d);
327 switch (_process_data.phasefield_model)
328 {
330 {
331 element_surface_energy +=
332 gc * 0.375 *
333 ((1 - d_ip) / ls + (dNdx * d).dot((dNdx * d)) * ls) * w;
334
335 break;
336 }
338 {
339 element_surface_energy += 0.5 * gc *
340 ((1 - d_ip) * (1 - d_ip) / ls +
341 (dNdx * d).dot((dNdx * d)) * ls) *
342 w;
343 break;
344 }
346 {
347 element_surface_energy +=
348 gc / std::numbers::pi *
349 ((1 - d_ip * d_ip) / ls + (dNdx * d).dot((dNdx * d)) * ls) *
350 w;
351 break;
352 }
353 }
354
355 if (_process_data.pressurized_crack)
356 {
357 element_pressure_work += pressure_ip * (N_u * u).dot(dNdx * d) * w;
358 }
359 }
360
361#ifdef USE_PETSC
362 int const n_all_nodes = indices_of_processes[1].size();
363 int const n_regular_nodes = std::count_if(
364 begin(indices_of_processes[1]), end(indices_of_processes[1]),
365 [](GlobalIndexType const& index) { return index >= 0; });
366 if (n_all_nodes != n_regular_nodes)
367 {
368 element_elastic_energy *=
369 static_cast<double>(n_regular_nodes) / n_all_nodes;
370 element_surface_energy *=
371 static_cast<double>(n_regular_nodes) / n_all_nodes;
372 element_pressure_work *=
373 static_cast<double>(n_regular_nodes) / n_all_nodes;
374 }
375#endif // USE_PETSC
376 elastic_energy += element_elastic_energy;
377 surface_energy += element_surface_energy;
378 pressure_work += element_pressure_work;
379}
GlobalMatrix::IndexType GlobalIndexType

References MaterialLib::Solids::Phasefield::AT1, MaterialLib::Solids::Phasefield::AT2, MaterialLib::Solids::Phasefield::COHESIVE, ProcessLib::getCoupledLocalSolutions(), and ParameterLib::SpatialPosition::setElementID().

◆ getEpsilon()

template<typename ShapeFunctionDisplacement , int DisplacementDim>
std::vector< double > ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunctionDisplacement, DisplacementDim >::getEpsilon ( ) const
overridevirtual

Implements ProcessLib::PhaseField::PhaseFieldLocalAssemblerInterface.

Definition at line 426 of file PhaseFieldFEM-impl.h.

427{
428 auto const kelvin_vector_size =
430 unsigned const n_integration_points =
432
433 std::vector<double> ip_epsilon_values;
434 auto cache_mat = MathLib::createZeroedMatrix<Eigen::Matrix<
435 double, Eigen::Dynamic, kelvin_vector_size, Eigen::RowMajor>>(
436 ip_epsilon_values, n_integration_points, kelvin_vector_size);
437
438 for (unsigned ip = 0; ip < n_integration_points; ++ip)
439 {
440 auto const& eps = _ip_data[ip].eps;
441 cache_mat.row(ip) =
443 }
444
445 return ip_epsilon_values;
446}
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)

References MathLib::createZeroedMatrix(), MathLib::KelvinVector::kelvin_vector_dimensions(), and MathLib::KelvinVector::kelvinVectorToSymmetricTensor().

◆ getIntPtEpsilon()

template<typename ShapeFunction , int DisplacementDim>
std::vector< double > const & ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getIntPtEpsilon ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverrideprivatevirtual

◆ getIntPtEpsilonTensile()

template<typename ShapeFunction , int DisplacementDim>
std::vector< double > const & ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getIntPtEpsilonTensile ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverrideprivatevirtual

◆ getIntPtSigma()

template<typename ShapeFunction , int DisplacementDim>
std::vector< double > const & ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getIntPtSigma ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverrideprivatevirtual

◆ getIntPtSigmaCompressive()

template<typename ShapeFunction , int DisplacementDim>
std::vector< double > const & ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getIntPtSigmaCompressive ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverrideprivatevirtual

◆ getIntPtSigmaTensile()

template<typename ShapeFunction , int DisplacementDim>
std::vector< double > const & ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getIntPtSigmaTensile ( const double ,
std::vector< GlobalVector * > const & ,
std::vector< NumLib::LocalToGlobalIndexMap const * > const & ,
std::vector< double > & cache ) const
inlineoverrideprivatevirtual

◆ getShapeMatrix()

template<typename ShapeFunction , int DisplacementDim>
Eigen::Map< const Eigen::RowVectorXd > ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::getShapeMatrix ( const unsigned integration_point) const
inlineoverridevirtual

Provides the shape matrix at the given integration point.

Implements NumLib::ExtrapolatableElement.

Definition at line 284 of file PhaseFieldFEM.h.

286 {
287 auto const& N = _secondary_data.N[integration_point];
288
289 // assumes N is stored contiguously in memory
290 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
291 }

References ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_secondary_data, and ProcessLib::PhaseField::SecondaryData< ShapeMatrixType >::N.

◆ getSigma()

template<typename ShapeFunctionDisplacement , int DisplacementDim>
std::vector< double > ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunctionDisplacement, DisplacementDim >::getSigma ( ) const
overridevirtual

◆ initializeConcrete()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::initializeConcrete ( )
inlineoverridevirtual

Set initial stress from parameter.

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 226 of file PhaseFieldFEM.h.

227 {
228 unsigned const n_integration_points =
230
231 for (unsigned ip = 0; ip < n_integration_points; ip++)
232 {
233 auto& ip_data = _ip_data[ip];
234
235 ParameterLib::SpatialPosition const x_position{
236 std::nullopt, _element.getID(),
238 NumLib::interpolateCoordinates<ShapeFunction,
240 _element, ip_data.N))};
241
243 if (_process_data.initial_stress.value)
244 {
245 ip_data.sigma =
247 DisplacementDim>((*_process_data.initial_stress.value)(
248 std::numeric_limits<
249 double>::quiet_NaN() /* time independent */,
250 x_position));
251 }
252
253 ip_data.pushBackState();
254 }
255 }
Eigen::Matrix< double, Eigen::MatrixBase< Derived >::RowsAtCompileTime, 1 > symmetricTensorToKelvinVector(Eigen::MatrixBase< Derived > const &v)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)

References ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_element, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_integration_method, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_ip_data, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_process_data, MeshLib::Element::getID(), NumLib::GenericIntegrationMethod::getNumberOfPoints(), NumLib::interpolateCoordinates(), and MathLib::KelvinVector::symmetricTensorToKelvinVector().

◆ postTimestepConcrete()

template<typename ShapeFunction , int DisplacementDim>
void ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::postTimestepConcrete ( Eigen::VectorXd const & ,
Eigen::VectorXd const & ,
double const ,
double const ,
int const  )
inlineoverridevirtual

Reimplemented from ProcessLib::LocalAssemblerInterface.

Definition at line 257 of file PhaseFieldFEM.h.

261 {
262 unsigned const n_integration_points =
264
265 for (unsigned ip = 0; ip < n_integration_points; ip++)
266 {
267 _ip_data[ip].pushBackState();
268 }
269 }

References ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_integration_method, ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_ip_data, and NumLib::GenericIntegrationMethod::getNumberOfPoints().

◆ setIPDataInitialConditions()

template<typename ShapeFunctionDisplacement , int DisplacementDim>
std::size_t ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunctionDisplacement, DisplacementDim >::setIPDataInitialConditions ( std::string_view const name,
double const * values,
int const integration_order )
overridevirtual

Returns number of read integration points.

Implements ProcessLib::PhaseField::PhaseFieldLocalAssemblerInterface.

Definition at line 384 of file PhaseFieldFEM-impl.h.

387{
388 if (integration_order !=
389 static_cast<int>(_integration_method.getIntegrationOrder()))
390 {
391 OGS_FATAL(
392 "Setting integration point initial conditions; The integration "
393 "order of the local assembler for element {:d} is different from "
394 "the integration order in the initial condition.",
395 _element.getID());
396 }
397
398 if (name == "sigma")
399 {
400 if (_process_data.initial_stress.value != nullptr)
401 {
402 OGS_FATAL(
403 "Setting initial conditions for stress from integration "
404 "point data and from a parameter '{:s}' is not possible "
405 "simultaneously.",
406 _process_data.initial_stress.value->name);
407 }
408
410 values, _ip_data, &IpData::sigma);
411 }
412
413 return 0;
414}
std::size_t setIntegrationPointKelvinVectorData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)

References OGS_FATAL, and ProcessLib::setIntegrationPointKelvinVectorData().

Member Data Documentation

◆ _element

◆ _integration_method

◆ _ip_data

◆ _is_axially_symmetric

template<typename ShapeFunction , int DisplacementDim>
bool const ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_is_axially_symmetric
private

Definition at line 366 of file PhaseFieldFEM.h.

◆ _process_data

◆ _secondary_data

template<typename ShapeFunction , int DisplacementDim>
SecondaryData<typename ShapeMatrices::ShapeType> ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::_secondary_data
private

◆ displacement_index

template<typename ShapeFunction , int DisplacementDim>
int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::displacement_index = 0
staticconstexprprivate

Definition at line 110 of file PhaseFieldFEM.h.

◆ displacement_size

template<typename ShapeFunction , int DisplacementDim>
int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::displacement_size
staticconstexprprivate
Initial value:
=
ShapeFunction::NPOINTS * DisplacementDim

Definition at line 111 of file PhaseFieldFEM.h.

◆ mechanics_process_id

template<typename ShapeFunction , int DisplacementDim>
const int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::mechanics_process_id = 0
staticprivate

Definition at line 369 of file PhaseFieldFEM.h.

◆ phase_process_id

template<typename ShapeFunction , int DisplacementDim>
const int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::phase_process_id = 1
staticprivate

Definition at line 368 of file PhaseFieldFEM.h.

◆ phasefield_index

template<typename ShapeFunction , int DisplacementDim>
int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::phasefield_index
staticconstexprprivate
Initial value:

Definition at line 113 of file PhaseFieldFEM.h.

◆ phasefield_size

template<typename ShapeFunction , int DisplacementDim>
int ProcessLib::PhaseField::PhaseFieldLocalAssembler< ShapeFunction, DisplacementDim >::phasefield_size = ShapeFunction::NPOINTS
staticconstexprprivate

Definition at line 115 of file PhaseFieldFEM.h.


The documentation for this class was generated from the following files: