diff --git a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp index ce30fc3520ff3d9239a8cbbec3f539fcdfaf6466..8752bbecf4d17c54183babdde52addb24bc7e362 100644 --- a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp +++ b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2.cpp @@ -352,7 +352,7 @@ class RoeViscousFormEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -459,7 +459,7 @@ class RoeViscousFormEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -519,34 +519,62 @@ class RoeViscousFormEulerianCompositeSolver_v2 // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { const NodeId node_id = node_list[i_node]; - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + + break; + } + } } - normal *= 1. / node_cell_list.size(); + + 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]; @@ -579,7 +607,7 @@ class RoeViscousFormEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -592,27 +620,52 @@ class RoeViscousFormEulerianCompositeSolver_v2 const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); - const auto Cje = mesh_data.Cje(); + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); + + const auto& edge_list = bc.edgeList(); for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { const EdgeId edge_id = edge_list[i_edge]; - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; - - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; diff --git a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp index d22e940a9c3d53575747cf3d09bb1160377f209a..b164663491b3753fb4a1b49dac507f01c554ce27 100644 --- a/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp +++ b/src/scheme/RoeViscousFormEulerianCompositeSolver_v2_o2.cpp @@ -360,7 +360,7 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -467,7 +467,7 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -527,35 +527,60 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { - const NodeId node_id = node_list[i_node]; - - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const NodeId node_id = node_list[i_node]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + + break; + } + } } - normal *= 1. / node_cell_list.size(); - normal *= 1. / l2Norm(normal); + 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]; @@ -587,7 +612,7 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -600,27 +625,52 @@ class RoeViscousFormEulerianCompositeSolver_v2_o2 const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); + + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); - const auto Cje = mesh_data.Cje(); + const auto& edge_list = bc.edgeList(); for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { const EdgeId edge_id = edge_list[i_edge]; - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); - - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; @@ -944,7 +994,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 a13b34fb94582505b86683af9eed5efdca6f8af3..8374ae71679e9383c97ddb29546c954b5b352556 100644 --- a/src/scheme/RusanovEulerianCompositeSolver.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver.cpp @@ -185,34 +185,61 @@ class RusanovEulerianCompositeSolver // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { const NodeId node_id = node_list[i_node]; - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / node_cell_list.size(); + + 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]; @@ -245,7 +272,7 @@ class RusanovEulerianCompositeSolver Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -258,27 +285,51 @@ class RusanovEulerianCompositeSolver const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); - const auto Cje = mesh_data.Cje(); + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); - for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { - const EdgeId edge_id = edge_list[i_edge]; - - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + const auto& edge_list = bc.edgeList(); - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { + const EdgeId edge_id = edge_list[i_edge]; + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; @@ -354,7 +405,8 @@ class RusanovEulerianCompositeSolver 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]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // + node_array_list[i_node][dim]; } } @@ -466,7 +518,8 @@ class RusanovEulerianCompositeSolver 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]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // + // node_array_list[i_node][dim]; } } @@ -481,7 +534,7 @@ class RusanovEulerianCompositeSolver Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -573,7 +626,8 @@ class RusanovEulerianCompositeSolver 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]; + // stateNode[node_cell_id][node_local_number_in_cell][dim] = 0; // + // node_array_list[i_node][dim]; } } @@ -588,7 +642,7 @@ class RusanovEulerianCompositeSolver Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -1215,7 +1269,8 @@ class RusanovEulerianCompositeSolver } /* std::cout << " maxErr face " << xl[l] << " err " << l2Norm(SumGjf) << " size face cell" - << face_to_cell.size() << " Cell " << face_to_cell[0] << " / " << face_to_cell[1] << " Cjf0 " + << face_to_cell.size() << " Cell " << face_to_cell[0] << " / " << face_to_cell[1] << " Cjf0 + " << Cjf(face_to_cell[0], 0) << " / Cjf1 " << Cjf(face_to_cell[1], 1) << "\n"; if (l2Norm(SumGjf) > 1e-3) diff --git a/src/scheme/RusanovEulerianCompositeSolver_o2.cpp b/src/scheme/RusanovEulerianCompositeSolver_o2.cpp index 867e6c4e5f7c2f9865820e954c26c219800f2cb9..e17e9dc7145e8db3808b972558d3376c572f8f8e 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_o2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_o2.cpp @@ -193,34 +193,61 @@ class RusanovEulerianCompositeSolver_o2 // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { const NodeId node_id = node_list[i_node]; - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / node_cell_list.size(); + + 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]; @@ -253,7 +280,7 @@ class RusanovEulerianCompositeSolver_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -266,27 +293,52 @@ class RusanovEulerianCompositeSolver_o2 const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); + + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); - const auto Cje = mesh_data.Cje(); + const auto& edge_list = bc.edgeList(); for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { const EdgeId edge_id = edge_list[i_edge]; - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; - - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; @@ -489,7 +541,7 @@ class RusanovEulerianCompositeSolver_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -596,7 +648,7 @@ class RusanovEulerianCompositeSolver_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -795,7 +847,8 @@ class RusanovEulerianCompositeSolver_o2 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>>(); + // 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()); diff --git a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp index cde234af1fcfe35fa66938cbc30b5a37942f3392..a68b66b90edaf331b23a3d16218d013856f9c1f2 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_v2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_v2.cpp @@ -185,35 +185,59 @@ class RusanovEulerianCompositeSolver_v2 // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { const NodeId node_id = node_list[i_node]; - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; - normal *= 1. / node_cell_list.size(); 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]; @@ -246,7 +270,7 @@ class RusanovEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -260,27 +284,51 @@ class RusanovEulerianCompositeSolver_v2 const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); - - const auto Cje = mesh_data.Cje(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); - for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { - const EdgeId edge_id = edge_list[i_edge]; + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + const auto& edge_list = bc.edgeList(); - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { + const EdgeId edge_id = edge_list[i_edge]; + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; @@ -302,6 +350,7 @@ class RusanovEulerianCompositeSolver_v2 boundary_condition); } } + void _applyOutflowBoundaryCondition(const BoundaryConditionList& bc_list, const MeshType& mesh, @@ -483,7 +532,7 @@ class RusanovEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -590,7 +639,7 @@ class RusanovEulerianCompositeSolver_v2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; diff --git a/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp b/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp index 7386f4e84451e2d1b99d284df97eb5f9f44693d1..e1c4f46ab1d354587f7e23d54ca430cd0b937b43 100644 --- a/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp +++ b/src/scheme/RusanovEulerianCompositeSolver_v2_o2.cpp @@ -193,34 +193,60 @@ class RusanovEulerianCompositeSolver_v2_o2 // const Rd& normal = bc.outgoingNormal(); const auto& node_to_cell_matrix = mesh.connectivity().nodeToCellMatrix(); + const auto& node_to_face_matrix = mesh.connectivity().nodeToFaceMatrix(); const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix(); const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells(); + const auto& node_local_numbers_in_their_faces = mesh.connectivity().nodeLocalNumbersInTheirFaces(); const auto& face_local_numbers_in_their_cells = mesh.connectivity().faceLocalNumbersInTheirCells(); // const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed(); const auto& face_list = bc.faceList(); const auto& node_list = bc.nodeList(); - const auto Cjr = mesh_data.Cjr(); + // const auto Cjr = mesh_data.Cjr(); const auto Cjf = mesh_data.Cjf(); for (size_t i_node = 0; i_node < node_list.size(); ++i_node) { - const NodeId node_id = node_list[i_node]; - - const auto& node_cell_list = node_to_cell_matrix[node_id]; + const NodeId node_id = node_list[i_node]; + const auto& node_face_list = node_to_face_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); + // const auto& node_local_number_in_its_faces = node_local_numbers_in_their_faces.itemArray(node_id); - // Normal locale approchée + // on va chercher les normale d'une face issue du noeud de CL et contenue dans le faceList Rd normal(zero); - 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 += Cjr(node_cell_id, node_local_number_in_cell); + 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]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (node_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / node_cell_list.size(); + + 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]; @@ -253,7 +279,7 @@ class RusanovEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal; @@ -266,27 +292,51 @@ class RusanovEulerianCompositeSolver_v2_o2 const auto& edge_local_numbers_in_their_cells = mesh.connectivity().edgeLocalNumbersInTheirCells(); - const auto& edge_list = bc.edgeList(); - - const auto Cje = mesh_data.Cje(); + const auto& edge_to_face_matrix = mesh.connectivity().edgeToFaceMatrix(); - for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { - const EdgeId edge_id = edge_list[i_edge]; + const auto& edge_local_numbers_in_their_faces = mesh.connectivity().edgeLocalNumbersInTheirFaces(); - const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + const auto& edge_list = bc.edgeList(); - const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_edge = 0; i_edge < edge_list.size(); ++i_edge) { + const EdgeId edge_id = edge_list[i_edge]; + const auto& edge_face_list = edge_to_face_matrix[edge_id]; - // Normal locale approchée + // on va chercher les normale d'une face issue du edge de CL et contenue dans le faceList Rd normal(zero); - for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { - CellId edge_cell_id = edge_cell_list[i_cell]; - size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; - normal += Cje(edge_cell_id, edge_local_number_in_cell); + int nbnormal = 0; + for (size_t i_face = 0; i_face < edge_face_list.size(); ++i_face) { + FaceId edge_face_id = edge_face_list[i_face]; + + for (size_t i_facebc = 0; i_facebc < face_list.size(); ++i_facebc) { + const FaceId facebc_id = face_list[i_facebc]; + if (edge_face_id == facebc_id) { + const auto& face_cell_list = face_to_cell_matrix[facebc_id]; + Assert(face_cell_list.size() == 1); + + CellId face_cell_id = face_cell_list[0]; + size_t face_local_number_in_cell = face_local_numbers_in_their_cells(facebc_id, 0); + + // Normal locale approchée + Rd normalloc = Cjf(face_cell_id, face_local_number_in_cell); + normalloc *= 1. / l2Norm(normalloc); + normal += normalloc; + ++nbnormal; + break; + } + } } - normal *= 1. / edge_cell_list.size(); + + if (nbnormal == 0) + continue; + normal *= 1. / nbnormal; + normal *= 1. / l2Norm(normal); + const auto& edge_cell_list = edge_to_cell_matrix[edge_id]; + + const auto& edge_local_number_in_its_cells = edge_local_numbers_in_their_cells.itemArray(edge_id); + for (size_t i_cell = 0; i_cell < edge_cell_list.size(); ++i_cell) { CellId edge_cell_id = edge_cell_list[i_cell]; size_t edge_local_number_in_cell = edge_local_number_in_its_cells[i_cell]; @@ -488,7 +538,7 @@ class RusanovEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; Rdxd MatriceProj(identity); MatriceProj -= tensorProduct(normal, normal); @@ -595,7 +645,7 @@ class RusanovEulerianCompositeSolver_v2_o2 Rd vectorSym(zero); for (size_t dim = 0; dim < Dimension; ++dim) - vectorSym[dim] = stateEdge[face_cell_id][face_local_number_in_cell][1 + dim]; + vectorSym[dim] = stateFace[face_cell_id][face_local_number_in_cell][1 + dim]; vectorSym -= dot(vectorSym, normal) * normal;