279 dynamic_cast<MaterialStateVariables const*
>(&material_state_variables));
281 auto state = std::make_unique<MaterialStateVariables>(
282 static_cast<MaterialStateVariables const&
>(material_state_variables));
283 auto& behaviour_data = state->_behaviour_data;
286 behaviour_data.dt = dt;
287 behaviour_data.rdt = 1.0;
288 behaviour_data.K[0] = 4.0;
293 auto out = behaviour_data.s1.material_properties.begin();
296 auto const& vals = (*param)(t, x);
297 out =
std::copy(vals.begin(), vals.end(), out);
299 assert(out == behaviour_data.s1.material_properties.end());
302 if (!behaviour_data.s0.external_state_variables.empty())
305 if (!std::holds_alternative<double>(
306 variable_array_prev[
static_cast<int>(
310 "MPL::Variable::temperature is not set for variable_array_prev "
311 "before calling MFront::integrateStress.");
314 behaviour_data.s1.external_state_variables[0] = std::get<double>(
318 if (!behaviour_data.s1.external_state_variables.empty())
321 if (!std::holds_alternative<double>(
325 "MPL::Variable::temperature is not set for variable_array "
326 "before calling MFront::integrateStress");
329 behaviour_data.s1.external_state_variables[0] = std::get<double>(
344 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
345 variable_array_prev[
static_cast<int>(
346 MPL::Variable::mechanical_strain)]);
351 DisplacementDim)>() *
353 std::copy_n(eps_prev_MFront.data(), KelvinVector::SizeAtCompileTime,
354 behaviour_data.s0.gradients.data());
356 auto const& eps = std::get<MPL::SymmetricTensor<DisplacementDim>>(
357 variable_array[
static_cast<int>(MPL::Variable::mechanical_strain)]);
362 DisplacementDim)>() *
364 std::copy_n(eps_MFront.data(), KelvinVector::SizeAtCompileTime,
365 behaviour_data.s1.gradients.data());
367 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
368 variable_array_prev[
static_cast<int>(MPL::Variable::stress)]);
373 DisplacementDim)>() *
375 std::copy_n(sigma_prev_MFront.data(), KelvinVector::SizeAtCompileTime,
376 behaviour_data.s0.thermodynamic_forces.data());
377 std::copy_n(sigma_prev_MFront.data(), KelvinVector::SizeAtCompileTime,
378 behaviour_data.s1.thermodynamic_forces.data());
380 auto v = mgis::behaviour::make_view(behaviour_data);
381 auto const status = mgis::behaviour::integrate(v,
_behaviour);
385 "MFront: integration failed with status" + std::to_string(status) +
390 std::copy_n(behaviour_data.s1.thermodynamic_forces.data(),
391 KelvinVector::SizeAtCompileTime, sigma.data());
399 if (behaviour_data.K.size() !=
400 KelvinMatrix::RowsAtCompileTime * KelvinMatrix::ColsAtCompileTime)
401 OGS_FATAL(
"Stiffness matrix has wrong size.");
404 Q *
MFrontToOGS(Eigen::Map<KelvinMatrix>(behaviour_data.K.data())) *
410 return std::make_optional(
412 std::unique_ptr<
typename MechanicsBase<
413 DisplacementDim>::MaterialStateVariables>,
415 std::move(sigma), std::move(state), std::move(C)));
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
KelvinMatrixType< DisplacementDim > fourthOrderRotationMatrix(Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::ColMajor, DisplacementDim, DisplacementDim > const &transformation)
void copy(PETScVector const &x, PETScVector &y)
Derived::PlainObject OGSToMFront(Eigen::DenseBase< Derived > const &m)
Converts between OGSes and MFront's Kelvin vectors and matrices.
Derived::PlainObject MFrontToOGS(Eigen::DenseBase< Derived > const &m)
Converts between OGSes and MFront's Kelvin vectors and matrices.
Eigen::Matrix< double, Dimension, Dimension > transformation(SpatialPosition const &pos) const