OGS
ThermoMechanicsFEM-impl.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
13
14namespace ProcessLib
15{
16namespace ThermoMechanics
17{
18template <typename ShapeFunction, int DisplacementDim>
21 MeshLib::Element const& e,
22 std::size_t const /*local_matrix_size*/,
23 NumLib::GenericIntegrationMethod const& integration_method,
24 bool const is_axially_symmetric,
26 : _process_data(process_data),
27 _integration_method(integration_method),
28 _element(e),
29 _is_axially_symmetric(is_axially_symmetric)
30{
31 unsigned const n_integration_points =
32 _integration_method.getNumberOfPoints();
33
34 _ip_data.reserve(n_integration_points);
35 _secondary_data.N.resize(n_integration_points);
36
37 auto const shape_matrices =
39 DisplacementDim>(e, is_axially_symmetric,
41
43 _process_data.solid_materials, _process_data.material_ids, e.getID());
44
45 for (unsigned ip = 0; ip < n_integration_points; ip++)
46 {
47 _ip_data.emplace_back(solid_material);
48 auto& ip_data = _ip_data[ip];
49 ip_data.integration_weight =
50 _integration_method.getWeightedPoint(ip).getWeight() *
51 shape_matrices[ip].integralMeasure * shape_matrices[ip].detJ;
52
53 static const int kelvin_vector_size =
55 // Initialize current time step values
56 ip_data.sigma.setZero(kelvin_vector_size);
57 ip_data.eps.setZero(kelvin_vector_size);
58
59 // Previous time step values are not initialized and are set later.
60 ip_data.sigma_prev.resize(kelvin_vector_size);
61 ip_data.eps_prev.resize(kelvin_vector_size);
62
63 ip_data.eps_m.setZero(kelvin_vector_size);
64 ip_data.eps_m_prev.setZero(kelvin_vector_size);
66 x_position.setElementID(_element.getID());
67 ip_data.N = shape_matrices[ip].N;
68 ip_data.dNdx = shape_matrices[ip].dNdx;
69
70 _secondary_data.N[ip] = shape_matrices[ip].N;
71 }
72}
73
74template <typename ShapeFunction, int DisplacementDim>
76 setInitialConditionsConcrete(Eigen::VectorXd const local_x,
77 double const /*t*/,
78 int const /*process_id*/)
79{
80 unsigned const n_integration_points =
81 this->_integration_method.getNumberOfPoints();
82 auto const local_u =
83 local_x.template segment<displacement_size>(displacement_index);
84
85 for (unsigned ip = 0; ip < n_integration_points; ip++)
86 {
87 auto const& N = _ip_data[ip].N;
88 auto const& dNdx = _ip_data[ip].dNdx;
89
90 ParameterLib::SpatialPosition const x_position{
91 std::nullopt, _element.getID(),
94 _element, N))};
95
96 auto const x_coord = x_position.getCoordinates().value()[0];
97
98 auto const& B =
99 LinearBMatrix::computeBMatrix<DisplacementDim,
100 ShapeFunction::NPOINTS,
102 dNdx, N, x_coord, _is_axially_symmetric);
103
104 _ip_data[ip].eps.noalias() = B * local_u;
105 }
106}
107
108template <typename ShapeFunction, int DisplacementDim>
110 setIPDataInitialConditions(std::string_view const name,
111 double const* values,
112 int const integration_order)
113{
114 if (integration_order !=
115 static_cast<int>(_integration_method.getIntegrationOrder()))
116 {
117 OGS_FATAL(
118 "Setting integration point initial conditions; The integration "
119 "order of the local assembler for element {:d} is different from "
120 "the integration order in the initial condition.",
121 _element.getID());
122 }
123
124 if (name == "sigma")
125 {
126 return setSigma(values);
127 }
128 if (name == "epsilon")
129 {
130 return setEpsilon(values);
131 }
132 if (name == "epsilon_m")
133 {
134 return setEpsilonMechanical(values);
135 }
136
137 return 0;
138}
139
140template <typename ShapeFunction, int DisplacementDim>
142 assembleWithJacobian(double const t, double const dt,
143 std::vector<double> const& local_x,
144 std::vector<double> const& local_x_prev,
145 std::vector<double>& local_rhs_data,
146 std::vector<double>& local_Jac_data)
147{
148 auto const local_matrix_size = local_x.size();
149 assert(local_matrix_size == temperature_size + displacement_size);
150
151 auto T = Eigen::Map<typename ShapeMatricesType::template VectorType<
152 temperature_size> const>(local_x.data() + temperature_index,
154
155 auto u = Eigen::Map<typename ShapeMatricesType::template VectorType<
156 displacement_size> const>(local_x.data() + displacement_index,
158 bool const is_u_non_zero = u.norm() > 0.0;
159
160 auto T_prev = Eigen::Map<typename ShapeMatricesType::template VectorType<
161 temperature_size> const>(local_x_prev.data() + temperature_index,
163
165 local_Jac_data, local_matrix_size, local_matrix_size);
166
167 auto local_rhs = MathLib::createZeroedVector<RhsVector>(local_rhs_data,
168 local_matrix_size);
169
170 typename ShapeMatricesType::template MatrixType<displacement_size,
172 KuT;
174
177
180
181 unsigned const n_integration_points =
182 _integration_method.getNumberOfPoints();
183
184 MPL::VariableArray variables;
185 MPL::VariableArray variables_prev;
187 x_position.setElementID(_element.getID());
188
189 auto const& medium = _process_data.media_map.getMedium(_element.getID());
190 auto const& solid_phase =
192
193 for (unsigned ip = 0; ip < n_integration_points; ip++)
194 {
195 auto const& w = _ip_data[ip].integration_weight;
196 auto const& N = _ip_data[ip].N;
197 auto const& dNdx = _ip_data[ip].dNdx;
198
199 ParameterLib::SpatialPosition const x_position{
200 std::nullopt, _element.getID(),
203 _element, N))};
204
205 auto const x_coord = x_position.getCoordinates().value()[0];
206 auto const& B =
207 LinearBMatrix::computeBMatrix<DisplacementDim,
208 ShapeFunction::NPOINTS,
210 dNdx, N, x_coord, _is_axially_symmetric);
211
212 auto& sigma = _ip_data[ip].sigma;
213 auto const& sigma_prev = _ip_data[ip].sigma_prev;
214
215 auto& eps = _ip_data[ip].eps;
216 auto const& eps_prev = _ip_data[ip].eps_prev;
217
218 auto& eps_m = _ip_data[ip].eps_m;
219 auto const& eps_m_prev = _ip_data[ip].eps_m_prev;
220
221 auto& state = _ip_data[ip].material_state_variables;
222
223 const double T_ip = N.dot(T); // T at integration point
224 double const T_prev_ip = N.dot(T_prev);
225
226 // Consider also anisotropic thermal expansion.
227 auto const solid_linear_thermal_expansivity_vector =
229 solid_phase
230 .property(
232 .value(variables, x_position, t, dt));
233
235 dthermal_strain =
236 solid_linear_thermal_expansivity_vector * (T_ip - T_prev_ip);
237
238 //
239 // displacement equation, displacement part
240 //
241 // For the restart computation, the displacement may not be
242 // reloaded but the initial strains are always available. For such case,
243 // the following computation is skipped.
244 if (is_u_non_zero)
245 {
246 eps.noalias() = B * u;
247 }
248
249 eps_m.noalias() = eps_m_prev + eps - eps_prev - dthermal_strain;
250
251 variables_prev.stress
253 sigma_prev);
254 variables_prev.mechanical_strain
256 eps_m_prev);
257 variables_prev.temperature = T_ip;
258 variables.mechanical_strain
260 eps_m);
261 variables.temperature = T_ip;
262
263 auto&& solution = _ip_data[ip].solid_material.integrateStress(
264 variables_prev, variables, t, x_position, dt, *state);
265
266 if (!solution)
267 {
268 OGS_FATAL("Computation of local constitutive relation failed.");
269 }
270
272 std::tie(sigma, state, C) = std::move(*solution);
273
274 local_Jac
275 .template block<displacement_size, displacement_size>(
277 .noalias() += B.transpose() * C * B * w;
278
279 typename ShapeMatricesType::template MatrixType<DisplacementDim,
281 N_u = ShapeMatricesType::template MatrixType<
282 DisplacementDim, displacement_size>::Zero(DisplacementDim,
284
285 for (int i = 0; i < DisplacementDim; ++i)
286 {
287 N_u.template block<1, displacement_size / DisplacementDim>(
288 i, i * displacement_size / DisplacementDim)
289 .noalias() = N;
290 }
291
292 auto const rho_s =
293 solid_phase.property(MPL::PropertyType::density)
294 .template value<double>(variables, x_position, t, dt);
295
296 auto const& b = _process_data.specific_body_force;
297 local_rhs.template block<displacement_size, 1>(displacement_index, 0)
298 .noalias() -=
299 (B.transpose() * sigma - N_u.transpose() * rho_s * b) * w;
300
301 //
302 // displacement equation, temperature part
303 // The computation of KuT can be ignored.
304 auto const alpha_T_tensor =
306 solid_linear_thermal_expansivity_vector);
307 KuT.noalias() += B.transpose() * (C * alpha_T_tensor) * N * w;
308
309 if (_ip_data[ip].solid_material.getConstitutiveModel() ==
311 {
312 auto const s = Invariants::deviatoric_projection * sigma;
313 double const norm_s = Invariants::FrobeniusNorm(s);
314 const double creep_coefficient =
315 _ip_data[ip].solid_material.getTemperatureRelatedCoefficient(
316 t, dt, x_position, T_ip, norm_s);
317 KuT.noalias() += creep_coefficient * B.transpose() * s * N * w;
318 }
319
320 //
321 // temperature equation, temperature part;
322 //
323 auto const lambda =
324 solid_phase
325 .property(
327 .value(variables, x_position, t, dt);
328
329 GlobalDimMatrixType const thermal_conductivity =
331
332 KTT.noalias() += dNdx.transpose() * thermal_conductivity * dNdx * w;
333
334 auto const c =
335 solid_phase
336 .property(
338 .template value<double>(variables, x_position, t, dt);
339 DTT.noalias() += N.transpose() * rho_s * c * N * w;
340 }
341
342 // temperature equation, temperature part
343 local_Jac
344 .template block<temperature_size, temperature_size>(temperature_index,
346 .noalias() += KTT + DTT / dt;
347
348 // displacement equation, temperature part
349 local_Jac
350 .template block<displacement_size, temperature_size>(displacement_index,
352 .noalias() -= KuT;
353
354 local_rhs.template block<temperature_size, 1>(temperature_index, 0)
355 .noalias() -= KTT * T + DTT * (T - T_prev) / dt;
356}
357
358template <typename ShapeFunction, int DisplacementDim>
360 assembleWithJacobianForStaggeredScheme(const double t, double const dt,
361 Eigen::VectorXd const& local_x,
362 Eigen::VectorXd const& local_x_prev,
363 int const process_id,
364 std::vector<double>& local_b_data,
365 std::vector<double>& local_Jac_data)
366{
367 // For the equations with pressure
368 if (process_id == _process_data.heat_conduction_process_id)
369 {
371 t, dt, local_x, local_x_prev, local_b_data, local_Jac_data);
372 return;
373 }
374
375 // For the equations with deformation
376 assembleWithJacobianForDeformationEquations(t, dt, local_x, local_x_prev,
377 local_b_data, local_Jac_data);
378}
379
380template <typename ShapeFunction, int DisplacementDim>
383 const double t, double const dt, Eigen::VectorXd const& local_x,
384 Eigen::VectorXd const& local_x_prev, std::vector<double>& local_b_data,
385 std::vector<double>& local_Jac_data)
386{
387 auto const local_T =
388 local_x.template segment<temperature_size>(temperature_index);
389
390 auto const local_T_prev =
391 local_x_prev.template segment<temperature_size>(temperature_index);
392
393 auto const local_u =
394 local_x.template segment<displacement_size>(displacement_index);
395 bool const is_u_non_zero = local_u.norm() > 0.0;
396
397 auto local_Jac = MathLib::createZeroedMatrix<
398 typename ShapeMatricesType::template MatrixType<displacement_size,
400 local_Jac_data, displacement_size, displacement_size);
401
402 auto local_rhs = MathLib::createZeroedVector<
403 typename ShapeMatricesType::template VectorType<displacement_size>>(
404 local_b_data, displacement_size);
405
406 unsigned const n_integration_points =
407 _integration_method.getNumberOfPoints();
408
409 MPL::VariableArray variables;
410 MPL::VariableArray variables_prev;
411 auto const& medium = _process_data.media_map.getMedium(_element.getID());
412 auto const& solid_phase =
414
415 for (unsigned ip = 0; ip < n_integration_points; ip++)
416 {
417 auto const& w = _ip_data[ip].integration_weight;
418 auto const& N = _ip_data[ip].N;
419 auto const& dNdx = _ip_data[ip].dNdx;
420
421 ParameterLib::SpatialPosition const x_position{
422 std::nullopt, _element.getID(),
425 _element, N))};
426
427 auto const x_coord = x_position.getCoordinates().value()[0];
428
429 auto const& B =
430 LinearBMatrix::computeBMatrix<DisplacementDim,
431 ShapeFunction::NPOINTS,
433 dNdx, N, x_coord, _is_axially_symmetric);
434
435 auto& sigma = _ip_data[ip].sigma;
436 auto const& sigma_prev = _ip_data[ip].sigma_prev;
437
438 auto& eps = _ip_data[ip].eps;
439 auto const& eps_prev = _ip_data[ip].eps_prev;
440
441 auto& eps_m = _ip_data[ip].eps_m;
442 auto const& eps_m_prev = _ip_data[ip].eps_m_prev;
443
444 auto& state = _ip_data[ip].material_state_variables;
445
446 const double T_ip = N.dot(local_T); // T at integration point
447 variables.temperature = T_ip;
448 double const dT_ip = T_ip - N.dot(local_T_prev);
449
450 //
451 // displacement equation, displacement part
452 //
453 // For the restart computation, the displacement may not be
454 // reloaded but the initial strains are always available. For such case,
455 // the following computation is skipped.
456 if (is_u_non_zero)
457 {
458 eps.noalias() = B * local_u;
459 }
460
461 // Consider also anisotropic thermal expansion.
462 auto const solid_linear_thermal_expansivity_vector =
464 solid_phase
465 .property(
467 .value(variables, x_position, t, dt));
468
470 dthermal_strain = solid_linear_thermal_expansivity_vector * dT_ip;
471
472 eps_m.noalias() = eps_m_prev + eps - eps_prev - dthermal_strain;
473
474 variables_prev.stress
476 sigma_prev);
477 variables_prev.mechanical_strain
479 eps_m_prev);
480 variables_prev.temperature = T_ip;
481 variables.mechanical_strain
483 eps_m);
484
485 auto&& solution = _ip_data[ip].solid_material.integrateStress(
486 variables_prev, variables, t, x_position, dt, *state);
487
488 if (!solution)
489 {
490 OGS_FATAL("Computation of local constitutive relation failed.");
491 }
492
494 std::tie(sigma, state, C) = std::move(*solution);
495
496 local_Jac.noalias() += B.transpose() * C * B * w;
497
498 typename ShapeMatricesType::template MatrixType<DisplacementDim,
500 N_u = ShapeMatricesType::template MatrixType<
501 DisplacementDim, displacement_size>::Zero(DisplacementDim,
503
504 for (int i = 0; i < DisplacementDim; ++i)
505 {
506 N_u.template block<1, displacement_size / DisplacementDim>(
507 i, i * displacement_size / DisplacementDim)
508 .noalias() = N;
509 }
510
511 auto const rho_s =
512 solid_phase.property(MPL::PropertyType::density)
513 .template value<double>(variables, x_position, t, dt);
514
515 auto const& b = _process_data.specific_body_force;
516 local_rhs.noalias() -=
517 (B.transpose() * sigma - N_u.transpose() * rho_s * b) * w;
518 }
519}
520
521template <typename ShapeFunction, int DisplacementDim>
524 const double t, double const dt, Eigen::VectorXd const& local_x,
525 Eigen::VectorXd const& local_x_prev, std::vector<double>& local_b_data,
526 std::vector<double>& local_Jac_data)
527{
528 auto const local_T =
529 local_x.template segment<temperature_size>(temperature_index);
530
531 auto const local_T_prev =
532 local_x_prev.template segment<temperature_size>(temperature_index);
533
534 auto local_Jac = MathLib::createZeroedMatrix<
535 typename ShapeMatricesType::template MatrixType<temperature_size,
537 local_Jac_data, temperature_size, temperature_size);
538
539 auto local_rhs = MathLib::createZeroedVector<
540 typename ShapeMatricesType::template VectorType<temperature_size>>(
541 local_b_data, temperature_size);
542
544 mass.setZero(temperature_size, temperature_size);
545
546 typename ShapeMatricesType::NodalMatrixType laplace;
547 laplace.setZero(temperature_size, temperature_size);
548
549 unsigned const n_integration_points =
550 _integration_method.getNumberOfPoints();
551
552 auto const& medium = _process_data.media_map.getMedium(_element.getID());
553 auto const& solid_phase =
555 MPL::VariableArray variables;
556
557 for (unsigned ip = 0; ip < n_integration_points; ip++)
558 {
559 auto const& w = _ip_data[ip].integration_weight;
560 auto const& N = _ip_data[ip].N;
561 auto const& dNdx = _ip_data[ip].dNdx;
562
563 ParameterLib::SpatialPosition const x_position{
564 std::nullopt, _element.getID(),
567 _element, N))};
568
569 const double T_ip = N.dot(local_T); // T at integration point
570 variables.temperature = T_ip;
571
572 auto const rho_s =
573 solid_phase.property(MPL::PropertyType::density)
574 .template value<double>(variables, x_position, t, dt);
575 auto const c_p =
577 .template value<double>(variables, x_position, t, dt);
578
579 mass.noalias() += N.transpose() * rho_s * c_p * N * w;
580
581 auto const lambda =
582 solid_phase
583 .property(
585 .value(variables, x_position, t, dt);
586
587 GlobalDimMatrixType const thermal_conductivity =
589
590 laplace.noalias() += dNdx.transpose() * thermal_conductivity * dNdx * w;
591 }
592 local_Jac.noalias() += laplace + mass / dt;
593
594 local_rhs.noalias() -=
595 laplace * local_T + mass * (local_T - local_T_prev) / dt;
596}
597
598template <typename ShapeFunction, int DisplacementDim>
599std::size_t
606
607template <typename ShapeFunction, int DisplacementDim>
608std::vector<double>
610{
611 constexpr int kelvin_vector_size =
613
615 [this](std::vector<double>& values)
616 { return getIntPtSigma(0, {}, {}, values); });
617}
618
619template <typename ShapeFunction, int DisplacementDim>
620std::vector<double> const&
622 const double /*t*/,
623 std::vector<GlobalVector*> const& /*x*/,
624 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
625 std::vector<double>& cache) const
626{
628 _ip_data, &IpData::sigma, cache);
629}
630
631template <typename ShapeFunction, int DisplacementDim>
632std::size_t
639
640template <typename ShapeFunction, int DisplacementDim>
641std::vector<double> ThermoMechanicsLocalAssembler<
642 ShapeFunction, DisplacementDim>::getEpsilon() const
643{
644 constexpr int kelvin_vector_size =
646
648 [this](std::vector<double>& values)
649 { return getIntPtEpsilon(0, {}, {}, values); });
650}
651
652template <typename ShapeFunction, int DisplacementDim>
653std::vector<double> const&
655 const double /*t*/,
656 std::vector<GlobalVector*> const& /*x*/,
657 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
658 std::vector<double>& cache) const
659{
661 _ip_data, &IpData::eps, cache);
662}
663
664template <typename ShapeFunction, int DisplacementDim>
665std::vector<double> const&
668 const double /*t*/,
669 std::vector<GlobalVector*> const& /*x*/,
670 std::vector<NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
671 std::vector<double>& cache) const
672{
674 _ip_data, &IpData::eps_m, cache);
675}
676
677template <typename ShapeFunction, int DisplacementDim>
679 ShapeFunction, DisplacementDim>::setEpsilonMechanical(double const* values)
680{
682 values, _ip_data, &IpData::eps_m);
683}
684template <typename ShapeFunction, int DisplacementDim>
685std::vector<double> ThermoMechanicsLocalAssembler<
686 ShapeFunction, DisplacementDim>::getEpsilonMechanical() const
687{
688 constexpr int kelvin_vector_size =
690
692 [this](std::vector<double>& values)
693 { return getIntPtEpsilonMechanical(0, {}, {}, values); });
694}
695
696template <typename ShapeFunction, int DisplacementDim>
699{
700 return _integration_method.getNumberOfPoints();
701}
702
703template <typename ShapeFunction, int DisplacementDim>
705 DisplacementDim>::getMaterialID() const
706{
707 return _process_data.material_ids == nullptr
708 ? 0
709 : (*_process_data.material_ids)[_element.getID()];
710}
711
712template <typename ShapeFunction, int DisplacementDim>
714 DisplacementDim>::MaterialStateVariables const&
716 getMaterialStateVariablesAt(unsigned integration_point) const
717{
718 return *_ip_data[integration_point].material_state_variables;
719}
720} // namespace ThermoMechanics
721} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:80
void setElementID(std::size_t element_id)
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
std::vector< double > const & getIntPtEpsilonMechanical(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
std::size_t setIPDataInitialConditions(std::string_view const name, double const *values, int const integration_order) override
Returns number of read integration points.
std::vector< double > const & getIntPtSigma(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
ThermoMechanicsLocalAssembler(ThermoMechanicsLocalAssembler const &)=delete
MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables const & getMaterialStateVariablesAt(unsigned integration_point) const override
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
ThermoMechanicsProcessData< DisplacementDim > & _process_data
NumLib::GenericIntegrationMethod const & _integration_method
void assembleWithJacobianForHeatConductionEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianForDeformationEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_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_b_data, std::vector< double > &local_Jac_data) override
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
void setInitialConditionsConcrete(Eigen::VectorXd const local_x, double const t, int const process_id) override
std::vector< double > const & getIntPtEpsilon(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
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_rhs_data, std::vector< double > &local_Jac_data) override
auto & selectSolidConstitutiveRelation(SolidMaterialsMap const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
constexpr Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
MathLib::KelvinVector::KelvinVectorType< GlobalDim > formKelvinVector(MaterialPropertyLib::PropertyDataType const &values)
A function to form a Kelvin vector from strain or stress alike property like thermal expansivity for ...
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
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)
std::array< double, 3 > interpolateCoordinates(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.
std::vector< double > transposeInPlace(StoreValuesFunction const &store_values_function)
std::vector< double > const & getIntegrationPointKelvinVectorData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)
std::size_t setIntegrationPointKelvinVectorData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
static double FrobeniusNorm(Eigen::Matrix< double, KelvinVectorSize, 1 > const &deviatoric_v)
Get the norm of the deviatoric stress.
static Eigen::Matrix< double, KelvinVectorSize, KelvinVectorSize > const deviatoric_projection