1 #ifndef TOROIDAL_AVERAGE_HPP
2 #define TOROIDAL_AVERAGE_HPP
13 if(pol_decomp.mpi.n_intpl_ranks==1)
return;
16 View<double*,CLayout, typename T::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_1D((
double*)(f.data()), f.size());
26 bool send_result_to_all_ranks = (DESTINATION_RANK==-1);
27 if(send_result_to_all_ranks){
28 MPI_Allreduce(MPI_IN_PLACE, f_mpi.data(), f_mpi.size(), MPI_DOUBLE, MPI_SUM, pol_decomp.mpi.intpl_comm);
30 if(pol_decomp.mpi.my_intpl_rank==DESTINATION_RANK){
31 MPI_Reduce(MPI_IN_PLACE, f_mpi.data(), f_mpi.size(), MPI_DOUBLE, MPI_SUM, DESTINATION_RANK, pol_decomp.mpi.intpl_comm);
33 MPI_Reduce(f_mpi.data(), f_mpi.data(), f_mpi.size(), MPI_DOUBLE, MPI_SUM, DESTINATION_RANK, pol_decomp.mpi.intpl_comm);
38 if(send_result_to_all_ranks || pol_decomp.mpi.my_intpl_rank==DESTINATION_RANK){
49 if(pol_decomp.mpi.n_intpl_ranks==1)
return;
52 View<double*,CLayout, typename T::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_1D((
double*)(f.data()), f.size());
62 MPI_Allreduce(MPI_IN_PLACE, f_mpi.data(), f_mpi.size(), MPI_DOUBLE, MPI_SUM, pol_decomp.mpi.intpl_comm);
69 double inv_n_planes = 1.0/pol_decomp.mpi.n_intpl_ranks;
72 Kokkos::parallel_for(
"toroidal_average", Kokkos::RangePolicy<typename T::execution_space>(0, f.size()), KOKKOS_LAMBDA(
const int i){
73 f_1D(i) *= inv_n_planes;
82 View<double*,CLayout, typename T::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> f_1D((
double*)(f.data()), f.size());
85 View<double*,CLayout, typename T::device_type> toroidal_avg(
NoInit(
"toroidal_avg"), f_1D.layout());
86 Kokkos::deep_copy(toroidal_avg, f_1D);
92 Kokkos::parallel_for(
"toroidal_average", Kokkos::RangePolicy<typename T::execution_space>(0, f.size()), KOKKOS_LAMBDA(
const int i){
93 f_1D(i) -= toroidal_avg(i);
void mirror_copy(T1 &view_dest, const T2 &view_src)
Definition: my_mirror_view.hpp:122
View< T *, CLayout, Device > my_mirror_scratch_view(const View< T *, CLayout, Device, Kokkos::MemoryTraits< Kokkos::Unmanaged >> &view, Device nd)
Definition: my_mirror_view.hpp:97
View< T *, CLayout, Device > my_mirror_view(const View< T *, CLayout, Device > &view, Device nd)
Definition: my_mirror_view.hpp:14
void parallel_for(const std::string name, int n_ptl, Function func, Option option, HostAoSoA aosoa_h, DeviceAoSoA aosoa_d)
Definition: streamed_parallel_for.hpp:252
Kokkos::Device< HostExSpace, HostMemSpace > HostType
Definition: space_settings.hpp:57
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:69
void toroidal_sum_in_place(const DomainDecomposition< DeviceType > &pol_decomp, T &f, int DESTINATION_RANK=-1)
Definition: toroidal_average.hpp:10
void toroidal_average_in_place(const DomainDecomposition< DeviceType > &pol_decomp, T &f)
Definition: toroidal_average.hpp:46
void remove_toroidal_average(const DomainDecomposition< DeviceType > &pol_decomp, T &f)
Definition: toroidal_average.hpp:101
View< double *, CLayout, typename T::device_type > split_toroidal_average(const DomainDecomposition< DeviceType > &pol_decomp, T &f)
Definition: toroidal_average.hpp:80