OGS
LargeDeformationFEM.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <limits>
7#include <memory>
8#include <optional>
9#include <vector>
10
17#include "NumLib/DOF/LocalDOF.h"
31
32namespace ProcessLib
33{
34namespace LargeDeformation
35{
36namespace MPL = MaterialPropertyLib;
37
40template <typename ShapeMatrixType>
42{
43 std::vector<ShapeMatrixType, Eigen::aligned_allocator<ShapeMatrixType>> N;
44};
45
46template <int DisplacementDim, typename ShapeMatricesType>
47Eigen::Matrix<double, MPL::tensorSize(DisplacementDim),
48 MPL::tensorSize(DisplacementDim)>
49computeSigmaGeom(Eigen::Matrix3d const& sigma_tensor)
50{
51 static constexpr auto& sigma_geom_op = MathLib::eigenBlockMatrixView<
52 DisplacementDim,
53 Eigen::Matrix<double, DisplacementDim, DisplacementDim>>;
54
55 using SigmaGeom = Eigen::Matrix<double, MPL::tensorSize(DisplacementDim),
56 MPL::tensorSize(DisplacementDim)>;
57 if constexpr (DisplacementDim == 2)
58 {
59 SigmaGeom sigma_geom = SigmaGeom::Zero(5, 5);
60 sigma_geom.template block<4, 4>(0, 0) =
61 sigma_geom_op(sigma_tensor.template block<2, 2>(0, 0).eval());
62 sigma_geom(4, 4) = sigma_tensor(2, 2);
63
64 return sigma_geom;
65 }
66
67 if constexpr (DisplacementDim == 3)
68 {
69 return sigma_geom_op(sigma_tensor);
70 }
71}
72
73template <typename ShapeFunction, int DisplacementDim>
75 : public LargeDeformationLocalAssemblerInterface<DisplacementDim>
76{
77public:
86
92
96
98
99 using IpData =
101
102 static constexpr auto& N_u_op = MathLib::eigenBlockMatrixView<
103 DisplacementDim, typename ShapeMatricesType::NodalRowVectorType>;
104
106 delete;
108
110 MeshLib::Element const& e,
111 std::size_t const /*local_matrix_size*/,
112 NumLib::GenericIntegrationMethod const& integration_method,
113 bool const is_axially_symmetric,
116 e, integration_method, is_axially_symmetric, process_data)
117 {
118 unsigned const n_integration_points =
119 this->integration_method_.getNumberOfPoints();
120
121 _ip_data.resize(n_integration_points);
122 _secondary_data.N.resize(n_integration_points);
123
124 auto const shape_matrices =
126 DisplacementDim>(
127 e, is_axially_symmetric, this->integration_method_);
128
129 for (unsigned ip = 0; ip < n_integration_points; ip++)
130 {
131 auto& ip_data = _ip_data[ip];
132 auto const& sm = shape_matrices[ip];
133 _ip_data[ip].integration_weight =
134 this->integration_method_.getWeightedPoint(ip).getWeight() *
135 sm.integralMeasure * sm.detJ;
136
137 ip_data.N_u = sm.N;
138 ip_data.dNdx_u = sm.dNdx;
139
140 _secondary_data.N[ip] = shape_matrices[ip].N;
141 }
142 }
143
144 void initializeConcrete() override
145 {
146 unsigned const n_integration_points =
147 this->integration_method_.getNumberOfPoints();
148 for (unsigned ip = 0; ip < n_integration_points; ip++)
149 {
150 auto const& ip_data = _ip_data[ip];
151
152 ParameterLib::SpatialPosition const x_position{
153 std::nullopt, this->element_.getID(),
157 this->element_, ip_data.N_u))};
158
160 if (this->process_data_.initial_stress != nullptr)
161 {
162 std::get<StressData<DisplacementDim>>(this->current_states_[ip])
163 .sigma.noalias() =
165 DisplacementDim>((*this->process_data_.initial_stress)(
166 std::numeric_limits<
167 double>::quiet_NaN() /* time independent */,
168 x_position));
169 }
170
171 double const t = 0; // TODO (naumov) pass t from top
172 auto& material_state = this->material_states_[ip];
173 this->solid_material_.initializeInternalStateVariables(
174 t, x_position, *material_state.material_state_variables);
175
177 constitutive_setting;
178 constitutive_setting.init();
179
180 material_state.pushBackState();
181 this->prev_states_[ip] = this->current_states_[ip];
182 }
183 }
184
186 double const detF0,
187 BMatrixType const&
188 B /*B_{linear}+B_{nonlinear}/2 for Green-Lagrange strain*/,
189 GradientVectorType const& grad_u,
190 Eigen::Ref<Eigen::VectorXd const> const& u,
192 output_data) const
193 {
194 // Note: Here B=B_{linear}+B_{nonlinear}/2 For Green-Lagrange strain.
195 auto& eps_data = std::get<StrainData<DisplacementDim>>(output_data);
196 auto& deformation_gradient_data =
197 std::get<DeformationGradientData<DisplacementDim>>(output_data);
198
199 eps_data.eps = B * u;
200 deformation_gradient_data.deformation_gradient =
202 deformation_gradient_data.volume_ratio =
204 deformation_gradient_data.deformation_gradient);
205
206 if (this->process_data_.bar_det_f_type ==
208 {
209 return 1.0;
210 }
211
212 double const detF = deformation_gradient_data.volume_ratio;
213 double const J_ratio = detF0 / detF;
214
215 if (J_ratio < .0)
216 {
217 OGS_FATAL(
218 "det(F0)/det(F) is negative with det(F0) = {:g}, and det(F) = "
219 "{:g} ",
220 detF0, detF);
221 }
222
223 double const alpha =
224 DisplacementDim == 3 ? std::cbrt(J_ratio) : std::sqrt(J_ratio);
225
226 deformation_gradient_data.deformation_gradient
227 .template segment<DisplacementDim * DisplacementDim>(0) *= alpha;
228 deformation_gradient_data.volume_ratio *=
229 std::pow(alpha, DisplacementDim);
230
231 double const alpha_p2 = alpha * alpha;
232 eps_data.eps = alpha_p2 * eps_data.eps +
233 0.5 * (alpha_p2 - 1) *
236 return alpha;
237 }
238
241 double const alpha, GradientMatrixType const& G,
242 Eigen::Ref<Eigen::VectorXd const> const& u_prev,
243 ParameterLib::SpatialPosition const& x_position, double const t,
244 double const dt,
246 CS,
247 MaterialPropertyLib::Medium const& medium,
249 current_state,
251 prev_state,
254 output_data) const
255 {
256 double const T_ref =
257 this->process_data_.reference_temperature
258 ? (*this->process_data_.reference_temperature)(t, x_position)[0]
259 : std::numeric_limits<double>::quiet_NaN();
260
261 auto models =
263 this->process_data_, this->solid_material_);
265 tmp;
267
268 CS.eval(
269 models, t, dt, x_position, //
270 medium, //
271 T_ref, //
272 std::get<DeformationGradientData<DisplacementDim>>(output_data),
273 alpha * (G * u_prev +
275 current_state, prev_state, material_state, tmp, CD);
276
277 return CD;
278 }
279
280 void assemble(double const /*t*/, double const /*dt*/,
281 std::vector<double> const& /*local_x*/,
282 std::vector<double> const& /*local_x_prev*/,
283 std::vector<double>& /*local_M_data*/,
284 std::vector<double>& /*local_K_data*/,
285 std::vector<double>& /*local_b_data*/) override
286 {
287 OGS_FATAL(
288 "LargeDeformationLocalAssembler: assembly without jacobian is not "
289 "implemented.");
290 }
291
292 std::optional<std::tuple<double, VectorTypeForFbar>> computeFBarVariables(
293 bool const compute_detF0_only, Eigen::VectorXd const& local_x) const
294 {
295 if (this->process_data_.bar_det_f_type ==
297 {
298 return std::nullopt;
299 }
300
301 if (this->process_data_.bar_det_f_type ==
303 {
305 DisplacementDim, GradientVectorType, VectorTypeForFbar,
307 _ip_data, compute_detF0_only, local_x,
308 this->integration_method_, this->element_,
310 }
311
313 DisplacementDim, GradientVectorType, GradientMatrixType,
315 compute_detF0_only, local_x, this->element_,
317 }
318
319 void assembleWithJacobian(double const t, double const dt,
320 std::vector<double> const& local_x,
321 std::vector<double> const& local_x_prev,
322 std::vector<double>& local_b_data,
323 std::vector<double>& local_Jac_data) override
324 {
325 auto const local_matrix_size = local_x.size();
326
328 local_Jac_data, local_matrix_size, local_matrix_size);
329
331 local_b_data, local_matrix_size);
332
333 auto [u] = localDOF(local_x);
334 auto [u_prev] = localDOF(local_x_prev);
335
336 unsigned const n_integration_points =
337 this->integration_method_.getNumberOfPoints();
338
340 constitutive_setting;
341 auto const& medium =
342 *this->process_data_.media_map.getMedium(this->element_.getID());
343
344 auto const f_bar_variables =
345 computeFBarVariables(/*compute_detF0_only?*/ false, u);
346
347 for (unsigned ip = 0; ip < n_integration_points; ip++)
348 {
349 auto const& w = _ip_data[ip].integration_weight;
350 auto const& N = _ip_data[ip].N_u;
351 auto const& dNdx = _ip_data[ip].dNdx_u;
352
353 ParameterLib::SpatialPosition const x_position{
354 std::nullopt, this->element_.getID(),
358 this->element_, N))};
359
360 auto const x_coord = x_position.getCoordinates().value()[0];
361
362 // For the 2D case the 33-component is needed (and the four entries
363 // of the non-symmetric matrix); In 3d there are nine entries.
364 GradientMatrixType G(DisplacementDim * DisplacementDim +
365 (DisplacementDim == 2 ? 1 : 0),
366 ShapeFunction::NPOINTS * DisplacementDim);
367 Deformation::computeGMatrix<DisplacementDim,
368 ShapeFunction::NPOINTS>(
369 dNdx, G, this->is_axially_symmetric_, N, x_coord);
370
371 GradientVectorType const grad_u = G * u;
372
373 auto const B_0 = LinearBMatrix::computeBMatrix<
374 DisplacementDim, ShapeFunction::NPOINTS,
376 dNdx, N, x_coord, this->is_axially_symmetric_);
377
378 auto const B_N = NonLinearBMatrix::computeBMatrix<
379 DisplacementDim, ShapeFunction::NPOINTS,
381 dNdx, N, grad_u, x_coord, this->is_axially_symmetric_);
382
383 double const detF0 =
384 f_bar_variables ? std::get<double>(*f_bar_variables) : 0.0;
385 double const alpha = computeOutputStrainData(
386 detF0, B_0 + 0.5 * B_N, grad_u, u, this->output_data_[ip]);
387
388 auto const CD = updateConstitutiveRelations(
389 alpha, G, u_prev, x_position, t, dt, constitutive_setting,
390 medium, this->current_states_[ip], this->prev_states_[ip],
391 this->material_states_[ip], this->output_data_[ip]);
392
393 BMatrixType B = B_0 + B_N;
394
395 auto const& sigma =
396 std::get<StressData<DisplacementDim>>(this->current_states_[ip])
397 .sigma;
398 auto const& b = *std::get<VolumetricBodyForce<DisplacementDim>>(CD);
399 auto const& C =
401 DisplacementDim>>(CD)
402 .stiffness_tensor;
403
404 auto const sigma_geom =
407
408 if (!f_bar_variables)
409 {
410 local_b.noalias() -=
411 (B.transpose() * sigma - N_u_op(N).transpose() * b) * w;
412
413 local_Jac.noalias() += G.transpose() * sigma_geom * G * w;
414
415 local_Jac.noalias() += B.transpose() * C * B * w;
416 }
417 else // with F bar
418 {
419 double const alpha_p2 = alpha * alpha;
420 local_Jac.noalias() +=
421 alpha_p2 * G.transpose() * sigma_geom * G * w;
422
423 auto const q0 = std::get<VectorTypeForFbar>(*f_bar_variables);
424
425 auto const& F =
426 std::get<DeformationGradientData<DisplacementDim>>(
427 this->output_data_[ip])
428 .deformation_gradient;
430 DisplacementDim, ShapeFunction::NPOINTS, VectorTypeForFbar,
433 dNdx, F, this->is_axially_symmetric_);
434
435 auto const q0_q = q0 - q;
436
437 auto const S_q = sigma * (q0_q).transpose();
438
439 local_Jac.noalias() +=
440 2.0 * alpha_p2 * S_q.transpose() * B * w / DisplacementDim;
441
442 auto const twoEplsI =
444 alpha_p2,
446 this->output_data_[ip])
447 .eps,
448 this->is_axially_symmetric_);
449
450 // B bar:
451 BMatrixType const Bbar =
452 alpha_p2 *
453 (B + twoEplsI * (q0_q).transpose() / DisplacementDim);
454
455 local_Jac.noalias() +=
456 2.0 * Bbar.transpose() * S_q * w / DisplacementDim;
457
458 local_Jac.noalias() += Bbar.transpose() * C * Bbar * w;
459
460 local_Jac.noalias() -=
461 alpha_p2 * sigma.dot(twoEplsI) *
462 (q0 * q0.transpose() - q * q.transpose()) * w /
463 DisplacementDim;
464
465 local_b.noalias() -=
466 (Bbar.transpose() * sigma - N_u_op(N).transpose() * b) * w;
467 }
468 }
469 }
470
471 void postTimestepConcrete(Eigen::VectorXd const& local_x,
472 Eigen::VectorXd const& local_x_prev,
473 double const t, double const dt,
474 int const /*process_id*/) override
475 {
476 unsigned const n_integration_points =
477 this->integration_method_.getNumberOfPoints();
478
480 constitutive_setting;
481
482 auto& medium =
483 *this->process_data_.media_map.getMedium(this->element_.getID());
484
485 auto const f_bar_variables =
486 computeFBarVariables(/*compute_detF0_only?*/ true, local_x);
487
488 for (unsigned ip = 0; ip < n_integration_points; ip++)
489 {
490 auto const& N = _ip_data[ip].N_u;
491 auto const& dNdx = _ip_data[ip].dNdx_u;
492
493 ParameterLib::SpatialPosition const x_position{
494 std::nullopt, this->element_.getID(),
498 this->element_, N))};
499
500 auto const x_coord = x_position.getCoordinates().value()[0];
501
502 // For the 2D case the 33-component is needed (and the four entries
503 // of the non-symmetric matrix); In 3d there are nine entries.
504 GradientMatrixType G(DisplacementDim * DisplacementDim +
505 (DisplacementDim == 2 ? 1 : 0),
506 ShapeFunction::NPOINTS * DisplacementDim);
507 Deformation::computeGMatrix<DisplacementDim,
508 ShapeFunction::NPOINTS>(
509 dNdx, G, this->is_axially_symmetric_, N, x_coord);
510
511 GradientVectorType const grad_u = G * local_x;
512
513 // B for Green-Lagrange strain.
515 DisplacementDim, ShapeFunction::NPOINTS,
517 dNdx, N, x_coord, this->is_axially_symmetric_);
518
519 B.noalias() += 0.5 * NonLinearBMatrix::computeBMatrix<
520 DisplacementDim, ShapeFunction::NPOINTS,
522 dNdx, N, grad_u, x_coord,
523 this->is_axially_symmetric_);
524
525 double const detF0 =
526 f_bar_variables ? std::get<double>(*f_bar_variables) : 0.0;
527 double const alpha = computeOutputStrainData(
528 detF0, B, grad_u, local_x, this->output_data_[ip]);
529
531 alpha, G, local_x_prev, x_position, t, dt, constitutive_setting,
532 medium, this->current_states_[ip], this->prev_states_[ip],
533 this->material_states_[ip], this->output_data_[ip]);
534
535 this->material_states_[ip].pushBackState();
536 }
537
538 for (unsigned ip = 0; ip < n_integration_points; ip++)
539 {
540 this->prev_states_[ip] = this->current_states_[ip];
541 }
542 }
543
544 Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
545 const unsigned integration_point) const override
546 {
547 auto const& N = _secondary_data.N[integration_point];
548
549 // assumes N is stored contiguously in memory
550 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
551 }
552
553private:
554 static constexpr auto localDOF(std::vector<double> const& x)
555 {
556 return NumLib::localDOF<
558 }
559
560private:
561 std::vector<IpData, Eigen::aligned_allocator<IpData>> _ip_data;
562
564
565 static const int displacement_size =
566 ShapeFunction::NPOINTS * DisplacementDim;
567};
568
569} // namespace LargeDeformation
570} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
EigenFixedShapeMatrixPolicy< ShapeFunction, GlobalDim > ShapeMatrixPolicyType
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
MatrixType< _number_of_dof, _number_of_dof > StiffnessMatrixType
VectorType< _number_of_dof > NodalForceVectorType
Rhs residual.
VectorTypeFixedSize< MathLib::VectorizedTensor::size(DisplacementDim)> GradientVectorType
MatrixType< MathLib::VectorizedTensor::size(DisplacementDim), _number_of_dof > GradientMatrixType
std::optional< std::tuple< double, VectorTypeForFbar > > computeFBarVariables(bool const compute_detF0_only, Eigen::VectorXd const &local_x) const
LargeDeformationLocalAssembler(MeshLib::Element const &e, std::size_t const, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, LargeDeformationProcessData< DisplacementDim > &process_data)
typename GMatricesType::GradientVectorType GradientVectorType
IntegrationPointData< BMatricesType, ShapeMatricesType, DisplacementDim > IpData
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) override
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
void assemble(double const, double const, std::vector< double > const &, std::vector< double > const &, std::vector< double > &, std::vector< double > &, std::vector< double > &) override
double computeOutputStrainData(double const detF0, BMatrixType const &B, GradientVectorType const &grad_u, Eigen::Ref< Eigen::VectorXd const > const &u, typename ConstitutiveRelations::OutputData< DisplacementDim > &output_data) const
GMatrixPolicyType< ShapeFunction, DisplacementDim > GMatricesType
typename ShapeMatricesType::NodalVectorType NodalVectorType
static constexpr auto localDOF(std::vector< double > const &x)
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
typename BMatricesType::NodalForceVectorType NodalDisplacementVectorType
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
typename BMatricesType::NodalForceVectorType VectorTypeForFbar
BMatrixPolicyType< ShapeFunction, DisplacementDim > BMatricesType
void postTimestepConcrete(Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, double const t, double const dt, int const) override
ConstitutiveRelations::ConstitutiveData< DisplacementDim > updateConstitutiveRelations(double const alpha, GradientMatrixType const &G, Eigen::Ref< Eigen::VectorXd const > const &u_prev, ParameterLib::SpatialPosition const &x_position, double const t, double const dt, typename ConstitutiveRelations::ConstitutiveSetting< DisplacementDim > &CS, MaterialPropertyLib::Medium const &medium, typename ConstitutiveRelations::StatefulData< DisplacementDim > &current_state, typename ConstitutiveRelations::StatefulDataPrev< DisplacementDim > const &prev_state, MaterialStateData< DisplacementDim > &material_state, typename ConstitutiveRelations::OutputData< DisplacementDim > &output_data) const
typename BMatricesType::NodalForceVectorType NodalForceVectorType
typename GMatricesType::GradientMatrixType GradientMatrixType
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
typename ShapeMatricesType::GlobalDimNodalMatrixType GlobalDimNodalMatrixType
typename ShapeMatricesType::NodalMatrixType NodalMatrixType
LargeDeformationLocalAssembler(LargeDeformationLocalAssembler &&)=delete
typename BMatricesType::StiffnessMatrixType StiffnessMatrixType
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
LargeDeformationLocalAssembler(LargeDeformationLocalAssembler const &)=delete
constexpr int tensorSize(int dim)
See Tensor type for details.
Definition Tensor.h:13
Eigen::Matrix< double, Eigen::MatrixBase< Derived >::RowsAtCompileTime, 1 > symmetricTensorToKelvinVector(Eigen::MatrixBase< Derived > const &v)
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
double determinant(Eigen::MatrixBase< Derived > const &tensor)
Computes determinant of a vectorized tensor.
constexpr Eigen::CwiseNullaryOp< EigenBlockMatrixViewFunctor< D, M >, typename EigenBlockMatrixViewFunctor< D, M >::Matrix > eigenBlockMatrixView(const Eigen::MatrixBase< M > &matrix)
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)
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)
auto localDOF(ElementDOFVector const &x)
Definition LocalDOF.h:56
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
void computeGMatrix(DNDX_Type const &dNdx, GMatrixType &g_matrix, const bool is_axially_symmetric, N_Type const &N, const double radius)
Fills a G-matrix based on given shape function dN/dx values.
Definition GMatrix.h:18
std::tuple< SolidMechanicsDataStateless< DisplacementDim >, VolumetricBodyForce< DisplacementDim > > ConstitutiveData
Data that is needed for the equation system assembly.
ProcessLib::ConstitutiveRelations::PrevStateOf< StatefulData< DisplacementDim > > StatefulDataPrev
std::tuple< PrevState< DeformationGradientData< DisplacementDim > >, SolidDensity > ConstitutiveTempData
std::tuple< StressData< DisplacementDim > > StatefulData
Data whose state must be tracked by the process.
ConstitutiveModels< DisplacementDim > createConstitutiveModels(LDProcessData const &process_data, SolidConstitutiveRelation< DisplacementDim > const &solid_material)
std::tuple< StrainData< DisplacementDim >, DeformationGradientData< DisplacementDim > > OutputData
Eigen::Matrix< double, MPL::tensorSize(DisplacementDim), MPL::tensorSize(DisplacementDim)> computeSigmaGeom(Eigen::Matrix3d const &sigma_tensor)
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.
BMatrixType computeBMatrix(DNDX_Type const &dNdx, N_Type const &N, GradientVectorType const &grad_u, const double radius, const bool is_axially_symmetric)
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > identityForF(bool const is_axially_symmetric)
std::tuple< double, VectorTypeForFbar > computeFBarInitialVariablesElementCenter(bool const compute_detF0_only, Eigen::VectorXd const &u, MeshLib::Element const &element, bool const is_axially_symmetric)
VectorTypeForFbar computeQVector(DNDX_Type const &dNdx, GradientVectorType const &F, bool const)
std::tuple< double, VectorTypeForFbar > computeFBarInitialVariablesAverage(std::vector< IpData, Eigen::aligned_allocator< IpData > > const &ip_data, bool const compute_detF0_only, Eigen::VectorXd const &u, NumLib::GenericIntegrationMethod const &integration_method, MeshLib::Element const &element, bool const is_axially_symmetric)
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > compute2EPlusI(double const alpha_p2, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps_bar, bool const is_axially_symmetric)
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
MatrixType< GlobalDim, ShapeFunction::NPOINTS > GlobalDimNodalMatrixType
VectorType< ShapeFunction::NPOINTS > NodalVectorType
RowVectorType< ShapeFunction::NPOINTS > NodalRowVectorType
void eval(ConstitutiveModels< DisplacementDim > &models, double const t, double const dt, ParameterLib::SpatialPosition const &x_position, MaterialPropertyLib::Medium const &medium, double const T_ref, DeformationGradientData< DisplacementDim > const &deformation_gradient_data, GradientVectorType const &deformation_gradient_prev, StatefulData< DisplacementDim > &state, StatefulDataPrev< DisplacementDim > const &prev_state, MaterialStateData< DisplacementDim > &mat_state, ConstitutiveTempData< DisplacementDim > &tmp, ConstitutiveData< DisplacementDim > &cd) const
Evaluate the constitutive setting.
std::vector< typename ConstitutiveRelations::StatefulDataPrev< DisplacementDim > > prev_states_
LargeDeformationLocalAssemblerInterface(MeshLib::Element const &e, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, LargeDeformationProcessData< DisplacementDim > &process_data)
std::vector< typename ConstitutiveRelations::StatefulData< DisplacementDim > > current_states_
std::vector< typename ConstitutiveRelations::OutputData< DisplacementDim > > output_data_
ConstitutiveRelations::SolidConstitutiveRelation< DisplacementDim > const & solid_material_
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N