diff --git a/src/scheme/PolynomialReconstruction.cpp b/src/scheme/PolynomialReconstruction.cpp index 386d741d6f1b73028e50e2d71d87a22cb4183764..a6e35649ef1401bd3eda2b885d6f199be473b7e4 100644 --- a/src/scheme/PolynomialReconstruction.cpp +++ b/src/scheme/PolynomialReconstruction.cpp @@ -291,29 +291,68 @@ _computeEjkMean(const QuadratureFormula<3>& quadrature, const double y_yj = X_Xj[1]; const double z_zj = X_Xj[2]; + size_t n = degree; + std::clog << "DEGREE = " << degree << '\n'; + Array<size_t> yz_begining((n + 2) * (n + 1) / 2 + 1); + Array<size_t> z_index(n + 1); + + { + size_t i_z = 0; + size_t i_yz = 0; + + yz_begining[i_yz++] = 0; + for (ssize_t m = n + 1; m >= 1; --m) { + z_index[i_z++] = i_yz - 1; + for (ssize_t i = m; i >= 1; --i) { + yz_begining[i_yz] = yz_begining[i_yz - 1] + i; + ++i_yz; + } + } + } + + Array<size_t> yz_nb_monomes{yz_begining.size() - 1}; + for (size_t i = 0; i < yz_nb_monomes.size(); ++i) { + yz_nb_monomes[i] = yz_begining[i + 1] - yz_begining[i]; + } + { size_t k = 0; inv_Vj_wq_detJ_ek[k++] = wq * detT / Vi; for (; k <= degree; ++k) { inv_Vj_wq_detJ_ek[k] = x_xj * inv_Vj_wq_detJ_ek[k - 1]; + std::clog << "[" << k << "] <- x*[" << k - 1 << "]\n"; } for (size_t i_y = 1; i_y <= degree; ++i_y) { - const size_t begin_i_y_1 = ((i_y - 1) * (2 * degree - i_y + 4)) / 2; - for (size_t l = 0; l <= degree - i_y; ++l) { + const size_t begin_i_y_1 = yz_begining[i_y - 1]; + std::clog << "COMP 1: " << degree - i_y << " vs " << yz_nb_monomes[i_y] - 1 << '\n'; + for (size_t l = 0; l < yz_nb_monomes[i_y]; ++l) { + std::clog << "[" << k << "] <- y*[" << begin_i_y_1 + l << "]\n"; inv_Vj_wq_detJ_ek[k++] = y_yj * inv_Vj_wq_detJ_ek[begin_i_y_1 + l]; } } for (size_t i_z = 1; i_z <= degree; ++i_z) { - const size_t begin_i_z_1 = ((i_z - 1) * (3 * (degree + 2) * (degree + 3) + (i_z - (3 * degree + 8)) * i_z)) / 6; + const size_t index_z = z_index[i_z]; + const size_t index_z_1 = z_index[i_z - 1]; + std::clog << "index_z_1 = " << index_z_1 << '\n'; + std::clog << "COMP 2: " << degree - i_z << " vs " << yz_nb_monomes[index_z] - 1 << '\n'; for (size_t i_y = 0; i_y <= degree - i_z; ++i_y) { - const size_t begin_i_y_1 = (i_y * (2 * degree - i_y + 3)) / 2 + begin_i_z_1; + const size_t begin_i_yz_1 = yz_begining[index_z_1 + i_y]; + + std::clog << "COMP 3: " << degree - i_y - i_z << " vs " << yz_nb_monomes[index_z + i_y] - 1 << '\n'; for (size_t l = 0; l <= degree - i_y - i_z; ++l) { - inv_Vj_wq_detJ_ek[k++] = z_zj * inv_Vj_wq_detJ_ek[begin_i_y_1 + l]; + std::clog << "[" << k << "] <- z*[" << begin_i_yz_1 + l << "]\n"; + inv_Vj_wq_detJ_ek[k++] = z_zj * inv_Vj_wq_detJ_ek[begin_i_yz_1 + l]; } } } + + std::clog << "z_begining = " << z_index << '\n'; + std::clog << "yz_begining = " << yz_begining << '\n'; + std::clog << "yz_nb_monomes = " << yz_nb_monomes << '\n'; + + std::exit(0); } for (size_t k = 1; k < dimension; ++k) { @@ -1277,6 +1316,29 @@ PolynomialReconstruction::_build( _computeEjkMean(Xj, xr, cell_to_node_matrix[cell_j_id], cell_type[cell_j_id], Vj[cell_j_id], m_descriptor.degree(), basis_dimension, inv_Vj_wq_detJ_ek, mean_j_of_ejk); + auto exact_xz2 = [](const Rd& X) { + const double x0 = X[0] - 0.5; + const double y0 = X[1] - 0.5; + const double z0 = X[2] - 0.5; + const double x1 = X[0] + 0.5; + const double y1 = X[1] + 0.5; + const double z1 = X[2] + 0.5; + return (0.5 * x1 * x1 - 0.5 * x0 * x0) * (1. / 3 * z1 * z1 * z1 - 1. / 3 * z0 * z0 * z0); + }; + auto exact_yz2 = [](const Rd& X) { + const double x0 = X[0] - 0.5; + const double y0 = X[1] - 0.5; + const double z0 = X[2] - 0.5; + const double x1 = X[0] + 0.5; + const double y1 = X[1] + 0.5; + const double z1 = X[2] + 0.5; + return (0.5 * y1 * y1 - 0.5 * y0 * y0) * (1. / 3 * z1 * z1 * z1 - 1. / 3 * z0 * z0 * z0); + }; + if (cell_j_id == 0) { + std::clog << "- mean_j_of_ejk[xz2] = " << mean_j_of_ejk[16] << " vs " << exact_xz2(Xj) << '\n'; + std::clog << "- mean_j_of_ejk[yz2] = " << mean_j_of_ejk[17] << " vs " << exact_yz2(Xj) << '\n'; + } + size_t index = 0; for (size_t i = 0; i < stencil_cell_list.size(); ++i, ++index) { const CellId cell_i_id = stencil_cell_list[i]; @@ -1284,6 +1346,17 @@ PolynomialReconstruction::_build( _computeEjkMean(Xj, xr, cell_to_node_matrix[cell_i_id], cell_type[cell_i_id], Vj[cell_i_id], m_descriptor.degree(), basis_dimension, inv_Vj_wq_detJ_ek, mean_i_of_ejk); + const Rd& Xi = xj[cell_i_id]; + + if (cell_j_id == 0) { + std::clog << "- mean_i_of_ejk[" << rang::fgB::cyan << "xz2" << rang::fg::reset + << "] = " << mean_i_of_ejk[16] << " vs " << exact_xz2(Xi) + << "\tdelta=" << std::abs(mean_i_of_ejk[16] - exact_xz2(Xi)) << '\n'; + std::clog << "- mean_i_of_ejk[" << rang::fgB::yellow << "yz2" << rang::fg::reset + << "] = " << mean_i_of_ejk[17] << " vs " << exact_yz2(Xi) + << "\tdelta=" << std::abs(mean_i_of_ejk[17] - exact_yz2(Xi)) << '\n'; + } + for (size_t l = 0; l < basis_dimension - 1; ++l) { A(index, l) = mean_i_of_ejk[l] - mean_j_of_ejk[l]; } @@ -1383,23 +1456,23 @@ PolynomialReconstruction::_build( } } } else { - Givens::solveCollectionInPlace(A, X, B); #warning REMOVE if (cell_j_id == 0) { - for (size_t l = 0; l < B.numberOfRows(); ++l) { - for (size_t i = 0; i < B.numberOfColumns(); ++i) { - std::clog << "B(" << l << ", " << i << ") =" << B(l, i) << '\n'; - ; - } - } - - for (size_t l = 0; l < X.numberOfRows(); ++l) { - for (size_t i = 0; i < X.numberOfColumns(); ++i) { - std::clog << "X(" << l << ", " << i << ") =" << X(l, i) << '\n'; - ; - } - } + // for (size_t l = 0; l < B.numberOfRows(); ++l) { + // for (size_t i = 0; i < B.numberOfColumns(); ++i) { + // std::clog << "B(" << l << ", " << i << ") =" << B(l, i) << '\n'; + // ; + // } + // } + + // for (size_t l = 0; l < X.numberOfRows(); ++l) { + // for (size_t i = 0; i < X.numberOfColumns(); ++i) { + // std::clog << "X(" << l << ", " << i << ") =" << X(l, i) << '\n'; + // ; + // } + // } } + Givens::solveCollectionInPlace(A, X, B); } column_begin = 0; diff --git a/tests/test_PolynomialReconstruction_degree_3.cpp b/tests/test_PolynomialReconstruction_degree_3.cpp index d04ac14b7282e33e9b35ed2dc7fee18ed9aafb54..4f50a7e46ba2729ff379fcd34879e7ad98fe7724 100644 --- a/tests/test_PolynomialReconstruction_degree_3.cpp +++ b/tests/test_PolynomialReconstruction_degree_3.cpp @@ -464,7 +464,7 @@ TEST_CASE("PolynomialReconstruction_degree_3", "[scheme]") const double y3 = y2 * y; const double z3 = z2 * z; - return (y - 0.5) * (z - 0.5) * (z - 0.5); + return yz2; // return 2.3 + 1.7 * x - 1.3 * y + 2.1 * z // // + 1.7 * x2 + 1.4 * y2 + 1.7 * z2 // @@ -498,10 +498,10 @@ TEST_CASE("PolynomialReconstruction_degree_3", "[scheme]") for (auto named_mesh : MeshDataBaseForTests::get().all3DMeshes()) { SECTION(named_mesh.name()) { - auto p_initial_mesh = - CartesianMeshBuilder{TinyVector<3>{0, 0, 0}, TinyVector<3>{4, 4, 4}, TinyVector<3, size_t>{4, 4, 4}} - .mesh() - ->get<Mesh<3>>(); // named_mesh.mesh()->get<Mesh<3>>(); + auto p_initial_mesh = CartesianMeshBuilder{TinyVector<3>{-0.5, -0.5, -0.5}, + TinyVector<3>{3.5, 3.5, 3.5}, TinyVector<3, size_t>{4, 4, 4}} + .mesh() + ->get<Mesh<3>>(); // named_mesh.mesh()->get<Mesh<3>>(); auto& initial_mesh = *p_initial_mesh; constexpr double theta = 0;