OGS
ThermoRichardsMechanicsFEM-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
6#include <spdlog/fmt/fmt.h>
7
8#include <cassert>
9#include <type_traits>
10
24
25namespace ProcessLib
26{
28{
29template <typename ShapeFunctionDisplacement, typename ShapeFunction,
30 int DisplacementDim, typename ConstitutiveTraits>
31ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunction,
32 DisplacementDim, ConstitutiveTraits>::
33 ThermoRichardsMechanicsLocalAssembler(
34 MeshLib::Element const& e,
35 std::size_t const /*local_matrix_size*/,
36 NumLib::GenericIntegrationMethod const& integration_method,
37 bool const is_axially_symmetric,
39 process_data)
40 : LocalAssemblerInterface<DisplacementDim, ConstitutiveTraits>(
41 e, integration_method, is_axially_symmetric, process_data)
42{
43 unsigned const n_integration_points =
44 this->integration_method_.getNumberOfPoints();
45
46 ip_data_.resize(n_integration_points);
47
48 auto const shape_matrices_u =
49 NumLib::initShapeMatrices<ShapeFunctionDisplacement,
51 DisplacementDim>(e, is_axially_symmetric,
52 integration_method);
53
54 auto const shape_matrices =
56 DisplacementDim>(e, is_axially_symmetric,
57 integration_method);
58
59 for (unsigned ip = 0; ip < n_integration_points; ip++)
60 {
61 auto& ip_data = ip_data_[ip];
62 auto const& sm_u = shape_matrices_u[ip];
63 ip_data_[ip].integration_weight =
64 integration_method.getWeightedPoint(ip).getWeight() *
65 sm_u.integralMeasure * sm_u.detJ;
66
67 ip_data.N_u = sm_u.N;
68 ip_data.dNdx_u = sm_u.dNdx;
69
70 // ip_data.N_p and ip_data.dNdx_p are used for both p and T variables
71 ip_data.N_p = shape_matrices[ip].N;
72 ip_data.dNdx_p = shape_matrices[ip].dNdx;
73 }
74}
75
76template <typename ShapeFunctionDisplacement, typename ShapeFunction,
77 int DisplacementDim, typename ConstitutiveTraits>
79 ShapeFunctionDisplacement, ShapeFunction, DisplacementDim,
80 ConstitutiveTraits>::setInitialConditionsConcrete(Eigen::VectorXd const
81 local_x,
82 double const t,
83 int const /*process_id*/)
84{
85 assert(local_x.size() ==
87
88 auto const p_L = local_x.template segment<pressure_size>(pressure_index);
89 auto const T =
90 local_x.template segment<temperature_size>(temperature_index);
91
92 constexpr double dt = std::numeric_limits<double>::quiet_NaN();
93 auto const& medium =
94 *this->process_data_.media_map.getMedium(this->element_.getID());
95
96 MediaData const media_data{medium};
97
98 typename ConstitutiveTraits::ConstitutiveSetting const constitutive_setting;
99 auto models = ConstitutiveTraits::createConstitutiveModels(
100 this->process_data_, this->solid_material_);
101
102 unsigned const n_integration_points =
103 this->integration_method_.getNumberOfPoints();
104 for (unsigned ip = 0; ip < n_integration_points; ip++)
105 {
106 // N is used for both T and p variables.
107 auto const& N = ip_data_[ip].N_p;
108
109 ParameterLib::SpatialPosition const x_position{
110 std::nullopt, this->element_.getID(),
112 NumLib::interpolateCoordinates<ShapeFunctionDisplacement,
114 this->element_, ip_data_[ip].N_u))};
115
116 double T_ip;
118
119 double p_cap_ip;
120 NumLib::shapeFunctionInterpolate(-p_L, N, p_cap_ip);
121
122 MPL::VariableArray variables;
123
124 if (medium.hasProperty(MPL::PropertyType::saturation))
125 {
126 variables.capillary_pressure = p_cap_ip;
127 variables.liquid_phase_pressure = -p_cap_ip;
128 // setting pG to 1 atm
129 // TODO : rewrite equations s.t. p_L = pG-p_cap
130 variables.gas_phase_pressure = 1.0e5;
131 variables.temperature = T_ip;
132
133 double const S_L =
134 medium.property(MPL::PropertyType::saturation)
135 .template value<double>(variables, x_position, t, dt);
136 std::get<PrevState<SaturationData>>(this->prev_states_[ip])->S_L =
137 S_L;
138
139 variables.liquid_saturation = S_L;
140 }
141
142 // dt = 0 at initialization: there is no time step yet, which yields
143 // the elastic tangent. The function-wide dt is NaN to keep
144 // initialization and integration strictly separated.
145 constitutive_setting.init(models, t, 0.0 /*dt*/, x_position, media_data,
146 {T_ip, 0, {}}, this->current_states_[ip],
147 this->prev_states_[ip]);
148
149 if (this->process_data_.initial_stress.value)
150 {
151 if (!medium.hasProperty(MPL::PropertyType::saturation))
152 {
153 OGS_FATAL(
154 "The medium has no saturation property required to compute "
155 "initial stress.");
156 }
157 convertInitialStressType(ip, t, x_position, medium, variables,
158 -p_cap_ip);
159 }
160 }
161}
162
163template <typename ShapeFunctionDisplacement, typename ShapeFunction,
164 int DisplacementDim, typename ConstitutiveTraits>
165void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
166 ShapeFunction, DisplacementDim,
167 ConstitutiveTraits>::
168 convertInitialStressType(unsigned const ip,
169 double const t,
170 ParameterLib::SpatialPosition const x_position,
171 MaterialPropertyLib::Medium const& medium,
172 MPL::VariableArray const& variables,
173 double const p_at_ip)
174{
175 bool constexpr is_strain_temperature_constitutive =
177 DisplacementDim>,
178 ConstitutiveTraits>::value;
179 if (is_strain_temperature_constitutive &&
180 this->process_data_.initial_stress.type ==
182 {
183 return;
184 }
185
186 if (!is_strain_temperature_constitutive &&
187 this->process_data_.initial_stress.type == InitialStress::Type::Total)
188 {
189 return;
190 }
191
192 double const alpha_b =
194 .template value<double>(variables, x_position, t, 0.0 /*dt*/);
195
196 double const bishop =
198 .template value<double>(variables, x_position, t, 0.0 /*dt*/);
199
200 ConstitutiveTraits::ConstitutiveSetting::convertInitialStressType(
201 this->current_states_[ip], this->prev_states_[ip],
202 bishop * alpha_b * p_at_ip * Invariants::identity2);
203}
204
205template <typename ShapeFunctionDisplacement, typename ShapeFunction,
206 int DisplacementDim, typename ConstitutiveTraits>
207void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
208 ShapeFunction, DisplacementDim,
209 ConstitutiveTraits>::
210 assembleWithJacobian(double const t, double const dt,
211 std::vector<double> const& local_x,
212 std::vector<double> const& local_x_prev,
213 std::vector<double>& local_rhs_data,
214 std::vector<double>& local_Jac_data)
215{
216 auto& medium =
217 *this->process_data_.media_map.getMedium(this->element_.getID());
218
219 LocalMatrices loc_mat;
220 loc_mat.setZero();
221 LocalMatrices loc_mat_current_ip;
222 loc_mat_current_ip.setZero(); // only to set the right matrix sizes
223
224 typename ConstitutiveTraits::ConstitutiveSetting constitutive_setting;
225
226 for (unsigned ip = 0; ip < this->integration_method_.getNumberOfPoints();
227 ++ip)
228 {
229 ParameterLib::SpatialPosition const x_position{
230 std::nullopt, this->element_.getID(),
232 NumLib::interpolateCoordinates<ShapeFunctionDisplacement,
234 this->element_, ip_data_[ip].N_u))};
235
237 t, dt, x_position, //
238 local_x, local_x_prev, //
239 ip_data_[ip], constitutive_setting,
240 medium, //
241 loc_mat_current_ip, //
242 this->current_states_[ip], this->prev_states_[ip],
243 this->material_states_[ip], this->output_data_[ip]);
244 loc_mat += loc_mat_current_ip;
245 }
246
247 massLumping(loc_mat);
248
249 addToLocalMatrixData(dt, local_x, local_x_prev, loc_mat, local_rhs_data,
250 local_Jac_data);
251}
252
253template <typename ShapeFunctionDisplacement, typename ShapeFunction,
254 int DisplacementDim, typename ConstitutiveTraits>
255void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
256 ShapeFunction, DisplacementDim,
257 ConstitutiveTraits>::
258 massLumping(typename ThermoRichardsMechanicsLocalAssembler<
259 ShapeFunctionDisplacement, ShapeFunction, DisplacementDim,
260 ConstitutiveTraits>::LocalMatrices& loc_mat) const
261{
262 if (this->process_data_.apply_mass_lumping)
263 {
264 loc_mat.storage_p_a_p =
265 loc_mat.storage_p_a_p.colwise().sum().eval().asDiagonal();
266 loc_mat.storage_p_a_S =
267 loc_mat.storage_p_a_S.colwise().sum().eval().asDiagonal();
268 loc_mat.storage_p_a_S_Jpp =
269 loc_mat.storage_p_a_S_Jpp.colwise().sum().eval().asDiagonal();
270 }
271}
272
273template <typename ShapeFunctionDisplacement, typename ShapeFunction,
274 int DisplacementDim, typename ConstitutiveTraits>
275void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
276 ShapeFunction, DisplacementDim,
277 ConstitutiveTraits>::
278 addToLocalMatrixData(
279 double const dt,
280 std::vector<double> const& local_x,
281 std::vector<double> const& local_x_prev,
283 ShapeFunctionDisplacement, ShapeFunction, DisplacementDim,
284 ConstitutiveTraits>::LocalMatrices const& loc_mat,
285 std::vector<double>& local_rhs_data,
286 std::vector<double>& local_Jac_data) const
287{
288 constexpr auto local_matrix_dim =
290 assert(local_x.size() == local_matrix_dim);
291
292 auto local_Jac = MathLib::createZeroedMatrix<
293 typename ShapeMatricesTypeDisplacement::template MatrixType<
294 local_matrix_dim, local_matrix_dim>>(
295 local_Jac_data, local_matrix_dim, local_matrix_dim);
296
297 auto local_rhs =
298 MathLib::createZeroedVector<typename ShapeMatricesTypeDisplacement::
299 template VectorType<local_matrix_dim>>(
300 local_rhs_data, local_matrix_dim);
301
302 local_Jac.noalias() = loc_mat.Jac;
303 local_rhs.noalias() = -loc_mat.res;
304
305 //
306 // -- Jacobian
307 //
308 block_TT(local_Jac).noalias() += loc_mat.M_TT / dt + loc_mat.K_TT;
309 block_Tp(local_Jac).noalias() +=
310 loc_mat.K_Tp + loc_mat.dK_TT_dp + loc_mat.M_Tp / dt;
311
312 block_pT(local_Jac).noalias() += loc_mat.M_pT / dt + loc_mat.K_pT;
313 block_pp(local_Jac).noalias() +=
314 loc_mat.K_pp + loc_mat.storage_p_a_p / dt + loc_mat.storage_p_a_S_Jpp;
315 block_pu(local_Jac).noalias() = loc_mat.M_pu / dt;
316
317 //
318 // -- Residual
319 //
320 auto const [T, p_L, u] = localDOF(local_x);
321 auto const [T_prev, p_L_prev, u_prev] = localDOF(local_x_prev);
322
323 block_T(local_rhs).noalias() -= loc_mat.M_TT * (T - T_prev) / dt +
324 loc_mat.K_TT * T + loc_mat.K_Tp * p_L +
325 loc_mat.M_Tp * (p_L - p_L_prev) / dt;
326 block_p(local_rhs).noalias() -=
327 loc_mat.K_pp * p_L + loc_mat.K_pT * T +
328 (loc_mat.storage_p_a_p + loc_mat.storage_p_a_S) * (p_L - p_L_prev) /
329 dt +
330 loc_mat.M_pu * (u - u_prev) / dt + loc_mat.M_pT * (T - T_prev) / dt;
331}
332
333template <typename ShapeFunctionDisplacement, typename ShapeFunction,
334 int DisplacementDim, typename ConstitutiveTraits>
335void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
336 ShapeFunction, DisplacementDim,
337 ConstitutiveTraits>::
338 assembleWithJacobianSingleIP(
339 double const t, double const dt,
340 ParameterLib::SpatialPosition const& x_position,
341 std::vector<double> const& local_x,
342 std::vector<double> const& local_x_prev,
344 ShapeFunctionDisplacement, ShapeFunction, DisplacementDim,
345 ConstitutiveTraits>::IpData const& ip_data,
346 typename ConstitutiveTraits::ConstitutiveSetting& CS,
349 ShapeFunctionDisplacement, ShapeFunction, DisplacementDim,
350 ConstitutiveTraits>::LocalMatrices& out,
351 typename ConstitutiveTraits::StatefulData& current_state,
352 typename ConstitutiveTraits::StatefulDataPrev const& prev_state,
354 typename ConstitutiveTraits::OutputData& output_data) const
355{
356 auto const& N_u = ip_data.N_u;
357 auto const& dNdx_u = ip_data.dNdx_u;
358
359 // N and dNdx are used for both p and T variables
360 auto const& N = ip_data.N_p;
361 auto const& dNdx = ip_data.dNdx_p;
362
363 auto const B =
364 LinearBMatrix::computeBMatrix<DisplacementDim,
365 ShapeFunctionDisplacement::NPOINTS,
367 dNdx_u, N_u, (*x_position.getCoordinates())[0],
369
370 typename ConstitutiveTraits::ConstitutiveData CD;
371
372 auto const [T, p_L, u] = localDOF(local_x);
373 auto const [T_prev, p_L_prev, u_prev] = localDOF(local_x_prev);
374
375 {
376 auto models = ConstitutiveTraits::createConstitutiveModels(
377 this->process_data_, this->solid_material_);
378 typename ConstitutiveTraits::ConstitutiveTempData tmp;
379
380 double const T_ip = N * T;
381 double const T_prev_ip = N * T_prev;
382 GlobalDimVectorType const grad_T_ip = dNdx * T;
383
384 double const p_cap_ip = -N * p_L;
385 double const p_cap_prev_ip = -N * p_L_prev;
386 GlobalDimVectorType const grad_p_cap_ip = -dNdx * p_L;
387
388 KelvinVectorType eps = B * u;
389
390 CS.eval(models, t, dt, x_position, //
391 medium, //
392 {T_ip, T_prev_ip, grad_T_ip}, //
393 {p_cap_ip, p_cap_prev_ip, grad_p_cap_ip}, //
394 eps, current_state, prev_state, mat_state, tmp, output_data,
395 CD);
396 }
397
398 using NodalMatrix = typename ShapeMatricesType::NodalMatrixType;
399 NodalMatrix const NTN = N.transpose() * N;
400 NodalMatrix const dNTdN = dNdx.transpose() * dNdx;
401
402 // TODO is identity2.transpose() * B something like divergence?
403 auto const& identity2 = MathLib::KelvinVector::Invariants<
405 DisplacementDim)>::identity2;
406 typename ShapeMatricesTypeDisplacement::template MatrixType<
408 BTI2N = B.transpose() * identity2 * N;
409
410 /*
411 * Conventions:
412 *
413 * * use positive signs exclusively, any negative signs must be included in
414 * the coefficients coming from the constitutive setting
415 * * the used coefficients from the constitutive setting are named after the
416 * terms they appear in, e.g. K_TT_X_dNTdN means it is a scalar (X) that
417 * will be multiplied by dNdx.transpose() * dNdx. Placefolders for the
418 * coefficients are:
419 * * X -> scalar
420 * * V -> vector
421 * * K -> Kelvin vector
422 * * the Laplace terms have a special name, e.g., K_TT_Laplace
423 * * there shall be only one contribution to each of the LocalMatrices,
424 * assigned with = assignment; this point might be relaxed in the future
425 * * this method will overwrite the data in the passed LocalMatrices& out
426 * argument, not add to it
427 */
428
429 // residual, order T, p, u
430 block_p(out.res).noalias() =
431 dNdx.transpose() * std::get<EqPData<DisplacementDim>>(CD).rhs_p_dNT_V;
432 block_u(out.res).noalias() =
433 B.transpose() *
435 CD, current_state)
436 .sigma_total -
437 static_cast<int>(this->process_data_.apply_body_force_for_deformation) *
438 N_u_op(N_u).transpose() *
439 std::get<GravityData<DisplacementDim>>(CD).volumetric_body_force;
440
441 // Storage matrices
442 out.storage_p_a_p.noalias() =
443 std::get<EqPData<DisplacementDim>>(CD).storage_p_a_p_X_NTN * NTN;
444 out.storage_p_a_S.noalias() =
445 std::get<TRMStorageData>(CD).storage_p_a_S_X_NTN * NTN;
446 out.storage_p_a_S_Jpp.noalias() =
447 std::get<TRMStorageData>(CD).storage_p_a_S_Jpp_X_NTN * NTN;
448
449 // M matrices, order T, p, u
450 out.M_TT.noalias() =
451 std::get<EqTData<DisplacementDim>>(CD).M_TT_X_NTN * NTN;
452 out.M_Tp.noalias() =
453 std::get<TRMVaporDiffusionData<DisplacementDim>>(CD).M_Tp_X_NTN * NTN;
454
455 out.M_pT.noalias() =
456 std::get<EqPData<DisplacementDim>>(CD).M_pT_X_NTN * NTN;
457 out.M_pu.noalias() =
458 std::get<EqPData<DisplacementDim>>(CD).M_pu_X_BTI2N * BTI2N.transpose();
459
460 // K matrices, order T, p, u
461 out.K_TT.noalias() =
462 dNdx.transpose() *
463 std::get<TRMHeatStorageAndFluxData<DisplacementDim>>(CD)
464 .K_TT_Laplace *
465 dNdx +
466 N.transpose() *
467 (std::get<EqTData<DisplacementDim>>(CD).K_TT_NT_V_dN.transpose() *
468 dNdx) +
469 std::get<TRMVaporDiffusionData<DisplacementDim>>(CD).K_TT_X_dNTdN *
470 dNTdN;
471
472 out.dK_TT_dp.noalias() =
473 N.transpose() *
474 (std::get<TRMHeatStorageAndFluxData<DisplacementDim>>(CD)
475 .K_Tp_NT_V_dN.transpose() *
476 dNdx) +
477 std::get<TRMHeatStorageAndFluxData<DisplacementDim>>(CD).K_Tp_X_NTN *
478 NTN;
479 out.K_Tp.noalias() =
480 dNdx.transpose() *
481 std::get<ThermoOsmosisData<DisplacementDim>>(CD).K_Tp_Laplace *
482 dNdx +
484 dNTdN;
485
486 out.K_pp.noalias() =
487 dNdx.transpose() * std::get<EqPData<DisplacementDim>>(CD).K_pp_Laplace *
488 dNdx +
490 dNTdN;
491 out.K_pT.noalias() =
492 dNdx.transpose() *
493 std::get<ThermoOsmosisData<DisplacementDim>>(CD).K_pT_Laplace * dNdx;
494
495 // direct Jacobian contributions, order T, p, u
496 block_pT(out.Jac).noalias() =
497 std::get<TRMVaporDiffusionData<DisplacementDim>>(CD).J_pT_X_dNTdN *
498 dNTdN;
499 block_pp(out.Jac).noalias() =
500 std::get<TRMStorageData>(CD).J_pp_X_NTN * NTN +
501 std::get<EqPData<DisplacementDim>>(CD).J_pp_X_BTI2NT_u_dot_N *
502 BTI2N.transpose() * (u - u_prev) / dt *
503 N // TODO something with volumetric strain rate?
504 + dNdx.transpose() *
505 std::get<EqPData<DisplacementDim>>(CD).J_pp_dNT_V_N * N;
506
507 block_uT(out.Jac).noalias() =
508 B.transpose() *
509 std::get<SolidMechanicsDataStateless<DisplacementDim>>(CD).J_uT_BT_K_N *
510 N;
511 block_up(out.Jac).noalias() =
512 B.transpose() *
513 std::get<SolidMechanicsDataStateless<DisplacementDim>>(CD)
514 .J_up_BT_K_N *
515 N +
516 N_u_op(N_u).transpose() *
517 std::get<GravityData<DisplacementDim>>(CD).J_up_HT_V_N * N;
518 block_uu(out.Jac).noalias() =
519 B.transpose() *
520 std::get<SolidMechanicsDataStateless<DisplacementDim>>(CD)
521 .stiffness_tensor *
522 B;
523
524 out *= ip_data.integration_weight;
525}
526
527template <typename ShapeFunctionDisplacement, typename ShapeFunction,
528 int DisplacementDim, typename ConstitutiveTraits>
529void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
530 ShapeFunction, DisplacementDim,
531 ConstitutiveTraits>::
532 computeSecondaryVariableConcrete(double const t, double const dt,
533 Eigen::VectorXd const& local_x,
534 Eigen::VectorXd const& local_x_prev)
535{
536 auto const T = block_T(local_x);
537 auto const p_L = block_p(local_x);
538 auto const u = block_u(local_x);
539
540 auto const T_prev = block_T(local_x_prev);
541 auto const p_L_prev = block_p(local_x_prev);
542
543 auto const e_id = this->element_.getID();
544 auto const& process_data = this->process_data_;
545 auto& medium = *process_data.media_map.getMedium(e_id);
546
547 unsigned const n_integration_points =
548 this->integration_method_.getNumberOfPoints();
549
550 typename ConstitutiveTraits::ConstitutiveSetting constitutive_setting;
551
552 auto models = ConstitutiveTraits::createConstitutiveModels(
553 process_data, this->solid_material_);
554 typename ConstitutiveTraits::ConstitutiveTempData tmp;
555 typename ConstitutiveTraits::ConstitutiveData CD;
556
557 for (unsigned ip = 0; ip < n_integration_points; ip++)
558 {
559 auto& current_state = this->current_states_[ip];
560 auto& output_data = this->output_data_[ip];
561
562 auto const& ip_data = ip_data_[ip];
563
564 // N is used for both p and T variables
565 auto const& N = ip_data.N_p;
566 auto const& N_u = ip_data.N_u;
567 auto const& dNdx_u = ip_data.dNdx_u;
568 auto const& dNdx = ip_data.dNdx_p;
569
570 ParameterLib::SpatialPosition const x_position{
571 std::nullopt, this->element_.getID(),
573 NumLib::interpolateCoordinates<ShapeFunctionDisplacement,
575 this->element_, N_u))};
576
577 auto const x_coord =
578 x_position.getCoordinates().value()[0]; // r for axisymmetry
579 auto const B =
580 LinearBMatrix::computeBMatrix<DisplacementDim,
581 ShapeFunctionDisplacement::NPOINTS,
583 dNdx_u, N_u, x_coord, this->is_axially_symmetric_);
584
585 double const T_ip = N * T;
586 double const T_prev_ip = N * T_prev;
587 GlobalDimVectorType const grad_T_ip = dNdx * T;
588
589 double const p_cap_ip = -N * p_L;
590 double const p_cap_prev_ip = -N * p_L_prev;
591 GlobalDimVectorType const grad_p_cap_ip = -dNdx * p_L;
592
593 KelvinVectorType eps = B * u;
594
595 constitutive_setting.eval(models, //
596 t, dt, x_position, //
597 medium, //
598 {T_ip, T_prev_ip, grad_T_ip}, //
599 {p_cap_ip, p_cap_prev_ip, grad_p_cap_ip}, //
600 eps, current_state, this->prev_states_[ip],
601 this->material_states_[ip], tmp, output_data,
602 CD);
603 }
604
606 ShapeFunction, typename ShapeFunctionDisplacement::MeshElement,
607 DisplacementDim>(this->element_, this->is_axially_symmetric_, p_L,
608 *process_data.pressure_interpolated);
610 ShapeFunction, typename ShapeFunctionDisplacement::MeshElement,
611 DisplacementDim>(this->element_, this->is_axially_symmetric_, T,
612 *process_data.temperature_interpolated);
613}
614} // namespace ThermoRichardsMechanics
615} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:10
Property const & property(PropertyType const &p) const
Definition Medium.cpp:49
constexpr double getWeight() const
MathLib::WeightedPoint const & getWeightedPoint(unsigned const igp) const
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
void addToLocalMatrixData(double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, LocalMatrices const &loc_mat, std::vector< double > &local_rhs_data, std::vector< double > &local_Jac_data) const
void assembleWithJacobianSingleIP(double const t, double const dt, ParameterLib::SpatialPosition const &x_position, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, IpData const &ip_data, typename ConstitutiveTraits::ConstitutiveSetting &CS, MaterialPropertyLib::Medium &medium, LocalMatrices &out, typename ConstitutiveTraits::StatefulData &current_state, typename ConstitutiveTraits::StatefulDataPrev const &prev_state, MaterialStateData< DisplacementDim > &mat_state, typename ConstitutiveTraits::OutputData &output_data) const
ShapeMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > ShapeMatricesTypeDisplacement
void convertInitialStressType(unsigned const ip, double const t, ParameterLib::SpatialPosition const x_position, MaterialPropertyLib::Medium const &medium, MPL::VariableArray const &variables, double const p_at_ip)
ThermoRichardsMechanicsLocalAssembler(ThermoRichardsMechanicsLocalAssembler const &)=delete
void setInitialConditionsConcrete(Eigen::VectorXd const local_x, double const t, int const process_id) override
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
IntegrationPointData< ShapeMatricesTypeDisplacement, ShapeMatricesType, DisplacementDim, ShapeFunctionDisplacement::NPOINTS > IpData
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
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)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
void interpolateToHigherOrderNodes(MeshLib::Element const &element, bool const is_axially_symmetric, Eigen::MatrixBase< EigenMatrixType > const &node_values, MeshLib::PropertyVector< double > &interpolated_values_global_vector)
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)
auto & get(Tuples &... ts)
Definition Get.h:53
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.
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
static Eigen::Matrix< double, KelvinVectorSize, 1 > const identity2
Kelvin mapping of 2nd order identity tensor.
ThermoRichardsMechanicsProcessData< DisplacementDim, ConstitutiveTraits > & process_data_
LocalAssemblerInterface(MeshLib::Element const &e, NumLib::GenericIntegrationMethod const &integration_method, bool const is_axially_symmetric, ThermoRichardsMechanicsProcessData< DisplacementDim, ConstitutiveTraits > &process_data)