diff --git a/MaterialLib/SolidModels/MFront/MFront.h b/MaterialLib/SolidModels/MFront/MFront.h index 40cce4a2d3f6cabb15b2953083adf513a398b347..6be9fd61f9e405f8f51049514889ac8add168568 100644 --- a/MaterialLib/SolidModels/MFront/MFront.h +++ b/MaterialLib/SolidModels/MFront/MFront.h @@ -42,6 +42,15 @@ public: return Base::createMaterialStateVariables(); } + void initializeInternalStateVariables( + double const t, + ParameterLib::SpatialPosition const& x, + typename MechanicsBase<DisplacementDim>::MaterialStateVariables& + material_state_variables) const override + { + Base::initializeInternalStateVariables(t, x, material_state_variables); + } + std::optional<std::tuple<KelvinVector, std::unique_ptr<typename MechanicsBase< DisplacementDim>::MaterialStateVariables>, diff --git a/MaterialLib/SolidModels/MFront/MFrontGeneric.h b/MaterialLib/SolidModels/MFront/MFrontGeneric.h index bab6bc1a80d5270140150d8c2fea5b37bcf50e6e..3de579b3baf6442fc9140ca7e6c945dac8958e81 100644 --- a/MaterialLib/SolidModels/MFront/MFrontGeneric.h +++ b/MaterialLib/SolidModels/MFront/MFrontGeneric.h @@ -228,6 +228,8 @@ public: MathLib::KelvinVector::KelvinVectorType<DisplacementDim>; using KelvinMatrix = MathLib::KelvinVector::KelvinMatrixType<DisplacementDim>; + using InternalVariable = + typename MechanicsBase<DisplacementDim>::InternalVariable; MFrontGeneric( mgis::behaviour::Behaviour&& behaviour, @@ -375,6 +377,41 @@ public: equivalent_plastic_strain_offset_, _behaviour); } + void initializeInternalStateVariables( + double const t, + ParameterLib::SpatialPosition const& x, + typename MechanicsBase<DisplacementDim>::MaterialStateVariables& + material_state_variables) const + { + assert(dynamic_cast<MaterialStateVariablesMFront<DisplacementDim>*>( + &material_state_variables)); + + auto& state = + static_cast<MaterialStateVariablesMFront<DisplacementDim>&>( + material_state_variables); + + auto const& ivs = getInternalVariables(); + + for (auto& [name, parameter] : _state_variables_initial_properties) + { + // find corresponding internal variable + auto const& iv = BaseLib::findElementOrError( + begin(ivs), + end(ivs), + [name = name](InternalVariable const& iv) + { return iv.name == name; }, + fmt::format("Internal variable `{:s}' not found.", name)); + + // evaluate parameter + std::vector<double> values = (*parameter)(t, x); + + // copy parameter data into iv + auto const values_span = iv.reference(state); + assert(values.size() == values_span.size()); + std::copy_n(begin(values), values_span.size(), values_span.begin()); + } + } + std::optional<std::tuple<OGSMFrontThermodynamicForcesData, std::unique_ptr<typename MechanicsBase< DisplacementDim>::MaterialStateVariables>, @@ -534,9 +571,6 @@ public: behaviour_data.K, Q, _behaviour))); } - using InternalVariable = - typename MechanicsBase<DisplacementDim>::InternalVariable; - std::vector<InternalVariable> getInternalVariables() const { std::vector<InternalVariable> internal_variables; diff --git a/MaterialLib/SolidModels/MechanicsBase.h b/MaterialLib/SolidModels/MechanicsBase.h index f64584366004e53fdcb8843d19ada0499622e4fb..7886845d5d8d069b898c7357dc2153c4e3596748 100644 --- a/MaterialLib/SolidModels/MechanicsBase.h +++ b/MaterialLib/SolidModels/MechanicsBase.h @@ -71,6 +71,13 @@ struct MechanicsBase return std::make_unique<MaterialStateVariables>(); } + virtual void initializeInternalStateVariables( + double const /*t*/, + ParameterLib::SpatialPosition const& /*x*/, + typename MechanicsBase<DisplacementDim>::MaterialStateVariables&) const + { + } + using KelvinVector = MathLib::KelvinVector::KelvinVectorType<DisplacementDim>; using KelvinMatrix =