17template <
typename ShapeFunction,
int DisplacementDim>
23 bool const is_axially_symmetric,
30 unsigned const n_integration_points =
33 _ip_data.reserve(n_integration_points);
36 auto const shape_matrices =
38 DisplacementDim>(e, is_axially_symmetric,
44 for (
unsigned ip = 0; ip < n_integration_points; ip++)
46 _ip_data.emplace_back(solid_material);
48 ip_data.integration_weight =
50 shape_matrices[ip].integralMeasure * shape_matrices[ip].detJ;
52 static const int kelvin_vector_size =
55 ip_data.sigma.setZero(kelvin_vector_size);
56 ip_data.eps.setZero(kelvin_vector_size);
59 ip_data.sigma_prev.resize(kelvin_vector_size);
60 ip_data.eps_prev.resize(kelvin_vector_size);
62 ip_data.eps_m.setZero(kelvin_vector_size);
63 ip_data.eps_m_prev.setZero(kelvin_vector_size);
66 ip_data.N = shape_matrices[ip].N;
67 ip_data.dNdx = shape_matrices[ip].dNdx;
73template <
typename ShapeFunction,
int DisplacementDim>
79 unsigned const n_integration_points =
84 for (
unsigned ip = 0; ip < n_integration_points; ip++)
87 auto const& dNdx =
_ip_data[ip].dNdx;
99 ShapeFunction::NPOINTS,
103 _ip_data[ip].eps.noalias() = B * local_u;
107template <
typename ShapeFunction,
int DisplacementDim>
110 double const* values,
111 int const integration_order)
113 if (integration_order !=
117 "Setting integration point initial conditions; The integration "
118 "order of the local assembler for element {:d} is different from "
119 "the integration order in the initial condition.",
127 if (name ==
"epsilon")
131 if (name ==
"epsilon_m")
139template <
typename ShapeFunction,
int DisplacementDim>
142 std::vector<double>
const& local_x,
143 std::vector<double>
const& local_x_prev,
144 std::vector<double>& local_rhs_data,
145 std::vector<double>& local_Jac_data)
147 auto const local_matrix_size = local_x.size();
150 auto T = Eigen::Map<
typename ShapeMatricesType::template VectorType<
154 auto u = Eigen::Map<
typename ShapeMatricesType::template VectorType<
157 bool const is_u_non_zero = u.norm() > 0.0;
159 auto T_prev = Eigen::Map<
typename ShapeMatricesType::template VectorType<
164 local_Jac_data, local_matrix_size, local_matrix_size);
180 unsigned const n_integration_points =
189 auto const& solid_phase = medium->phase(
"Solid");
191 for (
unsigned ip = 0; ip < n_integration_points; ip++)
193 auto const& w =
_ip_data[ip].integration_weight;
195 auto const& dNdx =
_ip_data[ip].dNdx;
206 ShapeFunction::NPOINTS,
211 auto const& sigma_prev =
_ip_data[ip].sigma_prev;
214 auto const& eps_prev =
_ip_data[ip].eps_prev;
217 auto const& eps_m_prev =
_ip_data[ip].eps_m_prev;
219 auto& state =
_ip_data[ip].material_state_variables;
221 const double T_ip = N.dot(T);
222 double const T_prev_ip = N.dot(T_prev);
225 auto const solid_linear_thermal_expansivity_vector =
230 .value(variables, x_position, t, dt));
234 solid_linear_thermal_expansivity_vector * (T_ip - T_prev_ip);
244 eps.noalias() = B * u;
247 eps_m.noalias() = eps_m_prev + eps - eps_prev - dthermal_strain;
261 auto&& solution =
_ip_data[ip].solid_material.integrateStress(
262 variables_prev, variables, t, x_position, dt, *state);
266 OGS_FATAL(
"Computation of local constitutive relation failed.");
270 std::tie(sigma, state, C) = std::move(*solution);
273 .template block<displacement_size, displacement_size>(
275 .noalias() += B.transpose() * C * B * w;
277 typename ShapeMatricesType::template MatrixType<DisplacementDim,
279 N_u = ShapeMatricesType::template MatrixType<
283 for (
int i = 0; i < DisplacementDim; ++i)
292 .template value<double>(variables, x_position, t, dt);
297 (B.transpose() * sigma - N_u.transpose() * rho_s * b) * w;
302 auto const alpha_T_tensor =
304 solid_linear_thermal_expansivity_vector);
305 KuT.noalias() += B.transpose() * (C * alpha_T_tensor) * N * w;
307 if (
_ip_data[ip].solid_material.getConstitutiveModel() ==
312 const double creep_coefficient =
313 _ip_data[ip].solid_material.getTemperatureRelatedCoefficient(
314 t, dt, x_position, T_ip, norm_s);
315 KuT.noalias() += creep_coefficient * B.transpose() * s * N * w;
325 .value(variables, x_position, t, dt);
330 KTT.noalias() += dNdx.transpose() * thermal_conductivity * dNdx * w;
336 .template value<double>(variables, x_position, t, dt);
337 DTT.noalias() += N.transpose() * rho_s * c * N * w;
344 .noalias() += KTT + DTT / dt;
353 .noalias() -= KTT * T + DTT * (T - T_prev) / dt;
356template <
typename ShapeFunction,
int DisplacementDim>
359 Eigen::VectorXd
const& local_x,
360 Eigen::VectorXd
const& local_x_prev,
361 int const process_id,
362 std::vector<double>& local_b_data,
363 std::vector<double>& local_Jac_data)
369 t, dt, local_x, local_x_prev, local_b_data, local_Jac_data);
375 local_b_data, local_Jac_data);
378template <
typename ShapeFunction,
int DisplacementDim>
381 const double t,
double const dt, Eigen::VectorXd
const& local_x,
382 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_b_data,
383 std::vector<double>& local_Jac_data)
388 auto const local_T_prev =
393 bool const is_u_non_zero = local_u.norm() > 0.0;
401 typename ShapeMatricesType::template VectorType<displacement_size>>(
404 unsigned const n_integration_points =
410 auto const& solid_phase = medium->phase(
"Solid");
412 for (
unsigned ip = 0; ip < n_integration_points; ip++)
414 auto const& w =
_ip_data[ip].integration_weight;
416 auto const& dNdx =
_ip_data[ip].dNdx;
428 ShapeFunction::NPOINTS,
433 auto const& sigma_prev =
_ip_data[ip].sigma_prev;
436 auto const& eps_prev =
_ip_data[ip].eps_prev;
439 auto const& eps_m_prev =
_ip_data[ip].eps_m_prev;
441 auto& state =
_ip_data[ip].material_state_variables;
443 const double T_ip = N.dot(local_T);
445 double const dT_ip = T_ip - N.dot(local_T_prev);
455 eps.noalias() = B * local_u;
459 auto const solid_linear_thermal_expansivity_vector =
464 .value(variables, x_position, t, dt));
467 dthermal_strain = solid_linear_thermal_expansivity_vector * dT_ip;
469 eps_m.noalias() = eps_m_prev + eps - eps_prev - dthermal_strain;
482 auto&& solution =
_ip_data[ip].solid_material.integrateStress(
483 variables_prev, variables, t, x_position, dt, *state);
487 OGS_FATAL(
"Computation of local constitutive relation failed.");
491 std::tie(sigma, state, C) = std::move(*solution);
493 local_Jac.noalias() += B.transpose() * C * B * w;
495 typename ShapeMatricesType::template MatrixType<DisplacementDim,
497 N_u = ShapeMatricesType::template MatrixType<
501 for (
int i = 0; i < DisplacementDim; ++i)
510 .template value<double>(variables, x_position, t, dt);
513 local_rhs.noalias() -=
514 (B.transpose() * sigma - N_u.transpose() * rho_s * b) * w;
518template <
typename ShapeFunction,
int DisplacementDim>
521 const double t,
double const dt, Eigen::VectorXd
const& local_x,
522 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_b_data,
523 std::vector<double>& local_Jac_data)
528 auto const local_T_prev =
537 typename ShapeMatricesType::template VectorType<temperature_size>>(
546 unsigned const n_integration_points =
550 auto const& solid_phase = medium->phase(
"Solid");
553 for (
unsigned ip = 0; ip < n_integration_points; ip++)
555 auto const& w =
_ip_data[ip].integration_weight;
557 auto const& dNdx =
_ip_data[ip].dNdx;
565 const double T_ip = N.dot(local_T);
570 .template value<double>(variables, x_position, t, dt);
573 .template value<double>(variables, x_position, t, dt);
575 mass.noalias() += N.transpose() * rho_s * c_p * N * w;
581 .value(variables, x_position, t, dt);
586 laplace.noalias() += dNdx.transpose() * thermal_conductivity * dNdx * w;
588 local_Jac.noalias() += laplace + mass / dt;
590 local_rhs.noalias() -=
591 laplace * local_T + mass * (local_T - local_T_prev) / dt;
594template <
typename ShapeFunction,
int DisplacementDim>
597 double const* values)
603template <
typename ShapeFunction,
int DisplacementDim>
607 constexpr int kelvin_vector_size =
611 [
this](std::vector<double>& values)
615template <
typename ShapeFunction,
int DisplacementDim>
616std::vector<double>
const&
619 std::vector<GlobalVector*>
const& ,
620 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
621 std::vector<double>& cache)
const
627template <
typename ShapeFunction,
int DisplacementDim>
630 double const* values)
636template <
typename ShapeFunction,
int DisplacementDim>
640 constexpr int kelvin_vector_size =
644 [
this](std::vector<double>& values)
648template <
typename ShapeFunction,
int DisplacementDim>
649std::vector<double>
const&
652 std::vector<GlobalVector*>
const& ,
653 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
654 std::vector<double>& cache)
const
660template <
typename ShapeFunction,
int DisplacementDim>
661std::vector<double>
const&
665 std::vector<GlobalVector*>
const& ,
666 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
667 std::vector<double>& cache)
const
673template <
typename ShapeFunction,
int DisplacementDim>
680template <
typename ShapeFunction,
int DisplacementDim>
684 constexpr int kelvin_vector_size =
688 [
this](std::vector<double>& values)
692template <
typename ShapeFunction,
int DisplacementDim>
699template <
typename ShapeFunction,
int DisplacementDim>
708template <
typename ShapeFunction,
int DisplacementDim>
710 DisplacementDim>::MaterialStateVariables
const&
714 return *
_ip_data[integration_point].material_state_variables;
KelvinVector mechanical_strain
std::size_t getID() const
Returns the ID of the element.
void setElementID(std::size_t element_id)
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
Local assembler of ThermoMechanics process.
std::vector< double > getEpsilonMechanical() const override
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::size_t setSigma(double const *values)
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
MeshLib::Element const & _element
static const int temperature_size
static const int displacement_size
ThermoMechanicsLocalAssembler(ThermoMechanicsLocalAssembler const &)=delete
MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables const & getMaterialStateVariablesAt(unsigned integration_point) const override
std::size_t setEpsilonMechanical(double const *values)
ShapeMatrixPolicyType< ShapeFunction, DisplacementDim > ShapeMatricesType
ThermoMechanicsProcessData< DisplacementDim > & _process_data
unsigned getNumberOfIntegrationPoints() const override
bool const _is_axially_symmetric
NumLib::GenericIntegrationMethod const & _integration_method
static const int displacement_index
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)
std::size_t setEpsilon(double const *values)
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
int getMaterialID() const override
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
std::vector< double > getEpsilon() const override
static const int temperature_index
std::vector< double > getSigma() const override
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
BMatricesType::KelvinVectorType sigma
BMatricesType::KelvinVectorType eps_m
BMatricesType::KelvinVectorType eps