17 using T =
typename BareField::value_type;
18 constexpr unsigned Dim = BareField::dim;
20 static IpplTimings::TimerRef setup = IpplTimings::getTimer(
"inner_setup");
21 static IpplTimings::TimerRef ippl_red = IpplTimings::getTimer(
"ippl_reduce");
22 static IpplTimings::TimerRef mpi_red = IpplTimings::getTimer(
"mpi_reduce");
24 IpplTimings::startTimer(setup);
27 auto& layout = f1.getLayout();
28 auto& view1 = f1.getView();
29 auto& view2 = f2.getView();
30 using exec_space =
typename BareField::execution_space;
33 IpplTimings::stopTimer(setup);
34 IpplTimings::startTimer(ippl_red);
36 ippl::parallel_reduce(
38 KOKKOS_LAMBDA(
const index_array_type& args, T& val) {
39 val +=
apply(view1, args) *
apply(view2, args);
43 IpplTimings::stopTimer(ippl_red);
44 IpplTimings::startTimer(mpi_red);
47 layout.comm.allreduce(sum, globalSum, 1, std::plus<T>());
49 IpplTimings::stopTimer(mpi_red);
61 typename BareField::value_type norm(
const BareField& field,
int p = 2) {
62 using T =
typename BareField::value_type;
63 constexpr unsigned Dim = BareField::dim;
66 auto& layout = field.getLayout();
67 auto& view = field.getView();
68 using exec_space =
typename BareField::execution_space;
72 ippl::parallel_reduce(
74 KOKKOS_LAMBDA(
const index_array_type& args, T& val) {
75 T myVal = Kokkos::abs(
apply(view, args));
79 Kokkos::Max<T>(local));
81 layout.comm.allreduce(local, globalMax, 1, std::greater<T>());
85 ippl::parallel_reduce(
87 KOKKOS_LAMBDA(
const index_array_type& args, T& val) {
88 val += Kokkos::pow(Kokkos::abs(
apply(view, args)), p);
90 Kokkos::Sum<T>(local));
92 layout.comm.allreduce(local, globalSum, 1, std::plus<T>());
93 return std::pow(globalSum, 1.0 / p);
KOKKOS_INLINE_FUNCTION constexpr decltype(auto) apply(const View &view, const Coords &coords)
Definition IpplOperations.h:64
T innerProduct(const FEMVector< T > &a, const FEMVector< T > &b)
Calculate the inner product between two ippl::FEMVector(s).
Definition FEMVector.h:407