From 25b37797740829bcc28e86b41ced9de46276584a Mon Sep 17 00:00:00 2001 From: HOCH PHILIPPE <philippe.hoch@gmail.com> Date: Fri, 23 Aug 2024 05:56:29 +0200 Subject: [PATCH] Adding second order in space for 3 current solver with induced limitation --- src/language/modules/SchemeModule.cpp | 111 +++ src/scheme/CMakeLists.txt | 3 + .../RusanovEulerianCompositeSolver_v2.cpp | 684 +----------------- 3 files changed, 120 insertions(+), 678 deletions(-) diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 32f689003..13ce019b4 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -44,8 +44,11 @@ #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/RoeViscousFormEulerianCompositeSolver_v2.hpp> +#include <scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.hpp> #include <scheme/RusanovEulerianCompositeSolver.hpp> +#include <scheme/RusanovEulerianCompositeSolver_o2.hpp> #include <scheme/RusanovEulerianCompositeSolver_v2.hpp> +#include <scheme/RusanovEulerianCompositeSolver_v2_o2.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> #include <scheme/VariableBCDescriptor.hpp> #include <scheme/test_reconstruction.hpp> @@ -543,6 +546,44 @@ SchemeModule::SchemeModule() )); + this->_addBuiltinFunction("rusanov_eulerian_composite_solver_version1_o2", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return rusanovEulerianCompositeSolver_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt); + } + + )); + + this->_addBuiltinFunction("rusanov_eulerian_composite_solver_version1_o2_with_checks", + std::function( + + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return rusanovEulerianCompositeSolver_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt, true); + } + + )); + this->_addBuiltinFunction("rusanov_eulerian_composite_solver_version2", std::function( [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, @@ -612,6 +653,76 @@ SchemeModule::SchemeModule() )); + this->_addBuiltinFunction("rusanov_eulerian_composite_solver_version2_o2", + std::function( + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return rusanovEulerianCompositeSolver_v2_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt); + } + + )); + + this->_addBuiltinFunction("rusanov_eulerian_composite_solver_version2_o2_with_checks", + std::function( + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return rusanovEulerianCompositeSolver_v2_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt, true); + })); + + this->_addBuiltinFunction("roe_viscosityform_eulerian_composite_solver_version2_o2", + std::function( + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return roeViscousFormEulerianCompositeSolver_v2_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt); + } + + )); + + this->_addBuiltinFunction("roe_viscosityform_eulerian_composite_solver_version2_o2_with_checks", + std::function( + [](const std::shared_ptr<const DiscreteFunctionVariant>& rho, + const std::shared_ptr<const DiscreteFunctionVariant>& u, + const std::shared_ptr<const DiscreteFunctionVariant>& E, const double& gamma, + const std::shared_ptr<const DiscreteFunctionVariant>& c, + const std::shared_ptr<const DiscreteFunctionVariant>& p, const size_t& degree, + const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& + bc_descriptor_list, + const double& dt) -> std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>, + std::shared_ptr<const DiscreteFunctionVariant>> { + return roeViscousFormEulerianCompositeSolver_v2_o2(rho, u, E, gamma, c, p, degree, + bc_descriptor_list, dt, true); + } + + )); + this->_addBuiltinFunction("eucclhyd_fluxes", std::function( diff --git a/src/scheme/CMakeLists.txt b/src/scheme/CMakeLists.txt index bae8c3faa..14739b777 100644 --- a/src/scheme/CMakeLists.txt +++ b/src/scheme/CMakeLists.txt @@ -26,6 +26,9 @@ add_library( RusanovEulerianCompositeSolver.cpp RusanovEulerianCompositeSolver_v2.cpp RoeViscousFormEulerianCompositeSolver_v2.cpp + RusanovEulerianCompositeSolver_o2.cpp + RusanovEulerianCompositeSolver_v2_o2.cpp + RoeViscousFormEulerianCompositeSolver_v2_o2.cpp test_reconstruction.cpp ) diff --git a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp index 5e8bc7ffe..c00f2311b 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp @@ -12,13 +12,8 @@ #include <mesh/MeshNodeBoundary.hpp> #include <mesh/MeshTraits.hpp> #include <mesh/MeshVariant.hpp> -#include <scheme/DiscreteFunctionDPk.hpp> -#include <scheme/DiscreteFunctionDPkVariant.hpp> -#include <scheme/DiscreteFunctionDPkVector.hpp> #include <scheme/DiscreteFunctionUtils.hpp> #include <scheme/InflowListBoundaryConditionDescriptor.hpp> -#include <scheme/PolynomialReconstruction.hpp> -#include <utils/PugsTraits.hpp> #include <variant> template <MeshConcept MeshTypeT> @@ -602,517 +597,6 @@ class RusanovEulerianCompositeSolver_v2 return (gam - 1) * rho * epsilon; } - // void - // computeLimitorVolumicScalarQuantityMinModDukowicz(const DiscreteFunctionDPk<Dimension, double>& q_bar, - // CellValue<double>& Limitor_q) const - void - computeLimitorVolumicScalarQuantityMinModDukowiczGradient(const MeshType& mesh, - const CellValue<double>& q, - const CellValue<Rd>& gradq, - CellValue<double>& Limitor_q, - const bool enableWeakBoundPositivityOnly = false) const - { - Assert(Dimension == 2 or Dimension == 3); - const auto& cell_to_node_matrix = mesh.connectivity().cellToNodeMatrix(); - const auto& cell_to_face_matrix = mesh.connectivity().cellToFaceMatrix(); - const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); - - const auto& xr = mesh.xr(); - - MeshData<MeshType>& mesh_data = MeshDataManager::instance().getMeshData(mesh); - - // auto volumes_cell = mesh_data.Vj(); - - const auto& xcentroid = mesh_data.xj(); - const auto& xface = mesh_data.xl(); - - if (Dimension == 2) { - parallel_for( - mesh.numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j] - rho[j]); }); - const double State = q[j]; - const Rd& Cent = xcentroid[j]; // mesh.xi(j); - const Rd& Gradl = gradq[j]; - - // Min et Max des valeurs voisines - - double minvalvois(State); - double maxvalvois(State); - - // Calcul des extremas de la fonction - - double minval(std::numeric_limits<double>::max()); - double maxval(-std::numeric_limits<double>::max()); - - // At nodes - const auto& cell_to_node = cell_to_node_matrix[j]; - // At faces - const auto& cell_to_face = cell_to_face_matrix[j]; - - for (size_t l = 0; l < cell_to_node.size(); ++l) { - const NodeId& node = cell_to_node[l]; - const auto& node_to_cell = node_to_cell_matrix[node]; - - for (size_t k = 0; k < node_to_cell.size(); ++k) { - const CellId& cellvois = node_to_cell[k]; - const double statevoiscell = q[cellvois]; - const Rd Centvois = xcentroid[cellvois]; // mesh.element()[mayvois].centroid().x(); - const Rd Mvois(Centvois - Cent); - - const double valVois = State + dot(Gradl, Mvois); // Partie MinMod - - minval = std::min(minval, valVois); - maxval = std::max(maxval, valVois); - - minvalvois = std::min(minvalvois, statevoiscell); - maxvalvois = std::max(maxvalvois, statevoiscell); - } - - const Rd M(xr[node] - Cent); - - const double valLineO2node = State + dot(Gradl, M); // Partie Dukowicz - - minval = std::min(minval, valLineO2node); - maxval = std::max(maxval, valLineO2node); - } - - for (size_t l = 0; l < cell_to_face.size(); ++l) { - const FaceId& face = cell_to_face[l]; - - const Rd Mb(xface[face] - Cent); - - const double valLineO2bras = State + dot(Gradl, Mb); // Idem aux demi faces - - minval = std::min(minval, valLineO2bras); - maxval = std::max(maxval, valLineO2bras); - } - - static const double epsZer0 = 1e-15; - // on applique le traitement idem de l'ordre 2.. - double coef1 = 0, coef2 = 0; - if (enableWeakBoundPositivityOnly) { - coef1 = 1; - const double minGlobal = 1e-12; - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minGlobal - State) / ((minval - State)); - - } else { - if (std::fabs(maxval - State) <= epsZer0) // epsIsEqualAbs()) - coef1 = 1.; - else - coef1 = (maxvalvois - State) / ((maxval - State)); - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minvalvois - State) / ((minval - State)); - } - const double alfa = std::max(0., std::min(1., std::min(coef1, coef2))); - - Limitor_q[j] = alfa; - // grad(i) *= alfa; - }); - } else { - // throw NormalError(" Limiteur Scal Grad non encore implemente 3D"); - const auto& cell_to_edge_matrix = mesh.connectivity().cellToEdgeMatrix(); - const auto& xedge = mesh_data.xe(); - - parallel_for( - mesh.numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j] - rho[j]); }); - const double State = q[j]; - const Rd& Cent = xcentroid[j]; // mesh.xi(j); - const Rd& Gradl = gradq[j]; - - // Min et Max des valeurs voisines - - double minvalvois(State); - double maxvalvois(State); - - // Calcul des extremas de la fonction - - double minval(std::numeric_limits<double>::max()); - double maxval(-std::numeric_limits<double>::max()); - - // At nodes - const auto& cell_to_node = cell_to_node_matrix[j]; - // At faces - const auto& cell_to_face = cell_to_face_matrix[j]; - // At faces - const auto& cell_to_edge = cell_to_edge_matrix[j]; - - for (size_t l = 0; l < cell_to_node.size(); ++l) { - const NodeId& node = cell_to_node[l]; - const auto& node_to_cell = node_to_cell_matrix[node]; - - for (size_t k = 0; k < node_to_cell.size(); ++k) { - const CellId& cellvois = node_to_cell[k]; - const double statevoiscell = q[cellvois]; - const Rd Centvois = xcentroid[cellvois]; // mesh.element()[mayvois].centroid().x(); - const Rd Mvois(Centvois - Cent); - - const double valVois = State + dot(Gradl, Mvois); // Partie MinMod - - minval = std::min(minval, valVois); - maxval = std::max(maxval, valVois); - - minvalvois = std::min(minvalvois, statevoiscell); - maxvalvois = std::max(maxvalvois, statevoiscell); - } - - const Rd M(xr[node] - Cent); - - const double valLineO2node = State + dot(Gradl, M); // Partie Dukowicz - - minval = std::min(minval, valLineO2node); - maxval = std::max(maxval, valLineO2node); - } - - for (size_t l = 0; l < cell_to_face.size(); ++l) { - const FaceId& face = cell_to_face[l]; - - const Rd Mb(xface[face] - Cent); - - const double valLineO2face = State + dot(Gradl, Mb); // Idem aux demi faces - - minval = std::min(minval, valLineO2face); - maxval = std::max(maxval, valLineO2face); - } - - for (size_t l = 0; l < cell_to_edge.size(); ++l) { - const EdgeId& edge = cell_to_edge[l]; - - const Rd Me(xedge[edge] - Cent); - - const double valLineO2edge = State + dot(Gradl, Me); // Idem aux demi faces - - minval = std::min(minval, valLineO2edge); - maxval = std::max(maxval, valLineO2edge); - } - - static const double epsZer0 = 1e-15; - // on applique le traitement idem de l'ordre 2.. - double coef1 = 0, coef2 = 0; - if (enableWeakBoundPositivityOnly) { - coef1 = 1; - const double minGlobal = 1e-12; - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minGlobal - State) / ((minval - State)); - - } else { - if (std::fabs(maxval - State) <= epsZer0) // epsIsEqualAbs()) - coef1 = 1.; - else - coef1 = (maxvalvois - State) / ((maxval - State)); - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minvalvois - State) / ((minval - State)); - } - const double alfa = std::max(0., std::min(1., std::min(coef1, coef2))); - - Limitor_q[j] = alfa; - // grad(i) *= alfa; - }); - } - } - - void - computeLimitorInternalNrjScalarQuantityMinModDukowiczGradient(const MeshType& mesh, - const CellValue<double>& rho, - const CellValue<Rd>& gradrho, - const CellValue<double>& internalnrj, - const CellValue<Rd>& gradinternalnrj, - // const CellValue<Rd>& u, - const CellValue<Rdxd>& gradu, - CellValue<double>& Limitor_eps, - const bool enableWeakBoundPositivityOnly = false) const - { - Assert(Dimension == 2 or Dimension == 3); - const auto& cell_to_node_matrix = mesh.connectivity().cellToNodeMatrix(); - const auto& cell_to_face_matrix = mesh.connectivity().cellToFaceMatrix(); - const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); - const auto& xr = mesh.xr(); - - MeshData<MeshType>& mesh_data = MeshDataManager::instance().getMeshData(mesh); - - const auto& xcentroid = mesh_data.xj(); - const auto& xface = mesh_data.xl(); - - if (Dimension == 2) { - parallel_for( - mesh.numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j] - rho[j]); }); - const double rhol = rho[j]; - const Rd& Cent = xcentroid[j]; - const Rd& grad_rhol = gradrho[j]; - - // const Rd& ul = u[j]; - const Rdxd& grad_ul = gradu[j]; - - const double internal_nrj = internalnrj[j]; - // const double kinetic_nrj = .5 * dot(ul, ul); - - const Rd& grad_internal_nrj = gradinternalnrj[j]; - - // const Rd& grad_kinetic_internal_nrj = gradeps[j]; - - // const double qtt_limitor_density = rhol / (rhol + dot(grad,(x-xc)); - // At nodes - const auto& cell_to_node = cell_to_node_matrix[j]; - // At faces - const auto& cell_to_face = cell_to_face_matrix[j]; - - // Min et Max des valeurs voisines - const double State = internal_nrj; - - double minvalvois(State); - double maxvalvois(State); - - // Calcul des extremas de la fonction - - double minval(std::numeric_limits<double>::max()); - double maxval(-std::numeric_limits<double>::max()); - - for (size_t l = 0; l < cell_to_node.size(); ++l) { - const NodeId& node = cell_to_node[l]; - const auto& node_to_cell = node_to_cell_matrix[node]; - - for (size_t k = 0; k < node_to_cell.size(); ++k) { - const CellId& cellvois = node_to_cell[k]; - const Rd Centvois = xcentroid[cellvois]; - const Rd Mvois(Centvois - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mvois)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mvois); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mvois); - - const double valVois = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie MinMod - - minval = std::min(minval, valVois); - maxval = std::max(maxval, valVois); - - const double statevoiscell = internalnrj[cellvois]; - - minvalvois = std::min(minvalvois, statevoiscell); - maxvalvois = std::max(maxvalvois, statevoiscell); - } - - const Rd Mr(xr[node] - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mr)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mr); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mr); - - const double valLineO2node = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie Dukowicz - - minval = std::min(minval, valLineO2node); - maxval = std::max(maxval, valLineO2node); - } - - for (size_t l = 0; l < cell_to_face.size(); ++l) { - const FaceId& face = cell_to_face[l]; - - const Rd Mb(xface[face] - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mb)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mb); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mb); - - const double valLineO2face = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie Dukowicz - - minval = std::min(minval, valLineO2face); - maxval = std::max(maxval, valLineO2face); - } - - static const double epsZer0 = 1e-15; - - // on applique le traitement idem de l'ordre 2.. - double coef1 = 0, coef2 = 0; - if (enableWeakBoundPositivityOnly) { - coef1 = 1; - const double minGlobal = 1e-12; - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minGlobal - State) / ((minval - State)); - - } else { - if (std::fabs(maxval - State) <= epsZer0) // epsIsEqualAbs()) - coef1 = 1.; - else - coef1 = (maxvalvois - State) / ((maxval - State)); - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minvalvois - State) / ((minval - State)); - } - const double alfa = std::max(0., std::min(1., std::min(coef1, coef2))); - - Limitor_eps[j] = alfa; - }); - } else { - // throw NormalError(" Limiteur Scal Grad internal nrj non encore implemente 3D"); - const auto& cell_to_edge_matrix = mesh.connectivity().cellToEdgeMatrix(); - - const auto& xedge = mesh_data.xe(); - - parallel_for( - mesh.numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j] - rho[j]); }); - const double rhol = rho[j]; - const Rd& Cent = xcentroid[j]; - const Rd& grad_rhol = gradrho[j]; - - // const Rd& ul = u[j]; - const Rdxd& grad_ul = gradu[j]; - - const double internal_nrj = internalnrj[j]; - // const double kinetic_nrj = .5 * dot(ul, ul); - - const Rd& grad_internal_nrj = gradinternalnrj[j]; - - // const Rd& grad_kinetic_internal_nrj = gradeps[j]; - - // const double qtt_limitor_density = rhol / (rhol + dot(grad,(x-xc)); - // At nodes - const auto& cell_to_node = cell_to_node_matrix[j]; - // At faces - const auto& cell_to_face = cell_to_face_matrix[j]; - // At edges - const auto& cell_to_edge = cell_to_edge_matrix[j]; - - // Min et Max des valeurs voisines - const double State = internal_nrj; - - double minvalvois(State); - double maxvalvois(State); - - // Calcul des extremas de la fonction - - double minval(std::numeric_limits<double>::max()); - double maxval(-std::numeric_limits<double>::max()); - - for (size_t l = 0; l < cell_to_node.size(); ++l) { - const NodeId& node = cell_to_node[l]; - const auto& node_to_cell = node_to_cell_matrix[node]; - - for (size_t k = 0; k < node_to_cell.size(); ++k) { - const CellId& cellvois = node_to_cell[k]; - const Rd Centvois = xcentroid[cellvois]; - const Rd Mvois(Centvois - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mvois)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mvois); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mvois); - - const double valVois = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie MinMod - - minval = std::min(minval, valVois); - maxval = std::max(maxval, valVois); - - const double statevoiscell = internalnrj[cellvois]; - - minvalvois = std::min(minvalvois, statevoiscell); - maxvalvois = std::max(maxvalvois, statevoiscell); - } - - const Rd Mr(xr[node] - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mr)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mr); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mr); - - const double valLineO2node = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie Dukowicz - - minval = std::min(minval, valLineO2node); - maxval = std::max(maxval, valLineO2node); - } - - for (size_t l = 0; l < cell_to_face.size(); ++l) { - const FaceId& face = cell_to_face[l]; - - const Rd Mb(xface[face] - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Mb)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Mb); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Mb); - - const double valLineO2face = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie Dukowicz - - minval = std::min(minval, valLineO2face); - maxval = std::max(maxval, valLineO2face); - } - - for (size_t l = 0; l < cell_to_edge.size(); ++l) { - const EdgeId& edge = cell_to_edge[l]; - - const Rd Me(xedge[edge] - Cent); - - const double qtt_limitor_density = rhol / (rhol + dot(grad_rhol, Me)); - - const Rd& High_ordervelocity = qtt_limitor_density * (grad_ul * Me); - const double High_orderinternalnrj = qtt_limitor_density * dot(grad_internal_nrj, Me); - - const double valLineO2edge = internal_nrj + High_orderinternalnrj - - .5 * dot(High_ordervelocity, High_ordervelocity); // Partie Dukowicz - - minval = std::min(minval, valLineO2edge); - maxval = std::max(maxval, valLineO2edge); - } - - static const double epsZer0 = 1e-15; - - // on applique le traitement idem de l'ordre 2.. - double coef1 = 0, coef2 = 0; - if (enableWeakBoundPositivityOnly) { - coef1 = 1; - const double minGlobal = 1e-12; - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minGlobal - State) / ((minval - State)); - - } else { - if (std::fabs(maxval - State) <= epsZer0) // epsIsEqualAbs()) - coef1 = 1.; - else - coef1 = (maxvalvois - State) / ((maxval - State)); - - if (std::fabs(minval - State) <= epsZer0) // epsIsEqualAbs()) - coef2 = 1.; - else - coef2 = (minvalvois - State) / ((minval - State)); - } - const double alfa = std::max(0., std::min(1., std::min(coef1, coef2))); - - Limitor_eps[j] = alfa; - }); - } - } - std::tuple<std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>, std::shared_ptr<const DiscreteFunctionVariant>> @@ -1131,126 +615,6 @@ class RusanovEulerianCompositeSolver_v2 auto rho = copy(rho_n); auto u = copy(u_n); auto E = copy(E_n); - // using DiscreteScalarFunction = DiscreteFunctionP0<const double>; - // using DiscreteVectorFunction = DiscreteFunctionP0<const Rd>; - // DiscreteScalarFunction rhoD = rho_n.get<DiscreteScalarFunction>(); - // DiscreteVectorFunction uD = u_n.get<DiscreteVectorFunction>(); - // DiscreteScalarFunction ED = E_n.get<DiscreteScalarFunction>(); - - std::vector<std::shared_ptr<const IBoundaryDescriptor>> symmetry_boundary_descriptor_list; - - for (auto&& bc_descriptor : bc_descriptor_list) { - if (bc_descriptor->type() == IBoundaryConditionDescriptor::Type::symmetry) { - symmetry_boundary_descriptor_list.push_back(bc_descriptor->boundaryDescriptor_shared()); - } - } - // static const int degree = 1; - PolynomialReconstructionDescriptor - reconstruction_descriptor(IntegrationMethodType::cell_center, // IntegrationMethodType::boundary, - degree, symmetry_boundary_descriptor_list); - // - // - // - CellValue<double> valrho({p_mesh->connectivity()}); - CellValue<Rd> valu({p_mesh->connectivity()}); - CellValue<double> valeps({p_mesh->connectivity()}); - parallel_for( - p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { - valrho[j] = rho[j]; - valu[j] = u[j]; - valeps[j] = E[j] - .5 * dot(u[j], u[j]); - }); - - DiscreteFunctionP0<double> eps(p_mesh, valeps); - - // assemblage direct - // auto reconstructions = PolynomialReconstruction{reconstruction_descriptor}.build(rho, rho * u, rho * E); - - // Pour assemblage Leibniz - // ca calcul au moins les gradients - auto reconstructions = PolynomialReconstruction{reconstruction_descriptor}.build(rho, u, eps); - - DiscreteFunctionDPk rho_bar = reconstructions[0]->template get<DiscreteFunctionDPk<Dimension, const double>>(); - - DiscreteFunctionDPk u_bar = reconstructions[1]->template get<DiscreteFunctionDPk<Dimension, const Rd>>(); - DiscreteFunctionDPk eps_bar = reconstructions[2]->template get<DiscreteFunctionDPk<Dimension, const double>>(); - - // DiscreteFunctionDPk rho_u_bar = reconstructions[1]->template get<DiscreteFunctionDPk<Dimension, const Rd>>(); - // DiscreteFunctionDPk rho_E_bar = reconstructions[2]->template get<DiscreteFunctionDPk<Dimension, const double>>(); - - CellValue<double> Limitor_rho(p_mesh->connectivity()); - CellValue<double> Limitor_u(p_mesh->connectivity()); - CellValue<double> Limitor_eps(p_mesh->connectivity()); - - CellValue<Rd> grad_rho_cell(p_mesh->connectivity()); - CellValue<Rdxd> grad_u_cell(p_mesh->connectivity()); - CellValue<Rd> grad_eps_cell(p_mesh->connectivity()); - - // DiscreteFunctionDPk<Dimension, const double> rho_bar_lim; - parallel_for( - p_mesh->numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j](x) - rho[j]); - for (size_t dim = 0; dim < Dimension; ++dim) { - grad_rho_cell[j][dim] = rho_bar.coefficients(j)[1 + dim]; // si base : x, puis y , puis z - grad_eps_cell[j][dim] = eps_bar.coefficients(j)[1 + dim]; // idem ci dessus - const Rd gradu = u_bar.coefficients(j)[1 + dim]; - for (size_t dim2 = 0; dim2 < Dimension; ++dim2) { - grad_u_cell[j](dim, dim2) = gradu[dim2]; - } - } - grad_u_cell[j] = transpose(grad_u_cell[j]); - }); - - // Appels des limiteurs cell by cell - // Pour rho (plus ou moins classique) - computeLimitorVolumicScalarQuantityMinModDukowiczGradient(*p_mesh, valrho, grad_rho_cell, Limitor_rho); - - // Pour les variables d'interet (physique) - // Pour eps ici G.P. (avec Leibniz et toute l artillerie) - computeLimitorInternalNrjScalarQuantityMinModDukowiczGradient(*p_mesh, valrho, grad_rho_cell, valeps, grad_eps_cell, - // valu, - grad_u_cell, Limitor_eps); - // Pour u : relation deduite du principe d'induction - parallel_for( - p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { Limitor_u[j] = sqrt(Limitor_eps[j]); }); - - // - // Creation des variables conservatives limitées - // - auto rho_bar_lim = copy(rho_bar); - auto rho_u_bar_lim = copy(u_bar); // a modifier .. du a la densite - auto rho_E_bar_lim = copy(eps_bar); // a modifier et a completer : densité et energie cinetique - - // Assemblage des ctes et ordres élevés - parallel_for( - p_mesh->numberOfCells(), - PUGS_LAMBDA(CellId j) { // rho_bar_lim[j] = rho[j] + Limitor_rho[j] * (rho_bar[j](x) - rho[j]); - // rho_u_bar_lim.coefficients(j)[0] = valrho[j] * valu[j]; // * valu[j]; - // rho_E_bar_lim.coefficients(j)[0] = valrho[j] * (valeps[j] + .5 * dot(valu[j], valu[j])); - - // rho_bar_lim.coefficients(j)[0] // cte inchangée - rho_u_bar_lim.coefficients(j)[0] *= valrho[j]; // du coup (rho u) - rho_E_bar_lim.coefficients(j)[0] *= valrho[j]; // du coup (rho*epsilon) - rho_E_bar_lim.coefficients(j)[0] += valrho[j] * .5 * dot(valu[j], valu[j]); - // Rdxd grad_rhou_lim= - // valrho[j]*Limitor_u[j]*grad_u_cell[j]+Limitor_rho[j]*tensorProduct(valu[j],grad_rho_cell[j]); - // - Rdxd gradU_lim_transpose = Limitor_u[j] * transpose(grad_u_cell[j]); - const Rd gradUtu_lim = gradU_lim_transpose * valu[j]; - - for (size_t dim = 0; dim < Dimension; ++dim) { - rho_bar_lim.coefficients(j)[1 + dim] *= Limitor_rho[j]; - rho_u_bar_lim.coefficients(j)[1 + dim] *= Limitor_u[j] * valrho[j]; // c'est la partie gradu limite - rho_u_bar_lim.coefficients(j)[1 + dim] += Limitor_rho[j] * grad_rho_cell[j][dim] * valu[j]; - - rho_E_bar_lim.coefficients(j)[1 + dim] *= Limitor_eps[j] * valrho[j]; - rho_E_bar_lim.coefficients(j)[1 + dim] += gradUtu_lim[dim] * valrho[j]; - - rho_E_bar_lim.coefficients(j)[1 + dim] += - (valeps[j] + .5 * dot(valu[j], valu[j])) * Limitor_rho[j] * grad_rho_cell[j][dim]; - } - }); - // auto c = copy(c_n); // auto p = copy(p_n); @@ -1281,59 +645,23 @@ class RusanovEulerianCompositeSolver_v2 const auto& cell_to_edge_matrix = p_mesh->connectivity().cellToEdgeMatrix(); const auto& cell_to_face_matrix = p_mesh->connectivity().cellToFaceMatrix(); - const auto xr = p_mesh->xr(); - auto xl = MeshDataManager::instance().getMeshData(*p_mesh).xl(); - auto xe = MeshDataManager::instance().getMeshData(*p_mesh).xe(); + // const auto xr = p_mesh->xr(); + // auto xl = MeshDataManager::instance().getMeshData(*p_mesh).xl(); + // auto xe = MeshDataManager::instance().getMeshData(*p_mesh).xe(); NodeValuePerCell<Rp> StateAtNode{p_mesh->connectivity()}; StateAtNode.fill(zero); parallel_for( - p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { - // StateAtNode[j].fill(State[j]); - const auto& cell_to_node = cell_to_node_matrix[j]; - - for (size_t l = 0; l < cell_to_node.size(); ++l) { - const NodeId& node = cell_to_node[l]; - - StateAtNode[j][l][0] = rho_bar_lim[j](xr[node]); - for (size_t dim = 0; dim < Dimension; ++dim) - StateAtNode[j][l][1 + dim] = rho_u_bar_lim[j](xr[node])[dim]; - StateAtNode[j][l][1 + Dimension] = rho_E_bar_lim[j](xr[node]); - } - }); + p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { StateAtNode[j].fill(State[j]); }); EdgeValuePerCell<Rp> StateAtEdge{p_mesh->connectivity()}; StateAtEdge.fill(zero); parallel_for( - p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { - // eStateAtEdge[j].fill(State[j]); - const auto& cell_to_edge = cell_to_edge_matrix[j]; - - for (size_t l = 0; l < cell_to_edge.size(); ++l) { - const EdgeId& edge = cell_to_edge[l]; - - StateAtEdge[j][l][0] = rho_bar_lim[j](xe[edge]); - for (size_t dim = 0; dim < Dimension; ++dim) - StateAtEdge[j][l][1 + dim] = rho_u_bar_lim[j](xe[edge])[dim]; - StateAtEdge[j][l][1 + Dimension] = rho_E_bar_lim[j](xe[edge]); - } - }); + p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { StateAtEdge[j].fill(State[j]); }); FaceValuePerCell<Rp> StateAtFace{p_mesh->connectivity()}; StateAtFace.fill(zero); parallel_for( - p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { - // StateAtFace[j].fill(State[j]); - const auto& cell_to_face = cell_to_face_matrix[j]; - - for (size_t l = 0; l < cell_to_face.size(); ++l) { - const FaceId& face = cell_to_face[l]; - - StateAtFace[j][l][0] = rho_bar_lim[j](xl[face]); - for (size_t dim = 0; dim < Dimension; ++dim) - StateAtFace[j][l][1 + dim] = rho_u_bar_lim[j](xl[face])[dim]; - StateAtFace[j][l][1 + Dimension] = rho_E_bar_lim[j](xl[face]); - } - }); + p_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { StateAtFace[j].fill(State[j]); }); // Conditions aux limites des etats conservatifs -- GitLab