diff --git a/docs/CODING_STANDARD.md b/docs/CODING_STANDARD.md index 8419473f4..79309c460 100644 --- a/docs/CODING_STANDARD.md +++ b/docs/CODING_STANDARD.md @@ -31,6 +31,8 @@ * static member variables names begin with an `s_` prefix * we don't use single letter variables * we don't rely on case to distinguish between variables +* there are two types of DDC objects representing a multidimensional array : `ddc::Chunk` (which possesses the data) and `ddc::ChunkSpan` (which does not own the data but can be captured by `KOKKOS_LAMBDA`). We suffix `Chunk` with `_alloc` if both variables are needed locally. +* if a variable is mirrored between host (CPU) and device (GPU) memories, the variable representing data on host is `_host` suffixed ## Style * We use the style specified by the `.clang-format` file using clang-format 10 diff --git a/simulations/geometryXVx/bump_on_tail/bumpontail_fem_uniform.cpp b/simulations/geometryXVx/bump_on_tail/bumpontail_fem_uniform.cpp index 25733675c..d9f79588e 100644 --- a/simulations/geometryXVx/bump_on_tail/bumpontail_fem_uniform.cpp +++ b/simulations/geometryXVx/bump_on_tail/bumpontail_fem_uniform.cpp @@ -105,13 +105,13 @@ int main(int argc, char** argv) SplineVxBuilder const builder_vx(meshXVx); SplineVxBuilder_1d const builder_vx_poisson(interpolation_domain_vx); - FieldSp kinetic_charges(dom_kinsp); - DFieldSp masses(dom_kinsp); - DFieldSp epsilon_bot(dom_kinsp); - DFieldSp temperature_bot(dom_kinsp); - DFieldSp mean_velocity_bot(dom_kinsp); - DFieldSp init_perturb_amplitude(dom_kinsp); - FieldSp init_perturb_mode(dom_kinsp); + host_t> kinetic_charges(dom_kinsp); + host_t masses(dom_kinsp); + host_t epsilon_bot(dom_kinsp); + host_t temperature_bot(dom_kinsp); + host_t mean_velocity_bot(dom_kinsp); + host_t init_perturb_amplitude(dom_kinsp); + host_t> init_perturb_mode(dom_kinsp); int nb_elec_adiabspecies = 1; int nb_ion_adiabspecies = 1; @@ -137,7 +137,7 @@ int main(int argc, char** argv) // Create the domain of all species including kinetic species + adiabatic species (if existing) IDomainSp const dom_allsp(IndexSp(0), nb_kinspecies + nb_elec_adiabspecies + nb_ion_adiabspecies); - FieldSp charges(dom_allsp); + host_t> charges(dom_allsp); for (IndexSp isp : dom_kinsp) { charges(isp) = kinetic_charges(isp); } @@ -147,29 +147,29 @@ int main(int argc, char** argv) // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfequilibrium_device(meshSpVx); + DFieldSpVx allfequilibrium(meshSpVx); BumpontailEquilibrium const init_fequilibrium( std::move(epsilon_bot), std::move(temperature_bot), std::move(mean_velocity_bot)); - init_fequilibrium(allfequilibrium_device); + init_fequilibrium(allfequilibrium); ddc::expose_to_pdi("iter_start", iter_start); - device_t allfdistribu_device(meshSpXVx); + DFieldSpXVx allfdistribu(meshSpXVx); double time_start(0); if (iter_start == 0) { SingleModePerturbInitialization const - init(allfequilibrium_device, + init(allfequilibrium, init_perturb_mode.span_cview(), init_perturb_amplitude.span_cview()); - init(allfdistribu_device); + init(allfdistribu); } else { RestartInitialization const restart(iter_start, time_start); - restart(allfdistribu_device); + restart(allfdistribu); } - auto allfequilibrium = ddc::create_mirror_view_and_copy(allfequilibrium_device.span_view()); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfequilibrium_host = ddc::create_mirror_view_and_copy(allfequilibrium.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // --> Algorithm info double const deltat = PCpp_double(conf_voicexx, ".Algorithm.deltat"); @@ -206,13 +206,13 @@ int main(int argc, char** argv) // Creating of mesh for output saving IDomainX const gridx = ddc::select(meshSpXVx); - FieldX meshX_coord(gridx); + host_t> meshX_coord(gridx); for (IndexX const ix : gridx) { meshX_coord(ix) = ddc::coordinate(ix); } IDomainVx const gridvx = ddc::select(meshSpXVx); - FieldVx meshVx_coord(gridvx); + host_t> meshVx_coord(gridvx); for (IndexVx const ivx : gridvx) { meshVx_coord(ivx) = ddc::coordinate(ivx); } @@ -224,12 +224,12 @@ int main(int argc, char** argv) #else using FemPoissonSolverX = FemNonPeriodicPoissonSolver; #endif - DFieldVx const quadrature_coeffs + host_t const quadrature_coeffs_host = neumann_spline_quadrature_coefficients(gridvx, builder_vx_poisson); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FemPoissonSolverX const poisson(builder_x_poisson, spline_x_evaluator_poisson, rhs); PredCorr const predcorr(vlasov, poisson); @@ -243,11 +243,11 @@ int main(int argc, char** argv) ddc::expose_to_pdi("Nkinspecies", nb_kinspecies.value()); ddc::expose_to_pdi("fdistribu_charges", ddc::discrete_space().charges()[dom_kinsp]); ddc::expose_to_pdi("fdistribu_masses", ddc::discrete_space().masses()[dom_kinsp]); - ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium); + ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium_host); steady_clock::time_point const start = steady_clock::now(); - predcorr(allfdistribu_device, time_start, deltat, nbiter); + predcorr(allfdistribu, time_start, deltat, nbiter); steady_clock::time_point const end = steady_clock::now(); diff --git a/simulations/geometryXVx/bump_on_tail/bumpontail_fft.cpp b/simulations/geometryXVx/bump_on_tail/bumpontail_fft.cpp index 0c985d391..7496f178b 100644 --- a/simulations/geometryXVx/bump_on_tail/bumpontail_fft.cpp +++ b/simulations/geometryXVx/bump_on_tail/bumpontail_fft.cpp @@ -100,13 +100,13 @@ int main(int argc, char** argv) SplineVxBuilder const builder_vx(meshXVx); SplineVxBuilder_1d const builder_vx_poisson(interpolation_domain_vx); - FieldSp kinetic_charges(dom_kinsp); - DFieldSp masses(dom_kinsp); - DFieldSp epsilon_bot(dom_kinsp); - DFieldSp temperature_bot(dom_kinsp); - DFieldSp mean_velocity_bot(dom_kinsp); - DFieldSp init_perturb_amplitude(dom_kinsp); - FieldSp init_perturb_mode(dom_kinsp); + host_t> kinetic_charges(dom_kinsp); + host_t masses(dom_kinsp); + host_t epsilon_bot(dom_kinsp); + host_t temperature_bot(dom_kinsp); + host_t mean_velocity_bot(dom_kinsp); + host_t init_perturb_amplitude(dom_kinsp); + host_t> init_perturb_mode(dom_kinsp); int nb_elec_adiabspecies = 1; int nb_ion_adiabspecies = 1; @@ -132,7 +132,7 @@ int main(int argc, char** argv) // Create the domain of all species including kinetic species + adiabatic species (if existing) IDomainSp const dom_allsp(IndexSp(0), nb_kinspecies + nb_elec_adiabspecies + nb_ion_adiabspecies); - FieldSp charges(dom_allsp); + host_t> charges(dom_allsp); for (IndexSp isp : dom_kinsp) { charges(isp) = kinetic_charges(isp); } @@ -142,29 +142,29 @@ int main(int argc, char** argv) // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfequilibrium_device(meshSpVx); + DFieldSpVx allfequilibrium(meshSpVx); BumpontailEquilibrium const init_fequilibrium( std::move(epsilon_bot), std::move(temperature_bot), std::move(mean_velocity_bot)); - init_fequilibrium(allfequilibrium_device); + init_fequilibrium(allfequilibrium); ddc::expose_to_pdi("iter_start", iter_start); - device_t allfdistribu_device(meshSpXVx); + DFieldSpXVx allfdistribu(meshSpXVx); double time_start(0); if (iter_start == 0) { SingleModePerturbInitialization const - init(allfequilibrium_device, + init(allfequilibrium, init_perturb_mode.span_cview(), init_perturb_amplitude.span_cview()); - init(allfdistribu_device); + init(allfdistribu); } else { RestartInitialization const restart(iter_start, time_start); - restart(allfdistribu_device); + restart(allfdistribu); } - auto allfequilibrium = ddc::create_mirror_view_and_copy(allfequilibrium_device.span_view()); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfequilibrium_host = ddc::create_mirror_view_and_copy(allfequilibrium.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // --> Algorithm info double const deltat = PCpp_double(conf_voicexx, ".Algorithm.deltat"); @@ -199,13 +199,13 @@ int main(int argc, char** argv) // Creating of mesh for output saving IDomainX const gridx = ddc::select(meshSpXVx); - FieldX meshX_coord(gridx); + host_t> meshX_coord(gridx); for (IndexX const ix : gridx) { meshX_coord(ix) = ddc::coordinate(ix); } IDomainVx const gridvx = ddc::select(meshSpXVx); - FieldVx meshVx_coord(gridvx); + host_t> meshVx_coord(gridvx); for (IndexVx const ivx : gridvx) { meshVx_coord(ivx) = ddc::coordinate(ivx); } @@ -214,12 +214,12 @@ int main(int argc, char** argv) ddc::init_fourier_space(ddc::select(meshSpXVx)); - DFieldVx const quadrature_coeffs + host_t const quadrature_coeffs_host = neumann_spline_quadrature_coefficients(gridvx, builder_vx_poisson); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FftPoissonSolver const poisson(rhs); PredCorr const predcorr(vlasov, poisson); @@ -233,11 +233,11 @@ int main(int argc, char** argv) ddc::expose_to_pdi("Nkinspecies", nb_kinspecies.value()); ddc::expose_to_pdi("fdistribu_charges", ddc::discrete_space().charges()[dom_kinsp]); ddc::expose_to_pdi("fdistribu_masses", ddc::discrete_space().masses()[dom_kinsp]); - ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium); + ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium_host); steady_clock::time_point const start = steady_clock::now(); - predcorr(allfdistribu_device, time_start, deltat, nbiter); + predcorr(allfdistribu, time_start, deltat, nbiter); steady_clock::time_point const end = steady_clock::now(); diff --git a/simulations/geometryXVx/landau/landau_fem_uniform.cpp b/simulations/geometryXVx/landau/landau_fem_uniform.cpp index f06ec3f44..4bbc8eec1 100644 --- a/simulations/geometryXVx/landau/landau_fem_uniform.cpp +++ b/simulations/geometryXVx/landau/landau_fem_uniform.cpp @@ -104,13 +104,13 @@ int main(int argc, char** argv) SplineVxBuilder const builder_vx(meshXVx); SplineVxBuilder_1d const builder_vx_poisson(interpolation_domain_vx); - FieldSp kinetic_charges(dom_kinsp); - DFieldSp masses(dom_kinsp); - DFieldSp density_eq(dom_kinsp); - DFieldSp temperature_eq(dom_kinsp); - DFieldSp mean_velocity_eq(dom_kinsp); - DFieldSp init_perturb_amplitude(dom_kinsp); - FieldSp init_perturb_mode(dom_kinsp); + host_t> kinetic_charges(dom_kinsp); + host_t masses(dom_kinsp); + host_t density_eq(dom_kinsp); + host_t temperature_eq(dom_kinsp); + host_t mean_velocity_eq(dom_kinsp); + host_t init_perturb_amplitude(dom_kinsp); + host_t> init_perturb_mode(dom_kinsp); int nb_elec_adiabspecies = 1; int nb_ion_adiabspecies = 1; @@ -136,7 +136,7 @@ int main(int argc, char** argv) // Create the domain of all species including kinetic species + adiabatic species (if existing) IDomainSp const dom_allsp(IndexSp(0), nb_kinspecies + nb_elec_adiabspecies + nb_ion_adiabspecies); - FieldSp charges(dom_allsp); + host_t> charges(dom_allsp); for (IndexSp isp : dom_kinsp) { charges(isp) = kinetic_charges(isp); } @@ -146,29 +146,29 @@ int main(int argc, char** argv) // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfequilibrium_device(meshSpVx); + DFieldSpVx allfequilibrium(meshSpVx); MaxwellianEquilibrium const init_fequilibrium( std::move(density_eq), std::move(temperature_eq), std::move(mean_velocity_eq)); - init_fequilibrium(allfequilibrium_device); + init_fequilibrium(allfequilibrium); ddc::expose_to_pdi("iter_start", iter_start); - device_t allfdistribu_device(meshSpXVx); + DFieldSpXVx allfdistribu(meshSpXVx); double time_start(0); if (iter_start == 0) { SingleModePerturbInitialization const - init(allfequilibrium_device, + init(allfequilibrium, init_perturb_mode.span_cview(), init_perturb_amplitude.span_cview()); - init(allfdistribu_device); + init(allfdistribu); } else { RestartInitialization const restart(iter_start, time_start); - restart(allfdistribu_device); + restart(allfdistribu); } - auto allfequilibrium = ddc::create_mirror_view_and_copy(allfequilibrium_device.span_view()); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfequilibrium_host = ddc::create_mirror_view_and_copy(allfequilibrium.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // --> Algorithm info double const deltat = PCpp_double(conf_voicexx, ".Algorithm.deltat"); @@ -205,13 +205,13 @@ int main(int argc, char** argv) // Creating of mesh for output saving IDomainX const gridx = ddc::select(meshSpXVx); - FieldX meshX_coord(gridx); + host_t> meshX_coord(gridx); for (IndexX const ix : gridx) { meshX_coord(ix) = ddc::coordinate(ix); } IDomainVx const gridvx = ddc::select(meshSpXVx); - FieldVx meshVx_coord(gridvx); + host_t> meshVx_coord(gridvx); for (IndexVx const ivx : gridvx) { meshVx_coord(ivx) = ddc::coordinate(ivx); } @@ -223,12 +223,12 @@ int main(int argc, char** argv) #else using FemPoissonSolverX = FemNonPeriodicPoissonSolver; #endif - DFieldVx const quadrature_coeffs + host_t const quadrature_coeffs_host = neumann_spline_quadrature_coefficients(gridvx, builder_vx_poisson); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FemPoissonSolverX const poisson(builder_x_poisson, spline_x_evaluator_poisson, rhs); PredCorr const predcorr(vlasov, poisson); @@ -242,11 +242,11 @@ int main(int argc, char** argv) ddc::expose_to_pdi("Nkinspecies", nb_kinspecies.value()); ddc::expose_to_pdi("fdistribu_charges", ddc::discrete_space().charges()[dom_kinsp]); ddc::expose_to_pdi("fdistribu_masses", ddc::discrete_space().masses()[dom_kinsp]); - ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium); + ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium_host); steady_clock::time_point const start = steady_clock::now(); - predcorr(allfdistribu_device, time_start, deltat, nbiter); + predcorr(allfdistribu, time_start, deltat, nbiter); steady_clock::time_point const end = steady_clock::now(); diff --git a/simulations/geometryXVx/landau/landau_fft.cpp b/simulations/geometryXVx/landau/landau_fft.cpp index c97543ca0..560fa2d74 100644 --- a/simulations/geometryXVx/landau/landau_fft.cpp +++ b/simulations/geometryXVx/landau/landau_fft.cpp @@ -100,13 +100,13 @@ int main(int argc, char** argv) SplineVxBuilder const builder_vx(meshXVx); SplineVxBuilder_1d const builder_vx_poisson(interpolation_domain_vx); - FieldSp kinetic_charges(dom_kinsp); - DFieldSp masses(dom_kinsp); - DFieldSp density_eq(dom_kinsp); - DFieldSp temperature_eq(dom_kinsp); - DFieldSp mean_velocity_eq(dom_kinsp); - DFieldSp init_perturb_amplitude(dom_kinsp); - FieldSp init_perturb_mode(dom_kinsp); + host_t> kinetic_charges(dom_kinsp); + host_t masses(dom_kinsp); + host_t density_eq(dom_kinsp); + host_t temperature_eq(dom_kinsp); + host_t mean_velocity_eq(dom_kinsp); + host_t init_perturb_amplitude(dom_kinsp); + host_t> init_perturb_mode(dom_kinsp); int nb_elec_adiabspecies = 1; int nb_ion_adiabspecies = 1; @@ -132,7 +132,7 @@ int main(int argc, char** argv) // Create the domain of all species including kinetic species + adiabatic species (if existing) IDomainSp const dom_allsp(IndexSp(0), nb_kinspecies + nb_elec_adiabspecies + nb_ion_adiabspecies); - FieldSp charges(dom_allsp); + host_t> charges(dom_allsp); for (IndexSp isp : dom_kinsp) { charges(isp) = kinetic_charges(isp); } @@ -142,29 +142,29 @@ int main(int argc, char** argv) // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfequilibrium_device(meshSpVx); + DFieldSpVx allfequilibrium(meshSpVx); MaxwellianEquilibrium const init_fequilibrium( std::move(density_eq), std::move(temperature_eq), std::move(mean_velocity_eq)); - init_fequilibrium(allfequilibrium_device); + init_fequilibrium(allfequilibrium); ddc::expose_to_pdi("iter_start", iter_start); - device_t allfdistribu_device(meshSpXVx); + DFieldSpXVx allfdistribu(meshSpXVx); double time_start(0); if (iter_start == 0) { SingleModePerturbInitialization const - init(allfequilibrium_device, + init(allfequilibrium, init_perturb_mode.span_cview(), init_perturb_amplitude.span_cview()); - init(allfdistribu_device); + init(allfdistribu); } else { RestartInitialization const restart(iter_start, time_start); - restart(allfdistribu_device); + restart(allfdistribu); } - auto allfequilibrium = ddc::create_mirror_view_and_copy(allfequilibrium_device.span_view()); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfequilibrium_host = ddc::create_mirror_view_and_copy(allfequilibrium.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // --> Algorithm info double const deltat = PCpp_double(conf_voicexx, ".Algorithm.deltat"); @@ -199,13 +199,13 @@ int main(int argc, char** argv) // Creating of mesh for output saving IDomainX const gridx = ddc::select(meshSpXVx); - FieldX meshX_coord(gridx); + host_t> meshX_coord(gridx); for (IndexX const ix : gridx) { meshX_coord(ix) = ddc::coordinate(ix); } IDomainVx const gridvx = ddc::select(meshSpXVx); - FieldVx meshVx_coord(gridvx); + host_t> meshVx_coord(gridvx); for (IndexVx const ivx : gridvx) { meshVx_coord(ivx) = ddc::coordinate(ivx); } @@ -214,13 +214,13 @@ int main(int argc, char** argv) ddc::init_fourier_space(ddc::select(meshSpXVx)); - DFieldVx const quadrature_coeffs + host_t const quadrature_coeffs_host = neumann_spline_quadrature_coefficients(gridvx, builder_vx_poisson); - auto quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + auto quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FftPoissonSolver const poisson(rhs); PredCorr const predcorr(vlasov, poisson); @@ -234,11 +234,11 @@ int main(int argc, char** argv) ddc::expose_to_pdi("Nkinspecies", nb_kinspecies.value()); ddc::expose_to_pdi("fdistribu_charges", ddc::discrete_space().charges()[dom_kinsp]); ddc::expose_to_pdi("fdistribu_masses", ddc::discrete_space().masses()[dom_kinsp]); - ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium); + ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium_host); steady_clock::time_point const start = steady_clock::now(); - predcorr(allfdistribu_device, time_start, deltat, nbiter); + predcorr(allfdistribu, time_start, deltat, nbiter); steady_clock::time_point const end = steady_clock::now(); diff --git a/simulations/geometryXVx/sheath/sheath.cpp b/simulations/geometryXVx/sheath/sheath.cpp index 5e3851be0..fac74e5a6 100644 --- a/simulations/geometryXVx/sheath/sheath.cpp +++ b/simulations/geometryXVx/sheath/sheath.cpp @@ -119,13 +119,13 @@ int main(int argc, char** argv) SplineVxBuilder const builder_vx(meshXVx); SplineVxBuilder_1d const builder_vx_poisson(interpolation_domain_vx); - FieldSp kinetic_charges(dom_kinsp); - DFieldSp masses(dom_kinsp); - DFieldSp density_eq(dom_kinsp); - DFieldSp temperature_eq(dom_kinsp); - DFieldSp mean_velocity_eq(dom_kinsp); - DFieldSp init_perturb_amplitude(dom_kinsp); - FieldSp init_perturb_mode(dom_kinsp); + host_t> kinetic_charges(dom_kinsp); + host_t masses(dom_kinsp); + host_t density_eq(dom_kinsp); + host_t temperature_eq(dom_kinsp); + host_t mean_velocity_eq(dom_kinsp); + host_t init_perturb_amplitude(dom_kinsp); + host_t> init_perturb_mode(dom_kinsp); int nb_elec_adiabspecies = 1; int nb_ion_adiabspecies = 1; @@ -151,7 +151,7 @@ int main(int argc, char** argv) // Create the domain of all species including kinetic species + adiabatic species (if existing) IDomainSp const dom_allsp(IndexSp(0), nb_kinspecies + nb_elec_adiabspecies + nb_ion_adiabspecies); - FieldSp charges(dom_allsp); + host_t> charges(dom_allsp); for (IndexSp isp : dom_kinsp) { charges(isp) = kinetic_charges(isp); } @@ -161,29 +161,29 @@ int main(int argc, char** argv) // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfequilibrium_device(meshSpVx); + DFieldSpVx allfequilibrium(meshSpVx); MaxwellianEquilibrium const init_fequilibrium( std::move(density_eq), std::move(temperature_eq), std::move(mean_velocity_eq)); - init_fequilibrium(allfequilibrium_device); + init_fequilibrium(allfequilibrium); ddc::expose_to_pdi("iter_start", iter_start); - device_t allfdistribu_device(meshSpXVx); + DFieldSpXVx allfdistribu(meshSpXVx); double time_start(0); if (iter_start == 0) { SingleModePerturbInitialization const - init(allfequilibrium_device, + init(allfequilibrium, init_perturb_mode.span_cview(), init_perturb_amplitude.span_cview()); - init(allfdistribu_device); + init(allfdistribu); } else { RestartInitialization const restart(iter_start, time_start); - restart(allfdistribu_device); + restart(allfdistribu); } - auto allfequilibrium = ddc::create_mirror_view_and_copy(allfequilibrium_device.span_view()); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfequilibrium_host = ddc::create_mirror_view_and_copy(allfequilibrium.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // --> Algorithm info double const deltat = PCpp_double(conf_voicexx, ".Algorithm.deltat"); @@ -225,13 +225,13 @@ int main(int argc, char** argv) // Creating of mesh for output saving IDomainX const gridx = ddc::select(meshSpXVx); - FieldX meshX_coord(gridx); + host_t> meshX_coord(gridx); for (IndexX const ix : gridx) { meshX_coord(ix) = ddc::coordinate(ix); } IDomainVx const gridvx = ddc::select(meshSpXVx); - FieldVx meshVx_coord(gridvx); + host_t> meshVx_coord(gridvx); for (IndexVx const ivx : gridvx) { meshVx_coord(ivx) = ddc::coordinate(ivx); } @@ -304,13 +304,13 @@ int main(int argc, char** argv) SplitVlasovSolver const vlasov(advection_x, advection_vx); SplitRightHandSideSolver const boltzmann(vlasov, rhs_operators); - DFieldVx const quadrature_coeffs + host_t const quadrature_coeffs_host = neumann_spline_quadrature_coefficients(gridvx, builder_vx_poisson); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); #ifdef PERIODIC_RDIMX ddc::init_fourier_space(ddc::select(meshSpXVx)); FftPoissonSolver const poisson(rhs); @@ -331,11 +331,11 @@ int main(int argc, char** argv) ddc::expose_to_pdi("Nkinspecies", nb_kinspecies.value()); ddc::expose_to_pdi("fdistribu_charges", ddc::discrete_space().charges()[dom_kinsp]); ddc::expose_to_pdi("fdistribu_masses", ddc::discrete_space().masses()[dom_kinsp]); - ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium); + ddc::PdiEvent("initial_state").with("fdistribu_eq", allfequilibrium_host); steady_clock::time_point const start = steady_clock::now(); - predcorr(allfdistribu_device, time_start, deltat, nbiter); + predcorr(allfdistribu, time_start, deltat, nbiter); steady_clock::time_point const end = steady_clock::now(); diff --git a/src/advection/bsl_advection_vx.hpp b/src/advection/bsl_advection_vx.hpp index 6b13e39d3..949bd6c58 100644 --- a/src/advection/bsl_advection_vx.hpp +++ b/src/advection/bsl_advection_vx.hpp @@ -40,22 +40,22 @@ class BslAdvectionVelocity : public IAdvectionVelocity /** * @brief Advects fdistribu along DDimV for a duration dt. - * @param[in, out] allfdistribu_device Reference to the whole distribution function for one species, allocated on the device (ie it lets the choice of the location depend on the build configuration). - * @param[in] electric_field_device Reference to the electric field which derives from electrostatic potential, allocated on the device. + * @param[in, out] allfdistribu Reference to the whole distribution function for one species, allocated on the device (ie it lets the choice of the location depend on the build configuration). + * @param[in] electric_field Reference to the electric field which derives from electrostatic potential, allocated on the device. * @param[in] dt Time step * @return A reference to the allfdistribu array containing the value of the function at the coordinates. */ device_t> operator()( - device_t> const allfdistribu_device, - device_t> const electric_field_device, + device_t> const allfdistribu, + device_t> const electric_field, double const dt) const override { Kokkos::Profiling::pushRegion("BslAdvectionVelocity"); - auto allfdistribu_alloc = ddc::create_mirror_view_and_copy(allfdistribu_device); - ddc::ChunkSpan allfdistribu = allfdistribu_alloc.span_view(); - auto electric_field_alloc = ddc::create_mirror_view_and_copy(electric_field_device); - ddc::ChunkSpan electric_field = electric_field_alloc.span_view(); + auto allfdistribu_host_alloc = ddc::create_mirror_view_and_copy(allfdistribu); + ddc::ChunkSpan allfdistribu_host = allfdistribu_host_alloc.span_view(); + auto electric_field_host_alloc = ddc::create_mirror_view_and_copy(electric_field); + ddc::ChunkSpan electric_field_host = electric_field_host_alloc.span_view(); FdistribuDDom const dom = allfdistribu.domain(); ddc::DiscreteDomain const v_dom = ddc::select(dom); @@ -82,7 +82,8 @@ class BslAdvectionVelocity : public IAdvectionVelocity ddc::for_each(spatial_dom, [&](DElemSpatial const ix) { // compute the displacement - double const dvx = charge(isp) * sqrt_me_on_mspecies * dt * electric_field(ix); + double const dvx + = charge(isp) * sqrt_me_on_mspecies * dt * electric_field_host(ix); // compute the coordinates of the feet ddc::for_each(v_dom, [&](DElemV const iv) { @@ -90,19 +91,19 @@ class BslAdvectionVelocity : public IAdvectionVelocity }); // copy the slice in contiguous memory - ddc::deepcopy(contiguous_slice, allfdistribu[ic][isp][ix]); + ddc::deepcopy(contiguous_slice, allfdistribu_host[ic][isp][ix]); // build a spline representation of the data interpolator_v(contiguous_slice, feet_coords.span_cview()); // copy back - ddc::deepcopy(allfdistribu[ic][isp][ix], contiguous_slice); + ddc::deepcopy(allfdistribu_host[ic][isp][ix], contiguous_slice); }); }); }); - ddc::deepcopy(allfdistribu_device, allfdistribu); + ddc::deepcopy(allfdistribu, allfdistribu_host); Kokkos::Profiling::popRegion(); - return allfdistribu_device; + return allfdistribu; } }; diff --git a/src/advection/bsl_advection_x.hpp b/src/advection/bsl_advection_x.hpp index 1eaa1ffe2..10e439d54 100644 --- a/src/advection/bsl_advection_x.hpp +++ b/src/advection/bsl_advection_x.hpp @@ -42,17 +42,17 @@ class BslAdvectionSpatial : public IAdvectionSpatial /** * @brief Advects fdistribu along DDimX for a duration dt. - * @param[in, out] allfdistribu_device Reference to the whole distribution function for one species, allocated on the device (ie it lets the choice of the location depend on the build configuration). + * @param[in, out] allfdistribu Reference to the whole distribution function for one species, allocated on the device (ie it lets the choice of the location depend on the build configuration). * @param[in] dt time step * @return A reference to the allfdistribu array containing the value of the function at the coordinates. */ device_t> operator()( - device_t> const allfdistribu_device, + device_t> const allfdistribu, double const dt) const override { Kokkos::Profiling::pushRegion("BslAdvectionSpatial"); - auto allfdistribu_alloc = ddc::create_mirror_view_and_copy(allfdistribu_device); - ddc::ChunkSpan allfdistribu = allfdistribu_alloc.span_view(); + auto allfdistribu_host_alloc = ddc::create_mirror_view_and_copy(allfdistribu); + ddc::ChunkSpan allfdistribu_host = allfdistribu_host_alloc.span_view(); DDom const dom = allfdistribu.domain(); ddc::DiscreteDomain const x_dom = ddc::select(dom); @@ -85,19 +85,19 @@ class BslAdvectionSpatial : public IAdvectionSpatial }); // copy the slice in contiguous memory - ddc::deepcopy(contiguous_slice, allfdistribu[ic][isp][iv]); + ddc::deepcopy(contiguous_slice, allfdistribu_host[ic][isp][iv]); // interpolate the function at the feet using the provided interpolator interpolator_x(contiguous_slice, feet_coords.span_cview()); // copy back - ddc::deepcopy(allfdistribu[ic][isp][iv], contiguous_slice); + ddc::deepcopy(allfdistribu_host[ic][isp][iv], contiguous_slice); }); }); }); - ddc::deepcopy(allfdistribu_device, allfdistribu); + ddc::deepcopy(allfdistribu_host, allfdistribu); Kokkos::Profiling::popRegion(); - return allfdistribu_device; + return allfdistribu; } }; diff --git a/src/geometryXVx/boltzmann/iboltzmannsolver.hpp b/src/geometryXVx/boltzmann/iboltzmannsolver.hpp index a129ef87c..62d091647 100644 --- a/src/geometryXVx/boltzmann/iboltzmannsolver.hpp +++ b/src/geometryXVx/boltzmann/iboltzmannsolver.hpp @@ -21,8 +21,5 @@ class IBoltzmannSolver * @param[in] dt The timestep. * @return The distribution function after solving the Boltzmann equation. */ - virtual device_t operator()( - device_t allfdistribu, - device_t efield, - double dt) const = 0; + virtual DSpanSpXVx operator()(DSpanSpXVx allfdistribu, DViewX efield, double dt) const = 0; }; diff --git a/src/geometryXVx/boltzmann/splitrighthandsidesolver.cpp b/src/geometryXVx/boltzmann/splitrighthandsidesolver.cpp index 72e869925..9b008fe4c 100644 --- a/src/geometryXVx/boltzmann/splitrighthandsidesolver.cpp +++ b/src/geometryXVx/boltzmann/splitrighthandsidesolver.cpp @@ -17,9 +17,9 @@ SplitRightHandSideSolver::SplitRightHandSideSolver( { } -device_t SplitRightHandSideSolver::operator()( - device_t const allfdistribu, - device_t const electric_field, +DSpanSpXVx SplitRightHandSideSolver::operator()( + DSpanSpXVx const allfdistribu, + DViewX const electric_field, double const dt) const { for (auto rhsit = m_rhs.begin(); rhsit != m_rhs.end(); ++rhsit) { diff --git a/src/geometryXVx/boltzmann/splitrighthandsidesolver.hpp b/src/geometryXVx/boltzmann/splitrighthandsidesolver.hpp index e06e3b107..ca7a72d7f 100644 --- a/src/geometryXVx/boltzmann/splitrighthandsidesolver.hpp +++ b/src/geometryXVx/boltzmann/splitrighthandsidesolver.hpp @@ -52,8 +52,5 @@ class SplitRightHandSideSolver : public IBoltzmannSolver * @param[in] dt The timestep. * @return The distribution function after solving the Boltzmann equation. */ - device_t operator()( - device_t allfdistribu, - device_t electric_field, - double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, DViewX electric_field, double dt) const override; }; diff --git a/src/geometryXVx/boltzmann/splitvlasovsolver.cpp b/src/geometryXVx/boltzmann/splitvlasovsolver.cpp index 32168ed43..b82b153b5 100644 --- a/src/geometryXVx/boltzmann/splitvlasovsolver.cpp +++ b/src/geometryXVx/boltzmann/splitvlasovsolver.cpp @@ -12,9 +12,9 @@ SplitVlasovSolver::SplitVlasovSolver( { } -device_t SplitVlasovSolver::operator()( - device_t const allfdistribu, - device_t const electric_field, +DSpanSpXVx SplitVlasovSolver::operator()( + DSpanSpXVx const allfdistribu, + DViewX const electric_field, double const dt) const { m_advec_x(allfdistribu, dt / 2); diff --git a/src/geometryXVx/boltzmann/splitvlasovsolver.hpp b/src/geometryXVx/boltzmann/splitvlasovsolver.hpp index 6fcac77d1..64b114df9 100644 --- a/src/geometryXVx/boltzmann/splitvlasovsolver.hpp +++ b/src/geometryXVx/boltzmann/splitvlasovsolver.hpp @@ -51,8 +51,5 @@ class SplitVlasovSolver : public IBoltzmannSolver * @param[in] dt The timestep. * @return The distribution function after solving the Vlasov equation. */ - device_t operator()( - device_t allfdistribu, - device_t electric_field, - double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, DViewX electric_field, double dt) const override; }; diff --git a/src/geometryXVx/geometry/geometry.hpp b/src/geometryXVx/geometry/geometry.hpp index 5bc925216..177bad152 100644 --- a/src/geometryXVx/geometry/geometry.hpp +++ b/src/geometryXVx/geometry/geometry.hpp @@ -240,27 +240,27 @@ using IDomainSpXVx = ddc::DiscreteDomain; template -using FieldX = ddc::Chunk; +using FieldX = device_t>; template -using FieldVx = ddc::Chunk; +using FieldVx = device_t>; template -using FieldSp = ddc::Chunk; +using FieldSp = device_t>; template -using FieldSpX = ddc::Chunk; +using FieldSpX = device_t>; template -using FieldSpVx = ddc::Chunk; +using FieldSpVx = device_t>; template -using FieldSpXVx = ddc::Chunk; +using FieldSpXVx = device_t>; template -using DField = ddc::Chunk; +using DField = device_t>; using DFieldX = FieldX; @@ -277,30 +277,30 @@ using DFieldSpXVx = FieldSpXVx; template -using SpanSp = ddc::ChunkSpan; +using SpanSp = device_t>; template -using SpanSpX = ddc::ChunkSpan; +using SpanSpX = device_t>; template -using SpanX = ddc::ChunkSpan; +using SpanX = device_t>; template -using SpanSpX = ddc::ChunkSpan; +using SpanSpX = device_t>; template -using SpanVx = ddc::ChunkSpan; +using SpanVx = device_t>; template -using SpanSpXVx = ddc::ChunkSpan; +using SpanSpXVx = device_t>; template -using SpanSpVx = ddc::ChunkSpan; +using SpanSpVx = device_t>; template -using DSpan = ddc::ChunkSpan; +using DSpan = device_t>; using DSpanSp = SpanSp; @@ -318,30 +318,30 @@ using DSpanSpVx = SpanSpVx; template -using ViewX = ddc::ChunkSpan; +using ViewX = device_t>; template -using ViewVx = ddc::ChunkSpan; +using ViewVx = device_t>; template -using ViewSp = ddc::ChunkSpan; +using ViewSp = device_t>; template -using ViewSpX = ddc::ChunkSpan; +using ViewSpX = device_t>; template -using ViewSpVx = ddc::ChunkSpan; +using ViewSpVx = device_t>; template -using ViewSpXVx = ddc::ChunkSpan; +using ViewSpXVx = device_t>; template -using BSViewX = ddc::ChunkSpan; +using BSViewX = device_t>; template -using DView = ddc::ChunkSpan; +using DView = device_t>; using DViewX = ViewX; diff --git a/src/geometryXVx/initialization/bumpontailequilibrium.cpp b/src/geometryXVx/initialization/bumpontailequilibrium.cpp index 8d77af1e2..5605342b4 100644 --- a/src/geometryXVx/initialization/bumpontailequilibrium.cpp +++ b/src/geometryXVx/initialization/bumpontailequilibrium.cpp @@ -5,23 +5,22 @@ #include "bumpontailequilibrium.hpp" BumpontailEquilibrium::BumpontailEquilibrium( - DViewSp const epsilon_bot, - DViewSp const temperature_bot, - DViewSp const mean_velocity_bot) + host_t const epsilon_bot, + host_t const temperature_bot, + host_t const mean_velocity_bot) : m_epsilon_bot(epsilon_bot) , m_temperature_bot(temperature_bot) , m_mean_velocity_bot(mean_velocity_bot) { } -device_t BumpontailEquilibrium::operator()( - device_t const allfequilibrium) const +DSpanSpVx BumpontailEquilibrium::operator()(DSpanSpVx const allfequilibrium) const { IDomainVx const gridvx = allfequilibrium.domain(); IDomainSp const gridsp = allfequilibrium.domain(); // Initialization of the maxwellian - device_t maxwellian_alloc(gridvx); + DFieldVx maxwellian_alloc(gridvx); ddc::ChunkSpan maxwellian = maxwellian_alloc.span_view(); ddc::for_each(gridsp, [&](IndexSp const isp) { compute_twomaxwellian( @@ -39,7 +38,7 @@ device_t BumpontailEquilibrium::operator()( } void BumpontailEquilibrium::compute_twomaxwellian( - device_t const fMaxwellian, + DSpanVx const fMaxwellian, double const epsilon_bot, double const temperature_bot, double const mean_velocity_bot) const diff --git a/src/geometryXVx/initialization/bumpontailequilibrium.hpp b/src/geometryXVx/initialization/bumpontailequilibrium.hpp index 572dcc0f0..f9de0aded 100644 --- a/src/geometryXVx/initialization/bumpontailequilibrium.hpp +++ b/src/geometryXVx/initialization/bumpontailequilibrium.hpp @@ -19,13 +19,13 @@ class BumpontailEquilibrium : public IEquilibrium { /**Density of the bump-on-tail part for all kinetic species*/ - FieldSp m_epsilon_bot; + host_t m_epsilon_bot; /**Temperature of the bump-on-tail for all kinetic species*/ - FieldSp m_temperature_bot; + host_t m_temperature_bot; /**Mean velocity of the bump-on-tail for all kinetic species*/ - FieldSp m_mean_velocity_bot; + host_t m_mean_velocity_bot; public: /** @@ -41,7 +41,7 @@ class BumpontailEquilibrium : public IEquilibrium * @param[in] mean_velocity_bot A parameter that represents the mean velocity of the bump-on-tail Maxwellian. */ void compute_twomaxwellian( - device_t fMaxwellian, + DSpanVx fMaxwellian, double epsilon_bot, double temperature_bot, double mean_velocity_bot) const; @@ -51,7 +51,10 @@ class BumpontailEquilibrium : public IEquilibrium * @param[in] temperature_bot A parameter that represents the temperature of the bump-on-tail Maxwellian for each species. * @param[in] mean_velocity_bot A parameter that represents the mean velocity of the bump-on-tail Maxwellian for each species. */ - BumpontailEquilibrium(DViewSp epsilon_bot, DViewSp temperature_bot, DViewSp mean_velocity_bot); + BumpontailEquilibrium( + host_t epsilon_bot, + host_t temperature_bot, + host_t mean_velocity_bot); ~BumpontailEquilibrium() override = default; @@ -60,13 +63,13 @@ class BumpontailEquilibrium : public IEquilibrium * @param[out] allfequilibrium The initialized distribution function. * @return The initialized distribution function. */ - device_t operator()(device_t allfequilibrium) const override; + DSpanSpVx operator()(DSpanSpVx allfequilibrium) const override; /** * @brief A method for accessing the m_epsilon_bot member variable of the class. * @return a View containing the m_epsilon_bot variable. */ - ViewSp epsilon_bot() const + host_t epsilon_bot() const { return m_epsilon_bot; } @@ -75,7 +78,7 @@ class BumpontailEquilibrium : public IEquilibrium * @brief A method for accessing the m_temperature_bot member variable of the class. * @return a View containing the m_temperature_bot variable. */ - ViewSp temperature_bot() const + host_t temperature_bot() const { return m_temperature_bot; } @@ -84,7 +87,7 @@ class BumpontailEquilibrium : public IEquilibrium * @brief A method for accessing the m_mean_velocity_bot member variable of the class. * @return a View containing the m_velocity_bot variable. */ - ViewSp mean_velocity_bot() const + host_t mean_velocity_bot() const { return m_mean_velocity_bot; } diff --git a/src/geometryXVx/initialization/iequilibrium.hpp b/src/geometryXVx/initialization/iequilibrium.hpp index f50f81d95..7e6b7113b 100644 --- a/src/geometryXVx/initialization/iequilibrium.hpp +++ b/src/geometryXVx/initialization/iequilibrium.hpp @@ -18,5 +18,5 @@ class IEquilibrium * On output: the initialized distribution function. * @return The initialized distribution function. */ - virtual device_t operator()(device_t allfequilibrium) const = 0; + virtual DSpanSpVx operator()(DSpanSpVx allfequilibrium) const = 0; }; diff --git a/src/geometryXVx/initialization/iinitialization.hpp b/src/geometryXVx/initialization/iinitialization.hpp index 5ef805538..5573adafd 100644 --- a/src/geometryXVx/initialization/iinitialization.hpp +++ b/src/geometryXVx/initialization/iinitialization.hpp @@ -18,5 +18,5 @@ class IInitialization * On output: the initialized distribution function. * @return The initialized distribution function. */ - virtual device_t operator()(device_t allfdistribu) const = 0; + virtual DSpanSpXVx operator()(DSpanSpXVx allfdistribu) const = 0; }; diff --git a/src/geometryXVx/initialization/maxwellianequilibrium.cpp b/src/geometryXVx/initialization/maxwellianequilibrium.cpp index 62b9e18aa..a68064710 100644 --- a/src/geometryXVx/initialization/maxwellianequilibrium.cpp +++ b/src/geometryXVx/initialization/maxwellianequilibrium.cpp @@ -5,23 +5,22 @@ #include "maxwellianequilibrium.hpp" MaxwellianEquilibrium::MaxwellianEquilibrium( - DFieldSp density_eq, - DFieldSp temperature_eq, - DFieldSp mean_velocity_eq) + host_t density_eq, + host_t temperature_eq, + host_t mean_velocity_eq) : m_density_eq(std::move(density_eq)) , m_temperature_eq(std::move(temperature_eq)) , m_mean_velocity_eq(std::move(mean_velocity_eq)) { } -device_t MaxwellianEquilibrium::operator()( - device_t const allfequilibrium) const +DSpanSpVx MaxwellianEquilibrium::operator()(DSpanSpVx const allfequilibrium) const { IDomainVx const gridvx = allfequilibrium.domain(); IDomainSp const gridsp = allfequilibrium.domain(); // Initialization of the maxwellian - device_t maxwellian_alloc(gridvx); + DFieldVx maxwellian_alloc(gridvx); ddc::ChunkSpan maxwellian = maxwellian_alloc.span_view(); ddc::for_each(gridsp, [&](IndexSp const isp) { compute_maxwellian( @@ -39,7 +38,7 @@ device_t MaxwellianEquilibrium::operator()( } void MaxwellianEquilibrium::compute_maxwellian( - device_t const fMaxwellian, + DSpanVx const fMaxwellian, double const density, double const temperature, double const mean_velocity) diff --git a/src/geometryXVx/initialization/maxwellianequilibrium.hpp b/src/geometryXVx/initialization/maxwellianequilibrium.hpp index 9a0b3933a..fbf374b23 100644 --- a/src/geometryXVx/initialization/maxwellianequilibrium.hpp +++ b/src/geometryXVx/initialization/maxwellianequilibrium.hpp @@ -13,13 +13,13 @@ class MaxwellianEquilibrium : public IEquilibrium { /**Equilibrium density of all kinetic species*/ - FieldSp m_density_eq; + host_t m_density_eq; /**Equilibrium temperature of all kinetic species*/ - FieldSp m_temperature_eq; + host_t m_temperature_eq; /**Equilibrium mean velocity of all kinetic species*/ - FieldSp m_mean_velocity_eq; + host_t m_mean_velocity_eq; public: /** @@ -28,7 +28,10 @@ class MaxwellianEquilibrium : public IEquilibrium * @param[in] temperature_eq The temperature of the Maxwellian * @param[in] mean_velocity_eq The mean velocity of the Maxwellian */ - MaxwellianEquilibrium(DFieldSp density_eq, DFieldSp temperature_eq, DFieldSp mean_velocity_eq); + MaxwellianEquilibrium( + host_t density_eq, + host_t temperature_eq, + host_t mean_velocity_eq); ~MaxwellianEquilibrium() override = default; @@ -37,7 +40,7 @@ class MaxwellianEquilibrium : public IEquilibrium * @param[out] allfequilibrium A Span containing a Maxwellian distribution function. * @return A Span containing a Maxwellian distribution function. */ - device_t operator()(device_t allfequilibrium) const override; + DSpanSpVx operator()(DSpanSpVx allfequilibrium) const override; /** * @brief Compute a Maxwellian distribution function. @@ -51,7 +54,7 @@ class MaxwellianEquilibrium : public IEquilibrium * @param[in] mean_velocity A parameter that represents the mean velocity of Maxwellian. */ static void compute_maxwellian( - device_t const fMaxwellian, + DSpanVx const fMaxwellian, double const density, double const temperature, double const mean_velocity); @@ -60,7 +63,7 @@ class MaxwellianEquilibrium : public IEquilibrium * @brief A method for accessing the m_density_eq member variable of the class. * @return A view containing the m_density_eq value. */ - ViewSp density_eq() const + host_t density_eq() const { return m_density_eq; } @@ -69,7 +72,7 @@ class MaxwellianEquilibrium : public IEquilibrium * @brief A method for accessing the m_temperature_eq member variable of the class. * @return A view containing the m_temperature_eq value. */ - ViewSp temperature_eq() const + host_t temperature_eq() const { return m_temperature_eq; } @@ -78,7 +81,7 @@ class MaxwellianEquilibrium : public IEquilibrium * @brief A method for accessing the m_mean_velocity_eq member variable of the class. * @return A view containing the m_velocity_eq value. */ - ViewSp mean_velocity_eq() const + host_t mean_velocity_eq() const { return m_mean_velocity_eq; } diff --git a/src/geometryXVx/initialization/restartinitialization.cpp b/src/geometryXVx/initialization/restartinitialization.cpp index e556acc82..8ec0107f4 100644 --- a/src/geometryXVx/initialization/restartinitialization.cpp +++ b/src/geometryXVx/initialization/restartinitialization.cpp @@ -10,11 +10,10 @@ RestartInitialization::RestartInitialization(int iter_start, double& time_start) { } -device_t RestartInitialization::operator()( - device_t const allfdistribu_device) const +DSpanSpXVx RestartInitialization::operator()(DSpanSpXVx const allfdistribu) const { - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); - ddc::PdiEvent("restart").with("time_saved", m_time_start).with("fdistribu", allfdistribu); - ddc::deepcopy(allfdistribu_device, allfdistribu); - return allfdistribu_device; -} \ No newline at end of file + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); + ddc::PdiEvent("restart").with("time_saved", m_time_start).with("fdistribu", allfdistribu_host); + ddc::deepcopy(allfdistribu, allfdistribu_host); + return allfdistribu; +} diff --git a/src/geometryXVx/initialization/restartinitialization.hpp b/src/geometryXVx/initialization/restartinitialization.hpp index 0d1a54e6d..0954a6d81 100644 --- a/src/geometryXVx/initialization/restartinitialization.hpp +++ b/src/geometryXVx/initialization/restartinitialization.hpp @@ -40,5 +40,5 @@ class RestartInitialization : public IInitialization * read from an external file. * @return The initialized distribution function. */ - device_t operator()(device_t allfdistribu) const override; -}; \ No newline at end of file + DSpanSpXVx operator()(DSpanSpXVx allfdistribu) const override; +}; diff --git a/src/geometryXVx/initialization/singlemodeperturbinitialization.cpp b/src/geometryXVx/initialization/singlemodeperturbinitialization.cpp index 003d04fbd..047c2fecc 100644 --- a/src/geometryXVx/initialization/singlemodeperturbinitialization.cpp +++ b/src/geometryXVx/initialization/singlemodeperturbinitialization.cpp @@ -6,24 +6,23 @@ #include "singlemodeperturbinitialization.hpp" SingleModePerturbInitialization::SingleModePerturbInitialization( - device_t fequilibrium, - ViewSp const init_perturb_mode, - DViewSp const init_perturb_amplitude) + DViewSpVx fequilibrium, + host_t> const init_perturb_mode, + host_t const init_perturb_amplitude) : m_fequilibrium(fequilibrium) , m_init_perturb_mode(init_perturb_mode) , m_init_perturb_amplitude(init_perturb_amplitude) { } -device_t SingleModePerturbInitialization::operator()( - device_t const allfdistribu) const +DSpanSpXVx SingleModePerturbInitialization::operator()(DSpanSpXVx const allfdistribu) const { IDomainSp const gridsp = allfdistribu.domain(); IDomainX const gridx = allfdistribu.domain(); IDomainXVx const gridxvx = allfdistribu.domain(); // Initialization of the perturbation - device_t perturbation_alloc(gridx); + DFieldX perturbation_alloc(gridx); ddc::ChunkSpan perturbation = perturbation_alloc.span_view(); ddc::for_each(gridsp, [&](IndexSp const isp) { perturbation_initialization( @@ -48,7 +47,7 @@ device_t SingleModePerturbInitialization::operator()( } void SingleModePerturbInitialization::perturbation_initialization( - device_t const perturbation, + DSpanX const perturbation, int const mode, double const perturb_amplitude) const { diff --git a/src/geometryXVx/initialization/singlemodeperturbinitialization.hpp b/src/geometryXVx/initialization/singlemodeperturbinitialization.hpp index 3837ac34b..bcb1d2177 100644 --- a/src/geometryXVx/initialization/singlemodeperturbinitialization.hpp +++ b/src/geometryXVx/initialization/singlemodeperturbinitialization.hpp @@ -16,11 +16,11 @@ */ class SingleModePerturbInitialization : public IInitialization { - device_t m_fequilibrium; + DViewSpVx m_fequilibrium; - ViewSp m_init_perturb_mode; + host_t> m_init_perturb_mode; - DViewSp m_init_perturb_amplitude; + host_t m_init_perturb_amplitude; public: /** @@ -31,10 +31,7 @@ class SingleModePerturbInitialization : public IInitialization * @param[in] mode The mode of the perturbation. * @param[in] perturb_amplitude The amplitude of the perturbation. */ - void perturbation_initialization( - device_t perturbation, - int mode, - double perturb_amplitude) const; + void perturbation_initialization(DSpanX perturbation, int mode, double perturb_amplitude) const; /** * @brief Creates an instance of the SingleModePerturbInitialization class. @@ -43,9 +40,9 @@ class SingleModePerturbInitialization : public IInitialization * @param[in] init_perturb_amplitude The perturbation amplitude. */ SingleModePerturbInitialization( - device_t fequilibrium, - ViewSp init_perturb_mode, - DViewSp init_perturb_amplitude); + DViewSpVx fequilibrium, + host_t> init_perturb_mode, + host_t init_perturb_amplitude); ~SingleModePerturbInitialization() override = default; @@ -54,5 +51,5 @@ class SingleModePerturbInitialization : public IInitialization * @param[in, out] allfdistribu The initialized distribution function. * @return The initialized distribution function. */ - device_t operator()(device_t allfdistribu) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu) const override; }; diff --git a/src/geometryXVx/poisson/chargedensitycalculator.cpp b/src/geometryXVx/poisson/chargedensitycalculator.cpp index 3a376a9b1..c2c3a948f 100644 --- a/src/geometryXVx/poisson/chargedensitycalculator.cpp +++ b/src/geometryXVx/poisson/chargedensitycalculator.cpp @@ -9,9 +9,7 @@ ChargeDensityCalculator::ChargeDensityCalculator(const ChunkViewType& coeffs) { } -device_t ChargeDensityCalculator::operator()( - device_t const rho, - device_t const allfdistribu) const +DSpanX ChargeDensityCalculator::operator()(DSpanX const rho, DViewSpXVx const allfdistribu) const { Kokkos::Profiling::pushRegion("ChargeDensityCalculator"); IndexSp const last_kin_species = allfdistribu.domain().back(); @@ -26,8 +24,8 @@ device_t ChargeDensityCalculator::operator()( = allfdistribu.allocation_kokkos_view(); Kokkos::View const rho_view = rho.allocation_kokkos_view(); - ViewSp const charges = ddc::host_discrete_space().charges(); - ViewSp const kinetic_charges = charges[allfdistribu.domain()]; + host_t> const charges = ddc::host_discrete_space().charges(); + host_t> const kinetic_charges = charges[allfdistribu.domain()]; auto charges_alloc = create_mirror_view_and_copy(Kokkos::DefaultExecutionSpace(), kinetic_charges); diff --git a/src/geometryXVx/poisson/chargedensitycalculator.hpp b/src/geometryXVx/poisson/chargedensitycalculator.hpp index d644a0464..90842c69e 100644 --- a/src/geometryXVx/poisson/chargedensitycalculator.hpp +++ b/src/geometryXVx/poisson/chargedensitycalculator.hpp @@ -19,7 +19,7 @@ class ChargeDensityCalculator : public IChargeDensityCalculator { private: - using ChunkViewType = device_t; + using ChunkViewType = DViewVx; ChunkViewType m_coefficients; public: @@ -37,6 +37,5 @@ class ChargeDensityCalculator : public IChargeDensityCalculator * * @return rho The charge density. */ - device_t operator()(device_t rho, device_t allfdistribu) - const final; + DSpanX operator()(DSpanX rho, DViewSpXVx allfdistribu) const final; }; diff --git a/src/geometryXVx/poisson/electricfield.cpp b/src/geometryXVx/poisson/electricfield.cpp index 2e009bf0a..b6d77c414 100644 --- a/src/geometryXVx/poisson/electricfield.cpp +++ b/src/geometryXVx/poisson/electricfield.cpp @@ -16,8 +16,9 @@ ElectricField::ElectricField( // Compute efield = -dPhi/dx where Phi is the electrostatic potential // input : Phi values //=========================================================================== -void ElectricField::operator()(DSpanX const electric_field, DBSViewX const electrostatic_potential) - const +void ElectricField::operator()( + host_t const electric_field, + host_t const electrostatic_potential) const { IDomainX const& x_dom = electric_field.domain(); ddc::for_each(x_dom, [&](IndexX const ix) { @@ -26,11 +27,12 @@ void ElectricField::operator()(DSpanX const electric_field, DBSViewX const elect }); } -void ElectricField::operator()(DSpanX const electric_field, DViewX const electrostatic_potential) - const +void ElectricField::operator()( + host_t const electric_field, + host_t const electrostatic_potential) const { Kokkos::Profiling::pushRegion("ElectricField"); - ddc::Chunk elecpot_spline_coef(m_spline_x_builder.bsplines_domain()); + host_t> elecpot_spline_coef(m_spline_x_builder.bsplines_domain()); m_spline_x_builder(elecpot_spline_coef.span_view(), electrostatic_potential); (*this)(electric_field, elecpot_spline_coef); Kokkos::Profiling::popRegion(); diff --git a/src/geometryXVx/poisson/electricfield.hpp b/src/geometryXVx/poisson/electricfield.hpp index a6de45029..739a768e9 100644 --- a/src/geometryXVx/poisson/electricfield.hpp +++ b/src/geometryXVx/poisson/electricfield.hpp @@ -38,7 +38,7 @@ class ElectricField * @param[out] electric_field The electric_field, the result of the operation. * @param[out] electrostatic_potential The electrostatic potential, the input of the operator. */ - void operator()(DSpanX electric_field, DViewX electrostatic_potential) const; + void operator()(host_t electric_field, host_t electrostatic_potential) const; /** * The operator which solves the equation using the method described by the class. @@ -46,5 +46,5 @@ class ElectricField * @param[out] electric_field The electric_field, the result of the operation. * @param[out] electrostatic_potential The electrostatic potential, the input of the operator. */ - void operator()(DSpanX electric_field, DBSViewX electrostatic_potential) const; + void operator()(host_t electric_field, host_t electrostatic_potential) const; }; diff --git a/src/geometryXVx/poisson/femnonperiodicpoissonsolver.cpp b/src/geometryXVx/poisson/femnonperiodicpoissonsolver.cpp index b39485064..7c815f1fd 100644 --- a/src/geometryXVx/poisson/femnonperiodicpoissonsolver.cpp +++ b/src/geometryXVx/poisson/femnonperiodicpoissonsolver.cpp @@ -175,37 +175,37 @@ void FemNonPeriodicPoissonSolver::solve_matrix_system( // with Lagrangian multipliers //---------------------------------------------------------------------------- void FemNonPeriodicPoissonSolver::operator()( - device_t electrostatic_potential_device, - device_t electric_field_device, - device_t allfdistribu_device) const + DSpanX electrostatic_potential, + DSpanX electric_field, + DViewSpXVx allfdistribu) const { Kokkos::Profiling::pushRegion("PoissonSolver"); - auto electrostatic_potential = ddc::create_mirror_and_copy(electrostatic_potential_device); - auto electric_field = ddc::create_mirror_and_copy(electric_field_device); - assert(electrostatic_potential_device.domain() == ddc::get_domain(allfdistribu_device)); + auto electrostatic_potential_host = ddc::create_mirror_and_copy(electrostatic_potential); + auto electric_field_host = ddc::create_mirror_and_copy(electric_field); + assert(electrostatic_potential.domain() == ddc::get_domain(allfdistribu)); IDomainX const dom_x = electrostatic_potential.domain(); // Compute the RHS of the Poisson equation - ddc::Chunk rho(dom_x); - device_t> rho_device(dom_x); - m_compute_rho(rho_device, allfdistribu_device); - ddc::deepcopy(rho, rho_device); + host_t rho_host(dom_x); + DFieldX rho(dom_x); + m_compute_rho(rho, allfdistribu); + ddc::deepcopy(rho_host, rho); // ddc::Chunk rho_spline_coef(m_spline_x_builder.spline_domain()); - m_spline_x_builder(rho_spline_coef.span_view(), rho.span_cview()); + m_spline_x_builder(rho_spline_coef.span_view(), rho_host.span_cview()); ddc::Chunk phi_spline_coef( ddc::discrete_space().full_domain()); solve_matrix_system(phi_spline_coef, rho_spline_coef); // ddc::for_each(dom_x, [&](IndexX const ix) { - electrostatic_potential(ix) + electrostatic_potential_host(ix) = m_spline_x_nu_evaluator(ddc::coordinate(ix), phi_spline_coef.span_cview()); - electric_field(ix) + electric_field_host(ix) = -m_spline_x_nu_evaluator.deriv(ddc::coordinate(ix), phi_spline_coef.span_cview()); }); - ddc::deepcopy(electrostatic_potential_device, electrostatic_potential); - ddc::deepcopy(electric_field_device, electric_field); + ddc::deepcopy(electrostatic_potential, electrostatic_potential_host); + ddc::deepcopy(electric_field, electric_field_host); Kokkos::Profiling::popRegion(); } diff --git a/src/geometryXVx/poisson/femnonperiodicpoissonsolver.hpp b/src/geometryXVx/poisson/femnonperiodicpoissonsolver.hpp index 3068cfa64..9b52f3546 100644 --- a/src/geometryXVx/poisson/femnonperiodicpoissonsolver.hpp +++ b/src/geometryXVx/poisson/femnonperiodicpoissonsolver.hpp @@ -100,14 +100,12 @@ class FemNonPeriodicPoissonSolver : public IPoissonSolver /** * The operator which solves the equation using the method described by the class. * - * @param[out] electrostatic_potential_device The electrostatic potential, the result of the poisson solver. - * @param[out] electric_field_device The electric field, the derivative of the electrostatic potential. - * @param[in] allfdistribu_device The distribution function. + * @param[out] electrostatic_potential The electrostatic potential, the result of the poisson solver. + * @param[out] electric_field The electric field, the derivative of the electrostatic potential. + * @param[in] allfdistribu The distribution function. */ - void operator()( - device_t electrostatic_potential_device, - device_t electric_field_device, - device_t allfdistribu_device) const override; + void operator()(DSpanX electrostatic_potential, DSpanX electric_field, DViewSpXVx allfdistribu) + const override; private: void build_matrix(); diff --git a/src/geometryXVx/poisson/femperiodicpoissonsolver.cpp b/src/geometryXVx/poisson/femperiodicpoissonsolver.cpp index 764a8a56c..81aa3d922 100644 --- a/src/geometryXVx/poisson/femperiodicpoissonsolver.cpp +++ b/src/geometryXVx/poisson/femperiodicpoissonsolver.cpp @@ -160,36 +160,36 @@ void FemPeriodicPoissonSolver::solve_matrix_system( // with Lagrangian multipliers //---------------------------------------------------------------------------- void FemPeriodicPoissonSolver::operator()( - device_t electrostatic_potential_device, - device_t electric_field_device, - device_t allfdistribu_device) const + DSpanX electrostatic_potential, + DSpanX electric_field, + DViewSpXVx allfdistribu) const { Kokkos::Profiling::pushRegion("PoissonSolver"); - auto electrostatic_potential = ddc::create_mirror_and_copy(electrostatic_potential_device); - auto electric_field = ddc::create_mirror_and_copy(electric_field_device); - assert(electrostatic_potential_device.domain() == ddc::get_domain(allfdistribu_device)); + auto electrostatic_potential_host = ddc::create_mirror_and_copy(electrostatic_potential); + auto electric_field_host = ddc::create_mirror_and_copy(electric_field); + assert(electrostatic_potential.domain() == ddc::get_domain(allfdistribu)); IDomainX const dom_x = electrostatic_potential.domain(); // Compute the RHS of the Poisson equation + host_t rho_host(dom_x); DFieldX rho(dom_x); - device_t rho_device(dom_x); - m_compute_rho(rho_device, allfdistribu_device); - ddc::deepcopy(rho, rho_device); + m_compute_rho(rho, allfdistribu); + ddc::deepcopy(rho_host, rho); // ddc::Chunk rho_spline_coef(m_spline_x_builder.spline_domain()); - m_spline_x_builder(rho_spline_coef.span_view(), rho.span_cview()); + m_spline_x_builder(rho_spline_coef.span_view(), rho_host.span_cview()); ddc::Chunk phi_spline_coef(m_spline_x_builder.spline_domain()); solve_matrix_system(phi_spline_coef, rho_spline_coef); // ddc::for_each(dom_x, [&](IndexX const ix) { - electrostatic_potential(ix) + electrostatic_potential_host(ix) = m_spline_x_evaluator(ddc::coordinate(ix), phi_spline_coef.span_cview()); - electric_field(ix) + electric_field_host(ix) = -m_spline_x_evaluator.deriv(ddc::coordinate(ix), phi_spline_coef.span_cview()); }); - ddc::deepcopy(electrostatic_potential_device, electrostatic_potential); - ddc::deepcopy(electric_field_device, electric_field); + ddc::deepcopy(electrostatic_potential, electrostatic_potential_host); + ddc::deepcopy(electric_field, electric_field_host); Kokkos::Profiling::popRegion(); } diff --git a/src/geometryXVx/poisson/femperiodicpoissonsolver.hpp b/src/geometryXVx/poisson/femperiodicpoissonsolver.hpp index ecf7e0243..ab6a9c402 100644 --- a/src/geometryXVx/poisson/femperiodicpoissonsolver.hpp +++ b/src/geometryXVx/poisson/femperiodicpoissonsolver.hpp @@ -81,14 +81,12 @@ class FemPeriodicPoissonSolver : public IPoissonSolver /** * The operator which solves the equation using the method described by the class. * - * @param[out] electrostatic_potential_device The electrostatic potential, the result of the poisson solver. - * @param[out] electric_field_device The electric field, the derivative of the electrostatic potential. - * @param[in] allfdistribu_device The distribution function. + * @param[out] electrostatic_potential The electrostatic potential, the result of the poisson solver. + * @param[out] electric_field The electric field, the derivative of the electrostatic potential. + * @param[in] allfdistribu The distribution function. */ - void operator()( - device_t electrostatic_potential_device, - device_t electric_field_device, - device_t allfdistribu_device) const override; + void operator()(DSpanX electrostatic_potential, DSpanX electric_field, DViewSpXVx allfdistribu) + const override; private: void build_matrix(); diff --git a/src/geometryXVx/poisson/fftpoissonsolver.cpp b/src/geometryXVx/poisson/fftpoissonsolver.cpp index 5afd3266c..d659bb711 100644 --- a/src/geometryXVx/poisson/fftpoissonsolver.cpp +++ b/src/geometryXVx/poisson/fftpoissonsolver.cpp @@ -20,15 +20,15 @@ FftPoissonSolver::FftPoissonSolver(IChargeDensityCalculator const& compute_rho) // 1- Inner solvers shall be passed in the constructor // 2- Should it take an array of distribution functions ? void FftPoissonSolver::operator()( - device_t const electrostatic_potential, - device_t const electric_field, - device_t const allfdistribu) const + DSpanX const electrostatic_potential, + DSpanX const electric_field, + DViewSpXVx const allfdistribu) const { Kokkos::Profiling::pushRegion("PoissonSolver"); assert(electrostatic_potential.domain() == ddc::get_domain(allfdistribu)); IDomainX const x_dom = electrostatic_potential.domain(); // Compute the RHS of the Poisson equation. - device_t rho(x_dom); + DFieldX rho(x_dom); m_compute_rho(rho, allfdistribu); diff --git a/src/geometryXVx/poisson/fftpoissonsolver.hpp b/src/geometryXVx/poisson/fftpoissonsolver.hpp index c92a34953..ca805687d 100644 --- a/src/geometryXVx/poisson/fftpoissonsolver.hpp +++ b/src/geometryXVx/poisson/fftpoissonsolver.hpp @@ -39,8 +39,6 @@ class FftPoissonSolver : public IPoissonSolver * @param[out] electric_field The electric field, the derivative of the electrostatic potential. * @param[in] allfdistribu The distribution function. */ - void operator()( - device_t electrostatic_potential, - device_t electric_field, - device_t allfdistribu) const override; + void operator()(DSpanX electrostatic_potential, DSpanX electric_field, DViewSpXVx allfdistribu) + const override; }; diff --git a/src/geometryXVx/poisson/ichargedensitycalculator.hpp b/src/geometryXVx/poisson/ichargedensitycalculator.hpp index 4a4e26061..fcf99b76f 100644 --- a/src/geometryXVx/poisson/ichargedensitycalculator.hpp +++ b/src/geometryXVx/poisson/ichargedensitycalculator.hpp @@ -23,6 +23,5 @@ class IChargeDensityCalculator * * @return rho The charge density. */ - virtual device_t operator()(device_t rho, device_t allfdistribu) - const = 0; + virtual DSpanX operator()(DSpanX rho, DViewSpXVx allfdistribu) const = 0; }; diff --git a/src/geometryXVx/poisson/ipoissonsolver.hpp b/src/geometryXVx/poisson/ipoissonsolver.hpp index ad0e65c88..63ce64a66 100644 --- a/src/geometryXVx/poisson/ipoissonsolver.hpp +++ b/src/geometryXVx/poisson/ipoissonsolver.hpp @@ -20,12 +20,12 @@ class IPoissonSolver /** * The operator which solves the equation using the method described by the class. * - * @param[out] electrostatic_potential_device The electrostatic potential, the result of the poisson solver. - * @param[out] electric_field_device The electric field, the derivative of the electrostatic potential. - * @param[in] allfdistribu_device The distribution function. + * @param[out] electrostatic_potential The electrostatic potential, the result of the poisson solver. + * @param[out] electric_field The electric field, the derivative of the electrostatic potential. + * @param[in] allfdistribu The distribution function. */ virtual void operator()( - device_t electrostatic_potential_device, - device_t electric_field_device, - device_t allfdistribu_device) const = 0; + DSpanX electrostatic_potential, + DSpanX electric_field, + DViewSpXVx allfdistribu) const = 0; }; diff --git a/src/geometryXVx/poisson/nullpoissonsolver.cpp b/src/geometryXVx/poisson/nullpoissonsolver.cpp index 0040a8a83..b38e741be 100644 --- a/src/geometryXVx/poisson/nullpoissonsolver.cpp +++ b/src/geometryXVx/poisson/nullpoissonsolver.cpp @@ -3,8 +3,8 @@ #include "nullpoissonsolver.hpp" void NullPoissonSolver::operator()( - device_t const electrostatic_potential_device, - device_t const electric_field_device, - device_t const allfdistribu_device) const + DSpanX const electrostatic_potential, + DSpanX const electric_field, + DViewSpXVx const allfdistribu) const { } diff --git a/src/geometryXVx/poisson/nullpoissonsolver.hpp b/src/geometryXVx/poisson/nullpoissonsolver.hpp index ecf2b60e5..137db185f 100644 --- a/src/geometryXVx/poisson/nullpoissonsolver.hpp +++ b/src/geometryXVx/poisson/nullpoissonsolver.hpp @@ -21,12 +21,12 @@ class NullPoissonSolver : public IPoissonSolver /** * The operator which does not solves the equation. * - * @param[out] electrostatic_potential_device The electrostatic potential, the result of the poisson solver. - * @param[out] electric_field_device The electric field, the derivative of the electrostatic potential. - * @param[in] allfdistribu_device The distribution function. + * @param[out] electrostatic_potential The electrostatic potential, the result of the poisson solver. + * @param[out] electric_field The electric field, the derivative of the electrostatic potential. + * @param[in] allfdistribu The distribution function. */ void operator()( - device_t const electrostatic_potential_device, - device_t const electric_field_device, - device_t const allfdistribu_device) const override; + DSpanX const electrostatic_potential, + DSpanX const electric_field, + DViewSpXVx const allfdistribu) const override; }; diff --git a/src/geometryXVx/rhs/collisions_inter.cpp b/src/geometryXVx/rhs/collisions_inter.cpp index 881823e38..31c873cd7 100644 --- a/src/geometryXVx/rhs/collisions_inter.cpp +++ b/src/geometryXVx/rhs/collisions_inter.cpp @@ -25,24 +25,22 @@ CollisionsInter::CollisionsInter(IDomainSpXVx const& mesh, double nustar0) ddc::expose_to_pdi("collinter_nustar0", m_nustar0); } -void CollisionsInter::get_derivative( - device_t const df, - device_t const allfdistribu) const +void CollisionsInter::get_derivative(DSpanSpXVx const df, DViewSpXVx const allfdistribu) const { IDomainSpX grid_sp_x = allfdistribu.domain(); - device_t density_f(grid_sp_x); - device_t fluid_velocity_f(grid_sp_x); - device_t temperature_f(grid_sp_x); + DFieldSpX density_f(grid_sp_x); + DFieldSpX fluid_velocity_f(grid_sp_x); + DFieldSpX temperature_f(grid_sp_x); auto density = density_f.span_view(); auto fluid_velocity = fluid_velocity_f.span_view(); auto temperature = temperature_f.span_view(); - DFieldVx const quadrature_coeffs( + host_t const quadrature_coeffs_host( trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu))); auto quadrature_coeffs_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - auto quadrature_coeffs_device = quadrature_coeffs_alloc.span_view(); + quadrature_coeffs_host.span_view()); + auto quadrature_coeffs = quadrature_coeffs_alloc.span_view(); //Moments computation ddc::fill(density, 0.); @@ -56,7 +54,7 @@ void CollisionsInter::get_derivative( double momentum_flux(0); for (IndexVx ivx : allfdistribu.domain()) { CoordVx const coordv = ddc::coordinate(ivx); - double const val(quadrature_coeffs_device(ivx) * allfdistribu(isp, ix, ivx)); + double const val(quadrature_coeffs(ivx) * allfdistribu(isp, ix, ivx)); density(isp, ix) += val; particle_flux += val * coordv; momentum_flux += val * coordv * coordv; @@ -68,11 +66,11 @@ void CollisionsInter::get_derivative( //Collision frequencies, momentum and energy exchange terms - device_t nustar_profile(grid_sp_x); + DFieldSpX nustar_profile(grid_sp_x); ddc::deepcopy(nustar_profile, m_nustar_profile); - device_t collfreq_ab(grid_sp_x); - device_t momentum_exchange_ab_f(grid_sp_x); - device_t energy_exchange_ab_f(grid_sp_x); + DFieldSpX collfreq_ab(grid_sp_x); + DFieldSpX momentum_exchange_ab_f(grid_sp_x); + DFieldSpX energy_exchange_ab_f(grid_sp_x); auto momentum_exchange_ab = momentum_exchange_ab_f.span_view(); auto energy_exchange_ab = energy_exchange_ab_f.span_view(); compute_collfreq_ab(collfreq_ab.span_view(), nustar_profile, density, temperature); @@ -84,7 +82,7 @@ void CollisionsInter::get_derivative( fluid_velocity, temperature); - device_t fmaxwellian_f(allfdistribu.domain()); + DFieldSpXVx fmaxwellian_f(allfdistribu.domain()); auto fmaxwellian = fmaxwellian_f.span_view(); ddc::for_each( ddc::policies::parallel_device, @@ -121,18 +119,15 @@ void CollisionsInter::get_derivative( } -device_t CollisionsInter::operator()( - device_t allfdistribu_device, - double dt) const +DSpanSpXVx CollisionsInter::operator()(DSpanSpXVx allfdistribu, double dt) const { Kokkos::Profiling::pushRegion("CollisionsInter"); - RK2> timestepper(allfdistribu_device.domain()); + RK2 timestepper(allfdistribu.domain()); - timestepper - .update(allfdistribu_device, dt, [&](device_t dy, device_t y) { - get_derivative(dy, y); - }); + timestepper.update(allfdistribu, dt, [&](DSpanSpXVx dy, DViewSpXVx y) { + get_derivative(dy, y); + }); Kokkos::Profiling::popRegion(); - return allfdistribu_device; + return allfdistribu; } diff --git a/src/geometryXVx/rhs/collisions_inter.hpp b/src/geometryXVx/rhs/collisions_inter.hpp index c6dc6a04a..7a19d1d03 100644 --- a/src/geometryXVx/rhs/collisions_inter.hpp +++ b/src/geometryXVx/rhs/collisions_inter.hpp @@ -24,8 +24,8 @@ class CollisionsInter : public IRightHandSide { private: double m_nustar0; - device_t m_nustar_profile_alloc; - device_t m_nustar_profile; + DFieldSpX m_nustar_profile_alloc; + DSpanSpX m_nustar_profile; public: /** @@ -51,7 +51,7 @@ class CollisionsInter : public IRightHandSide * * @return A span referencing the distribution function passed as argument. */ - device_t operator()(device_t allfdistribu, double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const override; /** * @brief Get the collision coefficient. @@ -70,5 +70,5 @@ class CollisionsInter : public IRightHandSide * @param[inout] df The time derivative. * @param[in] allfdistribu The distribution function. */ - void get_derivative(device_t df, device_t allfdistribu) const; + void get_derivative(DSpanSpXVx df, DViewSpXVx allfdistribu) const; }; diff --git a/src/geometryXVx/rhs/collisions_intra.cpp b/src/geometryXVx/rhs/collisions_intra.cpp index 09fb1df94..040cc3b05 100644 --- a/src/geometryXVx/rhs/collisions_intra.cpp +++ b/src/geometryXVx/rhs/collisions_intra.cpp @@ -102,9 +102,9 @@ CollisionsIntra::get_mesh_ghosted() const } void CollisionsIntra::compute_matrix_coeff( - device_t AA, - device_t BB, - device_t CC, + DSpanSpXVx AA, + DSpanSpXVx BB, + DSpanSpXVx CC, device_t> Dcoll, device_t> Dcoll_staggered, device_t> Nucoll, @@ -162,9 +162,9 @@ void CollisionsIntra::compute_matrix_coeff( void CollisionsIntra::fill_matrix_with_coeff( Matrix_Banded& matrix, - DViewVx AA, - DViewVx BB, - DViewVx CC) const + host_t AA, + host_t BB, + host_t CC) const { matrix.set_element(0, 0, BB(IndexVx(0))); matrix.set_element(0, 1, CC(IndexVx(0))); @@ -183,11 +183,11 @@ void CollisionsIntra::fill_matrix_with_coeff( } void CollisionsIntra::compute_rhs_vector( - device_t RR, - device_t AA, - device_t BB, - device_t CC, - device_t allfdistribu, + DSpanSpXVx RR, + DViewSpXVx AA, + DViewSpXVx BB, + DViewSpXVx CC, + DViewSpXVx allfdistribu, double fthresh) const { ddc::for_each( @@ -221,7 +221,7 @@ void CollisionsIntra::compute_rhs_vector( -device_t CollisionsIntra::operator()(device_t allfdistribu, double dt) const +DSpanSpXVx CollisionsIntra::operator()(DSpanSpXVx allfdistribu, double dt) const { Kokkos::Profiling::pushRegion("CollisionsIntra"); auto allfdistribu_alloc = ddc::create_mirror_view_and_copy(allfdistribu); @@ -229,14 +229,14 @@ device_t CollisionsIntra::operator()(device_t allfdistri IDomainSpX grid_sp_x(allfdistribu.domain()); // density and temperature - device_t density_alloc(grid_sp_x); - device_t fluid_velocity_alloc(grid_sp_x); - device_t temperature_alloc(grid_sp_x); + DFieldSpX density_alloc(grid_sp_x); + DFieldSpX fluid_velocity_alloc(grid_sp_x); + DFieldSpX temperature_alloc(grid_sp_x); auto density = density_alloc.span_view(); auto fluid_velocity = fluid_velocity_alloc.span_view(); auto temperature = temperature_alloc.span_view(); - DFieldVx const quadrature_coeffs_host( + host_t const quadrature_coeffs_host( trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu))); auto quadrature_coeffs_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), @@ -264,9 +264,9 @@ device_t CollisionsIntra::operator()(device_t allfdistri }); // collision frequency - device_t collfreq_alloc(grid_sp_x); + DFieldSpX collfreq_alloc(grid_sp_x); auto collfreq = collfreq_alloc.span_view(); - device_t nustar_profile(grid_sp_x); + DFieldSpX nustar_profile(grid_sp_x); ddc::deepcopy(nustar_profile, m_nustar_profile); compute_collfreq(collfreq, nustar_profile, density, temperature); @@ -286,8 +286,8 @@ device_t CollisionsIntra::operator()(device_t allfdistri ghosted_vx_staggered_point_sampling>(Dcoll_staggered, collfreq, density, temperature); // kernel maxwellian fluid moments - device_t Vcoll_alloc(grid_sp_x); - device_t Tcoll_alloc(grid_sp_x); + DFieldSpX Vcoll_alloc(grid_sp_x); + DFieldSpX Tcoll_alloc(grid_sp_x); auto Vcoll = Vcoll_alloc.span_view(); auto Tcoll = Tcoll_alloc.span_view(); compute_Vcoll_Tcoll(Vcoll, Tcoll, allfdistribu, Dcoll, dvDcoll); @@ -298,9 +298,9 @@ device_t CollisionsIntra::operator()(device_t allfdistri compute_Nucoll(Nucoll, Dcoll, Vcoll, Tcoll); // matrix coefficients - device_t AA_alloc(allfdistribu.domain()); - device_t BB_alloc(allfdistribu.domain()); - device_t CC_alloc(allfdistribu.domain()); + DFieldSpXVx AA_alloc(allfdistribu.domain()); + DFieldSpXVx BB_alloc(allfdistribu.domain()); + DFieldSpXVx CC_alloc(allfdistribu.domain()); auto AA = AA_alloc.span_view(); auto BB = BB_alloc.span_view(); auto CC = CC_alloc.span_view(); @@ -308,14 +308,14 @@ device_t CollisionsIntra::operator()(device_t allfdistri // rhs vector coefficient - device_t RR_alloc(allfdistribu.domain()); + DFieldSpXVx RR_alloc(allfdistribu.domain()); auto RR = RR_alloc.span_view(); compute_rhs_vector(RR, AA, BB, CC, allfdistribu, m_fthresh); - DFieldSpXVx AA_host(allfdistribu.domain()); - DFieldSpXVx BB_host(allfdistribu.domain()); - DFieldSpXVx CC_host(allfdistribu.domain()); - DFieldSpXVx RR_host(allfdistribu.domain()); + host_t AA_host(allfdistribu.domain()); + host_t BB_host(allfdistribu.domain()); + host_t CC_host(allfdistribu.domain()); + host_t RR_host(allfdistribu.domain()); ddc::deepcopy(AA_host, AA); ddc::deepcopy(BB_host, BB); ddc::deepcopy(CC_host, CC); diff --git a/src/geometryXVx/rhs/collisions_intra.hpp b/src/geometryXVx/rhs/collisions_intra.hpp index c7b9fa622..e48a41a56 100644 --- a/src/geometryXVx/rhs/collisions_intra.hpp +++ b/src/geometryXVx/rhs/collisions_intra.hpp @@ -142,8 +142,8 @@ class CollisionsIntra : public IRightHandSide private: double m_nustar0; double m_fthresh; - device_t m_nustar_profile_alloc; - device_t m_nustar_profile; + DFieldSpX m_nustar_profile_alloc; + DSpanSpX m_nustar_profile; ddc::DiscreteDomain m_gridvx_ghosted; ddc::DiscreteDomain m_gridvx_ghosted_staggered; @@ -175,7 +175,7 @@ class CollisionsIntra : public IRightHandSide * * @return A span referencing the distribution function passed as argument. */ - device_t operator()(device_t allfdistribu, double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const override; /** * @brief Get the collision coefficient. @@ -216,11 +216,11 @@ class CollisionsIntra : public IRightHandSide * @param[in] fthresh A constant value used for imposing Dirichlet boundary condition to solve the linear system. */ void compute_rhs_vector( - device_t RR, - device_t AA, - device_t BB, - device_t CC, - device_t allfdistribu, + DSpanSpXVx RR, + DViewSpXVx AA, + DViewSpXVx BB, + DViewSpXVx CC, + DViewSpXVx allfdistribu, double fthresh) const; /** * @brief Compute the coefficients of the tridiagonal matrix of the collision operator linear system. @@ -233,9 +233,9 @@ class CollisionsIntra : public IRightHandSide * @param[in] deltat The time step. */ void compute_matrix_coeff( - device_t AA, - device_t BB, - device_t CC, + DSpanSpXVx AA, + DSpanSpXVx BB, + DSpanSpXVx CC, device_t> Dcoll, device_t> Dcoll_staggered, device_t> Nucoll, @@ -248,5 +248,9 @@ class CollisionsIntra : public IRightHandSide * @param[in] BB A vector containing the diagonal coefficients of the matrix. * @param[in] CC A vector containing the upper diagonal coefficients of the matrix. */ - void fill_matrix_with_coeff(Matrix_Banded& matrix, DViewVx AA, DViewVx BB, DViewVx CC) const; + void fill_matrix_with_coeff( + Matrix_Banded& matrix, + host_t AA, + host_t BB, + host_t CC) const; }; diff --git a/src/geometryXVx/rhs/collisions_utils.cpp b/src/geometryXVx/rhs/collisions_utils.cpp index 3ac86a760..76302a961 100644 --- a/src/geometryXVx/rhs/collisions_utils.cpp +++ b/src/geometryXVx/rhs/collisions_utils.cpp @@ -36,7 +36,7 @@ IndexSp find_ion(IDomainSp const dom_sp) * but could be space dependent (for instance to have no collisions in some specific * parts of the simulation box). */ -void compute_nustar_profile(device_t nustar_profile, double nustar0) +void compute_nustar_profile(DSpanSpX nustar_profile, double nustar0) { double const Lx = ddcHelper::total_interval_length(ddc::get_domain(nustar_profile)); @@ -54,10 +54,10 @@ void compute_nustar_profile(device_t nustar_profile, double nustar0) * Computes the space and species dependent collision frequency collfreq. */ void compute_collfreq( - device_t collfreq, - device_t nustar_profile, - device_t density, - device_t temperature) + DSpanSpX collfreq, + DViewSpX nustar_profile, + DViewSpX density, + DViewSpX temperature) { ddc::for_each( ddc::policies::parallel_device, @@ -72,10 +72,10 @@ void compute_collfreq( * Computes the two species collision frequency collfreq_ei */ void compute_collfreq_ab( - device_t collfreq_ab, - device_t nustar_profile, - device_t density, - device_t temperature) + DSpanSpX collfreq_ab, + DViewSpX nustar_profile, + DViewSpX density, + DViewSpX temperature) { IndexSp const iion = find_ion(density.domain()); double const charge_ratio(charge(iion) / charge(ielec())); @@ -116,12 +116,12 @@ void compute_collfreq_ab( * Computes the momentum and energy exchange terms between ions and electrons */ void compute_momentum_energy_exchange( - device_t momentum_exchange_ab, - device_t energy_exchange_ab, - device_t collfreq_ab, - device_t density, - device_t mean_velocity, - device_t temperature) + DSpanSpX momentum_exchange_ab, + DSpanSpX energy_exchange_ab, + DViewSpX collfreq_ab, + DViewSpX density, + DViewSpX mean_velocity, + DViewSpX temperature) { IndexSp const iion = find_ion(density.domain()); double const mass_ratio(mass(ielec()) / mass(iion)); diff --git a/src/geometryXVx/rhs/collisions_utils.hpp b/src/geometryXVx/rhs/collisions_utils.hpp index ac00a0c4c..d382466db 100644 --- a/src/geometryXVx/rhs/collisions_utils.hpp +++ b/src/geometryXVx/rhs/collisions_utils.hpp @@ -11,7 +11,7 @@ * @param[inout] nustar_profile The collisionality profile. * @param[in] nustar0 normalized collisionality coefficient. */ -void compute_nustar_profile(device_t nustar_profile, double nustar0); +void compute_nustar_profile(DSpanSpX nustar_profile, double nustar0); /** * @brief Compute the collision frequency for each species. @@ -21,10 +21,10 @@ void compute_nustar_profile(device_t nustar_profile, double nustar0); * @param[in] temperature The temperature of each species. */ void compute_collfreq( - device_t collfreq, - device_t nustar_profile, - device_t density, - device_t temperature); + DSpanSpX collfreq, + DViewSpX nustar_profile, + DViewSpX density, + DViewSpX temperature); /** * @brief Compute the intra species collision operator diffusion coefficient. @@ -40,9 +40,9 @@ void compute_Dcoll( ddc::DiscreteDomain, std::experimental::layout_right, Kokkos::DefaultExecutionSpace::memory_space> Dcoll, - device_t collfreq, - device_t density, - device_t temperature) + DViewSpX collfreq, + DViewSpX density, + DViewSpX temperature) { ddc::for_each( ddc::policies::parallel_device, @@ -88,9 +88,9 @@ void compute_dvDcoll( ddc::DiscreteDomain, std::experimental::layout_right, Kokkos::DefaultExecutionSpace::memory_space> dvDcoll, - device_t collfreq, - device_t density, - device_t temperature) + DViewSpX collfreq, + DViewSpX density, + DViewSpX temperature) { ddc::for_each( ddc::policies::parallel_device, @@ -152,9 +152,9 @@ void compute_dvDcoll( */ template void compute_Vcoll_Tcoll( - device_t Vcoll, - device_t Tcoll, - device_t allfdistribu, + DSpanSpX Vcoll, + DSpanSpX Tcoll, + DViewSpXVx allfdistribu, ddc::ChunkSpan< double, ddc::DiscreteDomain, @@ -166,7 +166,7 @@ void compute_Vcoll_Tcoll( std::experimental::layout_right, Kokkos::DefaultExecutionSpace::memory_space> dvDcoll) { - DFieldVx const quadrature_coeffs_host( + host_t const quadrature_coeffs_host( trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu))); auto quadrature_coeffs_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), @@ -174,11 +174,11 @@ void compute_Vcoll_Tcoll( auto quadrature_coeffs = quadrature_coeffs_alloc.span_view(); // computation of the integrands - device_t I0mean_integrand_alloc(allfdistribu.domain()); - device_t I1mean_integrand_alloc(allfdistribu.domain()); - device_t I2mean_integrand_alloc(allfdistribu.domain()); - device_t I3mean_integrand_alloc(allfdistribu.domain()); - device_t I4mean_integrand_alloc(allfdistribu.domain()); + DFieldSpXVx I0mean_integrand_alloc(allfdistribu.domain()); + DFieldSpXVx I1mean_integrand_alloc(allfdistribu.domain()); + DFieldSpXVx I2mean_integrand_alloc(allfdistribu.domain()); + DFieldSpXVx I3mean_integrand_alloc(allfdistribu.domain()); + DFieldSpXVx I4mean_integrand_alloc(allfdistribu.domain()); auto I0mean_integrand = I0mean_integrand_alloc.span_view(); auto I1mean_integrand = I1mean_integrand_alloc.span_view(); auto I2mean_integrand = I2mean_integrand_alloc.span_view(); @@ -204,11 +204,11 @@ void compute_Vcoll_Tcoll( // computation of the integrals over the Vx direction IDomainSpX grid_sp_x(allfdistribu.domain()); - device_t I0mean_alloc(grid_sp_x); - device_t I1mean_alloc(grid_sp_x); - device_t I2mean_alloc(grid_sp_x); - device_t I3mean_alloc(grid_sp_x); - device_t I4mean_alloc(grid_sp_x); + DFieldSpX I0mean_alloc(grid_sp_x); + DFieldSpX I1mean_alloc(grid_sp_x); + DFieldSpX I2mean_alloc(grid_sp_x); + DFieldSpX I3mean_alloc(grid_sp_x); + DFieldSpX I4mean_alloc(grid_sp_x); auto I0mean = I0mean_alloc.span_view(); auto I1mean = I1mean_alloc.span_view(); auto I2mean = I2mean_alloc.span_view(); @@ -260,8 +260,8 @@ void compute_Nucoll( ddc::DiscreteDomain, std::experimental::layout_right, Kokkos::DefaultExecutionSpace::memory_space> Dcoll, - device_t Vcoll, - device_t Tcoll) + DViewSpX Vcoll, + DViewSpX Tcoll) { ddc::for_each( ddc::policies::parallel_device, @@ -282,10 +282,10 @@ void compute_Nucoll( * @param[in] temperature The temperature of each species. */ void compute_collfreq_ab( - device_t collfreq_ab, - device_t nustar_profile, - device_t density, - device_t temperature); + DSpanSpX collfreq_ab, + DViewSpX nustar_profile, + DViewSpX density, + DViewSpX temperature); /** * @brief Compute the momentum and energy exchange terms between species a and b. @@ -297,9 +297,9 @@ void compute_collfreq_ab( * @param[in] temperature The temperature of each species. */ void compute_momentum_energy_exchange( - device_t momentum_exchange_ab, - device_t energy_exchange_ab, - device_t collfreq_ab, - device_t density, - device_t mean_velocity, - device_t temperature); + DSpanSpX momentum_exchange_ab, + DSpanSpX energy_exchange_ab, + DViewSpX collfreq_ab, + DViewSpX density, + DViewSpX mean_velocity, + DViewSpX temperature); diff --git a/src/geometryXVx/rhs/irighthandside.hpp b/src/geometryXVx/rhs/irighthandside.hpp index 95296741e..1bc3833c1 100644 --- a/src/geometryXVx/rhs/irighthandside.hpp +++ b/src/geometryXVx/rhs/irighthandside.hpp @@ -28,5 +28,5 @@ class IRightHandSide * @param[in] dt The timestep. * @return The distribution function after solving the source evolution equation. */ - virtual device_t operator()(device_t allfdistribu, double dt) const = 0; + virtual DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const = 0; }; diff --git a/src/geometryXVx/rhs/kinetic_source.cpp b/src/geometryXVx/rhs/kinetic_source.cpp index b1db67b80..9bd009a2f 100644 --- a/src/geometryXVx/rhs/kinetic_source.cpp +++ b/src/geometryXVx/rhs/kinetic_source.cpp @@ -42,20 +42,18 @@ KineticSource::KineticSource( ddc::expose_to_pdi("kinetic_source_spatial_extent", m_spatial_extent); } -device_t KineticSource::operator()( - device_t const allfdistribu, - double const dt) const +DSpanSpXVx KineticSource::operator()(DSpanSpXVx const allfdistribu, double const dt) const { Kokkos::Profiling::pushRegion("KineticSource"); - auto velocity_shape_device_alloc = ddc::create_mirror_view_and_copy( + auto velocity_shape_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), m_velocity_shape.span_view()); - auto velocity_shape_device = velocity_shape_device_alloc.span_view(); + auto velocity_shape = velocity_shape_alloc.span_view(); - auto spatial_extent_device_alloc = ddc::create_mirror_view_and_copy( + auto spatial_extent_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), m_spatial_extent.span_view()); - auto spatial_extent_device = spatial_extent_device_alloc.span_view(); + auto spatial_extent = spatial_extent_alloc.span_view(); auto const& amplitude = m_amplitude; @@ -64,8 +62,8 @@ device_t KineticSource::operator()( allfdistribu.domain(), KOKKOS_LAMBDA(IndexSpXVx const ispxvx) { double const df( - amplitude * spatial_extent_device(ddc::select(ispxvx)) - * velocity_shape_device(ddc::select(ispxvx)) * dt); + amplitude * spatial_extent(ddc::select(ispxvx)) + * velocity_shape(ddc::select(ispxvx)) * dt); allfdistribu(ispxvx) += df; }); diff --git a/src/geometryXVx/rhs/kinetic_source.hpp b/src/geometryXVx/rhs/kinetic_source.hpp index 0d1d7c410..79355f67d 100644 --- a/src/geometryXVx/rhs/kinetic_source.hpp +++ b/src/geometryXVx/rhs/kinetic_source.hpp @@ -35,8 +35,8 @@ class KineticSource : public IRightHandSide double m_density; double m_energy; double m_temperature; - DFieldX m_spatial_extent; - DFieldVx m_velocity_shape; + host_t m_spatial_extent; + host_t m_velocity_shape; public: /** @@ -73,5 +73,5 @@ class KineticSource : public IRightHandSide * * @return A span referencing the distribution function passed as argument. */ - device_t operator()(device_t allfdistribu, double dt) const override; -}; \ No newline at end of file + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const override; +}; diff --git a/src/geometryXVx/rhs/krook_source_adaptive.cpp b/src/geometryXVx/rhs/krook_source_adaptive.cpp index 00a34e94c..175c2871f 100644 --- a/src/geometryXVx/rhs/krook_source_adaptive.cpp +++ b/src/geometryXVx/rhs/krook_source_adaptive.cpp @@ -33,7 +33,7 @@ KrookSourceAdaptive::KrookSourceAdaptive( , m_ftarget(gridvx) { // mask that defines the region where the operator is active - DFieldX mask_host(gridx); + host_t mask_host(gridx); switch (m_type) { case RhsType::Source: // the mask equals one in the interval [x_left, x_right] @@ -72,9 +72,7 @@ KrookSourceAdaptive::KrookSourceAdaptive( } } -void KrookSourceAdaptive::get_amplitudes( - device_t amplitudes, - device_t const allfdistribu) const +void KrookSourceAdaptive::get_amplitudes(DSpanSpX amplitudes, DViewSpXVx const allfdistribu) const { IDomainSp const dom_sp(ddc::get_domain(allfdistribu)); assert(dom_sp.size() == 2); @@ -87,7 +85,7 @@ void KrookSourceAdaptive::get_amplitudes( } IndexSp iion(iion_opt.value()); IDomainVx const gridvx = allfdistribu.domain(); - DFieldVx const quadrature_coeffs_host(trapezoid_quadrature_coefficients(gridvx)); + host_t const quadrature_coeffs_host(trapezoid_quadrature_coefficients(gridvx)); auto quadrature_coeffs_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), quadrature_coeffs_host.span_view()); @@ -113,13 +111,13 @@ void KrookSourceAdaptive::get_amplitudes( } void KrookSourceAdaptive::get_derivative( - device_t df, - device_t allfdistribu, - device_t allfdistribu_start) const + DSpanSpXVx df, + DViewSpXVx allfdistribu, + DViewSpXVx allfdistribu_start) const { IDomainSpX grid_sp_x(allfdistribu.domain()); - device_t amplitudes_alloc(grid_sp_x); + DFieldSpX amplitudes_alloc(grid_sp_x); auto amplitudes = amplitudes_alloc.span_view(); get_amplitudes(amplitudes, allfdistribu); @@ -138,14 +136,12 @@ void KrookSourceAdaptive::get_derivative( }); } -device_t KrookSourceAdaptive::operator()( - device_t const allfdistribu, - double const dt) const +DSpanSpXVx KrookSourceAdaptive::operator()(DSpanSpXVx const allfdistribu, double const dt) const { Kokkos::Profiling::pushRegion("KrookSource"); - RK2> timestepper(allfdistribu.domain()); + RK2 timestepper(allfdistribu.domain()); - timestepper.update(allfdistribu, dt, [&](device_t df, device_t f) { + timestepper.update(allfdistribu, dt, [&](DSpanSpXVx df, DViewSpXVx f) { get_derivative(df, f, allfdistribu); }); Kokkos::Profiling::popRegion(); diff --git a/src/geometryXVx/rhs/krook_source_adaptive.hpp b/src/geometryXVx/rhs/krook_source_adaptive.hpp index 07707e1ba..d1daf42e4 100644 --- a/src/geometryXVx/rhs/krook_source_adaptive.hpp +++ b/src/geometryXVx/rhs/krook_source_adaptive.hpp @@ -30,8 +30,8 @@ class KrookSourceAdaptive : public IRightHandSide double m_amplitude; double m_density; double m_temperature; - device_t m_mask; - device_t m_ftarget; + DFieldX m_mask; + DFieldVx m_ftarget; public: /** @@ -75,7 +75,7 @@ class KrookSourceAdaptive : public IRightHandSide * * @return A span referencing the distribution function passed as argument. */ - device_t operator()(device_t allfdistribu, double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const override; public: /** @@ -88,7 +88,7 @@ class KrookSourceAdaptive : public IRightHandSide * coefficients for each species. * @param[in] allfdistribu The distribution function. */ - void get_amplitudes(device_t amplitudes, device_t allfdistribu) const; + void get_amplitudes(DSpanSpX amplitudes, DViewSpXVx allfdistribu) const; /** * @brief Computes the expression of the time derivative of the distribution function. @@ -100,6 +100,5 @@ class KrookSourceAdaptive : public IRightHandSide * @param[in] f The distribution function. * @param[in] f0 An optional parameter. */ - void get_derivative(device_t df, device_t f, device_t f0) - const; + void get_derivative(DSpanSpXVx df, DViewSpXVx f, DViewSpXVx f0) const; }; diff --git a/src/geometryXVx/rhs/krook_source_constant.cpp b/src/geometryXVx/rhs/krook_source_constant.cpp index 27ef4cb96..628bf24b4 100644 --- a/src/geometryXVx/rhs/krook_source_constant.cpp +++ b/src/geometryXVx/rhs/krook_source_constant.cpp @@ -27,7 +27,7 @@ KrookSourceConstant::KrookSourceConstant( , m_ftarget(gridvx) { // mask that defines the region where the operator is active - DFieldX mask_host(gridx); + host_t mask_host(gridx); switch (m_type) { case RhsType::Source: // the mask equals one in the interval [x_left, x_right] @@ -66,9 +66,7 @@ KrookSourceConstant::KrookSourceConstant( } } -device_t KrookSourceConstant::operator()( - device_t const allfdistribu, - double const dt) const +DSpanSpXVx KrookSourceConstant::operator()(DSpanSpXVx const allfdistribu, double const dt) const { Kokkos::Profiling::pushRegion("KrookSource"); diff --git a/src/geometryXVx/rhs/krook_source_constant.hpp b/src/geometryXVx/rhs/krook_source_constant.hpp index 4facf7e9d..342b208fb 100644 --- a/src/geometryXVx/rhs/krook_source_constant.hpp +++ b/src/geometryXVx/rhs/krook_source_constant.hpp @@ -28,8 +28,8 @@ class KrookSourceConstant : public IRightHandSide double m_amplitude; double m_density; double m_temperature; - device_t m_mask; - device_t m_ftarget; + DFieldX m_mask; + DFieldVx m_ftarget; public: /** @@ -73,5 +73,5 @@ class KrookSourceConstant : public IRightHandSide * * @return A span referencing the distribution function passed as argument. */ - device_t operator()(device_t allfdistribu, double dt) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double dt) const override; }; diff --git a/src/geometryXVx/rhs/mask_tanh.cpp b/src/geometryXVx/rhs/mask_tanh.cpp index 516ef49c0..3e3ae3ef7 100644 --- a/src/geometryXVx/rhs/mask_tanh.cpp +++ b/src/geometryXVx/rhs/mask_tanh.cpp @@ -9,14 +9,14 @@ #include "mask_tanh.hpp" -DFieldX mask_tanh( +host_t mask_tanh( IDomainX const& gridx, double const extent, double const stiffness, MaskType const type, bool const normalized) { - DFieldX mask(gridx); + host_t mask(gridx); IVectX const Nx(gridx.size()); CoordX const x_min(ddc::coordinate(gridx.front())); @@ -46,7 +46,7 @@ DFieldX mask_tanh( } if (normalized) { - DFieldX const quadrature_coeffs = trapezoid_quadrature_coefficients(gridx); + host_t const quadrature_coeffs = trapezoid_quadrature_coefficients(gridx); Quadrature const integrate_x(quadrature_coeffs); double const coeff_norm = integrate_x(mask); ddc::for_each(gridx, [&](IndexX const ix) { mask(ix) = mask(ix) / coeff_norm; }); diff --git a/src/geometryXVx/rhs/mask_tanh.hpp b/src/geometryXVx/rhs/mask_tanh.hpp index a4a3ae0af..7021e5446 100644 --- a/src/geometryXVx/rhs/mask_tanh.hpp +++ b/src/geometryXVx/rhs/mask_tanh.hpp @@ -30,7 +30,7 @@ enum class MaskType { Normal, Inverted }; * @param[in] normalized A boolean that equals true if the integral of the mask must be equal to one. * @returns A Dfield containing the mask. */ -DFieldX mask_tanh( +host_t mask_tanh( IDomainX const& gridx, double extent, double stiffness, diff --git a/src/geometryXVx/time_integration/itimesolver.hpp b/src/geometryXVx/time_integration/itimesolver.hpp index 2ddee166a..f9d9fd2c3 100644 --- a/src/geometryXVx/time_integration/itimesolver.hpp +++ b/src/geometryXVx/time_integration/itimesolver.hpp @@ -22,8 +22,8 @@ class ITimeSolver * @param[in] steps The number of iterations to be performed by the solver. * @return The distribution function after solving the system. */ - virtual device_t operator()( - device_t allfdistribu, + virtual DSpanSpXVx operator()( + DSpanSpXVx allfdistribu, double time_start, double dt, int steps = 1) const = 0; diff --git a/src/geometryXVx/time_integration/predcorr.cpp b/src/geometryXVx/time_integration/predcorr.cpp index 5596f5c88..113ede5d7 100644 --- a/src/geometryXVx/time_integration/predcorr.cpp +++ b/src/geometryXVx/time_integration/predcorr.cpp @@ -16,26 +16,26 @@ PredCorr::PredCorr(IBoltzmannSolver const& boltzmann_solver, IPoissonSolver cons { } -device_t PredCorr::operator()( - device_t const allfdistribu_device, +DSpanSpXVx PredCorr::operator()( + DSpanSpXVx const allfdistribu, double const time_start, double const dt, int const steps) const { - auto allfdistribu_alloc = ddc::create_mirror_view_and_copy(allfdistribu_device); - ddc::ChunkSpan allfdistribu = allfdistribu_alloc.span_view(); + auto allfdistribu_alloc = ddc::create_mirror_view_and_copy(allfdistribu); + ddc::ChunkSpan allfdistribu_host = allfdistribu_alloc.span_view(); // electrostatic potential and electric field (depending only on x) + host_t electrostatic_potential_host(allfdistribu.domain()); DFieldX electrostatic_potential(allfdistribu.domain()); - device_t electrostatic_potential_device(allfdistribu.domain()); - device_t electric_field_device(allfdistribu.domain()); + DFieldX electric_field(allfdistribu.domain()); // a 2D chunk of the same size as fdistribu + host_t allfdistribu_half_t_host(allfdistribu.domain()); DFieldSpXVx allfdistribu_half_t(allfdistribu.domain()); - device_t allfdistribu_half_t_device(allfdistribu_device.domain()); - m_poisson_solver(electrostatic_potential_device, electric_field_device, allfdistribu_device); + m_poisson_solver(electrostatic_potential, electric_field, allfdistribu); int iter = 0; for (; iter < steps; ++iter) { @@ -43,45 +43,39 @@ device_t PredCorr::operator()( // computation of the electrostatic potential at time tn and // the associated electric field - m_poisson_solver( - electrostatic_potential_device, - electric_field_device, - allfdistribu_device); + m_poisson_solver(electrostatic_potential, electric_field, allfdistribu); // copies necessary to PDI - ddc::deepcopy(allfdistribu, allfdistribu_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu_host, allfdistribu); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); ddc::PdiEvent("iteration") .with("iter", iter) .and_with("time_saved", iter_time) - .and_with("fdistribu", allfdistribu) - .and_with("electrostatic_potential", electrostatic_potential); + .and_with("fdistribu", allfdistribu_host) + .and_with("electrostatic_potential", electrostatic_potential_host); // copy fdistribu - ddc::deepcopy(allfdistribu_half_t_device, allfdistribu_device); + ddc::deepcopy(allfdistribu_half_t, allfdistribu); // predictor - m_boltzmann_solver(allfdistribu_half_t_device, electric_field_device, dt / 2); + m_boltzmann_solver(allfdistribu_half_t, electric_field, dt / 2); // computation of the electrostatic potential at time tn+1/2 // and the associated electric field - m_poisson_solver( - electrostatic_potential_device, - electric_field_device, - allfdistribu_half_t_device); + m_poisson_solver(electrostatic_potential, electric_field, allfdistribu_half_t); // correction on a dt - m_boltzmann_solver(allfdistribu_device, electric_field_device, dt); + m_boltzmann_solver(allfdistribu, electric_field, dt); } double const final_time = time_start + iter * dt; - m_poisson_solver(electrostatic_potential_device, electric_field_device, allfdistribu_device); + m_poisson_solver(electrostatic_potential, electric_field, allfdistribu); //copies necessary to PDI - ddc::deepcopy(allfdistribu, allfdistribu_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu_host, allfdistribu); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); ddc::PdiEvent("last_iteration") .with("iter", iter) .and_with("time_saved", final_time) - .and_with("fdistribu", allfdistribu) - .and_with("electrostatic_potential", electrostatic_potential); + .and_with("fdistribu", allfdistribu_host) + .and_with("electrostatic_potential", electrostatic_potential_host); - return allfdistribu_device; + return allfdistribu; } diff --git a/src/geometryXVx/time_integration/predcorr.hpp b/src/geometryXVx/time_integration/predcorr.hpp index 4ec4536a1..057ceda8b 100644 --- a/src/geometryXVx/time_integration/predcorr.hpp +++ b/src/geometryXVx/time_integration/predcorr.hpp @@ -46,9 +46,6 @@ class PredCorr : public ITimeSolver * @param[in] steps The number of iterations to be performed by the predictor-corrector. * @return The distribution function after solving the system. */ - device_t operator()( - device_t allfdistribu, - double time_start, - double dt, - int steps = 1) const override; + DSpanSpXVx operator()(DSpanSpXVx allfdistribu, double time_start, double dt, int steps = 1) + const override; }; diff --git a/src/geometryXVx/utils/fluid_moments.cpp b/src/geometryXVx/utils/fluid_moments.cpp index d968a0145..2febd6753 100644 --- a/src/geometryXVx/utils/fluid_moments.cpp +++ b/src/geometryXVx/utils/fluid_moments.cpp @@ -11,7 +11,10 @@ FluidMoments::FluidMoments(Quadrature integrate_v) : m_integrate_v(integ /* * Computes the density of fdistribu */ -void FluidMoments::operator()(double& density, DViewVx const fdistribu, FluidMoments::MomentDensity) +void FluidMoments::operator()( + double& density, + host_t const fdistribu, + FluidMoments::MomentDensity) { density = m_integrate_v(fdistribu); } @@ -20,8 +23,8 @@ void FluidMoments::operator()(double& density, DViewVx const fdistribu, FluidMom * Computes the density of allfdistribu */ void FluidMoments::operator()( - DSpanSpX const density, - DViewSpXVx const allfdistribu, + host_t const density, + host_t const allfdistribu, FluidMoments::MomentDensity) { ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { @@ -34,11 +37,11 @@ void FluidMoments::operator()( */ void FluidMoments::operator()( double& mean_velocity, - DViewVx const fdistribu, + host_t const fdistribu, double density, FluidMoments::MomentVelocity) { - DFieldVx integrand(fdistribu.domain()); + host_t integrand(fdistribu.domain()); ddc::for_each(fdistribu.domain(), [&](IndexVx const ivx) { CoordVx const coordv = ddc::coordinate(ivx); integrand(ivx) = coordv * fdistribu(ivx); @@ -50,12 +53,12 @@ void FluidMoments::operator()( * Computes the mean_velocity of allfdistribu, using its density */ void FluidMoments::operator()( - DSpanSpX const mean_velocity, - DViewSpXVx const allfdistribu, - DViewSpX const density, + host_t const mean_velocity, + host_t const allfdistribu, + host_t const density, FluidMoments::MomentVelocity) { - DFieldSpXVx integrand(allfdistribu.domain()); + host_t integrand(allfdistribu.domain()); ddc::for_each(allfdistribu.domain(), [&](IndexSpXVx const ispxvx) { CoordVx const coordv = ddc::coordinate(ddc::select(ispxvx)); integrand(ispxvx) = coordv * allfdistribu(ispxvx); @@ -71,12 +74,12 @@ void FluidMoments::operator()( */ void FluidMoments::operator()( double& temperature, - DViewVx const fdistribu, + host_t const fdistribu, double density, double mean_velocity, FluidMoments::MomentTemperature) { - DFieldVx integrand(fdistribu.domain()); + host_t integrand(fdistribu.domain()); ddc::for_each(fdistribu.domain(), [&](IndexVx const ivx) { double const coeff = ddc::coordinate(ddc::select(ivx)) - mean_velocity; integrand(ivx) = coeff * coeff * fdistribu(ivx); @@ -88,13 +91,13 @@ void FluidMoments::operator()( * Computes the temperature of allfdistribu, using its density and mean velocity */ void FluidMoments::operator()( - DSpanSpX const temperature, - DViewSpXVx const allfdistribu, - DViewSpX const density, - DViewSpX const mean_velocity, + host_t const temperature, + host_t const allfdistribu, + host_t const density, + host_t const mean_velocity, FluidMoments::MomentTemperature) { - DFieldSpXVx integrand(allfdistribu.domain()); + host_t integrand(allfdistribu.domain()); ddc::for_each(allfdistribu.domain(), [&](IndexSpXVx const ispxvx) { double const coeff = ddc::coordinate(ddc::select(ispxvx)) - mean_velocity(ddc::select(ispxvx)); diff --git a/src/geometryXVx/utils/fluid_moments.hpp b/src/geometryXVx/utils/fluid_moments.hpp index 50d846720..ee9c0d809 100644 --- a/src/geometryXVx/utils/fluid_moments.hpp +++ b/src/geometryXVx/utils/fluid_moments.hpp @@ -71,7 +71,7 @@ class FluidMoments * at the given point. * @param[in] moment_density A tag to ensure that the correct operator is called. */ - void operator()(double& density, DViewVx fdistribu, MomentDensity moment_density); + void operator()(double& density, host_t fdistribu, MomentDensity moment_density); /** * Calculate the density of the distribution function. @@ -80,7 +80,10 @@ class FluidMoments * @param[in] allfdistribu The distribution function. * @param[in] moment_density A tag to ensure that the correct operator is called. */ - void operator()(DSpanSpX density, DViewSpXVx allfdistribu, MomentDensity moment_density); + void operator()( + host_t density, + host_t allfdistribu, + MomentDensity moment_density); /** * Calculate the mean velocity at a specific point of the distribution function. @@ -93,7 +96,7 @@ class FluidMoments */ void operator()( double& mean_velocity, - DViewVx fdistribu, + host_t fdistribu, double density, MomentVelocity moment_velocity); @@ -106,9 +109,9 @@ class FluidMoments * @param[in] moment_velocity A tag to ensure that the correct operator is called. */ void operator()( - DSpanSpX mean_velocity, - DViewSpXVx allfdistribu, - DViewSpX density, + host_t mean_velocity, + host_t allfdistribu, + host_t density, MomentVelocity moment_velocity); /** @@ -123,7 +126,7 @@ class FluidMoments */ void operator()( double& temperature, - DViewVx fdistribu, + host_t fdistribu, double density, double mean_velocity, MomentTemperature moment_temperature); @@ -138,9 +141,9 @@ class FluidMoments * @param[in] moment_temperature A tag to ensure that the correct operator is called. */ void operator()( - DSpanSpX temperature, - DViewSpXVx allfdistribu, - DViewSpX density, - DViewSpX mean_velocity, + host_t temperature, + host_t allfdistribu, + host_t density, + host_t mean_velocity, MomentTemperature moment_temperature); }; diff --git a/tests/geometryXVx/collisions_inter.cpp b/tests/geometryXVx/collisions_inter.cpp index 5ae2edce5..06ef3fa48 100644 --- a/tests/geometryXVx/collisions_inter.cpp +++ b/tests/geometryXVx/collisions_inter.cpp @@ -55,17 +55,17 @@ TEST(CollisionsInter, CollisionsInter) IDomainVx const gridvx = builder_vx.interpolation_domain(); IDomainSpXVx const mesh(dom_sp, gridx, gridvx); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); double const mass_ion(400.), mass_elec(1.); masses(my_ielec) = mass_elec; masses(my_iion) = mass_ion; // Initialization of the distribution function as a maxwellian ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfdistribu_device(mesh); + DFieldSpXVx allfdistribu(mesh); std::vector deltat_list = {0.1, 0.01}; std::vector error_deltat; @@ -73,82 +73,80 @@ TEST(CollisionsInter, CollisionsInter) // Initialization of the distribution function as a maxwellian with a // different electron and ion temperatures double const density_init(1.); - DFieldSp temperature_init(dom_sp); + host_t temperature_init(dom_sp); temperature_init(my_iion) = 1.; temperature_init(my_ielec) = 1.2; double const fluid_velocity_init(0.); ddc::for_each(ddc::select(mesh), [&](IndexSpX const ispx) { - device_t finit_device(gridvx); + DFieldVx finit(gridvx); MaxwellianEquilibrium::compute_maxwellian( - finit_device.span_view(), + finit.span_view(), density_init, temperature_init(ddc::select(ispx)), fluid_velocity_init); - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu_device[ispx], finit); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); double const nustar0(0.1); CollisionsInter collisions(mesh, nustar0); - DFieldVx const quadrature_coeffs = trapezoid_quadrature_coefficients(gridvx); + host_t const quadrature_coeffs = trapezoid_quadrature_coefficients(gridvx); Quadrature integrate(quadrature_coeffs); FluidMoments moments(integrate); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); - device_t nustar_profile_alloc(ddc::get_domain(allfdistribu)); - device_t nustar_profile = nustar_profile_alloc.span_view(); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); + DFieldSpX nustar_profile_alloc(ddc::get_domain(allfdistribu_host)); + DSpanSpX nustar_profile = nustar_profile_alloc.span_view(); compute_nustar_profile(nustar_profile, nustar0); int const nbiter(100); for (int iter(0); iter < nbiter; iter++) { - collisions(allfdistribu_device, deltat); + collisions(allfdistribu, deltat); } - ddc::deepcopy(allfdistribu, allfdistribu_device); + ddc::deepcopy(allfdistribu_host, allfdistribu); double error_L1(0); - DFieldSpX density(ddc::get_domain(allfdistribu)); - DFieldSpX fluid_velocity(ddc::get_domain(allfdistribu)); - DFieldSpX temperature(ddc::get_domain(allfdistribu)); - - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - moments(density(ispx), allfdistribu[ispx], FluidMoments::s_density); - moments(fluid_velocity(ispx), - allfdistribu[ispx], - density(ispx), + host_t density_host(ddc::get_domain(allfdistribu_host)); + host_t fluid_velocity_host(ddc::get_domain(allfdistribu_host)); + host_t temperature_host(ddc::get_domain(allfdistribu_host)); + + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexSpX const ispx) { + moments(density_host(ispx), allfdistribu_host[ispx], FluidMoments::s_density); + moments(fluid_velocity_host(ispx), + allfdistribu_host[ispx], + density_host(ispx), FluidMoments::s_velocity); - moments(temperature(ispx), - allfdistribu[ispx], - density(ispx), - fluid_velocity(ispx), + moments(temperature_host(ispx), + allfdistribu_host[ispx], + density_host(ispx), + fluid_velocity_host(ispx), FluidMoments::s_temperature); }); //Collision frequencies, momentum and energy exchange terms - device_t collfreq_ab_device(ddc::get_domain(allfdistribu)); - auto density_device_alloc = ddc:: - create_mirror_view_and_copy(Kokkos::DefaultExecutionSpace(), density.span_view()); - auto density_device = density_device_alloc.span_view(); - auto temperature_device_alloc = ddc::create_mirror_view_and_copy( + DFieldSpX collfreq_ab(ddc::get_domain(allfdistribu_host)); + auto density_alloc = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - temperature.span_view()); - auto temperature_device = temperature_device_alloc.span_view(); - compute_collfreq_ab( - collfreq_ab_device.span_view(), - nustar_profile, - density_device, - temperature_device); - auto collfreq_ab = ddc::create_mirror_view_and_copy(collfreq_ab_device.span_view()); + density_host.span_view()); + auto density = density_alloc.span_view(); + auto temperature_alloc = ddc::create_mirror_view_and_copy( + Kokkos::DefaultExecutionSpace(), + temperature_host.span_view()); + auto temperature = temperature_alloc.span_view(); + compute_collfreq_ab(collfreq_ab.span_view(), nustar_profile, density, temperature); + auto collfreq_ab_host = ddc::create_mirror_view_and_copy(collfreq_ab.span_view()); double const me_on_memi(mass(my_ielec) / (mass(my_ielec) + mass(my_iion))); ddc::for_each(gridx, [&](IndexX const ix) { // test : dlog(T_e - T_i)/dt = -12nu_ei*m_e/(m_e+m_b) // should be verified double const error = std::fabs( - std::log(std::fabs(temperature(my_ielec, ix) - temperature(my_iion, ix))) + std::log(std::fabs( + temperature_host(my_ielec, ix) - temperature_host(my_iion, ix))) - std::log(std::fabs(temperature_init(my_ielec) - temperature_init(my_iion))) - + 12 * collfreq_ab(my_ielec, ix) * me_on_memi * nbiter * deltat); + + 12 * collfreq_ab_host(my_ielec, ix) * me_on_memi * nbiter * deltat); error_L1 += error; }); error_L1 = error_L1 / x_size; diff --git a/tests/geometryXVx/collisions_intra_gridvx.cpp b/tests/geometryXVx/collisions_intra_gridvx.cpp index cfa569c54..5cb94d5d8 100644 --- a/tests/geometryXVx/collisions_intra_gridvx.cpp +++ b/tests/geometryXVx/collisions_intra_gridvx.cpp @@ -55,10 +55,10 @@ TEST(CollisionsIntraGridvx, CollisionsIntraGridvx) IDomainVx const gridvx = builder_vx.interpolation_domain(); IDomainSpXVx const mesh(dom_sp, gridx, gridvx); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); double const mass_ion(400); double const mass_elec(1); masses(my_ielec) = mass_elec; diff --git a/tests/geometryXVx/collisions_intra_maxwellian.cpp b/tests/geometryXVx/collisions_intra_maxwellian.cpp index 18be608d7..dbadf58f2 100644 --- a/tests/geometryXVx/collisions_intra_maxwellian.cpp +++ b/tests/geometryXVx/collisions_intra_maxwellian.cpp @@ -60,23 +60,23 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) IDomainVx const gridvx = builder_vx.interpolation_domain(); IDomainSpXVx const mesh(dom_sp, gridx, gridvx); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); double const mass_ion(400), mass_elec(1); masses(my_ielec) = mass_elec; masses(my_iion) = mass_ion; // Initialization of the distribution function as a maxwellian ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfdistribu_device(mesh); + DFieldSpXVx allfdistribu(mesh); // Initialization of the distribution function as a maxwellian with // moments depending on space - DFieldSpX density_init(ddc::select(mesh)); - DFieldSpX mean_velocity_init(ddc::select(mesh)); - DFieldSpX temperature_init(ddc::select(mesh)); + host_t density_init_host(ddc::select(mesh)); + host_t mean_velocity_init_host(ddc::select(mesh)); + host_t temperature_init_host(ddc::select(mesh)); ddc::for_each(ddc::select(mesh), [&](IndexSpX const ispx) { double const density = 1.; double const density_ampl = 0.1; @@ -86,26 +86,26 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) double const temperature_ampl = 0.3; double const coordx = ddc::coordinate(ddc::select(ispx)); - density_init(ispx) + density_init_host(ispx) = density + density_ampl * std::sin(2 * M_PI * coordx / ddc::coordinate(gridx.back())); - mean_velocity_init(ispx) + mean_velocity_init_host(ispx) = mean_velocity + mean_velocity_ampl * std::sin(2 * M_PI * coordx / ddc::coordinate(gridx.back())); - temperature_init(ispx) + temperature_init_host(ispx) = temperature + temperature_ampl * std::sin(2 * M_PI * coordx / ddc::coordinate(gridx.back())); - device_t finit_device(gridvx); + DFieldVx finit(gridvx); MaxwellianEquilibrium::compute_maxwellian( - finit_device.span_view(), - density_init(ispx), - temperature_init(ispx), - mean_velocity_init(ispx)); - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu_device[ispx], finit); + finit.span_view(), + density_init_host(ispx), + temperature_init_host(ispx), + mean_velocity_init_host(ispx)); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); double const nustar0(0.1); double const deltat(0.1); @@ -115,13 +115,13 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) EXPECT_EQ(charge(ielec()), -1); // nustar profile - device_t nustar_profile_alloc(ddc::get_domain(allfdistribu)); - device_t nustar_profile(nustar_profile_alloc.span_view()); + DFieldSpX nustar_profile_alloc(ddc::get_domain(allfdistribu_host)); + DSpanSpX nustar_profile(nustar_profile_alloc.span_view()); compute_nustar_profile(nustar_profile, nustar0); - DFieldSpX nustar_profile_host(ddc::get_domain(allfdistribu)); + host_t nustar_profile_host(ddc::get_domain(allfdistribu_host)); ddc::deepcopy(nustar_profile_host, nustar_profile); - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexSpX const ispx) { if (charge(ddc::select(ispx)) < 0.) { double const pred(1 / x_max * nustar0); EXPECT_LE(std::fabs(nustar_profile_host(ispx) - pred), 1e-12); @@ -132,31 +132,31 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) }); //collfreq - device_t collfreq_f(ddc::get_domain(allfdistribu)); - auto collfreq_device = collfreq_f.span_view(); + DFieldSpX collfreq_f(ddc::get_domain(allfdistribu_host)); + auto collfreq = collfreq_f.span_view(); - device_t density_init_device(ddc::get_domain(allfdistribu)); - ddc::deepcopy(density_init_device, density_init); + DFieldSpX density_init(ddc::get_domain(allfdistribu_host)); + ddc::deepcopy(density_init, density_init_host); - device_t temperature_init_device(ddc::get_domain(allfdistribu)); - ddc::deepcopy(temperature_init_device, temperature_init); + DFieldSpX temperature_init(ddc::get_domain(allfdistribu_host)); + ddc::deepcopy(temperature_init, temperature_init_host); - compute_collfreq(collfreq_device, nustar_profile, density_init_device, temperature_init_device); + compute_collfreq(collfreq, nustar_profile, density_init, temperature_init); - DFieldSpX collfreq(ddc::get_domain(allfdistribu)); - ddc::deepcopy(collfreq, collfreq_device); + host_t collfreq_host(ddc::get_domain(allfdistribu_host)); + ddc::deepcopy(collfreq_host, collfreq); ddc::for_each(ddc::select(mesh), [&](IndexSpX const ispx) { if (charge(ddc::select(ispx)) < 0.) { double const pred( - 1 / x_max * nustar0 * density_init(ispx) - / std::pow(temperature_init(ispx), 1.5)); - EXPECT_LE(std::fabs(collfreq(ispx) - pred), 1e-12); + 1 / x_max * nustar0 * density_init_host(ispx) + / std::pow(temperature_init_host(ispx), 1.5)); + EXPECT_LE(std::fabs(collfreq_host(ispx) - pred), 1e-12); } else { double const pred( - 1 / (std::sqrt(mass_ion) * x_max) * nustar0 * density_init(ispx) - / std::pow(temperature_init(ispx), 1.5)); - EXPECT_LE(std::fabs(collfreq(ispx) - pred), 1e-12); + 1 / (std::sqrt(mass_ion) * x_max) * nustar0 * density_init_host(ispx) + / std::pow(temperature_init_host(ispx), 1.5)); + EXPECT_LE(std::fabs(collfreq_host(ispx) - pred), 1e-12); } }); @@ -165,74 +165,66 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) double, ddc::DiscreteDomain>> Dcoll_f(collisions.get_mesh_ghosted()); - auto Dcoll_device = Dcoll_f.span_view(); - compute_Dcoll( - Dcoll_device, - collfreq_device, - density_init_device, - temperature_init_device); + auto Dcoll = Dcoll_f.span_view(); + compute_Dcoll< + CollisionsIntra:: + ghosted_vx_point_sampling>(Dcoll, collfreq, density_init, temperature_init); device_t>> dvDcoll_f(collisions.get_mesh_ghosted()); - auto dvDcoll_device = dvDcoll_f.span_view(); - compute_dvDcoll( - dvDcoll_device, - collfreq_device, - density_init_device, - temperature_init_device); + auto dvDcoll = dvDcoll_f.span_view(); + compute_dvDcoll< + CollisionsIntra:: + ghosted_vx_point_sampling>(dvDcoll, collfreq, density_init, temperature_init); // kernel maxwellian fluid moments - device_t Vcoll_f(ddc::get_domain(allfdistribu)); - device_t Tcoll_f(ddc::get_domain(allfdistribu)); - auto Vcoll_device = Vcoll_f.span_view(); - auto Tcoll_device = Tcoll_f.span_view(); - compute_Vcoll_Tcoll( - Vcoll_device, - Tcoll_device, - allfdistribu_device, - Dcoll_device, - dvDcoll_device); - - DFieldSpX Vcoll(ddc::get_domain(allfdistribu)); - DFieldSpX Tcoll(ddc::get_domain(allfdistribu)); - ddc::deepcopy(Vcoll, Vcoll_device); - ddc::deepcopy(Tcoll, Tcoll_device); - - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - EXPECT_LE(std::fabs(Vcoll(ispx) - mean_velocity_init(ispx)), 1e-12); - EXPECT_LE(std::fabs(Tcoll(ispx) - temperature_init(ispx)), 1e-12); + DFieldSpX Vcoll_f(ddc::get_domain(allfdistribu_host)); + DFieldSpX Tcoll_f(ddc::get_domain(allfdistribu_host)); + auto Vcoll = Vcoll_f.span_view(); + auto Tcoll = Tcoll_f.span_view(); + compute_Vcoll_Tcoll< + CollisionsIntra::ghosted_vx_point_sampling>(Vcoll, Tcoll, allfdistribu, Dcoll, dvDcoll); + + host_t Vcoll_host(ddc::get_domain(allfdistribu_host)); + host_t Tcoll_host(ddc::get_domain(allfdistribu_host)); + ddc::deepcopy(Vcoll_host, Vcoll); + ddc::deepcopy(Tcoll_host, Tcoll); + + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexSpX const ispx) { + EXPECT_LE(std::fabs(Vcoll_host(ispx) - mean_velocity_init_host(ispx)), 1e-12); + EXPECT_LE(std::fabs(Tcoll_host(ispx) - temperature_init_host(ispx)), 1e-12); }); - collisions(allfdistribu_device, deltat); - ddc::deepcopy(allfdistribu, allfdistribu_device); + collisions(allfdistribu, deltat); + ddc::deepcopy(allfdistribu_host, allfdistribu); // collision operator should not change densiy, mean_velocity and temperature - DFieldSpX density_res(ddc::get_domain(allfdistribu)); - DFieldSpX mean_velocity_res(ddc::get_domain(allfdistribu)); - DFieldSpX temperature_res(ddc::get_domain(allfdistribu)); - DFieldVx const quadrature_coeffs - = trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu)); + host_t density_res(ddc::get_domain(allfdistribu_host)); + host_t mean_velocity_res(ddc::get_domain(allfdistribu_host)); + host_t temperature_res(ddc::get_domain(allfdistribu_host)); + host_t const quadrature_coeffs + = trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu_host)); Quadrature integrate(quadrature_coeffs); FluidMoments moments(integrate); - moments(density_res.span_view(), allfdistribu.span_cview(), FluidMoments::s_density); + moments(density_res.span_view(), allfdistribu_host.span_cview(), FluidMoments::s_density); moments(mean_velocity_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), FluidMoments::s_velocity); moments(temperature_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), mean_velocity_res.span_cview(), FluidMoments::s_temperature); double const tol = 1.e-6; - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - EXPECT_LE(std::fabs(density_res(ispx) - density_init(ispx)), tol); - EXPECT_LE(std::fabs(mean_velocity_res(ispx) - mean_velocity_init(ispx)), tol); - EXPECT_LE(std::fabs(temperature_res(ispx) - temperature_init(ispx)), tol); + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexSpX const ispx) { + EXPECT_LE(std::fabs(density_res(ispx) - density_init_host(ispx)), tol); + EXPECT_LE(std::fabs(mean_velocity_res(ispx) - mean_velocity_init_host(ispx)), tol); + EXPECT_LE(std::fabs(temperature_res(ispx) - temperature_init_host(ispx)), tol); }); // * Intra species collisions applied on a perturbed distribution function @@ -255,14 +247,14 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) double const temperature_loc = temperature + temperature_ampl * std::sin(2 * M_PI * coordx / ddc::coordinate(gridx.back())); - device_t finit_device(gridvx); + DFieldVx finit(gridvx); MaxwellianEquilibrium::compute_maxwellian( - finit_device.span_view(), + finit.span_view(), density_loc, temperature_loc, mean_velocity_loc); - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu[ispx], finit); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu_host[ispx], finit_host); }); // initial perturbation @@ -277,75 +269,67 @@ TEST(CollisionsIntraMaxwellian, CollisionsIntraMaxwellian) double const perturb = coeff_mxw * std::exp(-coordvx_sq * coordvx_sq / (2 * perturb_temperature)); - allfdistribu(ispxvx) = allfdistribu(ispxvx) + perturb; + allfdistribu_host(ispxvx) = allfdistribu_host(ispxvx) + perturb; }); - ddc::deepcopy(allfdistribu_device, allfdistribu); + ddc::deepcopy(allfdistribu, allfdistribu_host); // before the collisions the perturbed distribution should have T != Tcoll and V != Vcoll // this test is performed on electrons since the largest error is made for them // (lightest species constraining the timestep) - moments(density_res.span_view(), allfdistribu.span_cview(), FluidMoments::s_density); + moments(density_res.span_view(), allfdistribu_host.span_cview(), FluidMoments::s_density); moments(mean_velocity_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), FluidMoments::s_velocity); moments(temperature_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), mean_velocity_res.span_cview(), FluidMoments::s_temperature); - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexX const ix) { - EXPECT_GE(std::fabs(mean_velocity_res(ielec(), ix) - Vcoll(ielec(), ix)), 1.e-4); - EXPECT_GE(std::fabs(temperature_res(ielec(), ix) - Tcoll(ielec(), ix)), 1.e-4); + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexX const ix) { + EXPECT_GE(std::fabs(mean_velocity_res(ielec(), ix) - Vcoll_host(ielec(), ix)), 1.e-4); + EXPECT_GE(std::fabs(temperature_res(ielec(), ix) - Tcoll_host(ielec(), ix)), 1.e-4); }); int const nbsteps = 300; for (int iter = 0; iter < nbsteps; ++iter) { - collisions(allfdistribu_device, deltat); + collisions(allfdistribu, deltat); }; - ddc::deepcopy(allfdistribu, allfdistribu_device); + ddc::deepcopy(allfdistribu_host, allfdistribu); // Vcoll and Tcoll calculation - compute_collfreq(collfreq_device, nustar_profile, density_init_device, temperature_init_device); - - compute_Dcoll( - Dcoll_device, - collfreq_device, - density_init_device, - temperature_init_device); - - compute_dvDcoll( - dvDcoll_device, - collfreq_device, - density_init_device, - temperature_init_device); - - compute_Vcoll_Tcoll( - Vcoll_device, - Tcoll_device, - allfdistribu_device, - Dcoll_device, - dvDcoll_device); - - moments(density_res.span_view(), allfdistribu.span_cview(), FluidMoments::s_density); + compute_collfreq(collfreq, nustar_profile, density_init, temperature_init); + + compute_Dcoll< + CollisionsIntra:: + ghosted_vx_point_sampling>(Dcoll, collfreq, density_init, temperature_init); + + compute_dvDcoll< + CollisionsIntra:: + ghosted_vx_point_sampling>(dvDcoll, collfreq, density_init, temperature_init); + + compute_Vcoll_Tcoll< + CollisionsIntra::ghosted_vx_point_sampling>(Vcoll, Tcoll, allfdistribu, Dcoll, dvDcoll); + + moments(density_res.span_view(), allfdistribu_host.span_cview(), FluidMoments::s_density); moments(mean_velocity_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), FluidMoments::s_velocity); moments(temperature_res.span_view(), - allfdistribu.span_cview(), + allfdistribu_host.span_cview(), density_res.span_cview(), mean_velocity_res.span_cview(), FluidMoments::s_temperature); - ddc::deepcopy(Vcoll, Vcoll_device); - ddc::deepcopy(Tcoll, Tcoll_device); + ddc::deepcopy(Vcoll_host, Vcoll); + ddc::deepcopy(Tcoll_host, Tcoll); - ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexX const ix) { - EXPECT_LE(std::fabs(mean_velocity_res(ielec(), ix) - Vcoll(ielec(), ix)), 1.e-4); - EXPECT_LE(std::fabs(temperature_res(ielec(), ix) - Tcoll(ielec(), ix)), 1.e-4); + ddc::for_each(ddc::get_domain(allfdistribu_host), [&](IndexX const ix) { + EXPECT_LE(std::fabs(mean_velocity_res(ielec(), ix) - Vcoll_host(ielec(), ix)), 1.e-4); + EXPECT_LE(std::fabs(temperature_res(ielec(), ix) - Tcoll_host(ielec(), ix)), 1.e-4); }); PC_tree_destroy(&conf_pdi); diff --git a/tests/geometryXVx/femnonperiodicpoissonsolver.cpp b/tests/geometryXVx/femnonperiodicpoissonsolver.cpp index 472c579c0..f5691d1f2 100644 --- a/tests/geometryXVx/femnonperiodicpoissonsolver.cpp +++ b/tests/geometryXVx/femnonperiodicpoissonsolver.cpp @@ -60,52 +60,53 @@ TEST(FemNonPeriodicPoissonSolver, Ordering) ddc::ConstantExtrapolationRule(vx_min), ddc::ConstantExtrapolationRule(vx_min)); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - DFieldVx const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridvx, builder_vx); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + host_t const quadrature_coeffs_host + = neumann_spline_quadrature_coefficients(gridvx, builder_vx); + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FemNonPeriodicPoissonSolver poisson(builder_x, spline_x_evaluator, rhs); - DFieldX electrostatic_potential(gridx); - DFieldX electric_field(gridx); - DFieldSpXVx allfdistribu(mesh); + host_t electrostatic_potential_host(gridx); + host_t electric_field_host(gridx); + host_t allfdistribu_host(mesh); // Initialization of the distribution function --> fill values for (IndexSp const isp : gridsp) { for (IndexX const ix : gridx) { double fdistribu_val = sin(ddc::coordinate(ix)); for (IndexVx const iv : gridvx) { - allfdistribu(isp, ix, iv) = fdistribu_val; + allfdistribu_host(isp, ix, iv) = fdistribu_val; } } } - device_t electrostatic_potential_device(gridx); - device_t electric_field_device(gridx); - device_t allfdistribu_device(mesh); + DFieldX electrostatic_potential(gridx); + DFieldX electric_field(gridx); + DFieldSpXVx allfdistribu(mesh); - ddc::deepcopy(allfdistribu_device, allfdistribu); - poisson(electrostatic_potential_device, electric_field_device, allfdistribu_device); - ddc::deepcopy(electric_field, electric_field_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu, allfdistribu_host); + poisson(electrostatic_potential, electric_field, allfdistribu); + ddc::deepcopy(electric_field_host, electric_field); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); double error_pot = 0.0; double error_field = 0.0; for (IndexX const ix : gridx) { double const exact_pot = sin(ddc::coordinate(ix)); - error_pot = fmax(fabs(electrostatic_potential(ix) - exact_pot), error_pot); + error_pot = fmax(fabs(electrostatic_potential_host(ix) - exact_pot), error_pot); double const exact_field = -cos(ddc::coordinate(ix)); - error_field = fmax(fabs(electric_field(ix) - exact_field), error_field); + error_field = fmax(fabs(electric_field_host(ix) - exact_field), error_field); } EXPECT_LE(error_pot, 1e-2); EXPECT_LE(error_field, 1e-1); diff --git a/tests/geometryXVx/femperiodicpoissonsolver.cpp b/tests/geometryXVx/femperiodicpoissonsolver.cpp index d6a9145ae..56a32bbe5 100644 --- a/tests/geometryXVx/femperiodicpoissonsolver.cpp +++ b/tests/geometryXVx/femperiodicpoissonsolver.cpp @@ -56,43 +56,44 @@ TEST(FemPeriodicPoissonSolver, CosineSource) builder_vx.spline_domain(), ddc::ConstantExtrapolationRule(vx_min), ddc::ConstantExtrapolationRule(vx_max)); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - DFieldVx const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridvx, builder_vx); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + host_t const quadrature_coeffs_host + = neumann_spline_quadrature_coefficients(gridvx, builder_vx); + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FemPeriodicPoissonSolver poisson(builder_x, spline_x_evaluator, rhs); - DFieldX electrostatic_potential(gridx); - DFieldX electric_field(gridx); - DFieldSpXVx allfdistribu(mesh); + host_t electrostatic_potential_host(gridx); + host_t electric_field_host(gridx); + host_t allfdistribu_host(mesh); // Initialization of the distribution function --> fill values for (IndexSp const isp : gridsp) { for (IndexX const ix : gridx) { double fdistribu_val = cos(ddc::coordinate(ix)); for (IndexVx const iv : gridvx) { - allfdistribu(isp, ix, iv) = fdistribu_val; + allfdistribu_host(isp, ix, iv) = fdistribu_val; } } } - device_t electrostatic_potential_device(gridx); - device_t electric_field_device(gridx); - device_t allfdistribu_device(mesh); + DFieldX electrostatic_potential(gridx); + DFieldX electric_field(gridx); + DFieldSpXVx allfdistribu(mesh); - ddc::deepcopy(allfdistribu_device, allfdistribu); - poisson(electrostatic_potential_device, electric_field_device, allfdistribu_device); - ddc::deepcopy(electric_field, electric_field_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu, allfdistribu_host); + poisson(electrostatic_potential, electric_field, allfdistribu); + ddc::deepcopy(electric_field_host, electric_field); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); double error_pot = 0.0; double error_field = 0.0; @@ -100,9 +101,9 @@ TEST(FemPeriodicPoissonSolver, CosineSource) for (IndexX const ix : gridx) { double const exact_pot = cos(ddc::coordinate(ix)); - error_pot = fmax(fabs(electrostatic_potential(ix) - exact_pot), error_pot); + error_pot = fmax(fabs(electrostatic_potential_host(ix) - exact_pot), error_pot); double const exact_field = sin(ddc::coordinate(ix)); - error_field = fmax(fabs(electric_field(ix) - exact_field), error_field); + error_field = fmax(fabs(electric_field_host(ix) - exact_field), error_field); } EXPECT_LE(error_pot, 1e-8); EXPECT_LE(error_field, 1e-6); diff --git a/tests/geometryXVx/fftpoissonsolver.cpp b/tests/geometryXVx/fftpoissonsolver.cpp index 6631fe4e5..7b8d60568 100644 --- a/tests/geometryXVx/fftpoissonsolver.cpp +++ b/tests/geometryXVx/fftpoissonsolver.cpp @@ -51,52 +51,53 @@ TEST(FftPoissonSolver, CosineSource) // Creating operators - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - DFieldVx const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridvx, builder_vx); - auto const quadrature_coeffs_device = ddc::create_mirror_view_and_copy( + host_t const quadrature_coeffs_host + = neumann_spline_quadrature_coefficients(gridvx, builder_vx); + auto const quadrature_coeffs = ddc::create_mirror_view_and_copy( Kokkos::DefaultExecutionSpace(), - quadrature_coeffs.span_view()); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + quadrature_coeffs_host.span_view()); + ChargeDensityCalculator rhs(quadrature_coeffs); FftPoissonSolver poisson(rhs); - DFieldX electrostatic_potential(gridx); - DFieldX electric_field(gridx); - DFieldSpXVx allfdistribu(mesh); + host_t electrostatic_potential_host(gridx); + host_t electric_field_host(gridx); + host_t allfdistribu_host(mesh); // Initialization of the distribution function --> fill values for (IndexSp const isp : gridsp) { for (IndexX const ix : gridx) { double fdistribu_val = cos(ddc::coordinate(ix)); for (IndexVx const iv : gridvx) { - allfdistribu(isp, ix, iv) = fdistribu_val; + allfdistribu_host(isp, ix, iv) = fdistribu_val; } } } - device_t electrostatic_potential_device(gridx); - device_t electric_field_device(gridx); - device_t allfdistribu_device(mesh); + DFieldX electrostatic_potential(gridx); + DFieldX electric_field(gridx); + DFieldSpXVx allfdistribu(mesh); - ddc::deepcopy(allfdistribu_device, allfdistribu); - poisson(electrostatic_potential_device, electric_field_device, allfdistribu_device); - ddc::deepcopy(electric_field, electric_field_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu, allfdistribu_host); + poisson(electrostatic_potential, electric_field, allfdistribu); + ddc::deepcopy(electric_field_host, electric_field); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); double error_pot = 0.0; double error_field = 0.0; for (IndexX const ix : gridx) { double const exact_pot = cos(ddc::coordinate(ix)); - error_pot = fmax(fabs(electrostatic_potential(ix) - exact_pot), error_pot); + error_pot = fmax(fabs(electrostatic_potential_host(ix) - exact_pot), error_pot); double const exact_field = sin(ddc::coordinate(ix)); - error_field = fmax(fabs(electric_field(ix) - exact_field), error_field); + error_field = fmax(fabs(electric_field_host(ix) - exact_field), error_field); } EXPECT_LE(error_pot, 1e-8); EXPECT_LE(error_field, 1e-6); @@ -139,52 +140,53 @@ TEST(FftPoissonSolver, CosineSourceParallel) // Creating operators - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - DFieldVx const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridvx, builder_vx); - device_t quadrature_coeffs_device(quadrature_coeffs.domain()); + host_t const quadrature_coeffs_host + = neumann_spline_quadrature_coefficients(gridvx, builder_vx); + DFieldVx quadrature_coeffs(quadrature_coeffs_host.domain()); - ddc::deepcopy(quadrature_coeffs_device, quadrature_coeffs); - ChargeDensityCalculator rhs(quadrature_coeffs_device); + ddc::deepcopy(quadrature_coeffs, quadrature_coeffs_host); + ChargeDensityCalculator rhs(quadrature_coeffs); FftPoissonSolver poisson(rhs); - DFieldX electrostatic_potential(gridx); - DFieldX electric_field(gridx); - DFieldSpXVx allfdistribu(mesh); + host_t electrostatic_potential_host(gridx); + host_t electric_field_host(gridx); + host_t allfdistribu_host(mesh); // Initialization of the distribution function --> fill values for (IndexSp const isp : gridsp) { for (IndexX const ix : gridx) { double fdistribu_val = cos(ddc::coordinate(ix)); for (IndexVx const iv : gridvx) { - allfdistribu(isp, ix, iv) = fdistribu_val; + allfdistribu_host(isp, ix, iv) = fdistribu_val; } } } - device_t electrostatic_potential_device(gridx); - device_t electric_field_device(gridx); - device_t allfdistribu_device(mesh); + DFieldX electrostatic_potential(gridx); + DFieldX electric_field(gridx); + DFieldSpXVx allfdistribu(mesh); - ddc::deepcopy(allfdistribu_device, allfdistribu); - poisson(electrostatic_potential_device, electric_field_device, allfdistribu_device); - ddc::deepcopy(electric_field, electric_field_device); - ddc::deepcopy(electrostatic_potential, electrostatic_potential_device); + ddc::deepcopy(allfdistribu, allfdistribu_host); + poisson(electrostatic_potential, electric_field, allfdistribu); + ddc::deepcopy(electric_field_host, electric_field); + ddc::deepcopy(electrostatic_potential_host, electrostatic_potential); double error_pot = 0.0; double error_field = 0.0; for (IndexX const ix : gridx) { double const exact_pot = cos(ddc::coordinate(ix)); - error_pot = fmax(fabs(electrostatic_potential(ix) - exact_pot), error_pot); + error_pot = fmax(fabs(electrostatic_potential_host(ix) - exact_pot), error_pot); double const exact_field = sin(ddc::coordinate(ix)); - error_field = fmax(fabs(electric_field(ix) - exact_field), error_field); + error_field = fmax(fabs(electric_field_host(ix) - exact_field), error_field); } EXPECT_LE(error_pot, 1e-8); EXPECT_LE(error_field, 1e-6); diff --git a/tests/geometryXVx/fluid_moments.cpp b/tests/geometryXVx/fluid_moments.cpp index 228a46683..8c9eba577 100644 --- a/tests/geometryXVx/fluid_moments.cpp +++ b/tests/geometryXVx/fluid_moments.cpp @@ -51,21 +51,21 @@ TEST(Physics, FluidMoments) IDomainVx const gridvx = builder_vx.interpolation_domain(); IDomainSpXVx const mesh(IDomainSp(my_iion, IVectSp(1)), gridx, gridvx); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function as a maxwellian ddc::init_discrete_space(std::move(charges), std::move(masses)); - DFieldSpXVx allfdistribu(mesh); + host_t allfdistribu(mesh); // Initialization of the distribution function as a maxwellian with // moments depending on space - DFieldSpX density_init(ddc::get_domain(allfdistribu)); - DFieldSpX mean_velocity_init(ddc::get_domain(allfdistribu)); - DFieldSpX temperature_init(ddc::get_domain(allfdistribu)); + host_t density_init(ddc::get_domain(allfdistribu)); + host_t mean_velocity_init(ddc::get_domain(allfdistribu)); + host_t temperature_init(ddc::get_domain(allfdistribu)); ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { double const density = 1.; double const density_ampl = 0.1; @@ -85,22 +85,22 @@ TEST(Physics, FluidMoments) temperature_init(ispx) = temperature + temperature_ampl * std::sin(2 * M_PI * coordx / ddc::coordinate(gridx.back())); - device_t finit_device(gridvx); + DFieldVx finit(gridvx); MaxwellianEquilibrium::compute_maxwellian( - finit_device.span_view(), + finit.span_view(), density_init(ispx), temperature_init(ispx), mean_velocity_init(ispx)); - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu[ispx], finit); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); // density and temperature - DFieldSpX density_computed(ddc::get_domain(allfdistribu)); - DFieldSpX mean_velocity_computed(ddc::get_domain(allfdistribu)); - DFieldSpX temperature_computed(ddc::get_domain(allfdistribu)); - DFieldVx const quadrature_coeffs + host_t density_computed(ddc::get_domain(allfdistribu)); + host_t mean_velocity_computed(ddc::get_domain(allfdistribu)); + host_t temperature_computed(ddc::get_domain(allfdistribu)); + host_t const quadrature_coeffs = trapezoid_quadrature_coefficients(ddc::get_domain(allfdistribu)); Quadrature integrate(quadrature_coeffs); FluidMoments moments(integrate); diff --git a/tests/geometryXVx/kineticsource.cpp b/tests/geometryXVx/kineticsource.cpp index 1ee500be8..b27294392 100644 --- a/tests/geometryXVx/kineticsource.cpp +++ b/tests/geometryXVx/kineticsource.cpp @@ -50,23 +50,23 @@ TEST(KineticSource, Moments) IDomainVx const gridvx = builder_vx.interpolation_domain(); IDomainSpXVx const mesh(IDomainSp(my_iion, IVectSp(1)), gridx, gridvx); - DFieldX quadrature_coeffs_x = trapezoid_quadrature_coefficients(gridx); - DFieldVx quadrature_coeffs_vx = trapezoid_quadrature_coefficients(gridvx); + host_t quadrature_coeffs_x = trapezoid_quadrature_coefficients(gridx); + host_t quadrature_coeffs_vx = trapezoid_quadrature_coefficients(gridvx); Quadrature const integrate_x(quadrature_coeffs_x); Quadrature const integrate_v(quadrature_coeffs_vx); - FieldSp charges(dom_sp); + host_t> charges(dom_sp); charges(my_ielec) = -1; charges(my_iion) = 1; - DFieldSp masses(dom_sp); + host_t masses(dom_sp); ddc::fill(masses, 1); // Initialization of the distribution function ddc::init_discrete_space(std::move(charges), std::move(masses)); - device_t allfdistribu_device(mesh); + DFieldSpXVx allfdistribu(mesh); // Initialization of the distribution function - ddc::fill(allfdistribu_device, 0.); + ddc::fill(allfdistribu, 0.); // Maxwellian source test double const px_source = 0.2; @@ -89,19 +89,19 @@ TEST(KineticSource, Moments) energy_amplitude, temperature_source); - kinetic_source(allfdistribu_device, deltat); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + kinetic_source(allfdistribu, deltat); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); - DFieldX density(gridx); - DFieldX fluid_velocity(gridx); - DFieldX temperature(gridx); + host_t density(gridx); + host_t fluid_velocity(gridx); + host_t temperature(gridx); - DFieldVx values_density(gridvx); - DFieldVx values_fluid_velocity(gridvx); - DFieldVx values_temperature(gridvx); + host_t values_density(gridvx); + host_t values_fluid_velocity(gridvx); + host_t values_temperature(gridvx); ddc::for_each(gridx, [&](IndexX const ix) { // density - ddc::deepcopy(values_density, allfdistribu[dom_sp.front()][ix]); + ddc::deepcopy(values_density, allfdistribu_host[dom_sp.front()][ix]); density(ix) = integrate_v(values_density); // fluid velocity diff --git a/tests/geometryXVx/krooksource.cpp b/tests/geometryXVx/krooksource.cpp index f87e0fdcd..731daab2e 100644 --- a/tests/geometryXVx/krooksource.cpp +++ b/tests/geometryXVx/krooksource.cpp @@ -56,13 +56,13 @@ TEST(KrookSource, Adaptive) IDomainSp const gridsp = dom_sp; IDomainSpXVx const mesh(gridsp, gridx, gridvx); - DFieldX const quadrature_coeffs_x = trapezoid_quadrature_coefficients(gridx); - DFieldVx const quadrature_coeffs_vx = trapezoid_quadrature_coefficients(gridvx); + host_t const quadrature_coeffs_x = trapezoid_quadrature_coefficients(gridx); + host_t const quadrature_coeffs_vx = trapezoid_quadrature_coefficients(gridvx); Quadrature const integrate_x(quadrature_coeffs_x); Quadrature const integrate_v(quadrature_coeffs_vx); - FieldSp charges(dom_sp); - DFieldSp masses(dom_sp); + host_t> charges(dom_sp); + host_t masses(dom_sp); IndexSp my_iion(dom_sp.front()); IndexSp my_ielec(dom_sp.back()); charges(my_iion) = 1; @@ -92,32 +92,32 @@ TEST(KrookSource, Adaptive) double const density_init_ion = 1.; double const density_init_elec = 2.; double const temperature_init = 1.; - device_t allfdistribu_device(mesh); + DFieldSpXVx allfdistribu(mesh); ddc::for_each(ddc::select(mesh), [&](IndexSpX const ispx) { - device_t finit_device(gridvx); + DFieldVx finit(gridvx); if (charge(ddc::select(ispx)) >= 0.) { MaxwellianEquilibrium:: - compute_maxwellian(finit_device, density_init_ion, temperature_init, 0.); + compute_maxwellian(finit, density_init_ion, temperature_init, 0.); } else { MaxwellianEquilibrium:: - compute_maxwellian(finit_device, density_init_elec, temperature_init, 0.); + compute_maxwellian(finit, density_init_elec, temperature_init, 0.); } - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu_device[ispx], finit); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); // error with a given deltat double const deltat = 0.1; - rhs_krook(allfdistribu_device, deltat); - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + rhs_krook(allfdistribu, deltat); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); - DFieldSpX densities(ddc::get_domain(allfdistribu)); + host_t densities(ddc::get_domain(allfdistribu)); ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - densities(ispx) = integrate_v(allfdistribu[ispx]); + densities(ispx) = integrate_v(allfdistribu_host[ispx]); }); // the charge should be conserved by the operator - DFieldX error(ddc::get_domain(allfdistribu)); + host_t error(ddc::get_domain(allfdistribu_host)); ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexX const ix) { error(ix) = std::fabs( charge(my_iion) * (densities(my_iion, ix) - density_init_ion) @@ -126,23 +126,23 @@ TEST(KrookSource, Adaptive) // reinitialization of the distribution function ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - device_t finit_device(gridvx); + DFieldVx finit(gridvx); if (charge(ddc::select(ispx)) >= 0.) { MaxwellianEquilibrium:: - compute_maxwellian(finit_device, density_init_ion, temperature_init, 0.); + compute_maxwellian(finit, density_init_ion, temperature_init, 0.); } else { MaxwellianEquilibrium:: - compute_maxwellian(finit_device, density_init_elec, temperature_init, 0.); + compute_maxwellian(finit, density_init_elec, temperature_init, 0.); } - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - ddc::deepcopy(allfdistribu_device[ispx], finit); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); // error with a deltat 10 times smaller - rhs_krook(allfdistribu_device, 0.01); - ddc::deepcopy(allfdistribu, allfdistribu_device); + rhs_krook(allfdistribu, 0.01); + ddc::deepcopy(allfdistribu_host, allfdistribu); ddc::for_each(ddc::get_domain(allfdistribu), [&](IndexSpX const ispx) { - densities(ispx) = integrate_v(allfdistribu[ispx]); + densities(ispx) = integrate_v(allfdistribu_host[ispx]); }); // the rk2 scheme used in the krook operator should be of order 2 @@ -196,8 +196,8 @@ TEST(KrookSource, Constant) IDomainSpXVx const mesh(gridsp, gridx, gridvx); - FieldSp charges(dom_sp); - DFieldSp masses(dom_sp); + host_t> charges(dom_sp); + host_t masses(dom_sp); charges(dom_sp.front()) = 1; charges(dom_sp.back()) = -1; ddc::for_each(dom_sp, [&](IndexSp const isp) { masses(isp) = 1.0; }); @@ -222,7 +222,7 @@ TEST(KrookSource, Constant) temperature_target); // compute the krook mask (spatial extent) - DFieldX mask = mask_tanh(gridx, extent, stiffness, MaskType::Inverted, false); + host_t mask = mask_tanh(gridx, extent, stiffness, MaskType::Inverted, false); // simulation double const deltat = 1.; @@ -230,35 +230,35 @@ TEST(KrookSource, Constant) // Initialization of the distribution function : maxwellian double const density_init = 1.; double const temperature_init = 1.; - device_t finit_device(gridvx); - MaxwellianEquilibrium::compute_maxwellian(finit_device, density_init, temperature_init, 0.); - auto finit = ddc::create_mirror_view_and_copy(finit_device.span_view()); - device_t allfdistribu_device(mesh); + DFieldVx finit(gridvx); + MaxwellianEquilibrium::compute_maxwellian(finit, density_init, temperature_init, 0.); + auto finit_host = ddc::create_mirror_view_and_copy(finit.span_view()); + DFieldSpXVx allfdistribu(mesh); ddc::for_each(ddc::select(mesh), [&](IndexSpX const ispx) { - ddc::deepcopy(allfdistribu_device[ispx], finit); + ddc::deepcopy(allfdistribu[ispx], finit_host); }); int const nbsteps = 100; for (int iter = 0; iter < nbsteps; ++iter) { - rhs_krook(allfdistribu_device, deltat); + rhs_krook(allfdistribu, deltat); }; - auto allfdistribu = ddc::create_mirror_view_and_copy(allfdistribu_device.span_view()); + auto allfdistribu_host = ddc::create_mirror_view_and_copy(allfdistribu.span_view()); // tests if distribution function matches theoretical prediction - device_t ftarget_device(gridvx); - MaxwellianEquilibrium:: - compute_maxwellian(ftarget_device, density_target, temperature_target, 0.); - auto ftarget = ddc::create_mirror_view_and_copy(ftarget_device.span_view()); + DFieldVx ftarget(gridvx); + MaxwellianEquilibrium::compute_maxwellian(ftarget, density_target, temperature_target, 0.); + auto ftarget_host = ddc::create_mirror_view_and_copy(ftarget.span_view()); ddc::for_each(allfdistribu.domain(), [&](IndexSpXVx const ispxvx) { // predicted distribution function value double const allfdistribu_pred - = ftarget(ddc::select(ispxvx)) - + (finit(ddc::select(ispxvx)) - ftarget(ddc::select(ispxvx))) + = ftarget_host(ddc::select(ispxvx)) + + (finit_host(ddc::select(ispxvx)) + - ftarget_host(ddc::select(ispxvx))) * std::exp( -amplitude * mask(ddc::select(ispxvx)) * deltat * nbsteps); - double const error = std::fabs(allfdistribu(ispxvx) - allfdistribu_pred); + double const error = std::fabs(allfdistribu_host(ispxvx) - allfdistribu_pred); EXPECT_LE(error, 1e-13); }); diff --git a/tests/geometryXVx/masks.cpp b/tests/geometryXVx/masks.cpp index e015e640a..0dd7c108d 100644 --- a/tests/geometryXVx/masks.cpp +++ b/tests/geometryXVx/masks.cpp @@ -51,22 +51,22 @@ TEST(Masks, Ordering) // with x_left = x_min + Lx*extent // x_right = x_min + Lx - Lx*extent // Lx = gridx total length - DFieldX mask = mask_tanh(gridx, extent, stiffness, MaskType::Normal, false); + host_t mask = mask_tanh(gridx, extent, stiffness, MaskType::Normal, false); EXPECT_LE(std::fabs(mask(middle) - 1.0), tolerance); EXPECT_LE(std::fabs(mask(tenth)), tolerance); // same but with a mask that is zero inside [x_left, x_right] - DFieldX mask_inverted = mask_tanh(gridx, extent, stiffness, MaskType::Inverted, false); + host_t mask_inverted = mask_tanh(gridx, extent, stiffness, MaskType::Inverted, false); EXPECT_LE(std::fabs(mask_inverted(middle)), tolerance); EXPECT_LE(std::fabs(mask_inverted(tenth) - 1.0), tolerance); // tests if integral of normalized mask equals 1 - DFieldX const quadrature_coeffs = trapezoid_quadrature_coefficients(gridx); + host_t const quadrature_coeffs = trapezoid_quadrature_coefficients(gridx); Quadrature const integrate_x(quadrature_coeffs); - DFieldX mask_normalized = mask_tanh(gridx, extent, stiffness, MaskType::Normal, true); + host_t mask_normalized = mask_tanh(gridx, extent, stiffness, MaskType::Normal, true); EXPECT_LE(std::fabs(integrate_x(mask_normalized) - 1.0), tolerance); - DFieldX mask_normalized_inverted + host_t mask_normalized_inverted = mask_tanh(gridx, extent, stiffness, MaskType::Inverted, true); EXPECT_LE(std::fabs(integrate_x(mask_normalized_inverted) - 1.0), tolerance); } diff --git a/tests/geometryXVx/maxwellian.cpp b/tests/geometryXVx/maxwellian.cpp index 1f5362850..d50a220b1 100644 --- a/tests/geometryXVx/maxwellian.cpp +++ b/tests/geometryXVx/maxwellian.cpp @@ -33,14 +33,14 @@ TEST(Maxwellian, Moments) IDomainVx const gridvx = builder_vx.interpolation_domain(); - DFieldVx const quadrature_coeffs = trapezoid_quadrature_coefficients(gridvx); + host_t const quadrature_coeffs = trapezoid_quadrature_coefficients(gridvx); Quadrature const integrate_v(quadrature_coeffs); double const density = 1.e-5; double const mean_velocity = 0.5; double const temperature = 0.5; - DFieldVx fdistribu(gridvx); + host_t fdistribu(gridvx); MaxwellianEquilibrium:: compute_maxwellian(fdistribu.span_view(), density, temperature, mean_velocity); @@ -48,7 +48,7 @@ TEST(Maxwellian, Moments) double const density_res = integrate_v(fdistribu); // mean velocity - DFieldVx integrand(gridvx); + host_t integrand(gridvx); ddc::for_each(gridvx, [&](IndexVx const ivx) { integrand(ivx) = ddc::coordinate(ivx) * fdistribu(ivx); }); diff --git a/tests/geometryXVx/neumann_quadrature_spline.cpp b/tests/geometryXVx/neumann_quadrature_spline.cpp index b62302540..0b8337e8d 100644 --- a/tests/geometryXVx/neumann_quadrature_spline.cpp +++ b/tests/geometryXVx/neumann_quadrature_spline.cpp @@ -25,10 +25,11 @@ TEST(NeumannSplineQuadratureTest, ExactForConstantFunc) IDomainVx const gridvx = builder_vx.interpolation_domain(); - DFieldVx const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridvx, builder_vx); + host_t const quadrature_coeffs + = neumann_spline_quadrature_coefficients(gridvx, builder_vx); Quadrature const integrate(quadrature_coeffs.span_cview()); - DFieldVx values(gridvx); + host_t values(gridvx); ddc::for_each(gridvx, [&](ddc::DiscreteElement const idx) { values(idx) = 1.0; }); double integral = integrate(values); @@ -61,7 +62,7 @@ double compute_error(int n_elems) ddc::SplineSolver::GINKGO, IDimY>; using IDomainY = ddc::DiscreteDomain; - using DFieldY = ddc::Chunk; + using DFieldY = device_t>; ddc::Coordinate> const y_min(-1.0); ddc::Coordinate> const y_max(1.0); @@ -73,10 +74,11 @@ double compute_error(int n_elems) SplineYBuilder const builder_y(gridy); - DFieldY const quadrature_coeffs = neumann_spline_quadrature_coefficients(gridy, builder_y); + host_t const quadrature_coeffs + = neumann_spline_quadrature_coefficients(gridy, builder_y); Quadrature const integrate(quadrature_coeffs.span_cview()); - DFieldY values(gridy); + host_t values(gridy); ddc::for_each(gridy, [&](ddc::DiscreteElement const idx) { double x = ddc::coordinate(idx); diff --git a/tests/geometryXVx/quadrature.cpp b/tests/geometryXVx/quadrature.cpp index e8021c610..cdab8c8ce 100644 --- a/tests/geometryXVx/quadrature.cpp +++ b/tests/geometryXVx/quadrature.cpp @@ -97,7 +97,7 @@ double compute_error(int n_elems, Method meth) using DimY = Y; using IDimY = ddc::NonUniformPointSampling; using IDomainY = ddc::DiscreteDomain; - using DFieldY = ddc::Chunk; + using DFieldY = device_t>; ddc::Coordinate const y_min(0.0); ddc::Coordinate const y_max(M_PI); @@ -114,7 +114,7 @@ double compute_error(int n_elems, Method meth) ddc::DiscreteVector npoints(n_elems); ddc::DiscreteDomain gridy(lbound, npoints); - DFieldY quadrature_coeffs; + host_t quadrature_coeffs; switch (meth) { case Method::TRAPEZ: quadrature_coeffs = trapezoid_quadrature_coefficients(gridy); @@ -123,7 +123,7 @@ double compute_error(int n_elems, Method meth) } Quadrature const integrate(quadrature_coeffs); - DFieldY values(gridy); + host_t values(gridy); ddc::for_each(gridy, [&](ddc::DiscreteElement const idx) { values(idx) = sin(ddc::coordinate(idx)); diff --git a/tests/geometryXVx/quadrature_spline.cpp b/tests/geometryXVx/quadrature_spline.cpp index 0e72de5ea..a7e2f75f1 100644 --- a/tests/geometryXVx/quadrature_spline.cpp +++ b/tests/geometryXVx/quadrature_spline.cpp @@ -30,7 +30,7 @@ TEST(SplineQuadratureTest, ExactForConstantFunc) using sllSplineXBuilder = SplineBuilder; using sllIDomainX = ddc::DiscreteDomain; - using sllDFieldX = ddc::Chunk; + using sllDFieldX = device_t>; ddc::init_discrete_space(x_min, x_max, x_size); @@ -41,10 +41,10 @@ TEST(SplineQuadratureTest, ExactForConstantFunc) sllIDomainX const gridx = builder_x.interpolation_domain(); - sllDFieldX const quadrature_coeffs = spline_quadrature_coefficients(gridx, builder_x); + host_t const quadrature_coeffs = spline_quadrature_coefficients(gridx, builder_x); Quadrature const integrate(quadrature_coeffs.span_cview()); - sllDFieldX values(gridx); + host_t values(gridx); ddc::for_each(gridx, [&](ddc::DiscreteElement const idx) { values(idx) = 1.0; }); double integral = integrate(values); @@ -70,7 +70,7 @@ double compute_error(int n_elems) using SplineYBuilder = SplineBuilder; using IDomainY = ddc::DiscreteDomain; - using DFieldY = ddc::Chunk; + using DFieldY = device_t>; ddc::Coordinate> const y_min(0.0); ddc::Coordinate> const y_max(M_PI); @@ -82,10 +82,10 @@ double compute_error(int n_elems) SplineYBuilder const builder_y(gridy); - DFieldY const quadrature_coeffs = spline_quadrature_coefficients(gridy, builder_y); + host_t const quadrature_coeffs = spline_quadrature_coefficients(gridy, builder_y); Quadrature const integrate(quadrature_coeffs.span_cview()); - DFieldY values(gridy); + host_t values(gridy); ddc::for_each(gridy, [&](ddc::DiscreteElement const idx) { values(idx) = sin(ddc::coordinate(idx)); diff --git a/tests/geometryXVx/splitvlasovsolver.cpp b/tests/geometryXVx/splitvlasovsolver.cpp index 0dd117f22..6d0cec77a 100644 --- a/tests/geometryXVx/splitvlasovsolver.cpp +++ b/tests/geometryXVx/splitvlasovsolver.cpp @@ -66,9 +66,9 @@ using namespace ::testing; TEST(SplitVlasovSolver, Ordering) { IDomainSpXVx const dom(IndexSpXVx(0, 0, 0), IVectSpXVx(0, 0, 0)); - device_t fdistribu(dom); - device_t const fdistribu_s(fdistribu); - device_t const efield(ddc::select(dom)); + DFieldSpXVx fdistribu(dom); + DSpanSpXVx const fdistribu_s(fdistribu); + DFieldX const efield(ddc::select(dom)); double const dt = 0.; MockAdvectionX const advec_x; diff --git a/vendor/ddc/CMakeLists.txt b/vendor/ddc/CMakeLists.txt index 597de6227..f2785b535 100644 --- a/vendor/ddc/CMakeLists.txt +++ b/vendor/ddc/CMakeLists.txt @@ -237,7 +237,7 @@ endif() if("${BUILD_SPLINES_KERNEL}") # Ginkgo - find_package(Ginkgo 1.7.0 EXACT REQUIRED) + find_package(Ginkgo 1.7.0 REQUIRED) target_link_libraries(DDC INTERFACE Ginkgo::ginkgo) target_compile_definitions(DDC INTERFACE ginkgo_AVAIL) endif()