diff --git a/include/ddc/kernels/splines/spline_builder.hpp b/include/ddc/kernels/splines/spline_builder.hpp index 697deb5d3..32344b783 100644 --- a/include/ddc/kernels/splines/spline_builder.hpp +++ b/include/ddc/kernels/splines/spline_builder.hpp @@ -22,7 +22,8 @@ namespace ddc { * An enum determining the backend solver of a SplineBuilder or SplineBuilder2d. */ enum class SplineSolver { - GINKGO ///< Enum member to identify the Ginkgo-based solver (iterative method) + GINKGO, ///< Enum member to identify the Ginkgo-based solver (iterative method) + LAPACK ///< Enum member to identify the LAPACK-based solver (direct method) }; /** @@ -599,10 +600,36 @@ void SplineBuilder< return; */ - matrix = ddc::detail::SplinesLinearProblemMaker::make_new_sparse( - ddc::discrete_space().nbasis(), - cols_per_chunk, - preconditionner_max_block_size); + if constexpr (Solver == ddc::SplineSolver::LAPACK) { + int upper_band_width; + if (bsplines_type::is_uniform()) { + upper_band_width = bsplines_type::degree() / 2; + } else { + upper_band_width = bsplines_type::degree() - 1; + } + if constexpr (bsplines_type::is_periodic()) { + matrix = ddc::detail::SplinesLinearProblemMaker::make_new_periodic_band_matrix< + ExecSpace>( + ddc::discrete_space().nbasis(), + upper_band_width, + upper_band_width, + bsplines_type::is_uniform()); + } else { + matrix = ddc::detail::SplinesLinearProblemMaker:: + make_new_block_matrix_with_band_main_block( + ddc::discrete_space().nbasis(), + upper_band_width, + upper_band_width, + bsplines_type::is_uniform(), + lower_block_size, + upper_block_size); + } + } else if constexpr (Solver == ddc::SplineSolver::GINKGO) { + matrix = ddc::detail::SplinesLinearProblemMaker::make_new_sparse( + ddc::discrete_space().nbasis(), + cols_per_chunk, + preconditionner_max_block_size); + } build_matrix_system(); diff --git a/tests/splines/CMakeLists.txt b/tests/splines/CMakeLists.txt index 785d89819..de6476f24 100644 --- a/tests/splines/CMakeLists.txt +++ b/tests/splines/CMakeLists.txt @@ -101,10 +101,11 @@ foreach(BC "BC_PERIODIC" "BC_GREVILLE") endforeach() endforeach() +# LAPACK foreach(BC "BC_PERIODIC" "BC_GREVILLE" "BC_HERMITE") foreach(DEGREE_X RANGE "${SPLINES_TEST_DEGREE_MIN}" "${SPLINES_TEST_DEGREE_MAX}") foreach(BSPLINES_TYPE "BSPLINES_TYPE_UNIFORM" "BSPLINES_TYPE_NON_UNIFORM") - set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}") + set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}_LAPACK") add_executable("${test_name}" ../main.cpp batched_spline_builder.cpp) target_compile_features("${test_name}" PUBLIC cxx_std_17) target_link_libraries("${test_name}" @@ -112,7 +113,26 @@ foreach(BC "BC_PERIODIC" "BC_GREVILLE" "BC_HERMITE") GTest::gtest DDC::DDC ) - target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC}) + target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC} -DSOLVER_LAPACK) + # add_test("${test_name}" "${test_name}") + gtest_discover_tests("${test_name}" DISCOVERY_MODE PRE_TEST) + endforeach() + endforeach() +endforeach() + +# GINKGO +foreach(BC "BC_PERIODIC" "BC_GREVILLE" "BC_HERMITE") + foreach(DEGREE_X RANGE "${SPLINES_TEST_DEGREE_MIN}" "${SPLINES_TEST_DEGREE_MAX}") + foreach(BSPLINES_TYPE "BSPLINES_TYPE_UNIFORM" "BSPLINES_TYPE_NON_UNIFORM") + set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}_GINKGO") + add_executable("${test_name}" ../main.cpp batched_spline_builder.cpp) + target_compile_features("${test_name}" PUBLIC cxx_std_17) + target_link_libraries("${test_name}" + PUBLIC + GTest::gtest + DDC::DDC + ) + target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC} -DSOLVER_GINKGO) # add_test("${test_name}" "${test_name}") gtest_discover_tests("${test_name}" DISCOVERY_MODE PRE_TEST) endforeach() diff --git a/tests/splines/batched_spline_builder.cpp b/tests/splines/batched_spline_builder.cpp index a714b3660..41d968a60 100644 --- a/tests/splines/batched_spline_builder.cpp +++ b/tests/splines/batched_spline_builder.cpp @@ -231,7 +231,11 @@ static void BatchedSplineTest() IDim, s_bcl, s_bcr, +#if defined(SOLVER_LAPACK) + ddc::SplineSolver::LAPACK, +#elif defined(SOLVER_GINKGO) ddc::SplineSolver::GINKGO, +#endif IDim...> spline_builder(dom_vals); @@ -416,18 +420,30 @@ static void BatchedSplineTest() 1.0e-14 * max_norm_int)); } -#if defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM) -#define SUFFIX(name) name##Periodic##Uniform -#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM) -#define SUFFIX(name) name##Periodic##NonUniform -#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM) -#define SUFFIX(name) name##Greville##Uniform -#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM) -#define SUFFIX(name) name##Greville##NonUniform -#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM) -#define SUFFIX(name) name##Hermite##Uniform -#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM) -#define SUFFIX(name) name##Hermite##NonUniform +#if defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Periodic##Uniform +#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Periodic##NonUniform +#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Greville##Uniform +#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Greville##NonUniform +#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Hermite##Uniform +#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK) +#define SUFFIX(name) name##Lapack##Hermite##NonUniform +#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Periodic##Uniform +#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Periodic##NonUniform +#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Greville##Uniform +#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Greville##NonUniform +#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Hermite##Uniform +#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO) +#define SUFFIX(name) name##Ginkgo##Hermite##NonUniform #endif TEST(SUFFIX(BatchedSplineHost), 1DX)