diff --git a/src/scheme/ScalarHybridScheme.cpp b/src/scheme/ScalarHybridScheme.cpp index ecf6d84ed3bf4e76c150d325c923c024fc3e8365..187d452b65ef2d56d95c7c1d72e25c78df12d1d4 100644 --- a/src/scheme/ScalarHybridScheme.cpp +++ b/src/scheme/ScalarHybridScheme.cpp @@ -1077,14 +1077,15 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH for (size_t i_face = 0; i_face < cell_to_face.size(); ++i_face) { const FaceId face_id = cell_to_face[i_face]; const auto& face_to_node = face_to_node_matrix[face_id]; - - if (face_to_node[0] == node_id or face_to_node[1] == node_id) { - S1(cell_id_j, cell_id_k) += - lambda * dt * (1. - cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * - dot(inverse(node_betar[node_id]) * Cjr(cell_id_k, i_node_k), xj1_xj2_orth(cell_id_j, i_face)); - S2(cell_id_j, cell_id_k) -= - lambda * dt * (cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * - dot(inverse(node_betar[node_id]) * Cjr(cell_id_k, i_node_k), xj1_xj2_orth(cell_id_j, i_face)); + if (not is_boundary_face[face_id]) { + if (face_to_node[0] == node_id or face_to_node[1] == node_id) { + S1(cell_id_j, cell_id_k) += + lambda * dt * (1. - cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * + dot(inverse(node_betar[node_id]) * Cjr(cell_id_k, i_node_k), xj1_xj2_orth(cell_id_j, i_face)); + S2(cell_id_j, cell_id_k) -= + lambda * dt * (cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * + dot(inverse(node_betar[node_id]) * Cjr(cell_id_k, i_node_k), xj1_xj2_orth(cell_id_j, i_face)); + } } } } @@ -1113,6 +1114,29 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH dot(kappar_invBetar[node_id] * (Cjr(cell_id_k, i_node_k) - theta(cell_id_k, i_node_k) / sum_theta[node_id] * sum_Cjr[node_id]), Q * Cjr(cell_id_j, i_node_j)); + + const auto& cell_to_face = cell_to_face_matrix[cell_id_j]; + + for (size_t i_face = 0; i_face < cell_to_face.size(); ++i_face) { + const FaceId face_id = cell_to_face[i_face]; + const auto& face_to_node = face_to_node_matrix[face_id]; + if (not is_boundary_face[face_id]) { + if (face_to_node[0] == node_id or face_to_node[1] == node_id) { + S1(cell_id_j, cell_id_k) += + lambda * dt * (1. - cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * + dot(inverse(node_betar[node_id]) * + (Cjr(cell_id_k, i_node_k) - + theta(cell_id_k, i_node_k) / sum_theta[node_id] * sum_Cjr[node_id]), + xj1_xj2_orth(cell_id_j, i_face)); + S2(cell_id_j, cell_id_k) -= + lambda * dt * (cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * + dot(inverse(node_betar[node_id]) * + (Cjr(cell_id_k, i_node_k) - + theta(cell_id_k, i_node_k) / sum_theta[node_id] * sum_Cjr[node_id]), + xj1_xj2_orth(cell_id_j, i_face)); + } + } + } } } } else if ((node_is_dirichlet[node_id]) && (not node_is_corner[node_id])) { @@ -1136,7 +1160,7 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH for (size_t i_face = 0; i_face < cell_to_face.size(); ++i_face) { const FaceId face_id = cell_to_face[i_face]; const auto& face_to_node = face_to_node_matrix[face_id]; - if (face_is_dirichlet[face_id]) { + if (face_is_dirichlet[face_id] or not is_boundary_face[face_id]) { if (face_to_node[0] == node_id or face_to_node[1] == node_id) { S1(cell_id_j, cell_id_k) += lambda * dt * (1. - cn_coeff / 2.) * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * @@ -1278,7 +1302,28 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH (1. / (sum_theta[node_id] * l2Norm(node_kappar[node_id] * n)) * dot(kappar_invBetar[node_id] * sum_Cjr[node_id], Q * Cjr(cell_id, i_node)) + dot(Cjr(cell_id, i_node), n)); + + const auto& cell_to_face = cell_to_face_matrix[cell_id]; + + for (size_t i_face = 0; i_face < cell_to_face.size(); ++i_face) { + const FaceId face_id = cell_to_face[i_face]; + const auto& face_to_node = face_to_node_matrix[face_id]; + if (not is_boundary_face[face_id]) { + if (face_to_node[0] == node_id or face_to_node[1] == node_id) { + b[cell_id] += lambda * 0.5 * mes_l[face_id] * normal_face_base(cell_id, i_face)[0] * + node_boundary_values[node_id] / + (sum_theta[node_id] * l2Norm(node_kappar[node_id] * n)) * + dot(inverse(node_betar[node_id]) * sum_Cjr[node_id], xj1_xj2_orth(cell_id, i_face)); + // std::cout << "xl - xj2 = " << xl[face_id] - + b_prev[cell_id] += + lambda * 0.5 * mes_l[face_id] * normal_face_base(cell_id, i_face)[0] * + node_boundary_prev_values[node_id] / (sum_theta[node_id] * l2Norm(node_kappar[node_id] * n)) * + dot(inverse(node_betar[node_id]) * sum_Cjr[node_id], xj1_xj2_orth(cell_id, i_face)); + } + } + } } + } else if (node_is_corner[node_id]) { const auto& node_to_face = node_to_face_matrix[node_id]; const CellId cell_id = node_to_cell[0]; @@ -1313,7 +1358,7 @@ class ScalarHybridSchemeHandler::ScalarHybridScheme : public ScalarHybridSchemeH for (size_t i_face = 0; i_face < cell_to_face.size(); ++i_face) { const FaceId face_id = cell_to_face[i_face]; const auto& face_to_node = face_to_node_matrix[face_id]; - if (face_is_dirichlet[face_id]) { + if (face_is_dirichlet[face_id] or not is_boundary_face[face_id]) { if (face_to_node[0] == node_id or face_to_node[1] == node_id) { b[cell_id_j] += lambda * 0.5 * mes_l[face_id] * normal_face_base(cell_id_j, i_face)[0] * node_boundary_values[node_id] *