From 88cddae39abb0796adf0ac9c90b959a97c5f2660 Mon Sep 17 00:00:00 2001 From: HOCH PHILIPPE <philippe.hoch@gmail.com> Date: Tue, 1 Apr 2025 08:38:38 +0200 Subject: [PATCH] New other implementation for Wall boundary at node in 2D .. still need coding in 3D --- ...eViscousFormEulerianCompositeSolver_v2.cpp | 47 ++++++++++-------- ...scousFormEulerianCompositeSolver_v2_o2.cpp | 48 +++++++++++-------- src/scheme/RusanovEulerianCompositeSolver.cpp | 46 ++++++++++-------- .../RusanovEulerianCompositeSolver_o2.cpp | 47 ++++++++++-------- .../RusanovEulerianCompositeSolver_v2.cpp | 46 ++++++++++-------- .../RusanovEulerianCompositeSolver_v2_o2.cpp | 46 ++++++++++-------- 6 files changed, 158 insertions(+), 122 deletions(-) diff --git a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp index 447bab9c..397eb85e 100644 --- a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp +++ b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp @@ -540,11 +540,12 @@ class RoeViscousFormEulerianCompositeSolver_v2 // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -556,32 +557,38 @@ class RoeViscousFormEulerianCompositeSolver_v2 size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; } } - if (l2Norm(normal) == 0.) - continue; + } - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - vectorSym -= dot(vectorSym, normal) * normal; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; - } + vectorSym -= dot(vectorSym, normal) * normal; + + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; } } diff --git a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp index a2d09206..2c9e1711 100644 --- a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp +++ b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp @@ -547,11 +547,12 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -563,31 +564,36 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; } } - if (l2Norm(normal) == 0.) - continue; + } + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - vectorSym -= dot(vectorSym, normal) * normal; + vectorSym -= dot(vectorSym, normal) * normal; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; - } + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; } } @@ -963,7 +969,7 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 const double gammaK, const double cK, const double pK, -*/ + */ const Rd& normal, const bool check = false) const { diff --git a/src/scheme/RusanovEulerianCompositeSolver.cpp b/src/scheme/RusanovEulerianCompositeSolver.cpp index f8d7311e..2bedc887 100644 --- a/src/scheme/RusanovEulerianCompositeSolver.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver.cpp @@ -206,11 +206,12 @@ class RusanovEulerianCompositeSolver // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -222,32 +223,37 @@ class RusanovEulerianCompositeSolver size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; break; } } - if (l2Norm(normal) == 0.) - continue; + } - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - vectorSym -= dot(vectorSym, normal) * normal; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; - } + vectorSym -= dot(vectorSym, normal) * normal; + + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; } } diff --git a/src/scheme/RusanovEulerianCompositeSolver_o2.cpp b/src/scheme/RusanovEulerianCompositeSolver_o2.cpp index 4383a001..6fbaafb7 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_o2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_o2.cpp @@ -214,11 +214,12 @@ class RusanovEulerianCompositeSolver_o2 // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -230,34 +231,40 @@ class RusanovEulerianCompositeSolver_o2 size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; break; } } - if (l2Norm(normal) == 0.) - continue; + } - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - vectorSym -= dot(vectorSym, normal) * normal; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; - } + vectorSym -= dot(vectorSym, normal) * normal; + + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; } } + for (size_t i_face = 0; i_face < face_list.size(); ++i_face) { const FaceId face_id = face_list[i_face]; diff --git a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp index 0fa8469d..af7c70e3 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp @@ -206,11 +206,11 @@ class RusanovEulerianCompositeSolver_v2 // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList - + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -222,32 +222,36 @@ class RusanovEulerianCompositeSolver_v2 size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; break; } } - if (l2Norm(normal) == 0.) - continue; + } + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - vectorSym -= dot(vectorSym, normal) * normal; + vectorSym -= dot(vectorSym, normal) * normal; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = 0; - } + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = 0; } } diff --git a/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp b/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp index 42cb12e5..be4c0495 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp @@ -213,11 +213,12 @@ class RusanovEulerianCompositeSolver_v2_o2 // Assert(face_cell_list.size() == 1); // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // on va chercher la normale d'une face issue du noeud de CL et contenue dans le faceList + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList + Rd normal(zero); + int nbnormal = 0; for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) { FaceId node_face_id = node_face_list[i_face]; - Rd normal(zero); for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { const FaceId facebc_id = face_list[i_facebc]; @@ -229,32 +230,37 @@ class RusanovEulerianCompositeSolver_v2_o2 size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); // Normal locale approchée - normal = Cjf(face_cell_id, face_local_number_in_cell); + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; break; } } - if (l2Norm(normal) == 0.) - continue; + } - normal *= 1. / l2Norm(normal); - const auto& node_cell_list = node_to_cell_matrix[node_id]; - // Assert(face_cell_list.size() == 1); - const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { - CellId node_cell_id = node_cell_list[i_cell]; - size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; + normal *= 1. / l2Norm(normal); + const auto& node_cell_list = node_to_cell_matrix[node_id]; + // Assert(face_cell_list.size() == 1); + const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(node_id); - Rd vectorSym(zero); - for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; + for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) { + CellId node_cell_id = node_cell_list[i_cell]; + size_t node_local_number_in_cell = node_local_number_in_its_cells[i_cell]; - vectorSym -= dot(vectorSym, normal) * normal; + Rd vectorSym(zero); + for (size_t dim = 0; dim < Dimension; ++dim) + vectorSym[dim] = stateNode[node_cell_id][node_local_number_in_cell][1 + dim]; - for (size_t dim = 0; dim < Dimension; ++dim) - stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; - // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; - } + vectorSym -= dot(vectorSym, normal) * normal; + + for (size_t dim = 0; dim < Dimension; ++dim) + stateNode[node_cell_id][node_local_number_in_cell][dim + 1] = vectorSym[dim]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // node_array_list[i_node][dim]; } } -- GitLab