diff --git a/src/scheme/EulerKineticSolverLagrangeMultiDLocalOrder2Periodic.cpp b/src/scheme/EulerKineticSolverLagrangeMultiDLocalOrder2Periodic.cpp index 46682295729de63aa20b00505e66ad9737e28a25..4f5e5e68973505be7e23a96778b281e1de90f442 100644 --- a/src/scheme/EulerKineticSolverLagrangeMultiDLocalOrder2Periodic.cpp +++ b/src/scheme/EulerKineticSolverLagrangeMultiDLocalOrder2Periodic.cpp @@ -61,6 +61,8 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic const auto& node_local_numbers_in_their_cells = p_mesh->connectivity().nodeLocalNumbersInTheirCells(); const auto& node_to_cell_matrix = p_mesh->connectivity().nodeToCellMatrix(); + NodeArray<double> sum_j_li_njr(m_mesh.connectivity(), nb_waves); + Fr.fill(0.); parallel_for( @@ -97,6 +99,26 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic sum_li_njr += li_njr; } } + sum_j_li_njr[node_id][i_wave] = sum_li_njr; + } + }); + + // Periodic BC + for (size_t i = 0; i < Fr.sizeOfArrays(); ++i) { + auto F = Fr[NodeId{0}][i] + Fr[NodeId(m_mesh.numberOfNodes() - 1)][i]; + Fr[NodeId{0}][i] = F; + Fr[NodeId(m_mesh.numberOfNodes() - 1)][i] = F; + + auto s = sum_j_li_njr[NodeId{0}][i] + sum_j_li_njr[NodeId(m_mesh.numberOfNodes() - 1)][i]; + + sum_j_li_njr[NodeId{0}][i] = s; + sum_j_li_njr[NodeId(m_mesh.numberOfNodes() - 1)][i] = s; + } + + parallel_for( + m_mesh.numberOfNodes(), PUGS_LAMBDA(const NodeId node_id) { + for (size_t i_wave = 0; i_wave < nb_waves; ++i_wave) { + const double sum_li_njr = sum_j_li_njr[node_id][i_wave]; if (sum_li_njr != 0) { Fr[node_id][i_wave] = 1. / sum_li_njr * Fr[node_id][i_wave]; } @@ -117,6 +139,8 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic const auto& node_local_numbers_in_their_cells = p_mesh->connectivity().nodeLocalNumbersInTheirCells(); const auto& node_to_cell_matrix = p_mesh->connectivity().nodeToCellMatrix(); + NodeArray<double> sum_j_li_njr(m_mesh.connectivity(), nb_waves); + Fr.fill(zero); parallel_for( @@ -151,6 +175,26 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic sum_li_njr += li_njr; } } + sum_j_li_njr[node_id][i_wave] = sum_li_njr; + } + }); + + // Periodic BC + for (size_t i = 0; i < Fr.sizeOfArrays(); ++i) { + auto F = Fr[NodeId{0}][i] + Fr[NodeId(m_mesh.numberOfNodes() - 1)][i]; + Fr[NodeId{0}][i] = F; + Fr[NodeId(m_mesh.numberOfNodes() - 1)][i] = F; + + auto s = sum_j_li_njr[NodeId{0}][i] + sum_j_li_njr[NodeId(m_mesh.numberOfNodes() - 1)][i]; + + sum_j_li_njr[NodeId{0}][i] = s; + sum_j_li_njr[NodeId(m_mesh.numberOfNodes() - 1)][i] = s; + } + + parallel_for( + m_mesh.numberOfNodes(), PUGS_LAMBDA(const NodeId node_id) { + for (size_t i_wave = 0; i_wave < nb_waves; ++i_wave) { + const double sum_li_njr = sum_j_li_njr[node_id][i_wave]; if (sum_li_njr != 0) { Fr[node_id][i_wave] = 1. / sum_li_njr * Fr[node_id][i_wave]; } @@ -176,6 +220,7 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic } u[node_id] = inv_lambda_squared * u[node_id]; }); + return u; } @@ -322,6 +367,13 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic } if constexpr (Dimension == 1) { + if (node_id == 0) { + lambda_r = std::max(lambda_r, lambda_j[CellId(m_mesh.numberOfCells() - 1)]); + } + if (node_id == m_mesh.numberOfNodes() - 1) { + lambda_r = std::max(lambda_r, lambda_j[CellId(0)]); + } + for (size_t i_wave = 0; i_wave < m_k; ++i_wave) { lambda_vector[node_id][i_wave][0] = lambda_r * (1 - 2. * i_wave / (m_k - 1)); } @@ -349,7 +401,6 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic }); return lambda_vector; } - void scalar_limiter(const CellValue<const double>& u, DiscreteFunctionDPk<Dimension, double>& DPk_uh) const { @@ -451,7 +502,7 @@ class EulerKineticSolverLagrangeMultiDLocalOrder2Periodic std::shared_ptr<const DiscreteFunctionVariant>> apply() { - const bool limitation = true; + const bool limitation = false; const CellValue<double> rho = copy(m_rho); const CellValue<TinyVector<Dimension>> u = copy(m_u);