Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_ParReduce.H
Go to the documentation of this file.
1#ifndef AMREX_PAR_REDUCE_H_
2#define AMREX_PAR_REDUCE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Concepts.H>
6#include <AMReX_Reduce.H>
7
8namespace amrex {
9
46template <typename... Ops, typename... Ts, BaseFabType FAB, typename F>
47typename ReduceData<Ts...>::Type
48ParReduce (TypeList<Ops...> operation_list, TypeList<Ts...> type_list,
49 FabArray<FAB> const& fa, IntVect const& nghost, F&& f)
50{
51 amrex::ignore_unused(operation_list,type_list);
52 ReduceOps<Ops...> reduce_op;
53 ReduceData<Ts...> reduce_data(reduce_op);
54 reduce_op.eval(fa, nghost, reduce_data, std::forward<F>(f));
55 return reduce_data.value(reduce_op);
56}
57
96template <typename Op, typename T, BaseFabType FAB, typename F>
97T
98ParReduce (TypeList<Op> operation_list, TypeList<T> type_list,
99 FabArray<FAB> const& fa, IntVect const& nghost, F&& f)
100{
101 amrex::ignore_unused(operation_list,type_list);
102 ReduceOps<Op> reduce_op;
103 ReduceData<T> reduce_data(reduce_op);
104 reduce_op.eval(fa, nghost, reduce_data, std::forward<F>(f));
105 auto const& hv = reduce_data.value(reduce_op);
106 return amrex::get<0>(hv);
107}
108
147template <typename... Ops, typename... Ts, BaseFabType FAB, typename F>
148typename ReduceData<Ts...>::Type
149ParReduce (TypeList<Ops...> operation_list, TypeList<Ts...> type_list,
150 FabArray<FAB> const& fa, IntVect const& nghost, int ncomp, F&& f)
151{
152 amrex::ignore_unused(operation_list,type_list);
153 ReduceOps<Ops...> reduce_op;
154 ReduceData<Ts...> reduce_data(reduce_op);
155 reduce_op.eval(fa, nghost, ncomp, reduce_data, std::forward<F>(f));
156 return reduce_data.value(reduce_op);
157}
158
194template <typename Op, typename T, BaseFabType FAB, typename F>
195T
196ParReduce (TypeList<Op> operation_list, TypeList<T> type_list,
197 FabArray<FAB> const& fa, IntVect const& nghost, int ncomp, F&& f)
198{
199 amrex::ignore_unused(operation_list,type_list);
200 ReduceOps<Op> reduce_op;
201 ReduceData<T> reduce_data(reduce_op);
202 reduce_op.eval(fa, nghost, ncomp, reduce_data, std::forward<F>(f));
203 auto const& hv = reduce_data.value(reduce_op);
204 return amrex::get<0>(hv);
205}
206
241template <typename... Ops, typename... Ts, BaseFabType FAB, typename F>
242typename ReduceData<Ts...>::Type
243ParReduce (TypeList<Ops...> operation_list, TypeList<Ts...> type_list,
244 FabArray<FAB> const& fa, F&& f)
245{
246 return ParReduce(operation_list, type_list, fa, IntVect(0), std::forward<F>(f));
247}
248
285template <typename Op, typename T, BaseFabType FAB, typename F>
286T
287ParReduce (TypeList<Op> operation_list, TypeList<T> type_list,
288 FabArray<FAB> const& fa, F&& f)
289{
290 return ParReduce(operation_list, type_list, fa, IntVect(0), std::forward<F>(f));
291}
292
293}
294#endif
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:344
Definition AMReX_Reduce.H:438
Type value()
Definition AMReX_Reduce.H:473
Definition AMReX_Reduce.H:597
void eval(MF const &mf, IntVect const &nghost, D &reduce_data, F &&f)
Definition AMReX_Reduce.H:731
Definition AMReX_Amr.cpp:50
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:139
ReduceData< Ts... >::Type ParReduce(TypeList< Ops... > operation_list, TypeList< Ts... > type_list, FabArray< FAB > const &fa, IntVect const &nghost, F &&f)
Parallel reduce for MultiFab/FabArray. The reduce result is local and it's the user's responsibility ...
Definition AMReX_ParReduce.H:48
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
Struct for holding types.
Definition AMReX_TypeList.H:13