diff --git a/MaterialLib/SolidModels/Ehlers.cpp b/MaterialLib/SolidModels/Ehlers.cpp index 2cda03b5f9d2ec6f0171092093526a12cba008ac..42c453e6162bd3c0105cd5ee3c04c0c5f12c58cb 100644 --- a/MaterialLib/SolidModels/Ehlers.cpp +++ b/MaterialLib/SolidModels/Ehlers.cpp @@ -468,6 +468,40 @@ splitSolutionVector(ResidualVector const& solution) solution[size * 2 + 2]); } +template <int DisplacementDim> +SolidEhlers<DisplacementDim>::SolidEhlers( + NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, + MaterialPropertiesParameters material_properties, + std::unique_ptr<DamagePropertiesParameters>&& damage_properties, + TangentType tangent_type) + : _nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)), + _mp(std::move(material_properties)), + _damage_properties(std::move(damage_properties)), + _tangent_type(tangent_type) +{ +} + +template <int DisplacementDim> +double SolidEhlers<DisplacementDim>::computeFreeEnergyDensity( + double const /*t*/, + ProcessLib::SpatialPosition const& /*x*/, + double const /*dt*/, + KelvinVector const& eps, + KelvinVector const& sigma, + typename MechanicsBase<DisplacementDim>::MaterialStateVariables const& + material_state_variables) const +{ + assert(dynamic_cast<StateVariables<DisplacementDim> const*>( + &material_state_variables) != nullptr); + + auto const& eps_p = static_cast<StateVariables<DisplacementDim> const&>( + material_state_variables) + .eps_p; + using Invariants = MathLib::KelvinVector::Invariants<KelvinVectorSize>; + auto const& identity2 = Invariants::identity2; + return (eps - eps_p.D - eps_p.V / 3 * identity2).dot(sigma) / 2; +} + template <int DisplacementDim> boost::optional<std::tuple<typename SolidEhlers<DisplacementDim>::KelvinVector, std::unique_ptr<typename MechanicsBase< diff --git a/MaterialLib/SolidModels/Ehlers.h b/MaterialLib/SolidModels/Ehlers.h index 22575ca2ef39d686336f968a4211326c4b234787..5121c31c99eacfe2c55985d2e31e28d6b91ecfa1 100644 --- a/MaterialLib/SolidModels/Ehlers.h +++ b/MaterialLib/SolidModels/Ehlers.h @@ -297,17 +297,11 @@ public: MathLib::KelvinVector::KelvinMatrixType<DisplacementDim>; public: - explicit SolidEhlers( + SolidEhlers( NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, MaterialPropertiesParameters material_properties, std::unique_ptr<DamagePropertiesParameters>&& damage_properties, - TangentType tangent_type) - : _nonlinear_solver_parameters(std::move(nonlinear_solver_parameters)), - _mp(std::move(material_properties)), - _damage_properties(std::move(damage_properties)), - _tangent_type(tangent_type) - { - } + TangentType tangent_type); double computeFreeEnergyDensity( double const /*t*/, @@ -316,18 +310,7 @@ public: KelvinVector const& eps, KelvinVector const& sigma, typename MechanicsBase<DisplacementDim>::MaterialStateVariables const& - material_state_variables) const override - { - assert(dynamic_cast<StateVariables<DisplacementDim> const*>( - &material_state_variables) != nullptr); - - auto const& eps_p = static_cast<StateVariables<DisplacementDim> const&>( - material_state_variables) - .eps_p; - using Invariants = MathLib::KelvinVector::Invariants<KelvinVectorSize>; - auto const& identity2 = Invariants::identity2; - return (eps - eps_p.D - eps_p.V / 3 * identity2).dot(sigma) / 2; - } + material_state_variables) const override; boost::optional<std::tuple<KelvinVector, std::unique_ptr<typename MechanicsBase<