From 1bc2762644cc09c96e91a56ebf7388dc928ad345 Mon Sep 17 00:00:00 2001 From: Alexandre GANGLOFF <alexandre.gangloff@cea.fr> Date: Thu, 28 Nov 2024 10:30:42 +0100 Subject: [PATCH] Add choice for the contructive law for hyper mono method --- src/language/modules/SchemeModule.cpp | 50 +++++++++-- src/scheme/Order2HyperelasticSolver.cpp | 110 +++++++++++++++++++----- src/scheme/Order2HyperelasticSolver.hpp | 9 +- 3 files changed, 141 insertions(+), 28 deletions(-) diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 1d6583a48..33c1f7b50 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -823,7 +823,7 @@ SchemeModule::SchemeModule() )); - this->_addBuiltinFunction("hyperelastic_eucclhyd_solver_order2", + this->_addBuiltinFunction("hyperelastic_eucclhyd_neohook_solver_order2", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, @@ -836,6 +836,8 @@ SchemeModule::SchemeModule() const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid, + const double& lambda, + const double& mu, const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -843,13 +845,13 @@ SchemeModule::SchemeModule() std::shared_ptr<const DiscreteFunctionVariant>> { return Order2HyperelasticSolverHandler{getCommonMesh({rho, u, E, CG, aL, aT, sigma})} .solver() - .apply(Order2HyperelasticSolverHandler::SolverType::Eucclhyd, dt, rho, u, E, CG, aL, aT, - sigma, bc_descriptor_list, chi_solid); + .apply(Order2HyperelasticSolverHandler::SolverType::Eucclhyd, 1, dt, rho, u, E, CG, aL, aT, + sigma, bc_descriptor_list, chi_solid, lambda, mu, 0, 0, 0, 0); } )); - this->_addBuiltinFunction("hyperelastic_glace_solver_order2", + this->_addBuiltinFunction("hyperelastic_eucclhyd_neohook_solver_order2", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, @@ -862,6 +864,10 @@ SchemeModule::SchemeModule() const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid, + const double& lambda, + const double& mu, + const double& gamma, + const double& p_inf, const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -869,8 +875,40 @@ SchemeModule::SchemeModule() std::shared_ptr<const DiscreteFunctionVariant>> { return Order2HyperelasticSolverHandler{getCommonMesh({rho, u, E, CG, aL, aT, sigma})} .solver() - .apply(Order2HyperelasticSolverHandler::SolverType::Glace, dt, rho, u, E, CG, aL, aT, - sigma, bc_descriptor_list, chi_solid); + .apply(Order2HyperelasticSolverHandler::SolverType::Eucclhyd, 1, dt, rho, u, E, CG, aL, aT, + sigma, bc_descriptor_list, chi_solid, lambda, mu, gamma, p_inf, 0, 0); + } + + )); + + this->_addBuiltinFunction("hyperelastic_eucclhyd_neohook2_solver_order2", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, + const std::shared_ptr<const DiscreteFunctionVariant>& CG, + const std::shared_ptr<const DiscreteFunctionVariant>& aL, + const std::shared_ptr<const DiscreteFunctionVariant>& aT, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid, + const double& lambda, + const double& mu, + const double& gamma_f, + const double& p_inf_f, + const double& gamma_s, + const double& p_inf_s, + const double& dt) -> std::tuple<std::shared_ptr<const MeshVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return Order2HyperelasticSolverHandler{getCommonMesh({rho, u, E, CG, aL, aT, sigma})} + .solver() + .apply(Order2HyperelasticSolverHandler::SolverType::Eucclhyd, 2, dt, rho, u, E, CG, aL, aT, + sigma, bc_descriptor_list, chi_solid, lambda, mu, gamma_f, p_inf_f, gamma_s, p_inf_s); } )); diff --git a/src/scheme/Order2HyperelasticSolver.cpp b/src/scheme/Order2HyperelasticSolver.cpp index 9c2bd2591..c249ab60f 100644 --- a/src/scheme/Order2HyperelasticSolver.cpp +++ b/src/scheme/Order2HyperelasticSolver.cpp @@ -491,6 +491,86 @@ class Order2HyperelasticSolverHandler::Order2HyperelasticSolver final : public O return lambda; } + std::tuple<const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>> + _apply_NeoHook(const DiscreteScalarFunction rho, + const DiscreteVectorFunction u, + const DiscreteScalarFunction E, + const DiscreteTensorFunction CG, + const DiscreteScalarFunction chi_solid, + const double& lambda, + const double& mu, + const double& gamma, + const double& p_inf) const + { + const TinyMatrix<Dimension> I = identity; + + const DiscreteScalarFunction& eps = E - 0.5 * dot(u,u); + const DiscreteScalarFunction& p_d = (1-chi_solid)*(gamma-1) * rho * eps - p_inf*gamma; + const DiscreteTensorFunction& sigma_d = chi_solid * (mu / sqrt(det(CG)) * (CG - I) + lambda / sqrt(det(CG)) * log(sqrt(det(CG))) * I) - p_d * I; + const DiscreteScalarFunction& aL_d = sqrt(chi_solid * (lambda + 2 * mu) / rho + gamma * (p_d + p_inf) / rho); + const DiscreteScalarFunction& aT_d = sqrt(chi_solid * mu / rho); + + return {std::make_shared<DiscreteFunctionVariant>(sigma_d), + std::make_shared<DiscreteFunctionVariant>(aL_d), + std::make_shared<DiscreteFunctionVariant>(aT_d)}; + } + + std::tuple<const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>> + _apply_NeoHook2(const DiscreteScalarFunction rho, + const DiscreteVectorFunction u, + const DiscreteScalarFunction E, + const DiscreteTensorFunction CG, + const DiscreteScalarFunction chi_solid, + const double& mu, + const double& gamma_f, + const double& p_inf_f, + const double& gamma_s, + const double& p_inf_s) const + { + const TinyMatrix<Dimension> I = identity; + + const DiscreteScalarFunction& eps = E - 0.5 * dot(u,u); + const DiscreteScalarFunction& p_d = (1-chi_solid)*(gamma_f-1) * rho * eps - p_inf_f*gamma_f + chi_solid * (gamma_s - 1) * rho * eps - gamma_s * p_inf_s; + const DiscreteTensorFunction& sigma_d = chi_solid * 2*mu/sqrt(det(CG))*(CG-1./3. * trace(CG)*I) - p_d * I; + const DiscreteScalarFunction& aL_d = sqrt(chi_solid * (2 * mu) / rho + ((1-chi_solid)*gamma_f * p_d + chi_solid * (gamma_s*(p_d+p_inf_s))) / rho); + const DiscreteScalarFunction& aT_d = sqrt(chi_solid * mu / rho); + + return {std::make_shared<DiscreteFunctionVariant>(sigma_d), + std::make_shared<DiscreteFunctionVariant>(aL_d), + std::make_shared<DiscreteFunctionVariant>(aT_d)}; + } + + std::tuple<const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>, const std::shared_ptr<const DiscreteFunctionVariant>> + _apply_state_law(const size_t law, + const std::shared_ptr<const DiscreteFunctionVariant>& rho_v, + const std::shared_ptr<const DiscreteFunctionVariant>& u_v, + const std::shared_ptr<const DiscreteFunctionVariant>& E_v, + const std::shared_ptr<const DiscreteFunctionVariant>& CG_v, + const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid_v, + const double& lambda, + const double& mu, + const double& gamma_f, + const double& p_inf_f, + const double& gamma_s, + const double& p_inf_s) const + { + const DiscreteScalarFunction& chi_solid_d = chi_solid_v->get<DiscreteScalarFunction>(); + const DiscreteScalarFunction& rho_d = rho_v->get<DiscreteScalarFunction>(); + const DiscreteVectorFunction& u_d = u_v->get<DiscreteVectorFunction>(); + const DiscreteScalarFunction& E_d = E_v->get<DiscreteScalarFunction>(); + const DiscreteTensorFunction& CG_d = CG_v->get<DiscreteTensorFunction>(); + + //const std::shared_ptr<const DiscreteFunctionVariant> sigma; + //const std::shared_ptr<const DiscreteFunctionVariant> aL; + //const std::shared_ptr<const DiscreteFunctionVariant> aT; + + if(law == 1){ + return _apply_NeoHook(rho_d,u_d,E_d,CG_d,chi_solid_d,lambda,mu,gamma_f,p_inf_f); + } else { + return _apply_NeoHook2(rho_d,u_d,E_d,CG_d,chi_solid_d,lambda,gamma_f,p_inf_f,gamma_s,p_inf_s); + } + } + public: std::tuple<const std::shared_ptr<const ItemValueVariant>, const std::shared_ptr<const SubItemValuePerItemVariant>> compute_fluxes(const SolverType& solver_type, @@ -851,6 +931,7 @@ class Order2HyperelasticSolverHandler::Order2HyperelasticSolver final : public O std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>> apply(const SolverType& solver_type, + const size_t& law, const double& dt, const std::shared_ptr<const DiscreteFunctionVariant>& rho, const std::shared_ptr<const DiscreteFunctionVariant>& u, @@ -860,7 +941,13 @@ class Order2HyperelasticSolverHandler::Order2HyperelasticSolver final : public O const std::shared_ptr<const DiscreteFunctionVariant>& aT, const std::shared_ptr<const DiscreteFunctionVariant>& sigma, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, - const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid) const + const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid, + const double& lambda, + const double& mu, + const double& gamma_f, + const double& p_inf_f, + const double& gamma_s, + const double& p_inf_s) const { std::shared_ptr m_app = getCommonMesh({rho, aL, aT, u, sigma}); std::shared_ptr<const DiscreteFunctionVariant> rho_app = rho; @@ -871,28 +958,9 @@ class Order2HyperelasticSolverHandler::Order2HyperelasticSolver final : public O auto [ur, Fjr] = compute_fluxes(solver_type, rho, aL, aT, u, sigma, bc_descriptor_list); std::tie(m_app,rho_app,u_app,E_app,CG_app) = apply_fluxes(dt/2, rho, u, E, CG, ur, Fjr); - const double& gamma = 1.4; - const double& youngs = 7000; - const double& nu = 0; - const double& mu = youngs/(2*(1-nu)); - const double& lambda = youngs * nu / ((1+nu) * (1 - 2 * nu)); - const TinyMatrix<Dimension> I = identity; std::shared_ptr<const DiscreteFunctionVariant> chi_solid_app = shallowCopy(m_app, chi_solid); - const DiscreteScalarFunction& chi_solid_d = chi_solid_app->get<DiscreteScalarFunction>(); - const DiscreteScalarFunction& rho_d = rho_app->get<DiscreteScalarFunction>(); - const DiscreteVectorFunction& u_d = u_app->get<DiscreteVectorFunction>(); - const DiscreteScalarFunction& E_d = E_app->get<DiscreteScalarFunction>(); - const DiscreteScalarFunction& eps = E_d - 0.5 * dot(u_d,u_d); - const DiscreteTensorFunction& CG_d = CG_app->get<DiscreteTensorFunction>(); - const DiscreteScalarFunction& p_d = (1-chi_solid_d)*(gamma-1) * rho_d * eps; - const DiscreteTensorFunction& sigma_d = chi_solid_d * (mu / sqrt(det(CG_d)) * (CG_d - I) + lambda / sqrt(det(CG_d)) * log(sqrt(det(CG_d))) * I) - p_d * I; - const DiscreteScalarFunction& aL_d = sqrt(chi_solid_d * (lambda + 2 * mu) / rho_d + gamma * p_d / rho_d); - const DiscreteScalarFunction& aT_d = sqrt(chi_solid_d * mu / rho_d); - - const std::shared_ptr<const DiscreteFunctionVariant>& sigma_app = std::make_shared<const DiscreteFunctionVariant>(sigma_d); - const std::shared_ptr<const DiscreteFunctionVariant>& aL_app = std::make_shared<const DiscreteFunctionVariant>(aL_d); - const std::shared_ptr<const DiscreteFunctionVariant>& aT_app = std::make_shared<const DiscreteFunctionVariant>(aT_d); + auto [sigma_app, aL_app, aT_app] = _apply_state_law(law,rho_app,u_app,E_app,CG_app,chi_solid_app,lambda,mu,gamma_f,p_inf_f,gamma_s,p_inf_s); auto [ur_app, Fjr_app] = compute_fluxes(solver_type, rho_app, aL_app,aT_app,u_app,sigma_app,bc_descriptor_list); return order2_apply_fluxes(dt, rho, u, E, CG, rho_app, CG_app, ur_app, Fjr_app); diff --git a/src/scheme/Order2HyperelasticSolver.hpp b/src/scheme/Order2HyperelasticSolver.hpp index 960959df5..0051bd0d7 100644 --- a/src/scheme/Order2HyperelasticSolver.hpp +++ b/src/scheme/Order2HyperelasticSolver.hpp @@ -55,6 +55,7 @@ class Order2HyperelasticSolverHandler std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>> apply(const SolverType& solver_type, + const size_t& law, const double& dt, const std::shared_ptr<const DiscreteFunctionVariant>& rho, const std::shared_ptr<const DiscreteFunctionVariant>& u, @@ -64,7 +65,13 @@ class Order2HyperelasticSolverHandler const std::shared_ptr<const DiscreteFunctionVariant>& aT, const std::shared_ptr<const DiscreteFunctionVariant>& sigma, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, - const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid) const = 0; + const std::shared_ptr<const DiscreteFunctionVariant>& chi_solid, + const double& lambda, + const double& mu, + const double& gamma_f, + const double& p_inf_f, + const double& gamma_s, + const double& p_inf_s) const = 0; IOrder2HyperelasticSolver() = default; IOrder2HyperelasticSolver(IOrder2HyperelasticSolver&&) = default; -- GitLab