diff --git a/src/language/modules/LocalFSIModule.cpp b/src/language/modules/LocalFSIModule.cpp index 7597da325c343a0c8e3422c8f922688908c9ca13..05d090b86fd2ea8e0ad5f6f089dda57773a849d1 100644 --- a/src/language/modules/LocalFSIModule.cpp +++ b/src/language/modules/LocalFSIModule.cpp @@ -305,7 +305,7 @@ LocalFSIModule::LocalFSIModule() )); - this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_solver", + this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_neohook_solver", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, @@ -326,7 +326,59 @@ LocalFSIModule::LocalFSIModule() const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, const double& lambda, const double& dt1, const size_t& q) + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1, + const size_t& q) + -> 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>, 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 LocalDtHyperelasticSolverHandler{getCommonMesh( + {rho1, u1, E1, CG1, aL1, aT1, sigma1}), + getCommonMesh( + {rho2, u2, E2, CG2, aL2, aT2, sigma2})} + .solver() + .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, 1, dt1, q, rho1, rho2, u1, + u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); + } + + )); + + this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_neohook_solver", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, + const std::shared_ptr<const DiscreteFunctionVariant>& u1, + const std::shared_ptr<const DiscreteFunctionVariant>& E1, + const std::shared_ptr<const DiscreteFunctionVariant>& CG1, + const std::shared_ptr<const DiscreteFunctionVariant>& aL1, + const std::shared_ptr<const DiscreteFunctionVariant>& aT1, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho2, + const std::shared_ptr<const DiscreteFunctionVariant>& u2, + const std::shared_ptr<const DiscreteFunctionVariant>& E2, + const std::shared_ptr<const DiscreteFunctionVariant>& CG2, + const std::shared_ptr<const DiscreteFunctionVariant>& aL2, + const std::shared_ptr<const DiscreteFunctionVariant>& aT2, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1) -> std::tuple< std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -341,14 +393,14 @@ LocalFSIModule::LocalFSIModule() getCommonMesh( {rho2, u2, E2, CG2, aL2, aT2, sigma2})} .solver() - .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, dt1, q, rho1, rho2, u1, + .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, 1, dt1, rho1, rho2, u1, u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, - bc_descriptor_list2, mu, lambda); + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); } )); - this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_solver", + this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_neohook2_solver", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, @@ -369,7 +421,59 @@ LocalFSIModule::LocalFSIModule() const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, const double& lambda, const double& dt1) + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1, + const size_t& q) + -> 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>, 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 LocalDtHyperelasticSolverHandler{getCommonMesh( + {rho1, u1, E1, CG1, aL1, aT1, sigma1}), + getCommonMesh( + {rho2, u2, E2, CG2, aL2, aT2, sigma2})} + .solver() + .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, 2, dt1, q, rho1, rho2, u1, + u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); + } + + )); + + this->_addBuiltinFunction("local_dt_hyperelastic_eucclhyd_neohook2_solver", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, + const std::shared_ptr<const DiscreteFunctionVariant>& u1, + const std::shared_ptr<const DiscreteFunctionVariant>& E1, + const std::shared_ptr<const DiscreteFunctionVariant>& CG1, + const std::shared_ptr<const DiscreteFunctionVariant>& aL1, + const std::shared_ptr<const DiscreteFunctionVariant>& aT1, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho2, + const std::shared_ptr<const DiscreteFunctionVariant>& u2, + const std::shared_ptr<const DiscreteFunctionVariant>& E2, + const std::shared_ptr<const DiscreteFunctionVariant>& CG2, + const std::shared_ptr<const DiscreteFunctionVariant>& aL2, + const std::shared_ptr<const DiscreteFunctionVariant>& aT2, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1) -> std::tuple< std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -384,9 +488,9 @@ LocalFSIModule::LocalFSIModule() getCommonMesh( {rho2, u2, E2, CG2, aL2, aT2, sigma2})} .solver() - .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, dt1, rho1, rho2, u1, + .apply(LocalDtHyperelasticSolverHandler::SolverType::Eucclhyd, 2, dt1, rho1, rho2, u1, u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, - bc_descriptor_list2, mu, lambda); + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); } )); @@ -610,7 +714,7 @@ LocalFSIModule::LocalFSIModule() )); - this->_addBuiltinFunction("local_dt_hyperelastic_glace_solver", + this->_addBuiltinFunction("local_dt_hyperelastic_glace_neohook_solver", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, @@ -631,7 +735,59 @@ LocalFSIModule::LocalFSIModule() const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, const double& lambda, const double& dt1, const size_t& q) + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1, + const size_t& q) + -> 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>, 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 LocalDtHyperelasticSolverHandler{getCommonMesh( + {rho1, u1, E1, CG1, aL1, aT1, sigma1}), + getCommonMesh( + {rho2, u2, E2, CG2, aL2, aT2, sigma2})} + .solver() + .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, 1, dt1, q, rho1, rho2, u1, + u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); + } + + )); + + this->_addBuiltinFunction("local_dt_hyperelastic_glace_neohook_solver", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, + const std::shared_ptr<const DiscreteFunctionVariant>& u1, + const std::shared_ptr<const DiscreteFunctionVariant>& E1, + const std::shared_ptr<const DiscreteFunctionVariant>& CG1, + const std::shared_ptr<const DiscreteFunctionVariant>& aL1, + const std::shared_ptr<const DiscreteFunctionVariant>& aT1, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho2, + const std::shared_ptr<const DiscreteFunctionVariant>& u2, + const std::shared_ptr<const DiscreteFunctionVariant>& E2, + const std::shared_ptr<const DiscreteFunctionVariant>& CG2, + const std::shared_ptr<const DiscreteFunctionVariant>& aL2, + const std::shared_ptr<const DiscreteFunctionVariant>& aT2, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1) -> std::tuple< std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -646,14 +802,14 @@ LocalFSIModule::LocalFSIModule() getCommonMesh( {rho2, u2, E2, CG2, aL2, aT2, sigma2})} .solver() - .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, dt1, q, rho1, rho2, u1, + .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, 1, dt1, rho1, rho2, u1, u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, - bc_descriptor_list2, mu, lambda); + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); } )); - this->_addBuiltinFunction("local_dt_hyperelastic_glace_solver", + this->_addBuiltinFunction("local_dt_hyperelastic_glace_neohook2_solver", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, @@ -674,7 +830,59 @@ LocalFSIModule::LocalFSIModule() const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, const double& lambda, const double& dt1) + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1, + const size_t& q) + -> 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>, 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 LocalDtHyperelasticSolverHandler{getCommonMesh( + {rho1, u1, E1, CG1, aL1, aT1, sigma1}), + getCommonMesh( + {rho2, u2, E2, CG2, aL2, aT2, sigma2})} + .solver() + .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, 2, dt1, q, rho1, rho2, u1, + u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); + } + + )); + + this->_addBuiltinFunction("local_dt_hyperelastic_glace_neohook2_solver", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho1, + const std::shared_ptr<const DiscreteFunctionVariant>& u1, + const std::shared_ptr<const DiscreteFunctionVariant>& E1, + const std::shared_ptr<const DiscreteFunctionVariant>& CG1, + const std::shared_ptr<const DiscreteFunctionVariant>& aL1, + const std::shared_ptr<const DiscreteFunctionVariant>& aT1, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho2, + const std::shared_ptr<const DiscreteFunctionVariant>& u2, + const std::shared_ptr<const DiscreteFunctionVariant>& E2, + const std::shared_ptr<const DiscreteFunctionVariant>& CG2, + const std::shared_ptr<const DiscreteFunctionVariant>& aL2, + const std::shared_ptr<const DiscreteFunctionVariant>& aT2, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf2, + const double& dt1) -> std::tuple< std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -689,9 +897,9 @@ LocalFSIModule::LocalFSIModule() getCommonMesh( {rho2, u2, E2, CG2, aL2, aT2, sigma2})} .solver() - .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, dt1, rho1, rho2, u1, + .apply(LocalDtHyperelasticSolverHandler::SolverType::Glace, 2, dt1, rho1, rho2, u1, u2, E1, E2, CG1, CG2, aL1, aL2, aT1, aT2, sigma1, sigma2, bc_descriptor_list1, - bc_descriptor_list2, mu, lambda); + bc_descriptor_list2, lambda2, mu2, gamma2, p_inf2); } )); diff --git a/src/scheme/LocalDtHyperelasticSolver.cpp b/src/scheme/LocalDtHyperelasticSolver.cpp index f5ec4f12ab7a5214a05b6d36863987ba58214db8..2c3cb3cedfcfacb9281315601e8d272fc7381653 100644 --- a/src/scheme/LocalDtHyperelasticSolver.cpp +++ b/src/scheme/LocalDtHyperelasticSolver.cpp @@ -19,6 +19,7 @@ #include <scheme/HyperelasticSolver.hpp> #include <scheme/IBoundaryConditionDescriptor.hpp> #include <scheme/IDiscreteFunctionDescriptor.hpp> +#include <scheme/LocalDtUtils.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> #include <utils/Socket.hpp> @@ -860,6 +861,132 @@ class LocalDtHyperelasticSolverHandler::LocalDtHyperelasticSolver final E->get<DiscreteScalarFunction>(), CG->get<DiscreteTensorFunction>(), map1, map2); } + 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>> + compute_sub_iterations(const SolverType& solver_type, + const size_t& law, + const double& dt, + const size_t& q, + 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::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, + NodeValue<Rd> CR_ur, + NodeValuePerCell<Rd> CR_Fjr, + std::vector<NodeId> map2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda, + const std::shared_ptr<const DiscreteFunctionVariant>& mu, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf) const + { + std::shared_ptr sub_m = getCommonMesh({rho, u, E, CG}); + std::shared_ptr<const DiscreteFunctionVariant> sub_rho = rho; + std::shared_ptr<const DiscreteFunctionVariant> sub_u = u; + std::shared_ptr<const DiscreteFunctionVariant> sub_E = E; + std::shared_ptr<const DiscreteFunctionVariant> sub_CG = CG; + + std::shared_ptr<const DiscreteFunctionVariant> sub_lambda = lambda; + std::shared_ptr<const DiscreteFunctionVariant> sub_mu = mu; + std::shared_ptr<const DiscreteFunctionVariant> sub_gamma = gamma; + std::shared_ptr<const DiscreteFunctionVariant> sub_p_inf = p_inf; + + double sub_dt = dt / q; + double sum_dt = 0.; + for(size_t i = 0; i < q; ++i){ + + if( i == q - 1){ + sub_dt = dt - sum_dt; + } + + const auto& [sigma, p, aL, aT] = apply_state_law<MeshType>(law,sub_rho,sub_u,sub_E,sub_CG,sub_lambda,sub_mu,sub_gamma,sub_p_inf); + + const DiscreteScalarFunction& aL_d = aL->template get<DiscreteScalarFunction>(); + const DiscreteScalarFunction& aT_d = aT->template get<DiscreteScalarFunction>(); + const std::shared_ptr<const DiscreteFunctionVariant>& c = + std::make_shared<const DiscreteFunctionVariant>(aL_d + aT_d); + + auto [sub_ur2, sub_Fjr2] = compute_fluxes(solver_type, sub_rho, aL, aT, sub_u, sigma, bc_descriptor_list, CR_ur, CR_Fjr, map2); + + std::tie(sub_m, sub_rho, sub_u, sub_E, sub_CG) = apply_fluxes(sub_dt, sub_rho, sub_u, sub_E, sub_CG, sub_ur2, sub_Fjr2); + + sub_lambda = shallowCopy(sub_m,sub_lambda); + sub_mu = shallowCopy(sub_m,sub_mu); + sub_gamma = shallowCopy(sub_m,sub_gamma); + sub_p_inf = shallowCopy(sub_m,sub_p_inf); + + sum_dt += sub_dt; + + } + + return {sub_m, sub_rho, sub_u, sub_E, sub_CG}; + } + + 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>> + compute_sub_iterations(const SolverType& solver_type, + const size_t& law, + const double& CFL, + const double& dt, + 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::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list, + NodeValue<Rd> CR_ur, + NodeValuePerCell<Rd> CR_Fjr, + std::vector<NodeId> map2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda, + const std::shared_ptr<const DiscreteFunctionVariant>& mu, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& p_inf) const + { + std::shared_ptr sub_m = getCommonMesh({rho, u, E, CG}); + std::shared_ptr<const DiscreteFunctionVariant> sub_rho = rho; + std::shared_ptr<const DiscreteFunctionVariant> sub_u = u; + std::shared_ptr<const DiscreteFunctionVariant> sub_E = E; + std::shared_ptr<const DiscreteFunctionVariant> sub_CG = CG; + + std::shared_ptr<const DiscreteFunctionVariant> sub_lambda = lambda; + std::shared_ptr<const DiscreteFunctionVariant> sub_mu = mu; + std::shared_ptr<const DiscreteFunctionVariant> sub_gamma = gamma; + std::shared_ptr<const DiscreteFunctionVariant> sub_p_inf = p_inf; + + double sum_dt = 0; + while(sum_dt < dt){ + const auto& [sigma, p, aL, aT] = apply_state_law<MeshType>(law,sub_rho,sub_u,sub_E,sub_CG,sub_lambda,sub_mu,sub_gamma,sub_p_inf); + + const DiscreteScalarFunction& aL_d = aL->template get<DiscreteScalarFunction>(); + const DiscreteScalarFunction& aT_d = aT->template get<DiscreteScalarFunction>(); + const std::shared_ptr<const DiscreteFunctionVariant>& c = + std::make_shared<const DiscreteFunctionVariant>(aL_d + aT_d); + + double sub_dt = CFL * hyperelastic_dt(c); + if(sum_dt + sub_dt > dt){ + sub_dt = dt - sum_dt; + } + + auto [sub_ur2, sub_Fjr2] = compute_fluxes(solver_type, sub_rho, aL, aT, sub_u, sigma, bc_descriptor_list, CR_ur, CR_Fjr, map2); + + std::tie(sub_m, sub_rho, sub_u, sub_E, sub_CG) = apply_fluxes(sub_dt, sub_rho, sub_u, sub_E, sub_CG, sub_ur2, sub_Fjr2); + + sub_lambda = shallowCopy(sub_m,sub_lambda); + sub_mu = shallowCopy(sub_m,sub_mu); + sub_gamma = shallowCopy(sub_m,sub_gamma); + sub_p_inf = shallowCopy(sub_m,sub_p_inf); + + sum_dt += sub_dt; + } + + return {sub_m, sub_rho, sub_u, sub_E, sub_CG}; + } + std::tuple<std::shared_ptr<const MeshVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, @@ -871,6 +998,7 @@ class LocalDtHyperelasticSolverHandler::LocalDtHyperelasticSolver final std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>> apply(const SolverType& solver_type, + const size_t& law, const double& dt1, const size_t& q, const std::shared_ptr<const DiscreteFunctionVariant>& rho1, @@ -889,66 +1017,22 @@ class LocalDtHyperelasticSolverHandler::LocalDtHyperelasticSolver final const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list1, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, - const double& lambda) const + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& pinf2) const { - std::shared_ptr new_m2 = getCommonMesh({rho2, aL2, aT2, u2, sigma2}); - std::shared_ptr m1 = getCommonMesh({rho1, aL1, aT1, u1, sigma1}); - - std::shared_ptr<const DiscreteFunctionVariant> new_rho2 = rho2; - std::shared_ptr<const DiscreteFunctionVariant> new_u2 = u2; - std::shared_ptr<const DiscreteFunctionVariant> new_E2 = E2; - std::shared_ptr<const DiscreteFunctionVariant> new_CG2 = CG2; + std::shared_ptr m2 = getCommonMesh({rho2, aL2, aT2, u2, sigma2}); + std::shared_ptr m1 = getCommonMesh({rho1, aL1, aT1, u1, sigma1}); - auto [map1, map2] = _computeMapping(m1, new_m2, bc_descriptor_list1, bc_descriptor_list2); + auto [map1, map2] = _computeMapping(m1, m2, bc_descriptor_list1, bc_descriptor_list2); auto [ur1, Fjr1, ur2, Fjr2, CR_ur, CR_Fjr] = compute_fluxes(solver_type, rho1, aL1, aT1, u1, sigma1, bc_descriptor_list1, rho2, aL2, aT2, u2, sigma2, bc_descriptor_list2, map1, map2); const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = apply_fluxes(dt1, rho1, u1, E1, CG1, ur1, Fjr1); - double dt2 = dt1 / q; - const double gamma = 1.4; - const TinyMatrix<Dimension> I = identity; - double sum_dt = 0; - - size_t fluid = 0; - if ((mu == 0) and (lambda == 0)) { - fluid = 1; - } - - for (size_t i = 0; i < q; i++) { - if (i == q - 1) { - dt2 = dt1 - sum_dt; - } - - const DiscreteScalarFunction& rho_d = new_rho2->get<DiscreteScalarFunction>(); - const DiscreteVectorFunction& u_d = new_u2->get<DiscreteVectorFunction>(); - const DiscreteScalarFunction& E_d = new_E2->get<DiscreteScalarFunction>(); - const DiscreteScalarFunction& eps = E_d - 0.5 * dot(u_d, u_d); - const DiscreteTensorFunction& CG_d = new_CG2->get<DiscreteTensorFunction>(); - const DiscreteScalarFunction& p = fluid * (gamma - 1) * rho_d * eps; - const DiscreteTensorFunction& sigma_d = - mu / sqrt(det(CG_d)) * (CG_d - I) + lambda / sqrt(det(CG_d)) * log(sqrt(det(CG_d))) * I - p * I; - const DiscreteScalarFunction& aL_d = sqrt((lambda + 2 * mu) / rho_d + gamma * p / rho_d); - - const DiscreteScalarFunction& aT_d = sqrt(mu / rho_d); - - const std::shared_ptr<const DiscreteFunctionVariant>& new_sigma2 = - std::make_shared<const DiscreteFunctionVariant>(sigma_d); - const std::shared_ptr<const DiscreteFunctionVariant>& new_aL2 = - std::make_shared<const DiscreteFunctionVariant>(aL_d); - const std::shared_ptr<const DiscreteFunctionVariant>& new_aT2 = - std::make_shared<const DiscreteFunctionVariant>(aT_d); - - auto [sub_ur2, sub_Fjr2] = compute_fluxes(solver_type, new_rho2, new_aL2, new_aT2, new_u2, new_sigma2, - bc_descriptor_list2, CR_ur, CR_Fjr, map2); - - std::tie(new_m2, new_rho2, new_u2, new_E2, new_CG2) = - apply_fluxes(dt2, new_rho2, new_u2, new_E2, new_CG2, sub_ur2, sub_Fjr2); - - sum_dt += dt2; - } + auto [new_m2, new_rho2, new_u2, new_E2, new_CG2] = compute_sub_iterations(solver_type,law,dt1,q,rho2,u2,E2,CG2,bc_descriptor_list2,CR_ur,CR_Fjr,map2,lambda2,mu2,gamma2,pinf2); std::tie(new_m2, new_rho2, new_u2, new_E2, new_CG2) = mesh_correction(new_m1, new_m2, new_rho2, new_u2, new_E2, new_CG2, map1, map2); @@ -967,6 +1051,7 @@ class LocalDtHyperelasticSolverHandler::LocalDtHyperelasticSolver final std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>> apply(const SolverType& solver_type, + const size_t& law, const double& dt1, const std::shared_ptr<const DiscreteFunctionVariant>& rho1, const std::shared_ptr<const DiscreteFunctionVariant>& rho2, @@ -984,74 +1069,23 @@ class LocalDtHyperelasticSolverHandler::LocalDtHyperelasticSolver final const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list1, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, - const double& lambda) const + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& pinf2) const { - std::shared_ptr new_m2 = getCommonMesh({rho2, aL2, aT2, u2, sigma2}); - std::shared_ptr m1 = getCommonMesh({rho1, aL1, aT1, u1, sigma1}); - - std::shared_ptr<const DiscreteFunctionVariant> new_rho2 = rho2; - std::shared_ptr<const DiscreteFunctionVariant> new_u2 = u2; - std::shared_ptr<const DiscreteFunctionVariant> new_E2 = E2; - std::shared_ptr<const DiscreteFunctionVariant> new_CG2 = CG2; - - DiscreteScalarFunction aL_d = aL2->get<DiscreteScalarFunction>(); - DiscreteScalarFunction aT_d = aT2->get<DiscreteScalarFunction>(); - const std::shared_ptr<const DiscreteFunctionVariant>& c = std::make_shared<const DiscreteFunctionVariant>(aL_d + aT_d); - - double dt2 = 0.4 * hyperelastic_dt(c); + std::shared_ptr m2 = getCommonMesh({rho2, aL2, aT2, u2, sigma2}); + std::shared_ptr m1 = getCommonMesh({rho1, aL1, aT1, u1, sigma1}); - auto [map1, map2] = _computeMapping(m1, new_m2, bc_descriptor_list1, bc_descriptor_list2); + auto [map1, map2] = _computeMapping(m1, m2, bc_descriptor_list1, bc_descriptor_list2); auto [ur1, Fjr1, ur2, Fjr2, CR_ur, CR_Fjr] = compute_fluxes2(solver_type, rho1, aL1, aT1, u1, sigma1, bc_descriptor_list1, rho2, aL2, aT2, u2, sigma2, bc_descriptor_list2, map1, map2); - const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = apply_fluxes(dt1, rho1, u1, E1, CG1, ur1, Fjr1); - std::tie(new_m2,new_rho2,new_u2,new_E2,new_CG2) = apply_fluxes(dt2, rho2, u2, E2, CG2, ur2, Fjr2); - - const double gamma = 1.4; - const TinyMatrix<Dimension> I = identity; - double sum_dt = dt2; - size_t fluid = 0; - if ((mu == 0) and (lambda == 0)) { - fluid = 1; - } - - while(sum_dt < dt1) { - - const DiscreteScalarFunction& rho_d = new_rho2->get<DiscreteScalarFunction>(); - const DiscreteVectorFunction& u_d = new_u2->get<DiscreteVectorFunction>(); - const DiscreteScalarFunction& E_d = new_E2->get<DiscreteScalarFunction>(); - const DiscreteScalarFunction& eps = E_d - 0.5 * dot(u_d, u_d); - const DiscreteTensorFunction& CG_d = new_CG2->get<DiscreteTensorFunction>(); - const DiscreteScalarFunction& p = fluid * (gamma - 1) * rho_d * eps; - const DiscreteTensorFunction& sigma_d = mu / sqrt(det(CG_d)) * (CG_d - I) + lambda / sqrt(det(CG_d)) * log(sqrt(det(CG_d))) * I - p * I; - const DiscreteScalarFunction& new_aL_d = sqrt((lambda + 2 * mu) / rho_d + gamma * p / rho_d); - const DiscreteScalarFunction& new_aT_d = sqrt(mu / rho_d); - - const std::shared_ptr<const DiscreteFunctionVariant>& new_sigma2 = - std::make_shared<const DiscreteFunctionVariant>(sigma_d); - const std::shared_ptr<const DiscreteFunctionVariant>& new_c = - std::make_shared<const DiscreteFunctionVariant>(new_aL_d + new_aT_d); - const std::shared_ptr<const DiscreteFunctionVariant>& new_aL2 = - std::make_shared<const DiscreteFunctionVariant>(new_aL_d); - const std::shared_ptr<const DiscreteFunctionVariant>& new_aT2 = - std::make_shared<const DiscreteFunctionVariant>(new_aT_d); - - dt2 = 0.4 * hyperelastic_dt(new_c); - if(sum_dt + dt2 > dt1){ - dt2 = dt1 - sum_dt; - } - - auto [sub_ur2, sub_Fjr2] = compute_fluxes(solver_type, new_rho2, new_aL2, new_aT2, new_u2, new_sigma2, - bc_descriptor_list2, CR_ur, CR_Fjr, map2); - - std::tie(new_m2, new_rho2, new_u2, new_E2, new_CG2) = - apply_fluxes(dt2, new_rho2, new_u2, new_E2, new_CG2, sub_ur2, sub_Fjr2); + const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = apply_fluxes(dt1, rho1, u1, E1, CG1, ur1, Fjr1); - sum_dt += dt2; - } + auto [new_m2, new_rho2, new_u2, new_E2, new_CG2] = compute_sub_iterations(solver_type,law,0.4,dt1,rho2,u2,E2,CG2,bc_descriptor_list2,CR_ur,CR_Fjr,map2,lambda2,mu2,gamma2,pinf2); std::tie(new_m2, new_rho2, new_u2, new_E2, new_CG2) = mesh_correction(new_m1, new_m2, new_rho2, new_u2, new_E2, new_CG2, map1, map2); diff --git a/src/scheme/LocalDtHyperelasticSolver.hpp b/src/scheme/LocalDtHyperelasticSolver.hpp index 6f2a80a318871a503d68bdf1c500b4aaa36bde82..5fc0aa0f54dabd8a43e2494adc3990889acf2275 100644 --- a/src/scheme/LocalDtHyperelasticSolver.hpp +++ b/src/scheme/LocalDtHyperelasticSolver.hpp @@ -51,49 +51,53 @@ class LocalDtHyperelasticSolverHandler const std::shared_ptr<const SubItemValuePerItemVariant>& Fjr) const = 0; virtual 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>, - 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>> - apply(const SolverType& solver_type, - const double& dt1, - const size_t& q, - const std::shared_ptr<const DiscreteFunctionVariant>& rho1, - const std::shared_ptr<const DiscreteFunctionVariant>& rho2, - const std::shared_ptr<const DiscreteFunctionVariant>& u1, - const std::shared_ptr<const DiscreteFunctionVariant>& u2, - const std::shared_ptr<const DiscreteFunctionVariant>& E1, - const std::shared_ptr<const DiscreteFunctionVariant>& E2, - const std::shared_ptr<const DiscreteFunctionVariant>& CG1, - const std::shared_ptr<const DiscreteFunctionVariant>& CG2, - const std::shared_ptr<const DiscreteFunctionVariant>& aL1, - const std::shared_ptr<const DiscreteFunctionVariant>& aL2, - const std::shared_ptr<const DiscreteFunctionVariant>& aT1, - const std::shared_ptr<const DiscreteFunctionVariant>& aT2, - const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, - const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, - const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list1, - const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, - const double& lambda) const = 0; + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + 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>> + apply(const SolverType& solver_type, + const size_t& law, + const double& dt1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho1, + const std::shared_ptr<const DiscreteFunctionVariant>& rho2, + const std::shared_ptr<const DiscreteFunctionVariant>& u1, + const std::shared_ptr<const DiscreteFunctionVariant>& u2, + const std::shared_ptr<const DiscreteFunctionVariant>& E1, + const std::shared_ptr<const DiscreteFunctionVariant>& E2, + const std::shared_ptr<const DiscreteFunctionVariant>& CG1, + const std::shared_ptr<const DiscreteFunctionVariant>& CG2, + const std::shared_ptr<const DiscreteFunctionVariant>& aL1, + const std::shared_ptr<const DiscreteFunctionVariant>& aL2, + const std::shared_ptr<const DiscreteFunctionVariant>& aT1, + const std::shared_ptr<const DiscreteFunctionVariant>& aT2, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma1, + const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list1, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& pinf2) const = 0; virtual 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>, - 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>> + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + 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>> apply(const SolverType& solver_type, + const size_t& law, const double& dt1, + const size_t& q, const std::shared_ptr<const DiscreteFunctionVariant>& rho1, const std::shared_ptr<const DiscreteFunctionVariant>& rho2, const std::shared_ptr<const DiscreteFunctionVariant>& u1, @@ -110,8 +114,10 @@ class LocalDtHyperelasticSolverHandler const std::shared_ptr<const DiscreteFunctionVariant>& sigma2, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list1, const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list2, - const double& mu, - const double& lambda) const = 0; + const std::shared_ptr<const DiscreteFunctionVariant>& lambda2, + const std::shared_ptr<const DiscreteFunctionVariant>& mu2, + const std::shared_ptr<const DiscreteFunctionVariant>& gamma2, + const std::shared_ptr<const DiscreteFunctionVariant>& pinf2) const = 0; ILocalDtHyperelasticSolver() = default; ILocalDtHyperelasticSolver(ILocalDtHyperelasticSolver&&) = default; diff --git a/src/scheme/Order2Limiters.hpp b/src/scheme/Order2Limiters.hpp index 49ef8dcdfd7d579a1c635ef1d21394b08eaeb537..277e02d6b7116247c622850fd2bf50ae815b5f2d 100644 --- a/src/scheme/Order2Limiters.hpp +++ b/src/scheme/Order2Limiters.hpp @@ -154,7 +154,7 @@ scalar_limiter(const MeshType& mesh, t[cell_id] = tj; l[cell_id] = lj; if(l2Norm(nj) != 0){ - n[cell_id] = (1/l2Norm(nj))*n[cell_id]; + n[cell_id] = (1/l2Norm(nj))*n[cell_id]; } if(l2Norm(tj) != 0){ t[cell_id] = (1/l2Norm(tj))*t[cell_id];