diff --git a/.clang-format b/.clang-format index 34dc6f5..b83306f 100644 --- a/.clang-format +++ b/.clang-format @@ -8,6 +8,7 @@ AllowShortLoopsOnASingleLine: false BreakBeforeBraces: Attach InsertBraces: true ColumnLimit: 100 +ForEachMacros: [ cilk_for ] IncludeCategories: - Regex: '^<' diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 6d3234d..43ee3f4 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -35,7 +35,7 @@ jobs: cmake ../cpp -G Ninja -D CMAKE_BUILD_TYPE=Release -D ENABLE_CILK=OFF ninja - name: benchmark - run: ./cmake-build-release/bench/bench-naive --benchmark_out_format=json --benchmark_out=../bench-naive.json --benchmark_min_time=5x + run: ./cmake-build-release/bench/bench-naive --benchmark_out_format=json --benchmark_out=../bench-naive.json --benchmark_repetitions=10 # Compare to baseline (main) - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 @@ -48,7 +48,7 @@ jobs: cmake ../cpp -G Ninja -D CMAKE_BUILD_TYPE=Release -D ENABLE_CILK=OFF ninja - name: benchmark-main - run: ./cmake-build-release-main/bench/bench-naive --benchmark_out_format=json --benchmark_out=../bench-naive-main.json --benchmark_min_time=5x + run: ./cmake-build-release-main/bench/bench-naive --benchmark_out_format=json --benchmark_out=../bench-naive-main.json --benchmark_repetitions=10 - name: compare-install run: | # Use cmake-build-release-main because cmake-build-release is gone after checkout diff --git a/.idea/misc.xml b/.idea/misc.xml index 09db0d2..4450eaa 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,12 +1,5 @@ - - diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index df267c7..2109770 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -31,8 +31,16 @@ FetchContent_Declare( GIT_TAG e593f6695c6065e6b345fe2862f04a519ed484e0 ) -FetchContent_MakeAvailable(argparse mdspan cnpy spdlog) +FetchContent_Declare( + eve + GIT_REPOSITORY https://github.com/jfalcou/eve.git + GIT_TAG b2d8b637e71d132654c52480549e9b79944d1f74 +) + +option(EVE_BUILD_TEST "Build EVE tests" OFF) +FetchContent_MakeAvailable(argparse mdspan cnpy spdlog eve) target_include_directories(cnpy PUBLIC ${CNPY_SOURCE_DIR}) +#target_include_directories(cnpy-static PUBLIC ${CNPY_SOURCE_DIR}) # ========================== # Project code @@ -44,13 +52,25 @@ target_link_libraries(fftw-cpp INTERFACE mdspan) option(ENABLE_AVX512 "Enable AVX512 instructions (e.g. might want to turn off for the sake of Valgrind)" OFF) if (ENABLE_AVX512) add_compile_options("-mavx512f" "-march=native") + add_compile_definitions(AVX512_ENABLED) endif () option(ENABLE_CILK "Enable Cilk parallelism" ON) +option(ENABLE_CILKSAN "Enable Cilk Sanitizer" OFF) +option(ENABLE_CILKSAN_WORKAROUND "Enable beta feature" OFF) if (ENABLE_CILK) add_compile_options("-fopencilk") add_link_options("-fopencilk") add_compile_definitions(CILK_ENABLED) + if (ENABLE_CILKSAN) + add_compile_options("-fsanitize=cilk") + add_link_options("-fsanitize=cilk") + add_compile_definitions(CILKSAN_ENABLED) + if (ENABLE_CILKSAN_WORKAROUND) + add_compile_options("-mllvm" "-cilksan-bc-path=/opt/OpenCilk-2.0.0/lib/clang/14.0.6/lib/x86_64-unknown-linux-gnu/libcilksan.bc") + add_link_options("-mllvm" "-cilksan-bc-path=/opt/OpenCilk-2.0.0/lib/clang/14.0.6/lib/x86_64-unknown-linux-gnu/libcilksan.bc") + endif () + endif () endif () # TODO: cleanup (currently just to test formatting) @@ -58,9 +78,16 @@ add_executable(adaptive_hermite_refinement lib/test-triangle.cpp) target_include_directories(adaptive_hermite_refinement PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(adaptive_hermite_refinement argparse mdspan) -add_library(src-lib OBJECT lib/Naive.cpp lib/Naive.hpp lib/HermiteRunner.cpp lib/HermiteRunner.hpp) +add_library(src-lib OBJECT lib/Naive.cpp lib/Naive.hpp lib/HermiteRunner.cpp lib/HermiteRunner.hpp + lib/Transformer.hpp lib/Transformer.cpp + lib/Exporter.hpp lib/Exporter.cpp + lib/Filter.hpp lib/Filter.cpp + lib/PrepareDerivatives.hpp lib/PrepareDerivatives.cpp + lib/Brackets.hpp lib/Brackets.cpp +) target_include_directories(src-lib PUBLIC lib/) -target_link_libraries(src-lib mdspan fftw-cpp cnpy spdlog::spdlog) +# TODO give eve only to vectorized targets +target_link_libraries(src-lib mdspan fftw-cpp cnpy spdlog::spdlog eve::eve) add_subdirectory(bench) diff --git a/cpp/bench/CMakeLists.txt b/cpp/bench/CMakeLists.txt index 6b75401..e29e6bc 100644 --- a/cpp/bench/CMakeLists.txt +++ b/cpp/bench/CMakeLists.txt @@ -19,9 +19,18 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(google-benchmark) -add_executable(bench-naive naive.cpp main-no-log.cpp) +add_executable(bench-naive naive.cpp main.cpp) target_link_libraries(bench-naive src-lib benchmark::benchmark) +add_executable(bench-hl-filter hl-filter.cpp main.cpp) +target_link_libraries(bench-hl-filter src-lib benchmark::benchmark) + +add_executable(bench-exps exps.cpp main.cpp) +target_link_libraries(bench-exps src-lib benchmark::benchmark) + +add_executable(bench-prepare prepare-derivatives.cpp main.cpp) +target_link_libraries(bench-prepare src-lib benchmark::benchmark) + if (ENABLE_CILK) add_executable(bench-fftw-cilk fftw-cilk.cpp) target_link_libraries(bench-fftw-cilk fftw-cpp benchmark::benchmark fftw3_threads) diff --git a/cpp/bench/benchmark-util.hpp b/cpp/bench/benchmark-util.hpp new file mode 100644 index 0000000..74418e9 --- /dev/null +++ b/cpp/bench/benchmark-util.hpp @@ -0,0 +1,9 @@ +#pragma once +#include + +/// Add `min` as a statistic to the benchmark, useful for serial execution. +/// Not reported when only running 1 repetition. +#define BENCHMARK_WMIN(...) \ + BENCHMARK(__VA_ARGS__)->ComputeStatistics("min", [](const std::vector &v) { \ + return *std::min_element(v.begin(), v.end()); \ + }) diff --git a/cpp/bench/exps.cpp b/cpp/bench/exps.cpp new file mode 100644 index 0000000..9bbc0bd --- /dev/null +++ b/cpp/bench/exps.cpp @@ -0,0 +1,72 @@ +#include "CachedExponentials.hpp" +#include "Exponentials.hpp" + +#include "benchmark-util.hpp" +#include + +using namespace ahr; +using namespace ahr::exp; +template static void BM_ExpKXKY(benchmark::State &state) { + Dim const M = state.range(0); + Dim const X = state.range(1); + Dim const Y = state.range(2); + + Grid grid{M, X, Y}; + Real dt = 1.0; + HyperCoefficients hyper = HyperCoefficients::calculate(dt, grid); + Exp exp{grid}; + + for (auto _ : state) { + dt *= 1.2; + exp.update(hyper, dt); + for (int m = 0; m < M; ++m) { + grid.for_each_kxky([&](Dim kx, Dim ky) { benchmark::DoNotOptimize(exp(kx, ky)); }); + } + } +} + +template static void BM_ExpM(benchmark::State &state) { + Dim const M = state.range(0); + Dim const X = state.range(1); + Dim const Y = state.range(2); + + Grid grid{M, X, Y}; + Real dt = 1.0; + HyperCoefficients hyper = HyperCoefficients::calculate(dt, grid); + + Exp exp{grid}; + + for (auto _ : state) { + dt *= 1.2; + exp.update(hyper, dt); + for (Dim m = 0; m < M; ++m) { + grid.for_each_kxky([&](Dim kx, Dim ky) { benchmark::DoNotOptimize(exp(m)); }); + } + } +} + +BENCHMARK_WMIN(BM_ExpKXKY) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpKXKY) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpKXKY) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpM) + ->ArgsProduct({{4, 8, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); + +BENCHMARK_WMIN(BM_ExpKXKY>) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpKXKY>) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpKXKY>) + ->ArgsProduct({{2, 4, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_ExpM>) + ->ArgsProduct({{4, 8, 16}, {2048, 4096}, {2048, 4096}}) + ->Unit(benchmark::kMillisecond); diff --git a/cpp/bench/fftw-cilk.cpp b/cpp/bench/fftw-cilk.cpp index c7ae1b8..f21e2d2 100644 --- a/cpp/bench/fftw-cilk.cpp +++ b/cpp/bench/fftw-cilk.cpp @@ -1,6 +1,6 @@ #include "fftw-cpp/fftw-cpp.h" -#include +#include "benchmark-util.hpp" #include #include #include @@ -76,15 +76,21 @@ static void BM_FFTW_2D(benchmark::State &state) { auto constexpr K = 1024; auto constexpr M = K * K; -BENCHMARK(BM_copy_1D)->RangeMultiplier(2)->Range(16 * M, 64 * M)->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_copy_1D) + ->RangeMultiplier(2) + ->Range(16 * M, 64 * M) + ->Unit(benchmark::kMillisecond); -BENCHMARK(BM_FFTW_1D)->RangeMultiplier(2)->Range(16 * M, 64 * M)->Unit(benchmark::kMillisecond); +BENCHMARK_WMIN(BM_FFTW_1D) + ->RangeMultiplier(2) + ->Range(16 * M, 64 * M) + ->Unit(benchmark::kMillisecond); -BENCHMARK(BM_copy_2D) +BENCHMARK_WMIN(BM_copy_2D) ->ArgsProduct({{4 * K, 8 * K, 16 * K}, {4 * K, 8 * K, 16 * K}}) ->Unit(benchmark::kMillisecond); -BENCHMARK(BM_FFTW_2D) +BENCHMARK_WMIN(BM_FFTW_2D) ->ArgsProduct({{4 * K, 8 * K, 16 * K}, {4 * K, 8 * K, 16 * K}}) ->Unit(benchmark::kMillisecond); diff --git a/cpp/bench/hl-filter.cpp b/cpp/bench/hl-filter.cpp new file mode 100644 index 0000000..e57d8d1 --- /dev/null +++ b/cpp/bench/hl-filter.cpp @@ -0,0 +1,41 @@ +#include "Filter.hpp" + +#include + +static constexpr auto N_WARMUP_ITERS = 5; + +using namespace ahr; +template static void BM_HouLiFilter(benchmark::State &state) { + Dim const X = state.range(0); + Dim const Y = state.range(1); + + Grid grid{1, X, Y}; + Filter filter{grid}; + + auto buf = grid.cBufXY(); + + // Warm-up + for (int i = 0; i < N_WARMUP_ITERS; i++) { + filter(buf); + } + + for (auto _ : state) { + filter(buf); + } +} + +BENCHMARK(BM_HouLiFilter) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); + +BENCHMARK(BM_HouLiFilter) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); + +BENCHMARK(BM_HouLiFilter) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); + +BENCHMARK(BM_HouLiFilter) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); diff --git a/cpp/bench/main-no-log.cpp b/cpp/bench/main.cpp similarity index 55% rename from cpp/bench/main-no-log.cpp rename to cpp/bench/main.cpp index 9e11219..842695e 100644 --- a/cpp/bench/main-no-log.cpp +++ b/cpp/bench/main.cpp @@ -2,12 +2,17 @@ #include #include +#include "cilk.hpp" + int main(int argc, char **argv) { // No logging in benchmarks (unless overridden via environment variable) spdlog::set_level(spdlog::level::off); spdlog::cfg::load_env_levels(); - benchmark::Initialize(&argc, argv); - benchmark::RunSpecifiedBenchmarks(); - benchmark::Shutdown(); + // Invoke a cilk_scope to avoid Cilk startup/shutdown in benchmarks + cilk_scope { + benchmark::Initialize(&argc, argv); + benchmark::RunSpecifiedBenchmarks(); + benchmark::Shutdown(); + } } \ No newline at end of file diff --git a/cpp/bench/naive.cpp b/cpp/bench/naive.cpp index 65d2516..89160cb 100644 --- a/cpp/bench/naive.cpp +++ b/cpp/bench/naive.cpp @@ -1,12 +1,10 @@ #include "Naive.hpp" -#include +#include "benchmark-util.hpp" #include using namespace ahr; static void BM_Naive(benchmark::State &state) { - std::ostringstream oss; - Dim const M = state.range(0); Dim const X = state.range(1); Dim const N = state.range(2); @@ -26,7 +24,7 @@ static void BM_Naive(benchmark::State &state) { } } -BENCHMARK(BM_Naive) +BENCHMARK_WMIN(BM_Naive) ->ArgsProduct({{2, 4, 10, 45}, {128, 256, 512}, {5}}) ->ArgsProduct({{2, 4}, {1024, 2048}, {5}}) ->ArgsProduct({{2}, {4096}, {5}}) diff --git a/cpp/bench/prepare-derivatives.cpp b/cpp/bench/prepare-derivatives.cpp new file mode 100644 index 0000000..3a9b72c --- /dev/null +++ b/cpp/bench/prepare-derivatives.cpp @@ -0,0 +1,35 @@ +#include "PrepareDerivatives.hpp" + +#include + +static constexpr auto N_WARMUP_ITERS = 5; + +using namespace ahr; +template static void BM_Prepare(benchmark::State &state) { + Dim const X = state.range(0); + Dim const Y = state.range(1); + + Grid grid{1, X, Y}; + Prepare prepare{grid}; + + auto buf = grid.cBufXY(); + auto buf2 = grid.cBufXY(); + auto buf3 = grid.cBufXY(); + + // Warm-up + for (int i = 0; i < N_WARMUP_ITERS; i++) { + prepare(buf, {buf2, buf3}); + } + + for (auto _ : state) { + prepare(buf, {buf2, buf3}); + } +} + +BENCHMARK(BM_Prepare) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); + +BENCHMARK(BM_Prepare) + ->ArgsProduct({{2048, 4096, 8192}, {2048, 4096, 8192}}) + ->Unit(benchmark::kMillisecond); diff --git a/cpp/lib/Brackets.cpp b/cpp/lib/Brackets.cpp new file mode 100644 index 0000000..e2b9806 --- /dev/null +++ b/cpp/lib/Brackets.cpp @@ -0,0 +1,43 @@ +#include "Brackets.hpp" +#include "Filter.hpp" +#include "Transformer.hpp" + +namespace ahr { + +void Brackets::bracket(DxDy const &op1, DxDy const &op2, + View::R_XY const &output) const { + grid.for_each_xy([&](Dim x, Dim y) { + output(x, y) = op1.DX(x, y) * op2.DY(x, y) - op1.DY(x, y) * op2.DX(x, y); + }); +} + +void Brackets::derivatives(View::C_XY const &op, DxDy output) const { + DxDy Der_K{grid.KX, grid.KY}; + prepareDXY(op, Der_K); + cilk_scope { + cilk_spawn tf.bfft(Der_K.DX, output.DX); + tf.bfft(Der_K.DY, output.DY); + } +} + +Brackets::Buf::C_XY Brackets::halfBracket(DxDy derOp1, DxDy derOp2) const { + Buf::R_XY br = grid.rBufXY(); + Buf::C_XY br_K = grid.cBufXY(); + bracket(derOp1, derOp2, br); + tf.fft(br, br_K); + hlFilter(br_K); + br_K(0, 0) = 0; + return br_K; +} + +[[nodiscard]] Brackets::Buf::C_XY Brackets::fullBracket(View::C_XY op1, View::C_XY op2) const { + auto derOp1 = grid.dBufXY(), derOp2 = grid.dBufXY(); + cilk_scope { + cilk_spawn derivatives(op1, derOp1); + derivatives(op2, derOp2); + } + + return halfBracket(derOp1, derOp2); +} + +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/Brackets.hpp b/cpp/lib/Brackets.hpp new file mode 100644 index 0000000..aef4459 --- /dev/null +++ b/cpp/lib/Brackets.hpp @@ -0,0 +1,40 @@ +#pragma once +#include "PrepareDerivatives.hpp" +#include "grid.hpp" + +namespace ahr { + +class Transformer; +class HouLiFilterCached1D; + +class Brackets { +public: + Brackets(Grid const &grid, Transformer const &tf, HouLiFilterCached1D const &hlFilter) + : grid(grid), tf(tf), hlFilter(hlFilter) {} + +private: + Grid const &grid; + Transformer const &tf; + HouLiFilterCached1D const &hlFilter; // TODO vectorized + PrepareDerivatives prepareDXY{grid}; + + using View = Grid::View; + using Buf = Grid::Buf; + template using DxDy = Grid::DxDy; + +public: + /// Compute real δx and δy derivatives of complex op, store in output + void derivatives(View::C_XY const &op, DxDy output) const; + + /// Compute the bracket of two complex fields using their derivatives + [[nodiscard]] Buf::C_XY halfBracket(DxDy op1, DxDy op2) const; + + /// Compute the bracket of two complex fields using their values + [[nodiscard]] Buf::C_XY fullBracket(View::C_XY op1, View::C_XY op2) const; + +private: + /// Computes bracket [op1, op2], expects normalized values + void bracket(DxDy const &op1, DxDy const &op2, + View::R_XY const &output) const; +}; +} // namespace ahr diff --git a/cpp/lib/CachedExponentials.hpp b/cpp/lib/CachedExponentials.hpp new file mode 100644 index 0000000..97d4a49 --- /dev/null +++ b/cpp/lib/CachedExponentials.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "Exponentials.hpp" + +namespace ahr::exp { + +template +concept space_like = requires(Exp exp, Dim kx, Dim ky) { + { exp(kx, ky) } -> std::same_as; +}; + +template +concept moment_like = requires(Exp exp, Dim m) { + { exp(m) } -> std::same_as; +}; + +template +concept updatable = requires(Exp exp, Real dt) { + { exp.update(HyperCoefficients{}, dt) }; +}; + +template + requires space_like +struct CachedKXKY : Exp { + explicit CachedKXKY(Grid const &grid) : Exp(grid), factors(grid.KX, grid.KY), dt(-1) {} + + void update(HyperCoefficients hyper, Real dt) { + // skip update if dt hasn't changed + if (this->dt == dt) { return; } + this->dt = dt; + + Exp::update(hyper, dt); + this->grid.for_each_kxky([&](Dim kx, Dim ky) { factors(kx, ky) = Exp::operator()(kx, ky); }); + } + + Real operator()(Dim kx, Dim ky) { return factors(kx, ky); } + +protected: + Grid::Buf::R_XY factors; ///< Real but of size (KX,KY) + Real dt; +}; + +template + requires moment_like +struct CachedM : Exp { + explicit CachedM(Grid const &grid) : Exp(grid), factors(grid.M), dt(-1) {} + + void update(HyperCoefficients hyper, Real dt) { + // skip update if dt hasn't changed + if (this->dt == dt) { return; } + this->dt = dt; + + Exp::update(hyper, dt); + for (Dim m = 0; m < this->grid.M; ++m) { + factors[m] = Exp::operator()(m); + } + } + + Real operator()(Dim m) { return factors[m]; } + +protected: + std::vector factors; + Real dt; +}; +} // namespace ahr::exp \ No newline at end of file diff --git a/cpp/lib/Exponentials.hpp b/cpp/lib/Exponentials.hpp new file mode 100644 index 0000000..5e24bce --- /dev/null +++ b/cpp/lib/Exponentials.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include "constants.hpp" +#include "grid.hpp" +#include "hyper.hpp" + +namespace ahr::exp { +class Base { +public: + explicit Base(Grid const &grid) : grid(grid) {} + + void update(HyperCoefficients hyper, Real dt) { + this->hyper = hyper; + this->dt = dt; + } + +protected: + Grid const &grid; + HyperCoefficients hyper{}; + Real dt{-1}; +}; + +class Eta : protected Base { +public: + using Base::Base; + using Base::update; + + Real operator()(Dim kx, Dim ky) { + return std::exp( + -(res * grid.kPerp2(kx, ky) + hyper.eta2 * std::pow(grid.kPerp2(kx, ky), hyper_order)) * + dt / (1.0 + grid.kPerp2(kx, ky) * de * de)); + } +}; + +class Nu : protected Base { +public: + using Base::Base; + using Base::update; + + Real operator()(Dim kx, Dim ky) { + return std::exp( + -(nu * grid.kPerp2(kx, ky) + hyper.nu_2 * std::pow(grid.kPerp2(kx, ky), hyper_order)) * dt); + } +}; + +class NuG : protected Base { +public: + using Base::Base; + using Base::update; + + Real operator()(Dim kx, Dim ky) { + return std::exp( + -(nu * grid.kPerp2(kx, ky) + hyper.nu_g * std::pow(grid.kPerp2(kx, ky), hyper_order)) * dt); + } +}; + +class GM : protected Base { +public: + using Base::Base; + using Base::update; + + Real operator()(Dim m) { + return std::exp(-(Real(m) * nu_ei + std::pow(m, 2 * hyper_morder) * hyper.nu_ei) * dt); + } +}; + +} // namespace ahr::exp \ No newline at end of file diff --git a/cpp/lib/Exporter.cpp b/cpp/lib/Exporter.cpp new file mode 100644 index 0000000..fb04dae --- /dev/null +++ b/cpp/lib/Exporter.cpp @@ -0,0 +1,53 @@ +#include "Exporter.hpp" +#include "Transformer.hpp" +#include +#include + +namespace ahr { +namespace fs = std::filesystem; +void Exporter::exportTo(fs::path const &filename, Grid::View::C_XY cView) { + // fft overwrites the input, so we need to copy it to a temporary buffer + auto tempK = grid.cBufXY(); + auto temp = grid.rBufXY(); + + // Copy and also normalize + tf.normalize(cView, tempK); + + // Backwards FFT + tf.bfft(tempK, temp); + + // Write the real buffer to file + exportTo(filename, temp); +} + +void Exporter::exportTo(fs::path const &filename, Grid::View::R_XY rView) { + // Copy the data to a layout-right buffer + stdex::mdarray> rArray{rView.extents()}; + grid.for_each_xy([&](Dim x, Dim y) { rArray(x, y) = rView(x, y); }); + + auto const path = filename.is_absolute() ? filename : prefix_dir / filename; + cnpy::npy_save(path, rArray.data(), {grid.X, grid.Y}, "w"); +} + +NpyMdspan +Exporter::importReal(const fs::path &filename) { // NOLINT(*-convert-member-functions-to-static) + auto const path = filename.is_absolute() ? filename : prefix_dir / filename; + return NpyMdspan{cnpy::npy_load(path)}; +} + +void Exporter::importReal(const fs::path &filename, Grid::View::R_XY rView) { + auto npy = importReal(filename); + if (!npy.valid()) { throw std::runtime_error("Invalid npy file"); } + if (npy.view().extents() != rView.extents()) { throw std::runtime_error("Incompatible extents"); } + + // Copy the data + grid.for_each_xy([&](Dim x, Dim y) { rView(x, y) = npy.view()(x, y); }); +} + +Grid::Buf::R_XY Exporter::importRealBuf(const fs::path &filename) { + auto rBuf = grid.rBufXY(); + importReal(filename, rBuf.to_mdspan()); + return rBuf; +} + +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/Exporter.hpp b/cpp/lib/Exporter.hpp new file mode 100644 index 0000000..b85b750 --- /dev/null +++ b/cpp/lib/Exporter.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "NpyMdspan.hpp" +#include "grid.hpp" +#include +#include + +namespace ahr { +namespace fs = std::filesystem; +class Transformer; + +/// This class is responsible for exporting and importing .npy buffers. +/// It can automatically transform complex buffers to real before exporting. +/// Any relative path is interpreted as relative to the prefix_dir. +class Exporter { + Grid const &grid; + Transformer const &tf; + fs::path prefix_dir; + +public: + Exporter(Grid const &grid, Transformer const &transformer, + std::optional prefix_dir = std::nullopt) + : grid(grid), tf(transformer) { + if (prefix_dir) { + this->prefix_dir = fs::canonical(*prefix_dir); + } else if (auto prefix_dir_env = std::getenv("EXPORT_PREFIX_DIR"); prefix_dir_env) { + this->prefix_dir = fs::canonical(prefix_dir_env); + } else { + this->prefix_dir = fs::current_path(); + } + + fs::create_directories(this->prefix_dir); + } + + /// Export the complex view to file by transforming it to real first. + void exportTo(fs::path const &filename, Grid::View::C_XY cView); + + /// Export the real buffer to file. + void exportTo(fs::path const &filename, Grid::View::R_XY rView); + + /// Import a real buffer from file, and write it to the given view. + void importReal(const fs::path &filename, Grid::View::R_XY rView); + + /// Import a real buffer from file, and return it as an owning NpyMdspan. + [[nodiscard]] NpyMdspan importReal(fs::path const &filename); + + /// Import a real buffer from file, and return it as a real buffer. + [[nodiscard]] Grid::Buf::R_XY importRealBuf(fs::path const &filename); +}; +} // namespace ahr diff --git a/cpp/lib/Filter.cpp b/cpp/lib/Filter.cpp new file mode 100644 index 0000000..e0d5c87 --- /dev/null +++ b/cpp/lib/Filter.cpp @@ -0,0 +1,135 @@ +// +// Created by Luka on 11/2/2024. +// + +#include "Filter.hpp" + +#include +#include + +namespace ahr { +void HouLiFilter::operator()(Grid::View::C_XY view) const { + grid.for_each_kxky([&](Dim kx, Dim ky) { + view(kx, ky) *= std::exp(-36.0 * std::pow(grid.kx_(kx) / grid.KX, 36.0)) * + std::exp(-36.0 * std::pow(grid.ky_(ky) / grid.KY, 36.0)); + }); +} + +HouLiFilterCached::HouLiFilterCached(Grid const &grid) + : HouLiFilter(grid), factors(std::array{grid.KX, grid.KY}) { + grid.for_each_kxky([&](Dim kx, Dim ky) { + factors(kx, ky) = std::exp(-36.0 * std::pow(grid.kx_(kx) / grid.KX, 36.0)) * + std::exp(-36.0 * std::pow(grid.ky_(ky) / grid.KY, 36.0)); + }); +} + +void HouLiFilterCached::operator()(Grid::View::C_XY view) const { + grid.for_each_kxky([&](Dim kx, Dim ky) { view(kx, ky) *= factors(kx, ky); }); +} + +HouLiFilterCached1D::HouLiFilterCached1D(Grid const &grid) + : HouLiFilter(grid), factors_x(grid.KX), factors_y(grid.KY) { + for (Dim kx = 0; kx < grid.KX; ++kx) { + factors_x.at(kx) = std::exp(-36.0 * std::pow(grid.kx_(kx) / grid.KX, 36.0)); + } + for (Dim ky = 0; ky < grid.KY; ++ky) { + factors_y.at(ky) = std::exp(-36.0 * std::pow(grid.ky_(ky) / grid.KY, 36.0)); + } +} + +void HouLiFilterCached1D::operator()(Grid::View::C_XY view) const { + grid.for_each_kxky([&](Dim kx, Dim ky) { + // Extra multiplication at runtime for lower memory cost + view(kx, ky) *= factors_x[kx] * factors_y[ky]; + }); +} + +HouLiFilterCached1DVector::HouLiFilterCached1DVector(Grid const &grid) : HouLiFilterCached1D(grid) { + assert(grid.KX > R_WIDTH); + assert(grid.KY % KY_TILE == 0); +} + +void HouLiFilterCached1DVector::operator()(Grid::View::C_XY view) const { + // This method applies the HouLi filter to view using vector instructions. + // An array of contiguous complex numbers is simply treated as a real array + // with double the length. + // The code is vectorized along the kx (continuous) dimension. + // To reuse kx-factors, we process KY_TILE rows at a time. + // We load R_WIDTH factors_x and expand them into two registers, duplicating each element. + // That way, each two consecutive real numbers (real and imaginary parts) + // get multiplied with the same factor. + // Finally, we read the complex numbers, multiply with kx- and ky-factors, and write it back. + // Duplication demo: + // vfx_full = {kx, kx+1, kx+2, kx+3, kx+4, kx+5, kx+6, kx+7} + // into + // lower_fx = {kx, kx, kx+1, kx+1, kx+2, kx+2, kx+3, kx+3} + // upper_fx = {kx+4, kx+4, kx+5, kx+5, kx+6, kx+6, kx+7, kx+7} + // + + static_assert(view.stride(0) == 1); // contiguous in kx + + cilk_for (int ky = 0; ky < grid.KY; ky += KY_TILE) { + // avoid std::vector dereference inside loop: + // broadcast fy value into vector + std::array vfy; + for (int i = 0; i < KY_TILE; ++i) { + vfy[i] = factors_y[ky + i]; + } + // prepare iteration address for fx + Real const *fx_addr = factors_x.data(); + + int kx = 0; + // Make sure the last element in the 2nd vector isn't past the end + // Process 1 vector of factors at a time (2 vectors of complex) + for (; kx <= grid.KX - R_WIDTH; kx += R_WIDTH, fx_addr += R_WIDTH) { + // get address for two vectors we're writing to + auto lower_view_addr = [&](int i) { return (Real *)&view(kx, ky + i); }; + auto upper_view_addr = [&](int i) { return (Real *)&view(kx + C_WIDTH, ky + i); }; + + // Load factors + VReal vfx_full{fx_addr}; + + // Permute lower factors, multiply lower input + VReal lower_fx = duplicateLower(vfx_full); + for (int i = 0; i < KY_TILE; ++i) { + eve::store(VReal{lower_view_addr(i)} * lower_fx * vfy[i], lower_view_addr(i)); + } + + // Permute upper factors, multiply upper input + VReal upper_fx = duplicateUpper(vfx_full); + for (int i = 0; i < KY_TILE; ++i) { + eve::store(VReal{upper_view_addr(i)} * upper_fx * vfy[i], upper_view_addr(i)); + } + } + + // tail + for (; kx < grid.KX; ++kx) { + for (int i = 0; i < KY_TILE; ++i) { + view(kx, ky + i) *= factors_x[kx] * factors_y[ky + i]; + } + } + } +} + +#ifdef AVX512_ENABLED +HouLiFilterCached1DVector::VReal HouLiFilterCached1DVector::duplicateLower(VReal src) const { + static_assert(R_WIDTH == 8); + const VIdx lower_idx{0, 0, 1, 1, 2, 2, 3, 3}; + return _mm512_permutex2var_pd(src, lower_idx, src); +} +HouLiFilterCached1DVector::VReal HouLiFilterCached1DVector::duplicateUpper(VReal src) const { + static_assert(R_WIDTH == 8); + const VIdx upper_idx{4, 4, 5, 5, 6, 6, 7, 7}; + return _mm512_permutex2var_pd(src, upper_idx, src); +} +#else +HouLiFilterCached1DVector::VReal HouLiFilterCached1DVector::duplicateLower(VReal src) const { + static_assert(R_WIDTH == 2); + return _mm_unpacklo_pd(src, src); +} +HouLiFilterCached1DVector::VReal HouLiFilterCached1DVector::duplicateUpper(VReal src) const { + static_assert(R_WIDTH == 2); + return _mm_unpackhi_pd(src, src); +} +#endif +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/Filter.hpp b/cpp/lib/Filter.hpp new file mode 100644 index 0000000..47055b9 --- /dev/null +++ b/cpp/lib/Filter.hpp @@ -0,0 +1,54 @@ +#pragma once +#include "constants.hpp" +#include "grid.hpp" +#include + +namespace ahr { + +class HouLiFilter { +public: + explicit HouLiFilter(Grid const &grid) : grid(grid) {} + + void operator()(Grid::View::C_XY view) const; + +protected: + Grid const &grid; +}; + +class HouLiFilterCached : HouLiFilter { +public: + explicit HouLiFilterCached(Grid const &grid); + void operator()(Grid::View::C_XY view) const; + +private: + /// Pre-calculated factors for the Hou-Li filter. + /// Note that this is a real buffer with dimensions (KX,KY) + Grid::Buf::R_XY factors; +}; + +class HouLiFilterCached1D : protected HouLiFilter { +public: + explicit HouLiFilterCached1D(Grid const &grid); + void operator()(Grid::View::C_XY view) const; + +protected: + std::vector factors_x, factors_y; +}; + +class HouLiFilterCached1DVector : HouLiFilterCached1D { +public: + explicit HouLiFilterCached1DVector(Grid const &grid); + void operator()(Grid::View::C_XY view) const; + +private: + using VIdx = eve::wide; + using VReal = eve::wide; + static auto constexpr R_WIDTH = VReal::size(); + static auto constexpr C_WIDTH = VReal::size() / 2; + + static auto constexpr KY_TILE = 4; + + VReal duplicateLower(VReal src) const; ///< duplicate lower half of src + VReal duplicateUpper(VReal src) const; ///< duplicate upper half of src +}; +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/HermiteRunner.hpp b/cpp/lib/HermiteRunner.hpp index 9805b9c..484c172 100644 --- a/cpp/lib/HermiteRunner.hpp +++ b/cpp/lib/HermiteRunner.hpp @@ -25,12 +25,6 @@ class HermiteRunner { * @param N the number of timesteps. */ virtual void run(Dim N, Dim saveInterval) = 0; - - /** - * - * @return Final values of APar. - */ - virtual mdarray> getFinalAPar() = 0; }; } // namespace ahr \ No newline at end of file diff --git a/cpp/lib/Naive.cpp b/cpp/lib/Naive.cpp index 8087de8..3ac701b 100644 --- a/cpp/lib/Naive.cpp +++ b/cpp/lib/Naive.cpp @@ -1,83 +1,68 @@ #include "Naive.hpp" #include "equillibrium.hpp" +#include "reducer.hpp" #include #include #include #include -namespace { -template -auto forward_to_array_impl(std::index_sequence indices, Args &&...args) { - return std::array{ - [&args...](size_t index) { return T{std::forward(args)...}; }(I)...}; -} - -template -std::array forward_to_array(Args &&...args) { - return forward_to_array_impl(std::make_index_sequence(), std::forward(args)...); -} -} // namespace - namespace ahr { -Naive::Naive(Dim M, Dim X, Dim Y) : HermiteRunner(), M(M), X(X), Y(Y) { +Naive::Naive(Dim M, Dim X, Dim Y) + : HermiteRunner(), g(M, X, Y), + // TODO move to tracker class + moments_K(g.cBufMXY()), momentsNew_K(g.cBufMXY()), phi_K(g.cBufXY()), phi_K_New(g.cBufXY()), + ueKPar_K(g.cBufXY()), ueKPar_K_New(g.cBufXY()), aParEq_K(g.cBufXY()), dGM(g.dBufMXY()), + dPhi(g.dBufXY()), dUEKPar(g.dBufXY()) { assert(M >= 4 or M == 2); // X and Y must be powers of 2 assert((X & (X - 1)) == 0); assert((Y & (Y - 1)) == 0); } -void Naive::hlFilter(CViewXY &complexArray) { - for_each_kxky([&](Dim kx, Dim ky) { - complexArray(kx, ky) *= - exp(-36.0 * pow(kx_(kx) / KX, 36.0)) * exp(-36.0 * pow(ky_(ky) / KY, 36.0)); - }); -} - -void Naive::fft(ViewXY in, CViewXY out) { - fft_base(in, out); +void Naive::fftHL(View::R_XY in, View::C_XY out) { + tf.fft(in, out); hlFilter(out); } void Naive::init(std::string_view equilibriumName) { // Currently assuming X==Y for simplicity, but the code is written generally for the most part. - assert(X == Y); - Buf2D temp{X, Y}; + assert(g.X == g.Y); + auto temp = g.rBufXY(); // Plan FFTs both ways - fft_base = fftw::plan_r2c<2u>::dft(temp.to_mdspan(), phi_K.to_mdspan(), fftw::ESTIMATE); - fftInv = fftw::plan_c2r<2u>::dft(phi_K.to_mdspan(), temp.to_mdspan(), fftw::ESTIMATE); + tf.init(); // Initialize equilibrium values - auto [aParEq, phi] = equilibrium(equilibriumName, X, Y); + auto [aParEq, phi] = equilibrium(equilibriumName, g); - fft(phi.to_mdspan(), phi_K.to_mdspan()); - fft(aParEq.to_mdspan(), aParEq_K.to_mdspan()); + fftHL(phi, phi_K); + fftHL(aParEq, aParEq_K); // Transform moments into phase space - for (int m = G_MIN; m < M; ++m) { - for_each_kxky([&](Dim kx, Dim ky) { moments_K(kx, ky, m) = 0; }); + for (int m = G_MIN; m < g.M; ++m) { + g.for_each_kxky([&](Dim kx, Dim ky) { moments_K(kx, ky, m) = 0; }); } // aPar, uekPar, ne - for_each_kxky([&](Dim kx, Dim ky) { - moments_K(kx, ky, N_E) = nonlinear::phiInv(phi_K(kx, ky), kPerp2(kx, ky)); + g.for_each_kxky([&](Dim kx, Dim ky) { + moments_K(kx, ky, N_E) = nonlinear::phiInv(phi_K(kx, ky), g.kPerp2(kx, ky)); moments_K(kx, ky, A_PAR) = aParEq_K(kx, ky); - ueKPar_K(kx, ky) = -kPerp2(kx, ky) * moments_K(kx, ky, A_PAR); + ueKPar_K(kx, ky) = -g.kPerp2(kx, ky) * moments_K(kx, ky, A_PAR); }); + br.derivatives(phi_K, dPhi); + br.derivatives(ueKPar_K, dUEKPar); + for (int m = 0; m < g.M; ++m) { + br.derivatives(momentK(m), Grid::sliceXY(dGM, m)); + } } void Naive::run(Dim N, Dim saveInterval) { - // store all derivatives - DxDy dGM{X, Y, M}; - DxDy dPhi{X, Y}, dUEKPar{X, Y}; - // isothermal if only running with 2 moments - assert(M >= 4 or M == 2); + assert(g.M >= 4 or g.M == 2); bool divergent = false, repeat = false, noInc = false; int divergentCount = 0, repeatCount = 0; - HyperCoefficients hyper{}; bool saved = false; // Manually increment t only if not diverging @@ -91,117 +76,120 @@ void Naive::run(Dim N, Dim saveInterval) { } // predictor step - derivatives(phi_K, dPhi); - derivatives(ueKPar_K, dUEKPar); - for (int m = 0; m < M; ++m) { - derivatives(sliceXY(moments_K, m), sliceXY(dGM, m)); - } - if (repeat or divergent) { spdlog::debug("repeat: {}, divergent: {}", repeat, divergent); repeat = false; divergent = false; } else if (dt == -1) { - dt = getTimestep(dPhi, sliceXY(dGM, N_E), sliceXY(dGM, A_PAR)); - hyper = HyperCoefficients::calculate(dt, KX, KY, M); + dt = getTimestep(dPhi, Grid::sliceXY(dGM, N_E), Grid::sliceXY(dGM, A_PAR)); + } + + hyper = HyperCoefficients::calculate(dt, g); + cilk_scope { + cilk_spawn exp_nu.update(hyper, dt); + cilk_spawn exp_nu_g.update(hyper, dt); + cilk_spawn exp_eta.update(hyper, dt); + exp_gm.update(hyper, dt); } spdlog::debug("dt: {}", dt); // store results of nonlinear operators, as well as results of predictor step - Buf3D_K GM_K_Star{KX, KY, M}, GM_Nonlinear_K{KX, KY, M}; + auto GM_K_Star = g.cBufMXY(), GM_Nonlinear_K = g.cBufMXY(); + // spawn a bunch of stuff here // Compute N - auto bracketPhiNE_K = halfBracket(dPhi, sliceXY(dGM, N_E)); - auto bracketAParUEKPar_K = halfBracket(sliceXY(dGM, A_PAR), dUEKPar); + auto bracketPhiNE_K = cilk_spawn br.halfBracket(dPhi, Grid::sliceXY(dGM, N_E)); + auto bracketAParUEKPar_K = cilk_spawn br.halfBracket(Grid::sliceXY(dGM, A_PAR), dUEKPar); // Compute A - DxDy dPhiNeG2{X, Y}; - if (M > 2) { - for_each_xy([&](Dim x, Dim y) { + auto dPhiNeG2 = g.dBufXY(); + if (g.M > 2) { + g.for_each_xy([&](Dim x, Dim y) { dPhiNeG2.DX(x, y) = dPhi.DX(x, y) - rhoS * rhoS * (std::sqrt(2) * dGM.DX(x, y, G_MIN) + dGM.DX(x, y, N_E)); dPhiNeG2.DY(x, y) = dPhi.DY(x, y) - rhoS * rhoS * (std::sqrt(2) * dGM.DY(x, y, G_MIN) + dGM.DY(x, y, N_E)); }); } else { - for_each_xy([&](Dim x, Dim y) { + g.for_each_xy([&](Dim x, Dim y) { dPhiNeG2.DX(x, y) = dPhi.DX(x, y) - rhoS * rhoS * dGM.DX(x, y, N_E); dPhiNeG2.DY(x, y) = dPhi.DY(x, y) - rhoS * rhoS * dGM.DY(x, y, N_E); }); } - auto bracketAParPhiG2Ne_K = halfBracket(sliceXY(dGM, A_PAR), dPhiNeG2); - auto bracketUEParPhi_K = halfBracket(dUEKPar, dPhi); + // TODO this one could be before the loop if the halfBracket wasn't destructive + // - for some reason this only shows up on MultiRun tests + auto bracketAParPhiG2Ne_K = cilk_spawn br.halfBracket(Grid::sliceXY(dGM, A_PAR), dPhiNeG2); + auto bracketUEParPhi_K = br.halfBracket(dUEKPar, dPhi); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K(kx, ky, N_E) = nonlinear::N(bracketPhiNE_K(kx, ky), bracketAParUEKPar_K(kx, ky)); - GM_K_Star(kx, ky, N_E) = - exp_nu(kx, ky, hyper.nu_2, dt) * moments_K(kx, ky, N_E) + - dt / 2.0 * (1 + exp_nu(kx, ky, hyper.nu_2, dt)) * GM_Nonlinear_K(kx, ky, N_E); + GM_K_Star(kx, ky, N_E) = exp_nu(kx, ky) * moments_K(kx, ky, N_E) + + dt / 2.0 * (1 + exp_nu(kx, ky)) * GM_Nonlinear_K(kx, ky, N_E); GM_Nonlinear_K(kx, ky, A_PAR) = - nonlinear::A(bracketAParPhiG2Ne_K(kx, ky), bracketUEParPhi_K(kx, ky), kPerp2(kx, ky)); - GM_K_Star(kx, ky, A_PAR) = - exp_eta(kx, ky, hyper.eta2, dt) * moments_K(kx, ky, A_PAR) + - dt / 2.0 * (1 + exp_eta(kx, ky, hyper.eta2, dt)) * GM_Nonlinear_K(kx, ky, A_PAR) + - (1.0 - exp_eta(kx, ky, hyper.eta2, dt)) * aParEq_K(kx, ky); + nonlinear::A(bracketAParPhiG2Ne_K(kx, ky), bracketUEParPhi_K(kx, ky), g.kPerp2(kx, ky)); + GM_K_Star(kx, ky, A_PAR) = exp_eta(kx, ky) * moments_K(kx, ky, A_PAR) + + dt / 2.0 * (1 + exp_eta(kx, ky)) * GM_Nonlinear_K(kx, ky, A_PAR) + + (1.0 - exp_eta(kx, ky)) * aParEq_K(kx, ky); }); - if (M > 2) { + if (g.M > 2) { // Compute G2 - auto bracketPhiG2_K = halfBracket(dPhi, sliceXY(dGM, G_MIN)); - auto bracketAParG3_K = halfBracket(sliceXY(dGM, A_PAR), sliceXY(dGM, G_MIN + 1)); + auto bracketPhiG2_K = cilk_spawn br.halfBracket(dPhi, Grid::sliceXY(dGM, G_MIN)); + auto bracketAParG3_K = + cilk_spawn br.halfBracket(Grid::sliceXY(dGM, A_PAR), Grid::sliceXY(dGM, G_MIN + 1)); // Compute G_{M-1} - auto bracketPhiGLast_K = halfBracket(dPhi, sliceXY(dGM, LAST)); - auto bracketAParGLast_K = halfBracket(sliceXY(dGM, A_PAR), sliceXY(dGM, LAST)); - for_each_kxky([&](Dim kx, Dim ky) { - bracketAParGLast_K(kx, ky) *= nonlinear::GLastBracketFactor(M, kPerp2(kx, ky), hyper); + auto bracketPhiGLast_K = cilk_spawn br.halfBracket(dPhi, Grid::sliceXY(dGM, LAST)); + auto bracketAParGLast_K = br.halfBracket(Grid::sliceXY(dGM, A_PAR), Grid::sliceXY(dGM, LAST)); + g.for_each_kxky([&](Dim kx, Dim ky) { + bracketAParGLast_K(kx, ky) *= nonlinear::GLastBracketFactor(g.M, g.kPerp2(kx, ky), hyper); bracketAParGLast_K(kx, ky) += rhoS / de * std::sqrt(LAST) * moments_K(kx, ky, LAST - 1); // TODO Viriato adds this after the derivative }); - DxDy dBrLast{X, Y}; - derivatives(bracketAParGLast_K, dBrLast); - auto bracketTotalGLast_K = halfBracket(sliceXY(dGM, A_PAR), dBrLast); + auto dBrLast = g.dBufXY(); + br.derivatives(bracketAParGLast_K, dBrLast); + auto bracketTotalGLast_K = br.halfBracket(Grid::sliceXY(dGM, A_PAR), dBrLast); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K(kx, ky, G_MIN) = nonlinear::G2( bracketPhiG2_K(kx, ky), bracketAParG3_K(kx, ky), bracketAParUEKPar_K(kx, ky)); - GM_K_Star(kx, ky, G_MIN) = - exp_nu(kx, ky, hyper.nu_2, dt) * moments_K(kx, ky, G_MIN) + - dt / 2.0 * (1 + exp_nu(kx, ky, hyper.nu_2, dt)) * GM_Nonlinear_K(kx, ky, G_MIN); + GM_K_Star(kx, ky, G_MIN) = exp_nu(kx, ky) * moments_K(kx, ky, G_MIN) + + dt / 2.0 * (1 + exp_nu(kx, ky)) * GM_Nonlinear_K(kx, ky, G_MIN); GM_Nonlinear_K(kx, ky, LAST) = nonlinear::GLast(bracketPhiGLast_K(kx, ky), bracketTotalGLast_K(kx, ky)); GM_K_Star(kx, ky, LAST) = - exp_gm(LAST, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * - moments_K(kx, ky, LAST) + - dt / 2.0 * (1 + exp_gm(LAST, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt)) * - GM_Nonlinear_K(kx, ky, LAST); + exp_gm(LAST) * exp_nu_g(kx, ky) * moments_K(kx, ky, LAST) + + dt / 2.0 * (1 + exp_gm(LAST) * exp_nu_g(kx, ky)) * GM_Nonlinear_K(kx, ky, LAST); }); - DxDy dGMinusPlus{X, Y}; - for (Dim m = G_MIN + 1; m < LAST; ++m) { - for_each_xy([&](Dim x, Dim y) { + cilk_for (Dim m = G_MIN + 1; m < LAST; ++m) { + auto dGMinusPlus = g.dBufXY(); + g.for_each_xy([&](Dim x, Dim y) { dGMinusPlus.DX(x, y) = std::sqrt(m) * dGM.DX(x, y, m - 1) + std::sqrt(m + 1) * dGM.DX(x, y, m + 1); dGMinusPlus.DY(x, y) = std::sqrt(m) * dGM.DY(x, y, m - 1) + std::sqrt(m + 1) * dGM.DY(x, y, m + 1); }); - auto bracketAParGMMinusPlus_K = halfBracket(sliceXY(dGM, A_PAR), dGMinusPlus); - auto bracketPhiGM_K = halfBracket(dPhi, sliceXY(dGM, m)); + auto bracketAParGMMinusPlus_K = + cilk_spawn br.halfBracket(Grid::sliceXY(dGM, A_PAR), dGMinusPlus); + auto bracketPhiGM_K = br.halfBracket(dPhi, Grid::sliceXY(dGM, m)); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K(kx, ky, m) = nonlinear::GM(m, bracketPhiGM_K(kx, ky), bracketAParGMMinusPlus_K(kx, ky)); GM_K_Star(kx, ky, m) = - exp_gm(m, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * moments_K(kx, ky, m) + - dt / 2.0 * (1 + exp_gm(m, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt)) * - GM_Nonlinear_K(kx, ky, m); + exp_gm(m) * exp_nu_g(kx, ky) * moments_K(kx, ky, m) + + dt / 2.0 * (1 + exp_gm(m) * exp_nu_g(kx, ky)) * GM_Nonlinear_K(kx, ky, m); }); } } @@ -209,31 +197,32 @@ void Naive::run(Dim N, Dim saveInterval) { // corrector step // Phi, Nabla, and other prep for A bracket - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { // set to 0 for (kx, ky)=(0,0) phi_K_New(kx, ky) = - ((kx | ky) == 0) ? 0 : nonlinear::phi(GM_K_Star(kx, ky, N_E), kPerp2(kx, ky)); - ueKPar_K_New(kx, ky) = -kPerp2(kx, ky) * GM_K_Star(kx, ky, A_PAR); + ((kx | ky) == 0) ? 0 : nonlinear::phi(GM_K_Star(kx, ky, N_E), g.kPerp2(kx, ky)); + ueKPar_K_New(kx, ky) = -g.kPerp2(kx, ky) * GM_K_Star(kx, ky, A_PAR); }); - DxDy dPhi_Loop{X, Y}, dUEKPar_Loop{X, Y}; - DxDy dGM_Loop{X, Y, M}; - derivatives(phi_K_New, dPhi_Loop); - derivatives(ueKPar_K_New, dUEKPar_Loop); + auto dPhi_Loop = g.dBufXY(), dUEKPar_Loop = g.dBufXY(); + auto dGM_Loop = g.dBufMXY(); + cilk_spawn br.derivatives(phi_K_New, dPhi_Loop); + cilk_spawn br.derivatives(ueKPar_K_New, dUEKPar_Loop); - for (int m = 0; m < M; ++m) { + cilk_for (int m = 0; m < g.M; ++m) { // TODO(OPT) not necessary if we bail (only up to G_MIN) - derivatives(sliceXY(GM_K_Star, m), sliceXY(dGM_Loop, m)); + br.derivatives(Grid::sliceXY(GM_K_Star, m), Grid::sliceXY(dGM_Loop, m)); } + cilk_sync; // Corrector loop // TODO confirm that only m derivatives are needed at a time // (if not, can always store one in a temporary buffer) - Buf2D_K guessAPar_K{KX, KY}, semiImplicitOperator{KX, KY}; - for_each_kxky([&](Dim kx, Dim ky) { + auto guessAPar_K = g.cBufXY(), semiImplicitOperator = g.cBufXY(); + g.for_each_kxky([&](Dim kx, Dim ky) { guessAPar_K(kx, ky) = moments_K(kx, ky, A_PAR); - semiImplicitOperator(kx, ky) = nonlinear::semiImplicitOp(dt, bPerpMax, aa0, kPerp2(kx, ky)); + semiImplicitOperator(kx, ky) = nonlinear::semiImplicitOp(dt, bPerpMax, aa0, g.kPerp2(kx, ky)); }); semiImplicitOperator(0, 0) = 0; @@ -241,13 +230,13 @@ void Naive::run(Dim N, Dim saveInterval) { for (int p = 0; p <= MaxP; ++p) { auto DerivateNewMoment = [&](Dim m) { - derivatives(sliceXY(momentsNew_K, m), sliceXY(dGM_Loop, m)); + br.derivatives(Grid::sliceXY(momentsNew_K, m), Grid::sliceXY(dGM_Loop, m)); }; // First, compute A_par - DxDy dPhiNeG2_Loop{X, Y}; - for_each_xy([&](Dim x, Dim y) { - if (M > 2) { + auto dPhiNeG2_Loop = g.dBufXY(); + g.for_each_xy([&](Dim x, Dim y) { + if (g.M > 2) { dPhiNeG2_Loop.DX(x, y) = dPhi_Loop.DX(x, y) - rhoS * rhoS * (std::sqrt(2) * dGM_Loop.DX(x, y, G_MIN) + dGM_Loop.DX(x, y, N_E)); @@ -260,82 +249,88 @@ void Naive::run(Dim N, Dim saveInterval) { } }); - auto bracketAParPhiG2Ne_K_Loop = halfBracket(sliceXY(dGM_Loop, A_PAR), dPhiNeG2_Loop); - auto bracketUEParPhi_K_Loop = halfBracket(dUEKPar_Loop, dPhi_Loop); + auto bracketAParPhiG2Ne_K_Loop = + cilk_spawn br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), dPhiNeG2_Loop); + auto bracketUEParPhi_K_Loop = br.halfBracket(dUEKPar_Loop, dPhi_Loop); + cilk_sync; /// f_pred from Viriato - Buf3D_K GM_Nonlinear_K_Loop{KX, KY, M}; - Real sumAParRelError = 0; - for_each_kxky([&](Dim kx, Dim ky) { + auto GM_Nonlinear_K_Loop = g.cBufMXY(); + SumReducer sumAParRelError = 0; + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K_Loop(kx, ky, A_PAR) = nonlinear::A( - bracketAParPhiG2Ne_K_Loop(kx, ky), bracketUEParPhi_K_Loop(kx, ky), kPerp2(kx, ky)); + bracketAParPhiG2Ne_K_Loop(kx, ky), bracketUEParPhi_K_Loop(kx, ky), g.kPerp2(kx, ky)); // TODO(OPT) reuse star - momentsNew_K(kx, ky, A_PAR) = - 1.0 / (1.0 + semiImplicitOperator(kx, ky) / 4.0) * - (exp_eta(kx, ky, hyper.eta2, dt) * moments_K(kx, ky, A_PAR) + - dt / 2.0 * exp_eta(kx, ky, hyper.eta2, dt) * GM_Nonlinear_K(kx, ky, A_PAR) + - dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, A_PAR) + - (1.0 - exp_eta(kx, ky, hyper.eta2, dt)) * aParEq_K(kx, ky) + - semiImplicitOperator(kx, ky) / 4.0 * guessAPar_K(kx, ky)); - ueKPar_K_New(kx, ky) = -kPerp2(kx, ky) * momentsNew_K(kx, ky, A_PAR); + momentsNew_K(kx, ky, A_PAR) = 1.0 / (1.0 + semiImplicitOperator(kx, ky) / 4.0) * + (exp_eta(kx, ky) * moments_K(kx, ky, A_PAR) + + dt / 2.0 * exp_eta(kx, ky) * GM_Nonlinear_K(kx, ky, A_PAR) + + dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, A_PAR) + + (1.0 - exp_eta(kx, ky)) * aParEq_K(kx, ky) + + semiImplicitOperator(kx, ky) / 4.0 * guessAPar_K(kx, ky)); + ueKPar_K_New(kx, ky) = -g.kPerp2(kx, ky) * momentsNew_K(kx, ky, A_PAR); sumAParRelError += std::norm(momentsNew_K(kx, ky, A_PAR) - moments_K(kx, ky, A_PAR)); }); old_error = relative_error; relative_error = 0; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { relative_error = std::max(relative_error, std::abs(semiImplicitOperator(kx, ky) / 4.0 * (momentsNew_K(kx, ky, A_PAR) - guessAPar_K(kx, ky))) / - std::sqrt(sumAParRelError / (Real(KX) * Real(KY)))); + std::sqrt(sumAParRelError / (Real(g.KX) * Real(g.KY)))); }); spdlog::debug("sumAParRelError: {}, relative_error: {}", sumAParRelError, relative_error); // TODO(OPT) bail if relative error is large - DerivateNewMoment(A_PAR); - derivatives(ueKPar_K_New, dUEKPar_Loop); + auto bracketPhiNE_K_Loop = cilk_spawn br.halfBracket(dPhi_Loop, Grid::sliceXY(dGM_Loop, N_E)); - auto bracketPhiNE_K_Loop = halfBracket(dPhi_Loop, sliceXY(dGM_Loop, N_E)); - auto bracketAParUEKPar_K_Loop = halfBracket(sliceXY(dGM_Loop, A_PAR), dUEKPar_Loop); + cilk_scope { + cilk_spawn DerivateNewMoment(A_PAR); + br.derivatives(ueKPar_K_New, dUEKPar_Loop); + } + auto bracketAParUEKPar_K_Loop = br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), dUEKPar_Loop); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K_Loop(kx, ky, N_E) = nonlinear::N(bracketPhiNE_K_Loop(kx, ky), bracketAParUEKPar_K_Loop(kx, ky)); // TODO(OPT) reuse star - momentsNew_K(kx, ky, N_E) = - exp_nu(kx, ky, hyper.nu_2, dt) * moments_K(kx, ky, N_E) + - dt / 2.0 * exp_nu(kx, ky, hyper.nu_2, dt) * GM_Nonlinear_K(kx, ky, N_E) + - dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, N_E); + momentsNew_K(kx, ky, N_E) = exp_nu(kx, ky) * moments_K(kx, ky, N_E) + + dt / 2.0 * exp_nu(kx, ky) * GM_Nonlinear_K(kx, ky, N_E) + + dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, N_E); phi_K_New(kx, ky) = - (kx | ky) == 0 ? 0 : nonlinear::phi(momentsNew_K(kx, ky, N_E), kPerp2(kx, ky)); + (kx | ky) == 0 ? 0 : nonlinear::phi(momentsNew_K(kx, ky, N_E), g.kPerp2(kx, ky)); }); - derivatives(phi_K_New, dPhi_Loop); + cilk_spawn br.derivatives(phi_K_New, dPhi_Loop); DerivateNewMoment(N_E); - if (M > 2) { + cilk_sync; + + if (g.M > 2) { // Compute G2 - auto bracketPhiG2_K_Loop = halfBracket(dPhi_Loop, sliceXY(dGM_Loop, G_MIN)); + auto bracketPhiG2_K_Loop = + cilk_spawn br.halfBracket(dPhi_Loop, Grid::sliceXY(dGM_Loop, G_MIN)); auto bracketAParG3_K_Loop = - halfBracket(sliceXY(dGM_Loop, A_PAR), sliceXY(dGM_Loop, G_MIN + 1)); + br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), Grid::sliceXY(dGM_Loop, G_MIN + 1)); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K_Loop(kx, ky, G_MIN) = nonlinear::G2(bracketPhiG2_K_Loop(kx, ky), bracketAParG3_K_Loop(kx, ky), bracketAParUEKPar_K_Loop(kx, ky)); // TODO(OPT) reuse star - momentsNew_K(kx, ky, G_MIN) = - exp_nu(kx, ky, hyper.nu_2, dt) * moments_K(kx, ky, G_MIN) + - dt / 2.0 * exp_nu(kx, ky, hyper.nu_2, dt) * GM_Nonlinear_K(kx, ky, G_MIN) + - dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, G_MIN); + momentsNew_K(kx, ky, G_MIN) = exp_nu(kx, ky) * moments_K(kx, ky, G_MIN) + + dt / 2.0 * exp_nu(kx, ky) * GM_Nonlinear_K(kx, ky, G_MIN) + + dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, G_MIN); }); DerivateNewMoment(G_MIN); - DxDy dGMinusPlus_Loop{X, Y}; + DxDy dGMinusPlus_Loop = g.dBufXY(); for (int m = G_MIN + 1; m < LAST; ++m) { - for_each_xy([&](Dim x, Dim y) { + g.for_each_xy([&](Dim x, Dim y) { dGMinusPlus_Loop.DX(x, y) = std::sqrt(m) * dGM_Loop.DX(x, y, m - 1) + std::sqrt(m + 1) * dGM_Loop.DX(x, y, m + 1); dGMinusPlus_Loop.DY(x, y) = std::sqrt(m) * dGM_Loop.DY(x, y, m - 1) + @@ -343,17 +338,17 @@ void Naive::run(Dim N, Dim saveInterval) { }); auto bracketAParGMMinusPlus_K_Loop = - halfBracket(sliceXY(dGM_Loop, A_PAR), dGMinusPlus_Loop); - auto bracketPhiGM_K_Loop = halfBracket(dPhi_Loop, sliceXY(dGM_Loop, m)); + cilk_spawn br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), dGMinusPlus_Loop); + auto bracketPhiGM_K_Loop = br.halfBracket(dPhi_Loop, Grid::sliceXY(dGM_Loop, m)); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K_Loop(kx, ky, m) = nonlinear::GM(m, bracketPhiGM_K_Loop(kx, ky), bracketAParGMMinusPlus_K_Loop(kx, ky)); // TODO(OPT) reuse star momentsNew_K(kx, ky, m) = - exp_gm(m, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * moments_K(kx, ky, m) + - dt / 2.0 * exp_gm(m, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * - GM_Nonlinear_K(kx, ky, m) + + exp_gm(m) * exp_nu_g(kx, ky) * moments_K(kx, ky, m) + + dt / 2.0 * exp_gm(m) * exp_nu_g(kx, ky) * GM_Nonlinear_K(kx, ky, m) + dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, m); }); @@ -361,30 +356,31 @@ void Naive::run(Dim N, Dim saveInterval) { } // Compute G_{M-1} - auto bracketPhiGLast_K_Loop = halfBracket(dPhi_Loop, sliceXY(dGM_Loop, LAST)); + auto bracketPhiGLast_K_Loop = + cilk_spawn br.halfBracket(dPhi_Loop, Grid::sliceXY(dGM_Loop, LAST)); auto bracketAParGLast_K_Loop = - halfBracket(sliceXY(dGM_Loop, A_PAR), sliceXY(dGM_Loop, LAST)); - for_each_kxky([&](Dim kx, Dim ky) { + br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), Grid::sliceXY(dGM_Loop, LAST)); + g.for_each_kxky([&](Dim kx, Dim ky) { bracketAParGLast_K_Loop(kx, ky) *= - nonlinear::GLastBracketFactor(M, kPerp2(kx, ky), hyper); + nonlinear::GLastBracketFactor(g.M, g.kPerp2(kx, ky), hyper); bracketAParGLast_K_Loop(kx, ky) += rhoS / de * std::sqrt(LAST) * momentsNew_K(kx, ky, LAST - 1); // Note: Viriato adds this after derivative, but can be distributed }); - DxDy dBrLast_Loop{X, Y}; - derivatives(bracketAParGLast_K_Loop, dBrLast_Loop); - auto bracketTotalGLast_K_Loop = halfBracket(sliceXY(dGM_Loop, A_PAR), dBrLast_Loop); + DxDy dBrLast_Loop = g.dBufXY(); + br.derivatives(bracketAParGLast_K_Loop, dBrLast_Loop); + auto bracketTotalGLast_K_Loop = + br.halfBracket(Grid::sliceXY(dGM_Loop, A_PAR), dBrLast_Loop); + cilk_sync; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { GM_Nonlinear_K_Loop(kx, ky, LAST) = nonlinear::GLast(bracketPhiGLast_K_Loop(kx, ky), bracketTotalGLast_K_Loop(kx, ky)); // TODO(OPT) reuse star momentsNew_K(kx, ky, LAST) = - exp_gm(LAST, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * - moments_K(kx, ky, LAST) + - dt / 2.0 * exp_gm(LAST, hyper.nu_ei, dt) * exp_nu(kx, ky, hyper.nu_g, dt) * - GM_Nonlinear_K(kx, ky, LAST) + + exp_gm(LAST) * exp_nu_g(kx, ky) * moments_K(kx, ky, LAST) + + dt / 2.0 * exp_gm(LAST) * exp_nu_g(kx, ky) * GM_Nonlinear_K(kx, ky, LAST) + dt / 2.0 * GM_Nonlinear_K_Loop(kx, ky, LAST); }); DerivateNewMoment(LAST); @@ -410,7 +406,7 @@ void Naive::run(Dim N, Dim saveInterval) { break; } - for_each_kxky([&](Dim kx, Dim ky) { guessAPar_K(kx, ky) = momentsNew_K(kx, ky, A_PAR); }); + g.for_each_kxky([&](Dim kx, Dim ky) { guessAPar_K(kx, ky) = momentsNew_K(kx, ky, A_PAR); }); } if (divergent) { continue; } @@ -424,9 +420,9 @@ void Naive::run(Dim N, Dim saveInterval) { this->elapsedT += dt; // Update dt - Real tempDt = getTimestep(dPhi_Loop, sliceXY(dGM_Loop, N_E), sliceXY(dGM_Loop, A_PAR)); + Real tempDt = + getTimestep(dPhi_Loop, Grid::sliceXY(dGM_Loop, N_E), Grid::sliceXY(dGM_Loop, A_PAR)); dt = updateTimestep(dt, tempDt, noInc, relative_error); - hyper = HyperCoefficients::calculate(dt, KX, KY, M); spdlog::info("Moving on to next timestep: {}\n" "dt is: {}", @@ -439,15 +435,20 @@ void Naive::run(Dim N, Dim saveInterval) { std::swap(phi_K, phi_K_New); std::swap(ueKPar_K, ueKPar_K_New); + // Also swap derivatives + std::swap(dPhi, dPhi_Loop); + std::swap(dUEKPar, dUEKPar_Loop); + std::swap(dGM, dGM_Loop); + // Must be after swap for now, it looks at current, not new values auto [magnetic, kinetic] = calculateEnergies(); spdlog::info("t={} magnetic energy: {}, kinetic energy: {}", t, magnetic, kinetic); // Log moment values when level is trace (most verbose) - - for (Dim m = 0; m < M; ++m) { - spdlog::trace("t={} m={}:\n{}", t, m, - fmt::streamed(ostream_tuple(std::setprecision(16), sliceXY(moments_K, m)))); + for (Dim m = 0; m < g.M; ++m) { + spdlog::trace( + "t={} m={}:\n{}", t, m, + fmt::streamed(ostream_tuple(std::setprecision(16), Grid::sliceXY(moments_K, m)))); } } @@ -460,15 +461,15 @@ void Naive::run(Dim N, Dim saveInterval) { void Naive::exportTimestep(Dim t) { std::ostringstream oss; oss << "a_par_t" << t << ".npy"; - exportToNpy(oss.str(), sliceXY(moments_K, A_PAR)); + exporter.exportTo(oss.str(), Grid::sliceXY(moments_K, A_PAR)); oss.str(""); oss << "phi_t" << t << ".npy"; - exportToNpy(oss.str(), phi_K); + exporter.exportTo(oss.str(), phi_K); oss.str(""); oss << "uekpar_t" << t << ".npy"; - exportToNpy(oss.str(), ueKPar_K); + exporter.exportTo(oss.str(), ueKPar_K); } Real Naive::updateTimestep(Real dt, Real tempDt, bool noInc, Real relative_error) const { @@ -479,86 +480,83 @@ Real Naive::updateTimestep(Real dt, Real tempDt, bool noInc, Real relative_error return dt; } -mdarray> Naive::getFinalAPar() { - Buf2D buf{X, Y}; - // This actually wrecks A_PAR, but we don't need it anymore - fftInv(sliceXY(moments_K, A_PAR), buf.to_mdspan()); - - // Write to a layout_right array and normalize - mdarray> result{X, Y}; - for_each_xy([&](Dim x, Dim y) { result(x, y) = buf(x, y) * XYNorm; }); - - return result; -} - -Naive::Buf2D Naive::getMoment(Dim m) const { +Naive::Buf::R_XY Naive::getMoment(Dim m) const { // Make a copy first - Buf2D_K tmp{KX, KY}; - for_each_kxky([&](Dim kx, Dim ky) { tmp(kx, ky) = moments_K(kx, ky, m); }); + Buf::C_XY tmp = g.cBufXY(); + g.for_each_kxky([&](Dim kx, Dim ky) { tmp(kx, ky) = moments_K(kx, ky, m); }); - Buf2D out{X, Y}; - fftInv(tmp.to_mdspan(), out.to_mdspan()); + Buf::R_XY out = g.rBufXY(); + tf.bfft(tmp, out); return out; } -[[nodiscard]] Naive::Buf2D_K Naive::fullBracket(Naive::CViewXY op1, Naive::CViewXY op2) { - DxDy derOp1{X, Y}, derOp2{X, Y}; - derivatives(op1, derOp1); - derivatives(op2, derOp2); - - return halfBracket(derOp1, derOp2); -} - -void Naive::derivatives(const Naive::CViewXY &op, Naive::DxDy output) { - DxDy Der_K{KX, KY}; - prepareDXY_PH(op, Der_K.DX, Der_K.DY); - fftInv(Der_K.DX.to_mdspan(), output.DX); - fftInv(Der_K.DY.to_mdspan(), output.DY); -} - -Naive::Buf2D_K Naive::halfBracket(Naive::DxDy derOp1, - Naive::DxDy derOp2) { - Buf2D br{X, Y}; - Buf2D_K br_K{KX, KY}; - bracket(derOp1, derOp2, br); - fft(br.to_mdspan(), br_K.to_mdspan()); - br_K(0, 0) = 0; - return br_K; -} - -void Naive::exportToNpy(std::string path, ahr::Naive::ViewXY view) const { - // Coordinates are flipped because we use layout_left - cnpy::npy_save(std::move(path), view.data_handle(), {Y, X}, "w"); -} +Real Naive::getTimestep(DxDy dPhi, DxDy dNE, DxDy dAPar) { + // compute flows + DxDy ve, b; + MaxReducer vyMax{0}, vxMax{0}, bxMax{0}, byMax{0}, bPerpMaxRed{0}; + + // Note that this is minus in Viriato, but we don't care because we're taking the absolute value + // anyway. + ve.DX = dPhi.DY; + ve.DY = dPhi.DX; + b.DX = dAPar.DY; + b.DY = dAPar.DX; + + g.for_each_xy([&](Dim x, Dim y) { + bxMax = std::max(bxMax, std::abs(b.DX(x, y))); + byMax = std::max(byMax, std::abs(b.DY(x, y))); + bPerpMaxRed = + std::max(bPerpMaxRed, std::sqrt(b.DX(x, y) * b.DX(x, y) + b.DY(x, y) * b.DY(x, y))); + vxMax = std::max(vxMax, std::abs(ve.DX(x, y))); + vyMax = std::max(vyMax, std::abs(ve.DY(x, y))); + if (rhoI >= smallRhoI) { + vxMax = std::max(vxMax, rhoS * rhoS * std::abs(dNE.DX(x, y))); + vyMax = std::max(vyMax, rhoS * rhoS * std::abs(dNE.DY(x, y))); + } + }); -void Naive::exportToNpy(std::string path, ahr::Naive::CViewXY view) const { - // fft overwrites the input, so we need to copy it to a temporary buffer - Buf2D_K tempK{KX, KY}; - Buf2D temp{X, Y}; + bPerpMax = bPerpMaxRed; + + Real kperpDum2 = std::pow(g.ky_(g.KY / 2), 2) + std::pow(Real(g.KX), 2); + Real omegaKaw; + if (rhoI < smallRhoI) { + omegaKaw = std::sqrt(1.0 + kperpDum2 * (3.0 / 4.0 * rhoI * rhoI + rhoS * rhoS)) * + g.ky_(g.KY / 2) * bPerpMax / (1.0 + kperpDum2 * de * de); + } else { + omegaKaw = + std::sqrt(kperpDum2 * + (rhoS * rhoS - rhoI * rhoI / (Gamma0(0.5 * kperpDum2 * rhoI * rhoI) - 1.0))) * + g.ky_(g.KY / 2 + 1) * bPerpMax / std::sqrt(1.0 + kperpDum2 * de * de); + } - for_each_kxky([&](Dim kx, Dim ky) { tempK(kx, ky) = view(kx, ky); }); + Real dx = lx / Real(g.X), dy = ly / Real(g.Y); - fftInv(tempK.to_mdspan(), temp.to_mdspan()); - normalize(temp.to_mdspan(), temp.to_mdspan()); + Real CFLFlow; + if (g.M > 2) { + CFLFlow = std::min({dx / vxMax, dy / vyMax, 2.0 / omegaKaw, + std::min(dx / bxMax, dy / byMax) / (rhoS / de) / std::sqrt(LAST)}); + } else { + CFLFlow = std::min({dx / vxMax, dy / vyMax, 2.0 / omegaKaw, dx / bxMax, dy / byMax}); + } - exportToNpy(std::move(path), temp.to_mdspan()); -} + spdlog::debug("vxmax: {}, vymax: {}, bxmax: {}, bymax: {}", vxMax, vyMax, bxMax, byMax); + spdlog::debug("bperp_max: {}, omegakaw: {}, CFLFlow: {}", bPerpMax, omegaKaw, CFLFlow); + spdlog::debug("Calculated timestep: {}", CFLFrac * CFLFlow); -void Naive::normalize(Naive::ViewXY view, Naive::ViewXY viewOut) const { - for_each_xy([&](Dim x, Dim y) { viewOut(x, y) = view(x, y) * XYNorm; }); + return CFLFrac * CFLFlow; } Naive::Energies Naive::calculateEnergies() const { Energies e{}; - for_each_kxky([&](Dim kx, Dim ky) { + g.for_each_kxky([&](Dim kx, Dim ky) { Real const factor = kx == 0 ? 0.5 : 1.0; - e.magnetic += factor * kPerp2(kx, ky) * std::norm(moments_K(kx, ky, A_PAR)); + e.magnetic += factor * g.kPerp2(kx, ky) * std::norm(moments_K(kx, ky, A_PAR)); if (rhoI < smallRhoI) { - e.kinetic += factor * kPerp2(kx, ky) * std::norm(phi_K(kx, ky)); + e.kinetic += factor * g.kPerp2(kx, ky) * std::norm(phi_K(kx, ky)); } else { - e.kinetic -= factor * 1.0 / (rhoI * rhoI) * (Gamma0(kPerp2(kx, ky) * rhoI * rhoI / 2.0) - 1) * - std::norm(phi_K(kx, ky)); + e.kinetic -= factor * 1.0 / (rhoI * rhoI) * + (Gamma0(g.kPerp2(kx, ky) * rhoI * rhoI / 2.0) - 1) * std::norm(phi_K(kx, ky)); } }); diff --git a/cpp/lib/Naive.hpp b/cpp/lib/Naive.hpp index cd5788f..b64b00c 100644 --- a/cpp/lib/Naive.hpp +++ b/cpp/lib/Naive.hpp @@ -1,8 +1,15 @@ #pragma once +#include "Brackets.hpp" +#include "Exponentials.hpp" +#include "Exporter.hpp" +#include "Filter.hpp" #include "HermiteRunner.hpp" +#include "Transformer.hpp" #include "constants.hpp" #include "debug.hpp" +#include "grid.hpp" +#include "hyper.hpp" #include "nonlinears.hpp" #include @@ -29,58 +36,31 @@ class Naive : public ahr::HermiteRunner { void run(Dim N, Dim saveInterval) override; - mdarray> getFinalAPar() override; + Grid g; + Transformer tf{g}; + Exporter exporter{g, tf}; + HouLiFilterCached1D hlFilter{g}; + Brackets br{g, tf, hlFilter}; private: - template - using buf_left = fftw::basic_mdbuffer, Complex, - stdex::layout_left, IsReal>; + using View = Grid::View; + using Buf = Grid::Buf; -public: - using Buf3D_K = buf_left<3u, false>; - using Buf2D_K = buf_left<2u, false>; - using Buf3D = buf_left<3u, true>; - using Buf2D = buf_left<2u, true>; - - using CViewXY = stdex::mdspan, stdex::layout_left>; - using ViewXY = stdex::mdspan, stdex::layout_left>; - -private: - Dim const M, X, Y, KX{X / 2 + 1}, KY{Y}; - Real XYNorm{1.0 / double(X) / double(Y)}; ///< Normalization factor for FFT + const Real XYNorm{1.0 / Real(g.X) / Real(g.Y)}; ///< Normalization factor for FFT - Real dt{-1}; ///< timestep - Real elapsedT{0.0}; ///< total time elapsed + Real dt{-1}; ///< timestep + Real elapsedT{0.0}; ///< total time elapsed + HyperCoefficients hyper{}; ///< Hyper-coefficients, updated every dt - void hlFilter(CViewXY &complexArray); - void fft(ViewXY in, CViewXY out); ///< FFT with Hou-Li Filter + void fftHL(View::R_XY in, View::C_XY out); ///< FFT with Hou-Li Filter - fftw::plan_r2c<2u> fft_base{}; - fftw::plan_c2r<2u> fftInv{}; Real bPerpMax{0}; static constexpr Dim N_E = 0; static constexpr Dim A_PAR = 1; static constexpr Dim G_MIN = 2; - const Dim LAST = M - 1; ///< This is equivalent to ngtot in Viriato - - template struct DxDy { - using buffer_t = Buffer; - Buffer DX, DY; - - template - requires std::constructible_from - explicit DxDy(Args &&...args) - : DX{std::forward(args)...}, DY{std::forward(args)...} {} - - DxDy(Buffer dx, Buffer dy) : DX(dx), DY(dy) {} - - template - requires std::convertible_to - operator DxDy() { // NOLINT(google-explicit-constructor) - return {U(DX), U(DY)}; - } - }; + const Dim LAST = g.M - 1; ///< This is equivalent to ngtot in Viriato + template using DxDy = Grid::DxDy; /// \defgroup Buffers for all the physical quantities used. /// Names ending in K mean the values are in phase space. @@ -92,176 +72,43 @@ class Naive : public ahr::HermiteRunner { /// - m=1: A∥ (or Apar, parallel velocity) /// TODO maybe instead of these enormous amounts of memory, we could reuse (parallelism might /// suffer) - Buf3D_K moments_K{KX, KY, M}, momentsNew_K{KX, KY, M}; + Buf::C_MXY moments_K, momentsNew_K; /// A|| equilibrium value, used in corrector step - Buf2D_K aParEq_K{KX, KY}; + Buf::C_XY aParEq_K; /// Φ: the electrostatic potential. - Buf2D_K phi_K{KX, KY}, phi_K_New{KX, KY}; + Buf::C_XY phi_K, phi_K_New; /// sq(∇⊥) A∥, also parallel electron velocity - Buf2D_K ueKPar_K{KX, KY}, ueKPar_K_New{KX, KY}; + Buf::C_XY ueKPar_K, ueKPar_K_New; + + /// Derivatives of moments + DxDy dGM; + + /// Derivatives of phi and ueKPar + DxDy dPhi, dUEKPar; + /// @} - void for_each_xy(std::invocable auto fun) const { - for (Dim y = 0; y < Y; ++y) { - for (Dim x = 0; x < X; ++x) { - fun(x, y); - } - } - } - - /// Iterate in phase space, will later be changed to account for phase space dims - void for_each_kxky(std::invocable auto fun) const { - for (Dim ky = 0; ky < KY; ++ky) { - for (Dim kx = 0; kx < KX; ++kx) { - fun(kx, ky); - } - } - } - - void for_each_mxy(std::invocable auto fun) { - for (Dim m = 0; m < M; ++m) { - for (Dim y = 0; y < Y; ++y) { - for (Dim x = 0; x < X; ++x) { - fun(m, x, y); - } - } - } - } - - /// Returns a 2D mdspan of values in the XY space for a specified m. - template - requires std::same_as, Buf3D> or std::same_as, Buf3D_K> - static auto sliceXY(Buf &moments, Dim m) { - return stdex::submdspan(moments.to_mdspan(), stdex::full_extent, stdex::full_extent, m); - } - - /// Returns a DxDy of 2D mdspans for a specified m. - template - requires std::same_as // or std::same_as // TODO likely no need for - // DxDy in K space? - static auto sliceXY(DxDy &moments, Dim m) { - return DxDy{sliceXY(moments.DX, m), sliceXY(moments.DY, m)}; - } - - /// Prepares the δx and δy of viewPH in phase space, as well as over-normalizes - /// (after inverse FFT, values will be properly normalized) - void prepareDXY_PH(CViewXY view_K, CViewXY viewDX_K, CViewXY viewDY_K) { - for_each_kxky([&](Dim kx, Dim ky) { - viewDX_K(kx, ky) = kx_(kx) * 1i * view_K(kx, ky) * XYNorm; - viewDY_K(kx, ky) = ky_(ky) * 1i * view_K(kx, ky) * XYNorm; - }); - } - - /// computes bracket [view, other], expects normalized values - void bracket(const ViewXY &dxOp1, const ViewXY &dyOp1, const ViewXY &dxOp2, const ViewXY &dyOp2, - const ViewXY &output) { - for_each_xy([&](Dim x, Dim y) { - output(x, y) = dxOp1(x, y) * dyOp2(x, y) - dyOp1(x, y) * dxOp2(x, y); - }); - } - - /// bracket overload for DxDy params - void bracket(const DxDy &op1, const DxDy &op2, const ViewXY &output) { - bracket(op1.DX, op1.DY, op2.DX, op2.DY, output); - } - - /// Bracket that only takes inputs and allocates temporaries and output - [[nodiscard]] Buf2D_K fullBracket(CViewXY op1, CViewXY op2); - - /// Compute derivatives in real space and store them in output - void derivatives(const CViewXY &value, DxDy output); - - /// Bracket that takes in derivatives that were already computed - [[nodiscard]] Buf2D_K halfBracket(DxDy op1, DxDy op2); + View::C_XY momentK(Dim m) { return g.sliceXY(moments_K, m); } // ================= // Math helpers // TODO other file/class // ================= - [[nodiscard]] Real ky_(Dim ky) const { - return (ky <= (KY / 2) ? Real(ky) : Real(ky) - Real(KY)) * Real(lx) / Real(ly); - }; - [[nodiscard]] Real kx_(Dim kx) const { return Real(kx); }; - - [[nodiscard]] Real kPerp2(Dim kx, Dim ky) const { - auto dkx = kx_(kx), dky = ky_(ky); - return dkx * dkx + dky * dky; - } - - [[nodiscard]] Real kPerp(Dim kx, Dim ky) const { return std::sqrt(kPerp2(kx, ky)); } - - [[nodiscard]] Real exp_nu(Dim kx, Dim ky, Real nu2, Real dt) const { - return std::exp(-(nu * kPerp2(kx, ky) + nu2 * std::pow(kPerp2(kx, ky), hyper_order)) * dt); - } - - [[nodiscard]] Real exp_gm(Dim m, Real hyper_nuei, Real dt) const { - return exp(-(Real(m) * nu_ei + std::pow(m, 2 * hyper_morder) * hyper_nuei) * dt); - } - - [[nodiscard]] Real exp_eta(Dim kx, Dim ky, Real res2, Real dt) const { - return std::exp(-(res * kPerp2(kx, ky) + res2 * std::pow(kPerp2(kx, ky), hyper_order)) * dt / - (1.0 + kPerp2(kx, ky) * de * de)); - } + /// \defgroup @{ + exp::Nu exp_nu{g}; + exp::NuG exp_nu_g{g}; + exp::Eta exp_eta{g}; + exp::GM exp_gm{g}; + /// @} /// getTimestep calculates flows and magnetic fields to determine a dt. /// It also updates bPerpMax in the process. - [[nodiscard]] Real getTimestep(DxDy dPhi, DxDy dNE, DxDy dAPar) { - // compute flows - DxDy ve, b; - Real vyMax{0}, vxMax{0}, bxMax{0}, byMax{0}; - bPerpMax = 0; - - // Note that this is minus in Viriato, but we don't care because we're taking the absolute value - // anyway. - ve.DX = dPhi.DY; - ve.DY = dPhi.DX; - b.DX = dAPar.DY; - b.DY = dAPar.DX; - - for_each_xy([&](Dim x, Dim y) { - bxMax = std::max(bxMax, std::abs(b.DX(x, y))); - byMax = std::max(byMax, std::abs(b.DY(x, y))); - bPerpMax = std::max(bPerpMax, std::sqrt(b.DX(x, y) * b.DX(x, y) + b.DY(x, y) * b.DY(x, y))); - vxMax = std::max(vxMax, std::abs(ve.DX(x, y))); - vyMax = std::max(vyMax, std::abs(ve.DY(x, y))); - if (rhoI >= smallRhoI) { - vxMax = std::max(vxMax, rhoS * rhoS * std::abs(dNE.DX(x, y))); - vyMax = std::max(vyMax, rhoS * rhoS * std::abs(dNE.DY(x, y))); - } - }); - - Real kperpDum2 = std::pow(ky_(KY / 2), 2) + std::pow(Real(KX), 2); - Real omegaKaw; - if (rhoI < smallRhoI) { - omegaKaw = std::sqrt(1.0 + kperpDum2 * (3.0 / 4.0 * rhoI * rhoI + rhoS * rhoS)) * - ky_(KY / 2) * bPerpMax / (1.0 + kperpDum2 * de * de); - } else { - omegaKaw = - std::sqrt(kperpDum2 * - (rhoS * rhoS - rhoI * rhoI / (Gamma0(0.5 * kperpDum2 * rhoI * rhoI) - 1.0))) * - ky_(KY / 2 + 1) * bPerpMax / std::sqrt(1.0 + kperpDum2 * de * de); - } - - Real dx = lx / Real(X), dy = ly / Real(Y); - - Real CFLFlow; - if (M > 2) { - CFLFlow = std::min({dx / vxMax, dy / vyMax, 2.0 / omegaKaw, - std::min(dx / bxMax, dy / byMax) / (rhoS / de) / std::sqrt(LAST)}); - } else { - CFLFlow = std::min({dx / vxMax, dy / vyMax, 2.0 / omegaKaw, dx / bxMax, dy / byMax}); - } - - spdlog::debug("vxmax: {}, vymax: {}, bxmax: {}, bymax: {}", vxMax, vyMax, bxMax, byMax); - spdlog::debug("bperp_max: {}, omegakaw: {}, CFLFlow: {}", bPerpMax, omegaKaw, CFLFlow); - spdlog::debug("Calculated timestep: {}", CFLFrac * CFLFlow); - - return CFLFrac * CFLFlow; - } + [[nodiscard]] Real getTimestep(DxDy dPhi, DxDy dNE, + DxDy dAPar); public: struct Energies { @@ -274,25 +121,11 @@ class Naive : public ahr::HermiteRunner { Real elapsedTime() const { return elapsedT; } - // Returns a const CViewXY - auto getMoment_K(Dim m) const { return sliceXY(moments_K, m); } - - Buf2D getMoment(Dim m) const; + Buf::R_XY getMoment(Dim m) const; private: Real updateTimestep(Real dt, Real tempDt, bool noInc, Real relative_error) const; -public: - // TODO(luka) separate exporting utility - void exportToNpy(std::string path, ViewXY view) const; - - // Will also normalize and inverseFFT - void exportToNpy(std::string path, CViewXY view) const; - -private: - // If view = viewOut, then we're normalizing in place. - void normalize(Naive::ViewXY view, Naive::ViewXY viewOut) const; - void exportTimestep(Dim t); }; }; // namespace ahr \ No newline at end of file diff --git a/cpp/lib/NpyMdspan.hpp b/cpp/lib/NpyMdspan.hpp new file mode 100644 index 0000000..7fb3d66 --- /dev/null +++ b/cpp/lib/NpyMdspan.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "grid.hpp" +#include +#include + +namespace ahr { +namespace fs = std::filesystem; + +/// Owning holder of a npy array with convenience to see it as an mdspan. +/// We can use this to avoid needlessly copying into an mdarray. +class NpyMdspan { + cnpy::NpyArray array_; + +public: + explicit NpyMdspan(cnpy::NpyArray array) : array_(std::move(array)) {} + + // Layout-right + using ViewXY = stdex::mdspan>; + + // TODO(luka) const view + ViewXY view() { + std::span const extents{array_.shape.data(), 2}; + return ViewXY{array_.data(), extents}; + } + + [[nodiscard]] bool valid() const { return array_.word_size == sizeof(Real); } +}; + +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/PrepareDerivatives.cpp b/cpp/lib/PrepareDerivatives.cpp new file mode 100644 index 0000000..75255ae --- /dev/null +++ b/cpp/lib/PrepareDerivatives.cpp @@ -0,0 +1,62 @@ +#include "PrepareDerivatives.hpp" + +#include + +namespace ahr { + +void PrepareDerivatives::operator()(View::C_XY const &in, DxDy out) const { + grid.for_each_kxky([&](Dim kx, Dim ky) { + Complex in_norm = 1i * in(kx, ky) * XYNorm; + out.DX(kx, ky) = kx_(kx) * in_norm; + out.DY(kx, ky) = ky_(ky) * in_norm; + }); +} + +void PrepareDerivativesVector::operator()(View::C_XY const &in, DxDy out) const { + eve::logical const even_mask{[](int idx, int) { return idx % 2 == 0; }}; + VReal const kx_v_init{[](int idx, int) { return Real(idx / 2); }}; + VReal const norm_v{XYNorm}; + + cilk_for (Dim ky = 0; ky < grid.KY; ky += KY_TILE) { + // broadcast ky values + using TileReal = std::array; + TileReal ky_v; + for (Dim tile_ky = 0; tile_ky < KY_TILE; ++tile_ky) { + ky_v[tile_ky] = ky_(ky + tile_ky); + } + + // Initialize kx values + VReal kx_v = kx_v_init; + + Dim kx = 0; + for (; kx <= grid.KX - C_WIDTH; kx += C_WIDTH, kx_v += C_WIDTH) { + auto input = [&](int i) { return (Real *)&in(kx, ky + i); }; + auto out_dx = [&](int i) { return (Real *)&out.DX(kx, ky + i); }; + auto out_dy = [&](int i) { return (Real *)&out.DY(kx, ky + i); }; + + for (int i = 0; i < KY_TILE; ++i) { + auto in_v = VReal{input(i)}; + // (a + bi) * i -> (-b + ai) + // swap real and imaginary parts + auto swapped = eve::swap_adjacent(in_v); + // selectively negate + auto mul_with_i = eve::minus[even_mask](swapped); + // normalize + auto in_norm = mul_with_i * norm_v; + + eve::store(kx_v * in_norm, out_dx(i)); + eve::store(ky_v[i] * in_norm, out_dy(i)); + } + } + + // tail + for (; kx < grid.KX; ++kx) { + for (int i = 0; i < KY_TILE; ++i) { + Complex in_norm = 1i * in(kx, ky + i) * XYNorm; + out.DX(kx, ky + i) = kx_(kx) * in_norm; + out.DY(kx, ky + i) = ky_(ky + i) * in_norm; + } + } + } +} +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/PrepareDerivatives.hpp b/cpp/lib/PrepareDerivatives.hpp new file mode 100644 index 0000000..a415e77 --- /dev/null +++ b/cpp/lib/PrepareDerivatives.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "constants.hpp" +#include "grid.hpp" +#include + +namespace ahr { + +class PrepareDerivatives { +protected: + using View = Grid::View; + template using DxDy = Grid::DxDy; + +public: + explicit PrepareDerivatives(Grid const &grid) : grid(grid) {} + + void operator()(View::C_XY const &in, DxDy out) const; + +protected: + Grid const &grid; + + /// Normalization factor for FFT + const Real XYNorm{1.0 / Real(grid.X) / Real(grid.Y)}; + + // TODO extract to common utility + [[nodiscard]] Real ky_(Dim ky) const { + return (ky <= (grid.KY / 2) ? Real(ky) : Real(ky) - Real(grid.KY)) * Real(lx) / Real(ly); + } + [[nodiscard]] Real kx_(Dim kx) const { return Real(kx); } +}; + +class PrepareDerivativesVector : protected PrepareDerivatives { +public: + explicit PrepareDerivativesVector(Grid const &grid) : PrepareDerivatives(grid) {} + + void operator()(View::C_XY const &in, DxDy out) const; + +protected: + using VReal = eve::wide; + + // TODO vec_utils + using VIdx = eve::wide; + static auto constexpr R_WIDTH = VReal::size(); + static auto constexpr C_WIDTH = VReal::size() / 2; + + static constexpr auto KY_TILE = 4; +}; + +} // namespace ahr diff --git a/cpp/lib/Transformer.cpp b/cpp/lib/Transformer.cpp new file mode 100644 index 0000000..b5888c9 --- /dev/null +++ b/cpp/lib/Transformer.cpp @@ -0,0 +1,27 @@ +// +// Created by Luka on 10/23/2024. +// + +#include "Transformer.hpp" + +namespace ahr { +void Transformer::init() { + auto r = grid.rBufXY(); + auto c = grid.cBufXY(); + fftFwd = fftw::plan_r2c<2u>::dft(r.to_mdspan(), c.to_mdspan(), fftw::ESTIMATE); + fftBwd = fftw::plan_c2r<2u>::dft(c.to_mdspan(), r.to_mdspan(), fftw::ESTIMATE); +} + +void Transformer::fft(Grid::View::R_XY in, Grid::View::C_XY out) const { fftFwd(in, out); } + +void Transformer::bfft(Grid::View::C_XY in, Grid::View::R_XY out) const { fftBwd(in, out); } + +void Transformer::normalize(Grid::View::C_XY view, Grid::View::C_XY out) const { + grid.for_each_kxky([&](Dim kx, Dim ky) { out(kx, ky) = view(kx, ky) * XYNorm; }); +} + +void Transformer::normalize(Grid::View::R_XY view, Grid::View::R_XY out) const { + grid.for_each_xy([&](Dim x, Dim y) { out(x, y) = view(x, y) * XYNorm; }); +} + +} // namespace ahr diff --git a/cpp/lib/Transformer.hpp b/cpp/lib/Transformer.hpp new file mode 100644 index 0000000..07f98e3 --- /dev/null +++ b/cpp/lib/Transformer.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include "grid.hpp" + +namespace ahr { + +class Transformer { + +public: + explicit Transformer(Grid const &grid) : grid(grid) {} + + /// Plan FFTs, etc. + void init(); + + /// Forward FFT + void fft(Grid::View::R_XY in, Grid::View::C_XY out) const; + + /// Backwards FFT (unnormalized, destructive) + void bfft(Grid::View::C_XY in, Grid::View::R_XY out) const; + + /// Normalize a complex buffer (can be in-place) + void normalize(Grid::View::C_XY view, Grid::View::C_XY out) const; + + /// Normalize a real buffer (can be in-place) + void normalize(Grid::View::R_XY view, Grid::View::R_XY out) const; + +private: + fftw::plan_r2c<2u> fftFwd{}; + fftw::plan_c2r<2u> fftBwd{}; + + Grid const &grid; + + /// Normalization factor for FFT + Real XYNorm{1.0 / double(grid.X) / double(grid.Y)}; +}; + +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/cilk.hpp b/cpp/lib/cilk.hpp index 68c9de9..221a231 100644 --- a/cpp/lib/cilk.hpp +++ b/cpp/lib/cilk.hpp @@ -5,6 +5,8 @@ #define cilk_spawn /* empty */ #define cilk_sync /* empty */ #define cilk_scope /* empty */ +#define cilk_reducer(init, reduce) /* empty */ + #else #include #endif diff --git a/cpp/lib/constants.hpp b/cpp/lib/constants.hpp index 1224057..3f18897 100644 --- a/cpp/lib/constants.hpp +++ b/cpp/lib/constants.hpp @@ -11,58 +11,36 @@ constexpr Real ly = 1.0 * 2 * pi; // TODO organize these into struct instead of global /// Time parameters -inline Real InitAA0Fac = 0.1; +constexpr Real InitAA0Fac = 0.1; inline Real CFLFrac = 0.2; -inline Real epsilon = 1e-10; +constexpr Real epsilon = 1e-10; // This actually means MaxP+1 is the last computed value -inline Dim MaxP = 1; +constexpr Dim MaxP = 1; -inline Real aa0 = InitAA0Fac; /// TODO not const -inline Real low = 0.92; +constexpr Real aa0 = InitAA0Fac; /// TODO not const +constexpr Real low = 0.92; /// FLR -inline Real rhoI = 1.0e-7; -inline Real rhoS = 1.0e-7; -inline Real de = 1.0e-7; +constexpr Real rhoI = 1.0e-7; +constexpr Real rhoS = 1.0e-7; +constexpr Real de = 1.0e-7; /// MHD -inline Real smallRhoI = 1.0e-6; +constexpr Real smallRhoI = 1.0e-6; /// Diffusion -inline Real nu_ei = 0.0001; +constexpr Real nu_ei = 0.0001; inline Real res = 0.1; inline Real nu = 0.1; // This is niu in Viriato -inline Real hyper_coef_g = 0.0; -inline Real hyper_coef = 0.0; -inline Real hyperm_coef = 0.0; +constexpr Real hyper_coef_g = 0.0; +constexpr Real hyper_coef = 0.0; +constexpr Real hyperm_coef = 0.0; -inline Dim hyper_order = 3; -inline Dim hyper_order_g = 3; -inline Dim hyper_morder = 3; +constexpr Dim hyper_order = 3; +constexpr Dim hyper_order_g = 3; +constexpr Dim hyper_morder = 3; /// equil -inline Real a0 = 1.0; - -struct HyperCoefficients { - Real nu_g, nu_2, eta2, nu_ei; - - static HyperCoefficients calculate(Real dt, Dim KX, Dim KY, Dim M) { - Real kPerpMax2 = std::pow(KX, 2) + std::pow(Real(KY) / 2, 2); - - HyperCoefficients ret{}; - ret.nu_g = hyper_coef_g / dt / std::pow(kPerpMax2, hyper_order_g); - ret.nu_2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order); - if (kPerpMax2 * de * de > 1) { - ret.eta2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order - 1) * de * de; - } else { - ret.eta2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order); - } - - ret.nu_ei = hyperm_coef / dt / std::pow(M, 2 * hyper_morder); - - return ret; - } -}; - +constexpr Real a0 = 1.0; } // namespace ahr \ No newline at end of file diff --git a/cpp/lib/equillibrium.hpp b/cpp/lib/equillibrium.hpp index 5fa4a5a..1f8c5d3 100644 --- a/cpp/lib/equillibrium.hpp +++ b/cpp/lib/equillibrium.hpp @@ -2,6 +2,7 @@ #include "Naive.hpp" #include "constants.hpp" +#include "grid.hpp" #include #include @@ -13,39 +14,36 @@ Real xx(Dim x, Dim X) { return lx * (Real(x) - Real(X) / 2.0) / Real(X); } Real yy(Dim y, Dim Y) { return ly * (Real(y) - Real(Y) / 2.0) / Real(Y); } -auto equilibriumGauss(Dim X, Dim Y) { - Naive::Buf2D aParEq{X, Y}, phiEq{X, Y}; +auto equilibriumGauss(Grid const &g) { + auto aParEq = g.rBufXY(), phiEq = g.rBufXY(); - for (int x = 0; x < X; ++x) { - for (int y = 0; y < Y; ++y) { - using std::numbers::pi; - aParEq(x, y) = a0 * std::exp(-std::pow(yy(y, Y) * 2 * pi * 2 / ly, 2)) * - std::exp(-std::pow(xx(x, X) * 2 * pi * 2 / lx, 2)); + g.for_each_xy([&](Dim x, Dim y) { + using std::numbers::pi; + aParEq(x, y) = a0 * std::exp(-std::pow(yy(y, g.Y) * 2 * pi * 2 / ly, 2)) * + std::exp(-std::pow(xx(x, g.X) * 2 * pi * 2 / lx, 2)); - phiEq(x, y) = 0; - } - } + phiEq(x, y) = 0; + }); return std::make_pair(std::move(aParEq), std::move(phiEq)); } -auto equilibriumOT01(Dim X, Dim Y) { - Naive::Buf2D aParEq{X, Y}, phiEq{X, Y}; +auto equilibriumOT01(Grid const &g) { + auto aParEq = g.rBufXY(), phiEq = g.rBufXY(); + + g.for_each_xy([&](Dim x, Dim y) { + using std::numbers::pi; + aParEq(x, y) = std::cos(4 * pi * xx(x, g.X) / lx) + 2 * std::cos(2 * pi * yy(y, g.Y) / ly); + phiEq(x, y) = -2 * (std::cos(2 * pi * xx(x, g.X) / lx) + std::cos(2 * pi * yy(y, g.Y) / ly)); + }); - for (int x = 0; x < X; ++x) { - for (int y = 0; y < Y; ++y) { - using std::numbers::pi; - aParEq(x, y) = std::cos(4 * pi * xx(x, X) / lx) + 2 * std::cos(2 * pi * yy(y, Y) / ly); - phiEq(x, y) = -2 * (std::cos(2 * pi * xx(x, X) / lx) + std::cos(2 * pi * yy(y, Y) / ly)); - } - } return std::make_pair(std::move(aParEq), std::move(phiEq)); } -auto equilibrium(std::string_view name, Dim X, Dim Y) { +auto equilibrium(std::string_view name, Grid const &g) { if (name == "gauss") { - return equilibriumGauss(X, Y); + return equilibriumGauss(g); } else if (name == "OT01") { - return equilibriumOT01(X, Y); + return equilibriumOT01(g); } else { throw std::invalid_argument("name must be one of gauss or OT01"); } diff --git a/cpp/lib/grid.hpp b/cpp/lib/grid.hpp new file mode 100644 index 0000000..b4b5bf9 --- /dev/null +++ b/cpp/lib/grid.hpp @@ -0,0 +1,154 @@ +#pragma once + +#include "cilk.hpp" +#include "constants.hpp" +#include "typedefs.hpp" + +#include + +#define FOREACH_XY(grid, ...) \ + cilk_for (Dim y = 0; y < (grid).Y; ++y) { \ + for (Dim x = 0; x < (grid).X; ++x) { \ + __VA_ARGS__; \ + } \ + } + +#define FOREACH_KXKY(grid, ...) \ + cilk_for (Dim ky = 0; ky < (grid).KY; ++ky) { \ + for (Dim kx = 0; kx < (grid).KX; ++kx) { \ + __VA_ARGS__; \ + } \ + } + +namespace ahr { +namespace stdex = std::experimental; + +struct Grid { + Dim const M, X, Y; + Dim const KX{X / 2 + 1}, KY{Y}; + + Grid(Dim M, Dim X, Dim Y) : M(M), X(X), Y(Y) {} + +private: + template + using buf_left = fftw::basic_mdbuffer, Complex, + stdex::layout_left, IsReal>; + +public: + struct Buf { + using C_XY = buf_left<2u, false>; + using R_XY = buf_left<2u, true>; + using C_MXY = buf_left<3u, false>; + using R_MXY = buf_left<3u, true>; + }; + + struct View { + using C_XY = stdex::mdspan, stdex::layout_left>; + using R_XY = stdex::mdspan, stdex::layout_left>; + }; + +private: + struct { + Buf::C_XY::extents_type cXY; + Buf::R_XY::extents_type rXY; + Buf::C_MXY::extents_type cMXY; + Buf::R_MXY::extents_type rMXY; + } extents{ + stdex::extents{KX, KY}, + std::array{X, Y}, + std::array{M, KX, KY}, + std::array{M, X, Y}, + }; + + struct { + Buf::C_XY::mapping_type cXY; + Buf::R_XY::mapping_type rXY; + Buf::C_MXY::mapping_type cMXY; + Buf::R_MXY::mapping_type rMXY; + } mapping{ + Buf::C_XY::extents_type{KX, KY}, + Buf::R_XY::extents_type{X, Y}, + Buf::C_MXY::extents_type{KX, KY, M}, + Buf::R_MXY::extents_type{X, Y, M}, + }; + +public: + /// @defgroup Buffer allocators + /// @{ + [[nodiscard]] Buf::C_XY cBufXY() const { return {mapping.cXY}; } + [[nodiscard]] Buf::R_XY rBufXY() const { return {mapping.rXY}; } + [[nodiscard]] Buf::C_MXY cBufMXY() const { return {mapping.cMXY}; } + [[nodiscard]] Buf::R_MXY rBufMXY() const { return {mapping.rMXY}; } + /// @} + + /// Named pair for holding both dx and dy derivatives + template struct DxDy { + T DX, DY; + + template + requires std::constructible_from + explicit DxDy(Args... args) : DX{args...}, DY{args...} {} + + DxDy(T dx, T dy) : DX(std::move(dx)), DY(std::move(dy)) {} + + template + requires std::convertible_to + operator DxDy() { // NOLINT(google-explicit-constructor) + return {U(DX), U(DY)}; + } + }; + + // TODO test? + [[nodiscard]] DxDy dBufXY() const { return {rBufXY(), rBufXY()}; } + [[nodiscard]] DxDy dBufMXY() const { return {rBufMXY(), rBufMXY()}; } + + static View::C_XY sliceXY(Buf::C_MXY &moments, Dim m) { + return stdex::submdspan(moments.to_mdspan(), stdex::full_extent, stdex::full_extent, m); + } + + static View::R_XY sliceXY(Buf::R_MXY &moments, Dim m) { + return stdex::submdspan(moments.to_mdspan(), stdex::full_extent, stdex::full_extent, m); + } + + static DxDy sliceXY(DxDy &moments, Dim m) { + return {sliceXY(moments.DX, m), sliceXY(moments.DY, m)}; + } + + // TODO move iteration to a separate class + + /// Iterate in real space + void for_each_xy(std::invocable auto fun) const { FOREACH_XY((*this), fun(x, y)); } + + /// Iterate in phase space + void for_each_kxky(std::invocable auto fun) const { + FOREACH_KXKY((*this), fun(kx, ky)); + } + + [[nodiscard]] Real ky_(Dim ky) const { + return (ky <= (KY / 2) ? Real(ky) : Real(ky) - Real(KY)) * Real(lx) / Real(ly); + } + [[nodiscard]] Real kx_(Dim kx) const { return Real(kx); } + + [[nodiscard]] Real kPerp2(Dim kx, Dim ky) const { + auto dkx = kx_(kx), dky = ky_(ky); + return dkx * dkx + dky * dky; + } + + [[nodiscard]] Real kPerp(Dim kx, Dim ky) const { return std::sqrt(kPerp2(kx, ky)); } +}; + +// Options for various buffer types: +// - Grid::Buf::XY_K +// - Grid::Buf::C_XY +// - Grid::Buf::CXY +// - Grid::Buf::KXY +// - Grid::Buf::KXKY +// - Grid::Buf::MKXKY +// - Grid::CBuf::MXY +// - Grid::CBuf::XY +// - Grid::Buf::XY +// - Grid::BufXY +// - Grid::BufMXY +// - Grid::CBufMXY + +} // namespace ahr diff --git a/cpp/lib/hyper.hpp b/cpp/lib/hyper.hpp new file mode 100644 index 0000000..748eef5 --- /dev/null +++ b/cpp/lib/hyper.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "constants.hpp" +#include "grid.hpp" + +namespace ahr { +struct HyperCoefficients { + Real nu_g, nu_2, eta2, nu_ei; + + static HyperCoefficients calculate(Real dt, Grid const &g) { + Real kPerpMax2 = std::pow(g.KX, 2) + std::pow(Real(g.KY) / 2, 2); + + HyperCoefficients ret{}; + ret.nu_g = hyper_coef_g / dt / std::pow(kPerpMax2, hyper_order_g); + ret.nu_2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order); + if (kPerpMax2 * de * de > 1) { + ret.eta2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order - 1) * de * de; + } else { + ret.eta2 = hyper_coef / dt / std::pow(kPerpMax2, hyper_order); + } + + ret.nu_ei = hyperm_coef / dt / std::pow(g.M, 2 * hyper_morder); + + return ret; + } +}; +} // namespace ahr \ No newline at end of file diff --git a/cpp/lib/nonlinears.hpp b/cpp/lib/nonlinears.hpp index 9f8bb10..428fe39 100644 --- a/cpp/lib/nonlinears.hpp +++ b/cpp/lib/nonlinears.hpp @@ -1,6 +1,7 @@ #pragma once #include "constants.hpp" +#include "hyper.hpp" namespace ahr { [[nodiscard]] inline Real Gamma0(Real x) { diff --git a/cpp/lib/reducer.hpp b/cpp/lib/reducer.hpp new file mode 100644 index 0000000..2c158b0 --- /dev/null +++ b/cpp/lib/reducer.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "cilk.hpp" + +#include +#include + +namespace detail { +template void sum_init(void *v) { *reinterpret_cast(v) = T{}; } + +template void sum_reduce(void *v, void *v2) { + T *a = reinterpret_cast(v), *b = reinterpret_cast(v2); + *a += *b; +} + +template void max_init(void *v) { + *reinterpret_cast(v) = std::numeric_limits::min(); +} + +template void max_reduce(void *v, void *v2) { + T *a = reinterpret_cast(v), *b = reinterpret_cast(v2); + *a = std::max(*a, *b); +} +} // namespace detail + +template using SumReducer = T cilk_reducer(detail::sum_init, detail::sum_reduce); +template using MaxReducer = T cilk_reducer(detail::max_init, detail::max_reduce); diff --git a/cpp/test/CMakeLists.txt b/cpp/test/CMakeLists.txt index 384fe8c..693d6c8 100644 --- a/cpp/test/CMakeLists.txt +++ b/cpp/test/CMakeLists.txt @@ -18,5 +18,12 @@ function(add_viriato_test FILE) add_viriato_test_impl(${NAME} ${FILE} ${ARGN}) endfunction() +add_viriato_test(exporter.cpp) +add_viriato_test(exps.cpp) +add_viriato_test(filter.cpp) +add_viriato_test(grid.cpp) +add_viriato_test(transformer.cpp) +add_viriato_test(prepare-derivatives.cpp) + add_viriato_test(naive-energies.cpp) add_viriato_test(naive-moments.cpp) diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m0.npy index 3edad97..d3ca560 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m1.npy index edce561..fc2e4aa 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m2.npy index cdf82a2..5db563b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m3.npy index 8d1f888..1417774 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m4.npy index 9b1f421..be1a68f 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m5.npy index bec4121..f32f045 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m6.npy index c85d8fa..f7be00d 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m7.npy index c385e59..1a6b59e 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m8.npy index 1df4e2d..c21df77 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m9.npy index 4a24ad8..c829cc3 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m0.npy index 5a3d9f7..a18c6c6 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m1.npy index 68acde5..42974f3 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m2.npy index fc22fd7..d09d9ce 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m3.npy index 9fbcc04..915c647 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m4.npy index b8ff682..03d9715 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m5.npy index 03250e0..42d23a1 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m6.npy index f9023f0..aede04c 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m7.npy index b74289b..3cbe434 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m8.npy index 1d7f2f5..9b8ef24 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m9.npy index ae3656a..6da6bd8 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m0.npy index 022f8e2..19fd6a3 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m1.npy index 1551981..bb8233a 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m2.npy index ba2f962..20aa6ef 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m3.npy index f320393..75084c3 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m4.npy index df38770..0e27b61 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m5.npy index b657d39..83f726b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m6.npy index ec75255..de75372 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m7.npy index a036be1..5502c97 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m8.npy index d9bbdb6..291fe08 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m9.npy index 73a195e..a894245 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m0.npy index f27b454..162c762 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m1.npy index 8b8b67a..7055d51 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m2.npy index 29e3806..5f99f72 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m3.npy index 1766ba8..d63813c 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m4.npy index 348a4a6..3d6c2f3 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m5.npy index 16fb8a7..206fb1d 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m6.npy index c8f6166..f81aaf7 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m7.npy index 2be34b5..b395bdb 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m8.npy index ade9d00..de0d42c 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m9.npy index c3165fe..2af7895 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu0_10_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m0.npy index b8cd586..9b4958e 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m1.npy index af8918d..a88cf60 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m2.npy index 4631bd9..d65a1bb 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m3.npy index 6ef0ad2..d931061 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m4.npy index ec863fc..23ccc20 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m5.npy index cc7fc2b..ba1459b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m6.npy index bfda6b3..b935e25 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m7.npy index be6bedb..4fb145e 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m8.npy index 4d10275..3072c9e 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m9.npy index 545be70..a01cdde 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m0.npy index 4f46a9e..6b0d108 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m1.npy index 0b3b581..2bfa8ab 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m2.npy index ae12d80..73805fe 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m3.npy index aa3d61f..acce2d7 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m4.npy index aba10f1..24f3120 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m5.npy index 14dc4a9..1f4073b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m6.npy index 7a28a3e..224c111 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m7.npy index 660047b..2618d33 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m8.npy index b9625da..e41672b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m9.npy index df94182..d31c55c 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m0.npy index d2a8fac..95e9a59 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m1.npy index b6708e4..dcb7983 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m2.npy index 27c8d5e..8149a3a 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m3.npy index 3670f5a..e6dd11e 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m4.npy index e2f6238..9c87b26 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m5.npy index 15a755c..2e4a830 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m6.npy index 354e00c..db6573d 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m7.npy index 6169449..a8878c6 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m8.npy index 75c3375..7b67851 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m9.npy index d93a896..705969c 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m0.npy index 38c9035..c155ea5 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m1.npy index cdc7491..fac22c2 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m2.npy index c43e399..e213c51 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m3.npy index 914c9c8..2614bdf 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m4.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m4.npy index 797ee04..e2361f4 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m5.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m5.npy index a1e71a2..b8160ba 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m6.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m6.npy index f83cfe7..51e2622 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m7.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m7.npy index 33df97e..375692b 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m8.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m8.npy index b4ebb16..bde9d43 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m9.npy b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m9.npy index 146d391..0ca71ad 100644 Binary files a/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M10_X32_N20_nu1_00_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m0.npy index 25d2087..1ed05ce 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m1.npy index 0334ee8..b47ee8f 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m2.npy index fc5d4e9..0bfe6f9 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m3.npy index e822145..581d81d 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m4.npy index 0f6f31a..fb4918b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m5.npy index cbb3be8..4764bb9 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m6.npy index c776559..afb3140 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m7.npy index 94ef8c0..8d00cd0 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m8.npy index 3d059e7..9194725 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m9.npy index 4fd1bf3..f1458aa 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m0.npy index f519f88..c9d289a 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m1.npy index 27606a6..b573444 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m2.npy index 15dfe64..5717895 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m3.npy index cacced6..55da22e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m4.npy index b9bc433..a1c7f6f 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m5.npy index cacce3e..1d43eb7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m6.npy index e2ca12c..8a66f81 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m7.npy index 0f53393..6c227fd 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m8.npy index 6383e10..5e6f186 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m9.npy index 45be329..d5246e2 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m0.npy index 3c40d2d..e700464 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m1.npy index 9b6d316..de78901 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m2.npy index 1cbf929..bf9e187 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m3.npy index 3a1204d..fcf7aa9 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m4.npy index 7ed66c2..01a2530 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m5.npy index 28ce28b..b0fc55b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m6.npy index 2124760..609871b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m7.npy index ad83c3b..5848748 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m8.npy index 1013a08..b2f0fff 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m9.npy index b663eff..c7f9c21 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m0.npy index 1fb8ad7..dadc50c 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m1.npy index 3178c4d..3167759 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m2.npy index 8dc31d9..6978c54 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m3.npy index 4a9ab4d..74341d3 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m4.npy index 6a8ee07..a2ec264 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m5.npy index cc44368..b7b14a7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m6.npy index 984e30b..46a634f 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m7.npy index efa27ef..4874d1c 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m8.npy index f750253..b1d47ec 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m9.npy index e54c149..db40e81 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu0_10_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m0.npy index 4f550f5..ee3b6a7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m1.npy index 315eebe..3e77ea6 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m2.npy index 737d06f..72a8ca2 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m3.npy index 2b497f1..0ee512b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m4.npy index a1282c5..ad03b9b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m5.npy index 9c87e4f..7cd72ba 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m6.npy index 46452d0..6a79822 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m7.npy index 0884030..a7c469b 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m8.npy index 55f15a6..919f44e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m9.npy index 248160d..f90468f 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m0.npy index cbefe4b..6392883 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m1.npy index e4a7023..db5fdbb 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m2.npy index 5e99e51..7785d85 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m3.npy index 2c7ba6d..df4adf7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m4.npy index 061fd4b..9d2d5d5 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m5.npy index 44df461..ffad645 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m6.npy index 1fe718a..666e9d6 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m7.npy index c613e50..d7f2e67 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m8.npy index 146682f..22e684f 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m9.npy index 40900c5..183ee29 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m0.npy index 264c999..05ccc6e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m1.npy index cc54fa1..8fb6669 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m2.npy index 014ff62..a2cd384 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m3.npy index 3a321b6..0008b32 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m4.npy index 8e782b0..f9b1f44 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m5.npy index fc83ed8..e3d06f4 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m6.npy index 3b281c7..9e311b4 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m7.npy index 1ac900c..13bda4e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m8.npy index f0fba13..650c1bf 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m9.npy index 58c0ef7..f6025df 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m0.npy index b0f3684..1a17153 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m1.npy index 8926a73..effabb7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m2.npy index 5bba8d1..0e5121d 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m3.npy index 6abc44e..18923d4 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m4.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m4.npy index de1e00b..cce0bd7 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m5.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m5.npy index 6890df4..478cfa3 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m6.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m6.npy index 1afd601..fea336e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m7.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m7.npy index 5ce3268..77e07fc 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m8.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m8.npy index 1097fca..3c7b63e 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m9.npy b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m9.npy index 66dddb1..0391afa 100644 Binary files a/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M10_X64_N20_nu1_00_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m0.npy index fa7555a..afe7f63 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m1.npy index c3519fc..8acaa0e 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m10.npy index 29c0937..c87b26d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m11.npy index 9a410d8..0f4a956 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m12.npy index f7f1e9e..8724190 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m13.npy index 87aedfc..d2b5eec 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m14.npy index 080fc6e..f29823f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m15.npy index 45895d3..8f7689e 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m16.npy index f71d44e..7f6c8d1 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m17.npy index 5167863..ed9306a 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m18.npy index da922ae..76f5ab0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m19.npy index 3134c49..63126ef 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m2.npy index 8ad6338..1c17be3 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m3.npy index 3c1d209..56b3162 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m4.npy index d907e2d..5150efd 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m5.npy index 5ac27ef..7553725 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m6.npy index 10b889a..a5c81e4 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m7.npy index 440323a..98a7fcb 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m8.npy index aa1a2a4..abae413 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m9.npy index 961ca99..9084ae2 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m0.npy index 8992364..705f135 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m1.npy index 1b4d0c1..1dec10f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m10.npy index 3bb9d21..44c5e59 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m11.npy index 054b62e..e91cb18 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m12.npy index 861442b..a58a071 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m13.npy index 39f2ff6..aa1eae9 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m14.npy index f3706a4..e960ceb 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m15.npy index 7cb65cb..216235f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m16.npy index 6a42fe3..cd0e781 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m17.npy index dc11ffd..ef7a784 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m18.npy index 279c001..3d8249d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m19.npy index 1ad7540..2f355ad 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m2.npy index 54458f3..a10a865 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m3.npy index 938d80d..849954d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m4.npy index 04eafa5..71af784 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m5.npy index 130a03f..001a7e7 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m6.npy index 576146c..109af83 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m7.npy index 5386001..75e870a 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m8.npy index e7765ec..49dfa2e 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m9.npy index e5fbb53..6a0ca9b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m0.npy index b96ac77..061a60d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m1.npy index 54b1011..32c9930 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m10.npy index 49dc88f..a22db82 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m11.npy index 4ecd5ce..b5414fa 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m12.npy index d741b6e..9d02219 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m13.npy index e97ab1e..7b1cb50 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m14.npy index 335fae5..3bfef25 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m15.npy index 0d5b406..1e5d5a2 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m16.npy index 0689a16..89b6dcd 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m17.npy index 469e3fc..96c933f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m18.npy index 2c90277..194c5f8 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m19.npy index 4f8aa53..78a4c47 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m2.npy index fca1994..c6a5588 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m3.npy index f9df8f4..59bf2ef 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m4.npy index a3c3e1f..10d97fc 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m5.npy index b8120e0..30dd217 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m6.npy index f2ddbb8..351744d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m7.npy index ae0cd48..b15a66c 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m8.npy index 6752505..95c3c62 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m9.npy index 2911c2b..1913b84 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m0.npy index 58d5f5f..bdb00ab 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m1.npy index 64f1827..69e24d6 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m10.npy index 064b87d..ccf8c16 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m11.npy index 623db6a..2492469 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m12.npy index 9fe9a2b..9e8ddbc 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m13.npy index b5c6001..f49f83f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m14.npy index 2c7f6bf..a71456b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m15.npy index e35f600..86af313 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m16.npy index d3cfab5..1869997 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m17.npy index 302edfb..32bcea8 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m18.npy index 2c6149d..187006d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m19.npy index 99ed890..173e604 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m2.npy index 651d030..0f3b058 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m3.npy index 6122619..14aab12 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m4.npy index b4c4f96..4dd9888 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m5.npy index 3543208..87bb835 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m6.npy index 3bac29a..d02c118 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m7.npy index 14aa41e..44ff268 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m8.npy index bc32eb5..607553e 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m9.npy index 31f82ca..a0550e8 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu0_10_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m0.npy index 3e4af3f..1a31953 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m1.npy index e3baa38..be52318 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m10.npy index 9407362..efb16ef 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m11.npy index cc0d672..681c2dc 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m12.npy index dff657d..eb11a51 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m13.npy index b47c677..8f2d748 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m14.npy index 74bea90..bf67cf1 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m15.npy index 69a2c20..863bd0d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m16.npy index f99ebf4..ba5ff14 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m17.npy index 4275942..dc2c4a7 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m18.npy index 91e800e..c51c22d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m19.npy index 6beb4aa..a624ef0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m2.npy index b08437c..f8522a4 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m3.npy index d181856..80e472d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m4.npy index a0101b7..b15f07d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m5.npy index fa1ba4f..440f0d3 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m6.npy index 5566690..62c2b7a 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m7.npy index 72c56db..c2e3df4 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m8.npy index f426d11..1fb2869 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m9.npy index 4a29b19..4ba32e5 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m0.npy index 8c66780..15a6889 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m1.npy index 84b0dce..fe46d21 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m10.npy index 7ce8086..23223d8 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m11.npy index 56561e5..b2e86c9 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m12.npy index ebae43b..b193e52 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m13.npy index 0de03d0..1f9b107 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m14.npy index 7dcb3c9..b3e9f8a 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m15.npy index 8fad791..1097035 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m16.npy index 7c4c219..230c8b3 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m17.npy index 337bdd4..048b81e 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m18.npy index 678b1ef..993dcbb 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m19.npy index fce68b9..a398da7 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m2.npy index 43bf887..631ba16 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m3.npy index 0ef45b6..1cf3599 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m4.npy index 8e139b4..2a8e2a9 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m5.npy index bc04a70..db459e7 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m6.npy index fadbc21..b8e4a7c 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m7.npy index 6037370..e2a6a49 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m8.npy index a52b5fd..c0f0246 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m9.npy index fe338e0..38f725c 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m0.npy index 2b85235..a6757b0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m1.npy index a935fe1..2509f3f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m10.npy index 540bfa1..93f2bb0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m11.npy index 0a584cb..e14edda 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m12.npy index 9177cbc..d5b1b68 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m13.npy index 0d530a4..b64e291 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m14.npy index 7af1bdf..5a71d58 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m15.npy index 0195a34..25c041b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m16.npy index 3225c75..c560018 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m17.npy index 7c46ece..6d19872 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m18.npy index c892948..65fdd35 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m19.npy index ec511d6..5fef8ce 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m2.npy index fccfa78..ae6a6e1 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m3.npy index 52d5010..f12bba0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m4.npy index 101568a..4de5927 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m5.npy index 96a9623..907a0e4 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m6.npy index ccb5481..7a89003 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m7.npy index b4225d5..7ca752c 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m8.npy index 4c0298a..f69d23b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m9.npy index 88bca7c..9145a3a 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m0.npy index e877611..5bdf1b1 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m1.npy index ab16536..1f31e63 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m10.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m10.npy index 9694cf2..6557f38 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m10.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m11.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m11.npy index 600ebcc..70de63d 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m11.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m12.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m12.npy index c9e7b55..4940720 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m12.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m13.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m13.npy index 4a38325..b3816fc 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m13.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m14.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m14.npy index bfbcb31..c6510a2 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m14.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m15.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m15.npy index 48bb731..826bfcc 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m15.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m16.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m16.npy index de282ad..c60d372 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m16.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m17.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m17.npy index 5870038..19e2569 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m17.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m18.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m18.npy index 42ad786..fb0e254 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m18.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m19.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m19.npy index 1035cfc..d943c3f 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m19.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m2.npy index 5c537f2..2fd3dd0 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m3.npy index e428b4f..ef603c5 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m4.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m4.npy index de72f11..428cc72 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m5.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m5.npy index 3ebc817..22f9961 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m6.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m6.npy index 67d7a4a..d23ab0b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m7.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m7.npy index 34bedf8..1045a3b 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m8.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m8.npy index 451d812..22a18dd 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m9.npy b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m9.npy index 46c8e86..02b9204 100644 Binary files a/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M20_X32_N20_nu1_00_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m0.npy index dfcc8b9..5521b0c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m1.npy index 2fb5792..1f49411 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m10.npy index 3aeebc2..211d794 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m11.npy index 6291a58..fe0f33d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m12.npy index 3c76914..3b3704d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m13.npy index 2b904fd..111dfeb 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m14.npy index a8bb353..509cb80 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m15.npy index 8772c51..0781a05 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m16.npy index ea71374..511cd20 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m17.npy index 3962c3f..b7f58b0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m18.npy index b6c63b6..c207d7d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m19.npy index 41e831e..33153c0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m2.npy index be8fc33..7530463 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m3.npy index 7596c53..ae47106 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m4.npy index 31ef044..a33dcdc 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m5.npy index 3b0d37a..2362a85 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m6.npy index db27655..8ec5d31 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m7.npy index 6ac044a..e9af964 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m8.npy index 1d2a7d2..609c152 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m9.npy index fc1e02f..28221c6 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m0.npy index f05a736..2a06cff 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m1.npy index 2ff3fa0..72220e4 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m10.npy index 1669beb..204c2fa 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m11.npy index 500e4da..2ef427a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m12.npy index 4f62433..d057cac 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m13.npy index d079fd9..ca98230 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m14.npy index ce90f4a..9b00193 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m15.npy index fd237a5..db11168 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m16.npy index f5284f2..7f08faf 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m17.npy index fcbb602..941667e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m18.npy index 303cda1..1732c88 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m19.npy index db739ff..921e496 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m2.npy index a116dc7..cb1f038 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m3.npy index a90e60d..639c1fa 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m4.npy index c16b953..843198c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m5.npy index f5779ee..a9be8d9 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m6.npy index 88ff3db..48fd462 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m7.npy index cbdb6e1..eea7400 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m8.npy index 9da67ad..ea45f87 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m9.npy index d6036b4..5768365 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m0.npy index 8f6485d..719837e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m1.npy index f6bbd75..c866b56 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m10.npy index 0a35cb8..1a73183 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m11.npy index b538ef2..3f65489 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m12.npy index 7239c39..7918d7e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m13.npy index f04787d..1cf7fcb 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m14.npy index e837a48..4ecf267 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m15.npy index 8cbcf98..4bb7c54 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m16.npy index 9156fd7..eaa45b3 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m17.npy index 78ba4e1..4915260 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m18.npy index b0c88fe..c8d687b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m19.npy index e78a4bf..dc471e6 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m2.npy index 17ca6f6..67f6dc5 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m3.npy index 7962d77..0ef6dee 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m4.npy index 7dbb1d2..ae15b09 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m5.npy index 637d3b8..17e7ff4 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m6.npy index 4dda9d7..64b9517 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m7.npy index beab8f5..19a7d36 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m8.npy index d600ae9..4fc8258 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m9.npy index f5c3a78..9e7607b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m0.npy index d96ffef..53b176b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m1.npy index 03cac9a..ac2faaf 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m10.npy index 8cd9e18..77c4fb4 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m11.npy index 8152bda..b22bad8 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m12.npy index 3b7ac1c..ab0043b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m13.npy index 9957d61..7c6ed1a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m14.npy index 33a59fe..28186f0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m15.npy index 12adecb..743c6b9 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m16.npy index dff5c44..2ceb07a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m17.npy index ec9c6ed..ee92742 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m18.npy index 9d04cf7..1d5bb68 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m19.npy index 8f58378..4aa5188 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m2.npy index 203b4f2..b5b00ee 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m3.npy index 5e8c6f1..64df74b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m4.npy index 01d05ec..486a8f7 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m5.npy index 302d9e0..80edd11 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m6.npy index c2948f3..6b9e7dc 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m7.npy index e34e06c..5081d89 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m8.npy index 9d9157e..593f084 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m9.npy index fbaa495..473f9f0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu0_10_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m0.npy index 7ed8245..adbb18d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m1.npy index 0e638fb..3f46a82 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m10.npy index 5b03437..e36c294 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m11.npy index b1d6f87..75bd8e2 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m12.npy index 3ddaacf..77a6d2b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m13.npy index b5bbead..ab5b75e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m14.npy index 5389327..f854621 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m15.npy index d46d36e..fbad06d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m16.npy index cf1bdd2..f13591b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m17.npy index a75a5ee..5d9b164 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m18.npy index 3276fba..6d0ce7a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m19.npy index f6c59ec..3e2c63f 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m2.npy index 4c9810b..89098a0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m3.npy index 1b06b92..20413e2 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m4.npy index cbc91bc..2234e59 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m5.npy index 0fd881d..b3ddafd 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m6.npy index 9f27a6b..800c46c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m7.npy index 0490ab0..f1a9745 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m8.npy index 784c07f..760ad3d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m9.npy index 3ce4df7..03dab1d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m0.npy index f8d0ce3..858fd9a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m1.npy index 8e6ab3c..cd7cbbf 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m10.npy index ab0a074..18e933c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m11.npy index 09044ef..883eece 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m12.npy index a34a7d1..ccbaa02 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m13.npy index 755d22d..90d79ae 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m14.npy index 4a56120..896f2f1 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m15.npy index 6e305f6..5cd8ada 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m16.npy index 1e4b22b..da6e653 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m17.npy index f555647..60d402b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m18.npy index 0c766a0..b92b831 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m19.npy index 4be8746..7cea8dc 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m2.npy index 1ba29ff..b79072d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m3.npy index 714dda4..c5359f2 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m4.npy index e1f850c..b6ceec6 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m5.npy index cf1851b..60815eb 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m6.npy index a2e38d9..8959dbf 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m7.npy index bee7aa2..33bf29c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m8.npy index d83d456..e43d99b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m9.npy index 6d2db73..e74a852 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res0_10_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m0.npy index 62656f3..cdf8ef0 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m1.npy index 0d60bd0..90218e9 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m10.npy index 2f0e75b..f3d35a5 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m11.npy index c4177a6..cae36d7 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m12.npy index e0e88a3..a53c956 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m13.npy index a359376..24be9f6 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m14.npy index 4275b56..8656a5a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m15.npy index f5a8be0..e1d6e3d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m16.npy index 528432b..6dfd87e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m17.npy index 3c23036..039312d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m18.npy index b402253..af9c28f 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m19.npy index ae6dadc..5325b8a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m2.npy index 7aa9e8c..061206c 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m3.npy index fea9584..f032095 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m4.npy index 3f327b5..1bddcbc 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m5.npy index e172ea3..e8ad31d 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m6.npy index af94aa7..7e3fe6b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m7.npy index e2b3867..0c7c60f 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m8.npy index ed416ba..760e8b8 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m9.npy index e257702..1f1c7a6 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_OT01_m9.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m0.npy index 644949d..003031a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m1.npy index 425ead1..7f380d8 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m10.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m10.npy index 6ea3c4a..a80e6f2 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m10.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m10.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m11.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m11.npy index f2d38f1..f1dd112 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m11.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m11.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m12.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m12.npy index d653dbd..4bd24bc 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m12.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m12.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m13.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m13.npy index 1b17bc4..64fe5c5 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m13.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m13.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m14.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m14.npy index 4e6675e..e345254 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m14.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m14.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m15.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m15.npy index 1802185..7273073 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m15.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m15.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m16.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m16.npy index 2a518a6..656ac7a 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m16.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m16.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m17.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m17.npy index 5740af9..33d4314 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m17.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m17.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m18.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m18.npy index 7352fb0..59d657e 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m18.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m18.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m19.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m19.npy index a1dbbe5..6879e69 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m19.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m19.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m2.npy index fa33b03..76982c3 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m3.npy index 54d4e63..04f7061 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m4.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m4.npy index c6c3137..09c3a46 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m4.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m4.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m5.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m5.npy index 9fc4b3f..ec20e2b 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m5.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m5.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m6.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m6.npy index 0fbd62e..7125331 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m6.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m6.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m7.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m7.npy index ae88cfc..18d0f89 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m7.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m7.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m8.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m8.npy index e3dd4ed..a6816bb 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m8.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m8.npy differ diff --git a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m9.npy b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m9.npy index 41d2d89..5361670 100644 Binary files a/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m9.npy and b/cpp/test/_test_data/M20_X64_N20_nu1_00_res1_00_gauss_m9.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m0.npy index 8bb6cb5..bb7cacf 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m1.npy index 33f87bf..7376696 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m0.npy index bfb2d78..aec9b56 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m1.npy index 5124d2d..1046fa5 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m0.npy index f57c7de..4e0bfa1 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m1.npy index c502bea..6cdc9c2 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m0.npy index 89c476e..d5b908f 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m1.npy index da38945..8a233e9 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m0.npy index 4079f8d..b776df7 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m1.npy index fb3dd8e..fbcdedc 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m0.npy index a7a887e..4854ba6 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m1.npy index 6aa0ce1..8046180 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m0.npy index f258c8b..f49e2fc 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m1.npy index 73570b4..d4a7e0b 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m0.npy index 742fdec..9fc5f65 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m1.npy index 67c6def..dfc7aa7 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m0.npy index 22bcb02..dfeabd6 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m1.npy index 95cbd5e..43731f4 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m0.npy index 919083c..c4c739c 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m1.npy index 069bd1e..b7dd778 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m0.npy index aa5b263..c5c3611 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m1.npy index cafb553..3029b54 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m0.npy index 9eb6afc..45a7081 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m1.npy index a3bba2b..213e8f6 100644 Binary files a/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X128_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m0.npy index e8bf59d..7c24ac7 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m1.npy index 19cc429..cb2f71c 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m0.npy index 663ce32..7f09306 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m1.npy index e66c0de..ba6c1a1 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m0.npy index d49a404..57cb970 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m1.npy index 104e891..f70e889 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m0.npy index 93ed063..819aa49 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m1.npy index bad97ce..e74b60e 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m0.npy index c868bc0..3fcdb28 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m1.npy index a823dcc..53e735a 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m0.npy index f83bd61..1292fdb 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m1.npy index 77b8067..c6760c2 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m0.npy index 590bc85..bd91097 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m1.npy index 6e53601..c9814dd 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m0.npy index 1a8242f..803a9b2 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m1.npy index aecfccb..e698618 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m0.npy index 4fa4e53..21432d6 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m1.npy index c0b5b38..29a6558 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m0.npy index 920e083..13f3f85 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m1.npy index c877eaf..ecac364 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m0.npy index a6e463d..1d2ecbe 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m1.npy index 6b80fbe..80163e2 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m0.npy index ba96474..2097b14 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m1.npy index 4070df8..7c7ecc4 100644 Binary files a/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X32_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m0.npy index 378dd00..b1de2e0 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m1.npy index 8f335b8..ea6d0d8 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m0.npy index 84f1b2b..cf1d613 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m1.npy index 0c5ff40..b8a73cc 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m0.npy index 361ecbb..63f835f 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m1.npy index 5ce0c17..6df7482 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m0.npy index de3dd89..b5ed13a 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m1.npy index 8a516c8..4b9fa3e 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m0.npy index de59cf8..e1f67d5 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m1.npy index 9d159f2..0aa4f2d 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m0.npy index 8529985..3d19e03 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m1.npy index dafb1d7..5801a28 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m0.npy index 1679bd1..612b0a7 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m1.npy index 800eaab..99713b1 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m0.npy index ca155af..e5e3108 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m1.npy index 11f5250..1542f18 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m0.npy index 894d690..f784e4f 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m1.npy index 58989d3..107a113 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m0.npy index 69edfcd..833c915 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m1.npy index 0fae96e..8fd676a 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m0.npy index 573336d..032c83d 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m1.npy index 83729bc..19cfc2f 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m0.npy index cfe6c0a..4b790c9 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m1.npy index 7a9c290..7f95e81 100644 Binary files a/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M2_X64_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m0.npy index b7810b9..8f46fdf 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m1.npy index e210951..b4daae7 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m2.npy index 66de2ad..5cef4a6 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m3.npy index 3d09596..61a5dff 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m0.npy index 19bdc1c..8683649 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m1.npy index d7a083a..e1bed5d 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m2.npy index 8e73ad0..2802fb7 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m3.npy index 9654910..70fec7b 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m0.npy index 8c50fc0..7cda2fe 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m1.npy index 458b2a4..6042eb0 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m2.npy index 9c9f6c9..353ac62 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m3.npy index 3bd3e5d..c48ef3b 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m0.npy index bd29a41..a671c39 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m1.npy index 9697823..347dc79 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m2.npy index 3a2d770..e4d40bc 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m3.npy index f03b598..46ae82d 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m0.npy index 5bf4808..807c56a 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m1.npy index d2e7b2d..e66a622 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m2.npy index 24ad2d3..937e21c 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m3.npy index 563034e..ee57e01 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m0.npy index edec057..0c61794 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m1.npy index 03f004e..bafba6b 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m2.npy index cbd2e86..87b3b9e 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m3.npy index 8ec5b86..10c903f 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m0.npy index d98b77c..5382612 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m1.npy index 5069187..c7ecfd5 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m2.npy index 5fec911..367d65c 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m3.npy index d1b6d2d..199ca05 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m0.npy index e1986f2..23008b8 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m1.npy index ce177f2..b10a5bb 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m2.npy index 8e0d615..4b8ed34 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m3.npy index 5bce733..843a736 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m0.npy index 660579d..63ca606 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m1.npy index caa3e58..960f67c 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m2.npy index 979926f..d6a2d34 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m3.npy index 8d15b8b..ce2c9cf 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m0.npy index 6a1dc1c..4443ac0 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m1.npy index 324fd70..0aa1bcf 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m2.npy index d772965..97c2966 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m3.npy index 03c11dd..cbe0f62 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m0.npy index 0e9ff9a..4a04c07 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m1.npy index 87f499f..176071a 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m2.npy index d281427..6110b7f 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m3.npy index ad55129..024a62f 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m0.npy index ff0469d..ad2f03b 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m1.npy index 1026678..ff89918 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m2.npy index 2bb7d1b..45cb58a 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m3.npy index 49208e3..4ec378c 100644 Binary files a/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X128_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m0.npy index 48c3a72..bdf5824 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m1.npy index c3bf998..650a57f 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m2.npy index f1caea6..4bc4085 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m3.npy index 9dbbdf8..dc02199 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m0.npy index 1dfa2b3..10d58bc 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m1.npy index d5fea91..4201c60 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m2.npy index cefb08a..bdccef7 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m3.npy index 18c8924..6a7177c 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m0.npy index 4d588c4..337606e 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m1.npy index 97c7c48..1b6f445 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m2.npy index 3e6634d..893e46f 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m3.npy index 6c3e304..5a63ea5 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m0.npy index 54616a8..7bc96fb 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m1.npy index aab7218..e3d21aa 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m2.npy index aa2ec98..aca4d28 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m3.npy index 5ed63de..1e4350a 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m0.npy index 0518e34..136c2b0 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m1.npy index f99f5dc..d58d2e0 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m2.npy index d6f3a6b..f5a8b32 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m3.npy index ed938a4..b98e830 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m0.npy index 70a615f..96ae6d2 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m1.npy index d5ac1ca..1af92dc 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m2.npy index debd486..bee0876 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m3.npy index 6615a9f..f9fd9fe 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m0.npy index 2dd856f..26cf0d5 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m1.npy index 19b9907..479b666 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m2.npy index 5560236..6d32128 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m3.npy index ed22325..f18cb9e 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m0.npy index 8d77a29..18a4b05 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m1.npy index 1f35faf..b5325eb 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m2.npy index 8d4062b..9b433ee 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m3.npy index c0de4bc..135a81a 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m0.npy index e034649..56ab54c 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m1.npy index 50334cd..92406a1 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m2.npy index d8dcc5c..3ca56f9 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m3.npy index 5c0dced..871ad26 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m0.npy index bdf6561..d76daf0 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m1.npy index fe6e301..27f5074 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m2.npy index 9808c99..efcdd86 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m3.npy index 739cc7f..7fbb21e 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m0.npy index 1c828a4..a1ecf93 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m1.npy index 5376a7c..d765a92 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m2.npy index 77412ce..2651f17 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m3.npy index 4e1f7a4..49e2bc3 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m0.npy index 67b9e5f..d024a17 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m1.npy index 3b29004..0f9c99a 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m2.npy index 8c2d489..6e5df14 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m3.npy index 0734f66..4c93028 100644 Binary files a/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X32_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m0.npy index aefb2ea..b6109ce 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m1.npy index afc4a8d..97a2198 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m2.npy index 8e01ac6..73f2a0d 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m3.npy index f2a3c04..35a5afa 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m0.npy index 05a7920..5e8bf22 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m1.npy index 1c8ec8c..05e3acd 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m2.npy index 7c0da7e..d5b2238 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m3.npy index 2a4e8c7..0d27a48 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m0.npy index f4b4eb9..af38def 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m1.npy index e4d015e..62019ea 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m2.npy index a59a11c..19202bb 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m3.npy index b1b3317..68668ff 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m0.npy index 101a254..b954c62 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m1.npy index 0190a24..e832f5b 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m2.npy index 65ad85a..45692fc 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m3.npy index 5bdc773..77874c9 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m0.npy index 8180647..e6ad4d1 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m1.npy index c9df15f..708ba0d 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m2.npy index 22c4e85..8239ef8 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m3.npy index 7663a23..4f188c6 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m0.npy index d8003da..0d2167f 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m1.npy index c589c53..14aa399 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m2.npy index 34a34b3..4b1b998 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m3.npy index f7d273f..2b05194 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu0_10_res1_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m0.npy index 990b3a0..c0eb29e 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m1.npy index 53a1e2e..a64dc8c 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m2.npy index 52badcb..0461ad7 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m3.npy index ac1005d..3178383 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m0.npy index f954c3d..656193a 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m1.npy index ebd76c1..e24e313 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m2.npy index efe0e3b..eec6373 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m3.npy index a8d7ec9..785c21f 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_00_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m0.npy index 1104285..d2a16be 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m1.npy index d82c926..cccdb95 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m2.npy index 913994a..e749437 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m3.npy index 74c3ae6..4b2b333 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m0.npy index c1380d2..d5d7c57 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m1.npy index 18948bb..e24bd96 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m2.npy index cb5b1e5..1175483 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m3.npy index dd8b9ab..31391b0 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res0_10_gauss_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m0.npy index 59f8ec2..979d0aa 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m1.npy index 4cc033d..ad44117 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m2.npy index 1e13424..9bb031e 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m3.npy index 092ac2d..64dd6d2 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_OT01_m3.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m0.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m0.npy index bbb1ad0..3669cab 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m0.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m0.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m1.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m1.npy index 9a89ac7..92b7be4 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m1.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m1.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m2.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m2.npy index 9c4d5a8..60daa74 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m2.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m2.npy differ diff --git a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m3.npy b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m3.npy index 8f6c84d..d6363ac 100644 Binary files a/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m3.npy and b/cpp/test/_test_data/M4_X64_N20_nu1_00_res1_00_gauss_m3.npy differ diff --git a/cpp/test/exporter.cpp b/cpp/test/exporter.cpp new file mode 100644 index 0000000..808ad95 --- /dev/null +++ b/cpp/test/exporter.cpp @@ -0,0 +1,61 @@ +#include "Exporter.hpp" +#include "Transformer.hpp" +#include "debug.hpp" +#include "util.hpp" +#include + +namespace ahr { + +class TestExporter : public ::testing::Test { +protected: + Grid grid{5, 16, 24}; + Transformer tf{grid}; + fs::path const tmp_dir{fs::temp_directory_path()}; + Exporter exporter{grid, tf, tmp_dir}; + + TestExporter() { tf.init(); } +}; + +TEST_F(TestExporter, RoundTripReal) { + + auto rBuf = grid.rBufXY(); + grid.for_each_xy([&](Dim x, Dim y) { rBuf(x, y) = Real(x + y * grid.X); }); + + exporter.exportTo("test.npy", rBuf); + + auto const path = tmp_dir / "test.npy"; + ASSERT_TRUE(fs::exists(path)); + + // Import buffer and compare + auto rBuf2 = exporter.importRealBuf("test.npy"); + // No math, tolerance is 0 + EXPECT_THAT(rBuf2.to_mdspan(), MdspanElementsAllClose(rBuf.to_mdspan(), 0.0)); + + // Import into npy view and compare + auto rNpy = exporter.importReal("test.npy"); + EXPECT_THAT(rNpy.view(), MdspanElementsAllClose(rBuf.to_mdspan(), 0.0)); +} + +TEST_F(TestExporter, RoundTripComplex) { + auto cBuf = grid.cBufXY(), cBuf2 = grid.cBufXY(); + grid.for_each_kxky([&](Dim kx, Dim ky) { + cBuf(kx, ky) = {Real(kx) + Real(ky * grid.KX), Real(kx) - Real(ky * grid.KX)}; + }); + tf.normalize(cBuf, cBuf2); + + // Use absolute path this time + exporter.exportTo(tmp_dir / "test.npy", cBuf); + + auto const path = tmp_dir / "test.npy"; + ASSERT_TRUE(fs::exists(path)); + + // Import buffer and compare + auto rBuf = exporter.importReal("test.npy"); + auto rBuf2 = grid.rBufXY(); + tf.bfft(cBuf2, rBuf2); + + // No math, tolerance is 0 + EXPECT_THAT(rBuf.view(), MdspanElementsAllClose(rBuf2.to_mdspan(), 0.0)); +} + +} // namespace ahr \ No newline at end of file diff --git a/cpp/test/exps.cpp b/cpp/test/exps.cpp new file mode 100644 index 0000000..1f20f3c --- /dev/null +++ b/cpp/test/exps.cpp @@ -0,0 +1,83 @@ +#include "grid.hpp" + +#include "debug.hpp" +#include "util.hpp" + +#include "CachedExponentials.hpp" +#include "Exponentials.hpp" + +#include + +namespace ahr::exp { + +template class TestExps : public ::testing::Test { +protected: + Grid grid{5, 32, 64}; + Exp exp{grid}; + ExpT exp_t{grid}; + + void check() + requires exp::space_like + { + grid.for_each_kxky([&](Dim kx, Dim ky) { + EXPECT_THAT(exp(kx, ky), AllClose(exp_t(kx, ky), 1e-16, 1e-15)); // prevent oneline + }); + } + + void check() + requires exp::moment_like + { + for (int m = 0; m < grid.M; ++m) { + EXPECT_THAT(exp(m), AllClose(exp_t(m), 1e-16, 1e-15)); + } + } + + void test() { + Real dt = 1.0; + HyperCoefficients hyper = HyperCoefficients::calculate(dt, grid); + + exp.update(hyper, dt); + exp_t.update(hyper, dt); + + this->check(); + this->check(); // Run again + + dt *= 1.2; + hyper = HyperCoefficients::calculate(dt, grid); + exp.update(hyper, dt); + exp_t.update(hyper, dt); + + this->check(); + + // Update with the same dt + exp.update(hyper, dt); + exp_t.update(hyper, dt); + this->check(); + + // Old dt again + exp.update(hyper, 1.0); + exp_t.update(hyper, 1.0); + this->check(); + } +}; + +/// This struct contains a type definition for the appropriate Cached* class for exp. +/// It's specialized for space-like/moment-like so they can all use the same test suite. +template struct cached; + +template struct cached { + using type = CachedKXKY; +}; + +template struct cached { + using type = CachedM; +}; + +template using TestCachedExps = TestExps::type>; + +using Types = ::testing::Types; +TYPED_TEST_SUITE(TestCachedExps, Types); + +TYPED_TEST(TestCachedExps, Exps) { this->test(); } + +} // namespace ahr::exp diff --git a/cpp/test/filter.cpp b/cpp/test/filter.cpp new file mode 100644 index 0000000..be84255 --- /dev/null +++ b/cpp/test/filter.cpp @@ -0,0 +1,37 @@ +#include "Filter.hpp" +#include "grid.hpp" + +#include "debug.hpp" +#include "util.hpp" + +#include + +namespace ahr { + +template class TestFilter : public ::testing::Test { +protected: + Grid grid{5, 32, 32}; + HouLiFilter filter{grid}; + TestedFilter filter_t{grid}; +}; + +using Types = ::testing::Types; +TYPED_TEST_SUITE(TestFilter, Types); + +TYPED_TEST(TestFilter, Filter) { + auto buf = this->grid.cBufXY(); + auto buf_t = this->grid.cBufXY(); + + // initialize buffers + this->grid.for_each_kxky([&](Dim kx, Dim ky) { + buf(kx, ky) = {std::sin(2 * pi * kx), std::cos(2 * pi * ky)}; + buf_t(kx, ky) = {std::sin(2 * pi * kx), std::cos(2 * pi * ky)}; + }); + + this->filter(buf); + this->filter_t(buf_t); + + ASSERT_THAT(buf_t.to_mdspan(), MdspanElementsAllClose(buf.to_mdspan(), 1e-16, 1e-15)); +} + +} // namespace ahr diff --git a/cpp/test/grid.cpp b/cpp/test/grid.cpp new file mode 100644 index 0000000..88bf7c8 --- /dev/null +++ b/cpp/test/grid.cpp @@ -0,0 +1,77 @@ +#include "grid.hpp" + +#include + +namespace ahr { +TEST(Grid, BufferAlloc) { + Grid grid{5, 16, 24}; + ASSERT_EQ(grid.KX, 9); + ASSERT_EQ(grid.KY, 24); + + auto cxy = grid.cBufXY(); + EXPECT_EQ(cxy.extents(), (Grid::Buf::C_XY::extents_type{9, 24})); + + auto rxy = grid.rBufXY(); + EXPECT_EQ(rxy.extents(), (Grid::Buf::R_XY::extents_type{16, 24})); + + auto cmxy = grid.cBufMXY(); + EXPECT_EQ(cmxy.extents(), (Grid::Buf::C_MXY::extents_type{9, 24, 5})); + + auto rmxy = grid.rBufMXY(); + EXPECT_EQ(rmxy.extents(), (Grid::Buf::R_MXY::extents_type{16, 24, 5})); +} + +TEST(Grid, Slicing) { + Grid grid{5, 16, 24}; + auto cmxy = grid.cBufMXY(); + auto rmxy = grid.rBufMXY(); + + auto cmxy_slice = Grid::sliceXY(cmxy, 2); + auto rmxy_slice = Grid::sliceXY(rmxy, 2); + + static_assert(std::is_same_v); + static_assert(std::is_same_v); + + EXPECT_EQ(cmxy_slice.extents(), grid.cBufXY().extents()); + EXPECT_EQ(rmxy_slice.extents(), grid.rBufXY().extents()); + + for (Dim kx = 0; kx < grid.KX; ++kx) { + for (Dim ky = 0; ky < grid.KY; ++ky) { + EXPECT_EQ(&cmxy_slice(kx, ky), &cmxy(kx, ky, 2)); + } + } + + for (Dim x = 0; x < grid.X; ++x) { + for (Dim y = 0; y < grid.Y; ++y) { + EXPECT_EQ(&rmxy_slice(x, y), &rmxy(x, y, 2)); + } + } +} + +TEST(Grid, ForEach) { + Grid grid{5, 16, 24}; + + struct MockLoop { + MOCK_METHOD(void, fun, (Dim, Dim)); + } mockLoop; + + for (Dim kx = 0; kx < grid.KX; ++kx) { + for (Dim ky = 0; ky < grid.KY; ++ky) { + EXPECT_CALL(mockLoop, fun(kx, ky)); + } + } + + grid.for_each_kxky([&](Dim kx, Dim ky) { mockLoop.fun(kx, ky); }); + testing::Mock::VerifyAndClearExpectations(&mockLoop); + + for (Dim x = 0; x < grid.X; ++x) { + for (Dim y = 0; y < grid.Y; ++y) { + EXPECT_CALL(mockLoop, fun(x, y)); + } + } + + grid.for_each_xy([&](Dim x, Dim y) { mockLoop.fun(x, y); }); + testing::Mock::VerifyAndClearExpectations(&mockLoop); +} + +}; // namespace ahr diff --git a/cpp/test/naive-moments.cpp b/cpp/test/naive-moments.cpp index 41c6a36..ce87f15 100644 --- a/cpp/test/naive-moments.cpp +++ b/cpp/test/naive-moments.cpp @@ -27,35 +27,13 @@ constexpr Real ATOL = LOW_PRECISION_ATOL; template class NaiveMomentsBase : public NaiveTester { protected: using Base = NaiveTester; - std::string getFilename(Dim m) { + fs::path getFilename(Dim m) { auto const p = Base::GetParam(); // Tests are run from inside the `test` directory auto const filename = p.to_param_str() + "_m" + std::to_string(m) + ".npy"; return fs::current_path() / "_test_data" / filename; } - - // Owning holder of a npy array with convenience to see it as an mdspan. - // We can use this to avoid needlessly copying into an mdarray. - class NpyMdspan { - cnpy::NpyArray array_; - - public: - explicit NpyMdspan(cnpy::NpyArray array) : array_(std::move(array)) {} - - // TODO(luka) const view - Naive::ViewXY view() { - std::span const extents{array_.shape.data(), 2}; - return Naive::ViewXY{array_.data(), extents}; - } - - [[nodiscard]] bool valid() const { return array_.word_size == sizeof(Real); } - }; - - NpyMdspan readMoment(Dim m) { - auto const filename = getFilename(m); - return NpyMdspan{cnpy::npy_load(filename)}; - } }; using MomentParam = WithEquilibrium>; @@ -79,9 +57,9 @@ TEST_P(NaiveMoments, CheckMoments) { for (Dim m = 0; m < p.M; m++) { // To update values, uncomment these 2 lines // std::cout << "WARNING!: Overwriting " << getFilename(m) << std::endl; - // naive.exportToNpy(getFilename(m), naive.getMoment(m)); + // naive.exporter.exportTo(getFilename(m), naive.getMoment(m)); - auto npy = readMoment(m); + auto npy = naive.exporter.importReal(getFilename(m)); ASSERT_TRUE(npy.valid()); auto const max_val = std::ranges::max(std::span(npy.view().data_handle(), npy.view().size())); auto const n = static_cast(p.N); diff --git a/cpp/test/prepare-derivatives.cpp b/cpp/test/prepare-derivatives.cpp new file mode 100644 index 0000000..74a1166 --- /dev/null +++ b/cpp/test/prepare-derivatives.cpp @@ -0,0 +1,39 @@ +#include "PrepareDerivatives.hpp" + +#include "debug.hpp" +#include "util.hpp" + +#include + +namespace ahr { + +template class TestPrepareDerivatives : public ::testing::Test { +protected: + Grid grid{5, 32, 32}; + PrepareDerivatives prepare{grid}; + TestedPrepare prepare_t{grid}; +}; + +using Types = ::testing::Types; +TYPED_TEST_SUITE(TestPrepareDerivatives, Types); + +TYPED_TEST(TestPrepareDerivatives, Prepare) { + auto const KX = this->grid.KX, KY = this->grid.KY; + auto buf = this->grid.cBufXY(), buf_t = this->grid.cBufXY(); + Grid::DxDy bufD{KX, KY}; + Grid::DxDy bufD_t{KX, KY}; + + // initialize buffers + this->grid.for_each_kxky([&](Dim kx, Dim ky) { + buf(kx, ky) = buf_t(kx, ky) = + 1024.0 * Complex{std::sin(2 * pi * kx / KX), std::cos(2 * pi * ky / KY)}; + }); + + this->prepare(buf, bufD); + this->prepare_t(buf_t, bufD_t); + + ASSERT_THAT(bufD_t.DX.to_mdspan(), MdspanElementsAllClose(bufD.DX.to_mdspan(), 1e-16, 1e-15)); + ASSERT_THAT(bufD_t.DY.to_mdspan(), MdspanElementsAllClose(bufD.DY.to_mdspan(), 1e-16, 1e-15)); +} + +} // namespace ahr diff --git a/cpp/test/transformer.cpp b/cpp/test/transformer.cpp new file mode 100644 index 0000000..4174abe --- /dev/null +++ b/cpp/test/transformer.cpp @@ -0,0 +1,73 @@ +#include "Transformer.hpp" + +#include "util.hpp" +#include + +namespace ahr { + +TEST(Transformer, Forward) { + Grid grid{5, 16, 24}; // Example grid dimensions + Transformer tf{grid}; + tf.init(); + + auto r = grid.rBufXY(); + auto c = grid.cBufXY(); + + // Initialize the input grid with a delta function + grid.for_each_xy([&](Dim x, Dim y) { r(x, y) = (x == 0 && y == 0) ? 1.0 : 0.0; }); + + // Perform FFT + tf.fft(r, c); + + // Check the output (constant) + grid.for_each_kxky([&](Dim kx, Dim ky) { + EXPECT_NEAR(c(kx, ky).real(), 1.0, 1e-6); + EXPECT_NEAR(c(kx, ky).imag(), 0.0, 1e-6); + }); +} + +TEST(Transformer, Backward) { + Grid grid{5, 16, 24}; + Transformer tf{grid}; + tf.init(); + + auto r = grid.rBufXY(); + auto c = grid.cBufXY(); + + // Initialize the input with a constant + grid.for_each_kxky([&](Dim kx, Dim ky) { c(kx, ky) = 1.0; }); + + tf.bfft(c, r); + + // Check the output (delta function) + grid.for_each_xy([&](Dim x, Dim y) { + if (x == 0 && y == 0) { + EXPECT_NEAR(r(x, y), grid.X * grid.Y, 1e-6); + } else { + EXPECT_NEAR(r(x, y), 0.0, 1e-6); + } + }); +} + +TEST(Transformer, RoundTrip) { + Grid grid{5, 16, 24}; + Transformer tf{grid}; + tf.init(); + + auto r = grid.rBufXY(), r2 = grid.rBufXY(); + auto c = grid.cBufXY(), c2 = grid.cBufXY(); + + grid.for_each_xy([&](Dim x, Dim y) { + using namespace std; + using namespace std::numbers; + r(x, y) = cos(4 * pi * x / grid.X) + 2 * cos(2 * pi * y / grid.Y); + }); + + tf.fft(r, c); + tf.normalize(c, c2); + tf.bfft(c2, r2); + + EXPECT_THAT(r2.to_mdspan(), MdspanElementsAllClose(r.to_mdspan(), 1e-10, 1e-10)); +} + +} // namespace ahr \ No newline at end of file diff --git a/cpp/test/util.hpp b/cpp/test/util.hpp index 36e0f44..97c6793 100644 --- a/cpp/test/util.hpp +++ b/cpp/test/util.hpp @@ -2,6 +2,7 @@ #include #include +#include #include // Function to slice the tuple @@ -20,11 +21,19 @@ template auto slice(const std::tuple(t); } +template T absdiff_no_overflow(T a, T b) { return std::max(a, b) - std::min(a, b); } + +template T absdiff_no_overflow(std::complex a, std::complex b) { + auto const real_diff = absdiff_no_overflow(a.real(), b.real()); + auto const imag_diff = absdiff_no_overflow(a.imag(), b.imag()); + return std::abs(std::complex{real_diff, imag_diff}); +} + using ::testing::PrintToString; MATCHER_P3(AllClose, val, rel_tol, abs_tol, PrintToString(val) + " ±" + PrintToString(abs_tol) + " (±" + PrintToString(double(rel_tol) * std::abs(val)) + ")") { - auto diff = std::max(arg, val) - std::min(arg, val); + auto diff = absdiff_no_overflow(val, arg); double tolerance_diff = double(diff) - double(abs_tol) - double(rel_tol) * std::abs(val); return tolerance_diff <= 0; } @@ -69,7 +78,7 @@ template static constexpr bool is_mdspan_v> && is_mdspan_v>, "ElementsAllClose only works with mdspan"); @@ -112,4 +121,17 @@ MATCHER_P3(MdspanElementsAllClose, vals, rel_tol, abs_tol, template auto MdspanElementsAllClose(V &&vals, R &&rel_tol) { return MdspanElementsAllClose(std::forward(vals), std::forward(rel_tol), 0.0); -} \ No newline at end of file +} + +namespace std::experimental { +/// This function provides an overload to GoogleTest for printing an mdspan. +/// It will always print at the highest precision (16 for double). +/// It must be in the same namespace as mdspan. +/// This overload is only instantiated if an ostream operator<< for mdspan exists. +template + requires requires(mdspan const &m, std::ostream &o) { o << m; } +void PrintTo(mdspan const &m, ::std::ostream *os) { + *os << std::setprecision(16) << m; +} + +} // namespace std::experimental