OGS
PhaseFieldFEM.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <memory>
14#include <vector>
15
33
34namespace ProcessLib
35{
36namespace PhaseField
37{
38template <typename BMatricesType, typename ShapeMatrixType, int DisplacementDim>
40{
46 solid_material.createMaterialStateVariables())
47 {
48 }
49
50 typename ShapeMatrixType::NodalRowVectorType N;
51 typename ShapeMatrixType::GlobalDimNodalMatrixType dNdx;
52
53 typename BMatricesType::KelvinVectorType eps, eps_prev, eps_tensile;
54
55 typename BMatricesType::KelvinVectorType sigma_tensile, sigma_compressive,
58
60 std::unique_ptr<typename MaterialLib::Solids::MechanicsBase<
61 DisplacementDim>::MaterialStateVariables>
63
64 typename BMatricesType::KelvinMatrixType D, C_tensile, C_compressive;
65
68
70 {
73 eps_prev = eps;
74 material_state_variables->pushBackState();
75 }
76
77 template <typename DisplacementVectorType>
78 void updateConstitutiveRelation(double const t,
80 double const /*dt*/,
81 DisplacementVectorType const& /*u*/,
82 double const degradation,
83 EnergySplitModel const energy_split_model)
84 {
85 auto linear_elastic_mp =
87 DisplacementDim> const&>(solid_material)
88 .getMaterialProperties();
89
90 auto const bulk_modulus = linear_elastic_mp.bulk_modulus(t, x);
91 auto const mu = linear_elastic_mp.mu(t, x);
92
93 switch (energy_split_model)
94 {
96 {
99 MaterialLib::Solids::Phasefield::
100 calculateIsotropicDegradedStress<DisplacementDim>(
101 degradation, bulk_modulus, mu, eps);
102 break;
103 }
105 {
108 MaterialLib::Solids::Phasefield::
109 calculateVolDevDegradedStress<DisplacementDim>(
110 degradation, bulk_modulus, mu, eps);
111 break;
112 }
114 {
117 C_compressive) = MaterialLib::Solids::Phasefield::
118 calculateIsotropicDegradedStressWithRankineEnergy<
119 DisplacementDim>(degradation, bulk_modulus, mu, eps);
120 break;
121 }
123 {
124 double temperature = 0.;
126 C_ortho = static_cast<
128 DisplacementDim> const&>(solid_material)
129 .getElasticTensor(t, x, temperature);
130
133 C_compressive) = MaterialLib::Solids::Phasefield::
134 calculateOrthoVolDevDegradedStress<DisplacementDim>(
135 degradation, eps, C_ortho);
136 break;
137 }
139 {
140 double temperature = 0.;
142 C_ortho = static_cast<
144 DisplacementDim> const&>(solid_material)
145 .getElasticTensor(t, x, temperature);
146
147 std::tie(eps_tensile, sigma, sigma_tensile, D,
149 C_compressive) = MaterialLib::Solids::Phasefield::
150 calculateOrthoMasonryDegradedStress<DisplacementDim>(
151 degradation, eps, C_ortho);
152 break;
153 }
154 }
155
158 }
159};
160
163template <typename ShapeMatrixType>
165{
166 std::vector<ShapeMatrixType, Eigen::aligned_allocator<ShapeMatrixType>> N;
167};
168
169template <typename ShapeFunction, int DisplacementDim>
171{
172private:
173 static constexpr int displacement_index = 0;
174 static constexpr int displacement_size =
175 ShapeFunction::NPOINTS * DisplacementDim;
176 static constexpr int phasefield_index =
178 static constexpr int phasefield_size = ShapeFunction::NPOINTS;
179
180public:
183 // Types for displacement.
184 // (Higher order elements = ShapeFunction).
187
189
191 typename ShapeMatricesType::template VectorType<displacement_size>;
193 typename ShapeMatricesType::template VectorType<phasefield_size>;
195 typename ShapeMatricesType::template MatrixType<phasefield_size,
199 using IpData =
201
204
206 MeshLib::Element const& e,
207 std::size_t const /*local_matrix_size*/,
208 NumLib::GenericIntegrationMethod const& integration_method,
209 bool const is_axially_symmetric,
211 : _process_data(process_data),
212 _integration_method(integration_method),
213 _element(e),
214 _is_axially_symmetric(is_axially_symmetric)
215 {
216 unsigned const n_integration_points =
218
219 _ip_data.reserve(n_integration_points);
220 _secondary_data.N.resize(n_integration_points);
221
222 auto& solid_material =
224 _process_data.solid_materials,
225 _process_data.material_ids,
226 e.getID());
227
228 auto const shape_matrices =
230 DisplacementDim>(e, is_axially_symmetric,
232
234 x_position.setElementID(_element.getID());
235
236 for (unsigned ip = 0; ip < n_integration_points; ip++)
237 {
238 _ip_data.emplace_back(solid_material);
239 auto& ip_data = _ip_data[ip];
240 ip_data.integration_weight =
242 shape_matrices[ip].integralMeasure * shape_matrices[ip].detJ;
243
244 static const int kelvin_vector_size =
246 DisplacementDim);
247 ip_data.eps_tensile.setZero(kelvin_vector_size);
248 ip_data.eps.setZero(kelvin_vector_size);
249 ip_data.eps_prev.resize(kelvin_vector_size);
250 ip_data.D.setZero(kelvin_vector_size, kelvin_vector_size);
251
252 ip_data.sigma_tensile.setZero(kelvin_vector_size);
253 ip_data.sigma_compressive.setZero(kelvin_vector_size);
254 ip_data.sigma.setZero(kelvin_vector_size);
255 ip_data.strain_energy_tensile = 0.0;
256 ip_data.elastic_energy = 0.0;
257
258 ip_data.N = shape_matrices[ip].N;
259 ip_data.dNdx = shape_matrices[ip].dNdx;
260
261 _secondary_data.N[ip] = shape_matrices[ip].N;
262 }
263 }
264
265 void assemble(double const /*t*/, double const /*dt*/,
266 std::vector<double> const& /*local_x*/,
267 std::vector<double> const& /*local_x_prev*/,
268 std::vector<double>& /*local_M_data*/,
269 std::vector<double>& /*local_K_data*/,
270 std::vector<double>& /*local_rhs_data*/) override
271 {
272 OGS_FATAL(
273 "PhaseFieldLocalAssembler: assembly without jacobian is not "
274 "implemented.");
275 }
276
278 double const t, double const dt, Eigen::VectorXd const& local_x,
279 Eigen::VectorXd const& local_x_prev, int const process_id,
280 std::vector<double>& local_M_data, std::vector<double>& local_K_data,
281 std::vector<double>& local_b_data,
282 std::vector<double>& local_Jac_data) override;
283
284 void initializeConcrete() override
285 {
286 unsigned const n_integration_points =
288
289 for (unsigned ip = 0; ip < n_integration_points; ip++)
290 {
291 _ip_data[ip].pushBackState();
292 }
293 }
294
295 void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
296 Eigen::VectorXd const& /*local_x_prev*/,
297 double const /*t*/, double const /*dt*/,
298 bool const /*use_monolithic_scheme*/,
299 int const /*process_id*/) override
300 {
301 unsigned const n_integration_points =
303
304 for (unsigned ip = 0; ip < n_integration_points; ip++)
305 {
306 _ip_data[ip].pushBackState();
307 }
308 }
309
311 std::size_t mesh_item_id,
312 std::vector<
313 std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> const&
314 dof_tables,
315 std::vector<GlobalVector*> const& x, double const t,
316 double& crack_volume) override;
317
318 void computeEnergy(std::size_t mesh_item_id,
319 std::vector<std::reference_wrapper<
320 NumLib::LocalToGlobalIndexMap>> const& dof_tables,
321 std::vector<GlobalVector*> const& x, double const t,
322 double& elastic_energy, double& surface_energy,
323 double& pressure_work) override;
324
325 Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
326 const unsigned integration_point) const override
327 {
328 auto const& N = _secondary_data.N[integration_point];
329
330 // assumes N is stored contiguously in memory
331 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
332 }
333
334private:
335 std::vector<double> const& getIntPtSigma(
336 const double /*t*/,
337 std::vector<GlobalVector*> const& /*x*/,
338 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
339 std::vector<double>& cache) const override
340 {
341 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
342 _ip_data, &IpData::sigma, cache);
343 }
344
345 std::vector<double> const& getIntPtSigmaTensile(
346 const double /*t*/,
347 std::vector<GlobalVector*> const& /*x*/,
348 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
349 std::vector<double>& cache) const override
350 {
351 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
353 }
354
355 std::vector<double> const& getIntPtSigmaCompressive(
356 const double /*t*/,
357 std::vector<GlobalVector*> const& /*x*/,
358 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
359 std::vector<double>& cache) const override
360 {
361 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
363 }
364
365 std::vector<double> const& getIntPtEpsilon(
366 const double /*t*/,
367 std::vector<GlobalVector*> const& /*x*/,
368 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
369 std::vector<double>& cache) const override
370 {
371 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
372 _ip_data, &IpData::eps, cache);
373 }
374
375 std::vector<double> const& getIntPtEpsilonTensile(
376 const double /*t*/,
377 std::vector<GlobalVector*> const& /*x*/,
378 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
379 std::vector<double>& cache) const override
380 {
381 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
383 }
384
386 double const t, double const dt, Eigen::VectorXd const& local_x,
387 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data);
388
390 double const t, double const dt, Eigen::VectorXd const& local_x,
391 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data);
392
394
395 std::vector<IpData, Eigen::aligned_allocator<IpData>> _ip_data;
396
401
402 static const int phase_process_id = 1;
403 static const int mechanics_process_id = 0;
404};
405
406} // namespace PhaseField
407} // namespace ProcessLib
408
409#include "PhaseFieldFEM-impl.h"
#define OGS_FATAL(...)
Definition: Error.h:26
double getWeight() const
Definition: WeightedPoint.h:80
virtual std::size_t getID() const final
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)
VectorType< _number_of_dof > NodalForceVectorType
Rhs residual.
Definition: BMatrixPolicy.h:44
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
typename ShapeMatricesType::template VectorType< phasefield_size > PhaseFieldVector
PhaseFieldProcessData< DisplacementDim > & _process_data
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 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)
std::vector< double > const & getIntPtSigmaCompressive(const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
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_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
typename BMatricesType::NodalForceVectorType NodalForceVectorType
void computeCrackIntegral(std::size_t mesh_item_id, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap > > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double &crack_volume) override
NumLib::GenericIntegrationMethod const & _integration_method
typename ShapeMatricesType::template VectorType< displacement_size > DeformationVector
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
PhaseFieldLocalAssembler(PhaseFieldLocalAssembler const &)=delete
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
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
typename ShapeMatricesType::template MatrixType< phasefield_size, phasefield_size > PhaseFieldMatrix
void postTimestepConcrete(Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, bool const, int const) override
PhaseFieldLocalAssembler(MeshLib::Element const &e, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, PhaseFieldProcessData< DisplacementDim > &process_data)
PhaseFieldLocalAssembler(PhaseFieldLocalAssembler &&)=delete
std::vector< double > const & getIntPtSigma(const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
void computeEnergy(std::size_t mesh_item_id, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap > > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double &elastic_energy, double &surface_energy, double &pressure_work) override
typename ShapeMatricesType::NodalMatrixType NodalMatrixType
std::vector< double > const & getIntPtSigmaTensile(const double, std::vector< GlobalVector * > const &, std::vector< NumLib::LocalToGlobalIndexMap const * > const &, std::vector< double > &cache) const override
typename ShapeMatricesType::NodalVectorType NodalVectorType
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.
Definition: KelvinVector.h:24
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
Definition: KelvinVector.h:57
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)
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
VectorType< ShapeFunction::NPOINTS > NodalVectorType
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N
Definition: SecondaryData.h:27
BMatricesType::KelvinVectorType sigma_tensile
Definition: PhaseFieldFEM.h:55
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material
Definition: PhaseFieldFEM.h:59
ShapeMatrixType::NodalRowVectorType N
Definition: PhaseFieldFEM.h:50
BMatricesType::KelvinVectorType eps_prev
Definition: PhaseFieldFEM.h:53
BMatricesType::KelvinMatrixType C_compressive
Definition: PhaseFieldFEM.h:64
BMatricesType::KelvinVectorType sigma_compressive
Definition: PhaseFieldFEM.h:55
ShapeMatrixType::GlobalDimNodalMatrixType dNdx
Definition: PhaseFieldFEM.h:51
BMatricesType::KelvinVectorType eps_tensile
Definition: PhaseFieldFEM.h:53
BMatricesType::KelvinVectorType eps
Definition: PhaseFieldFEM.h:53
BMatricesType::KelvinVectorType sigma
Definition: PhaseFieldFEM.h:56
void updateConstitutiveRelation(double const t, ParameterLib::SpatialPosition const &x, double const, DisplacementVectorType const &, double const degradation, EnergySplitModel const energy_split_model)
Definition: PhaseFieldFEM.h:78
BMatricesType::KelvinMatrixType D
Definition: PhaseFieldFEM.h:64
IntegrationPointData(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
Definition: PhaseFieldFEM.h:41
BMatricesType::KelvinMatrixType C_tensile
Definition: PhaseFieldFEM.h:64
std::unique_ptr< typename MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables > material_state_variables
Definition: PhaseFieldFEM.h:62
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N