aboutsummaryrefslogtreecommitdiff
path: root/Source/Parallelization/WarpXCommUtil.H
blob: 2a5ec5390d681ed6da68ccdc12c076fce18d48f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* Copyright 2019 Andrew Myers
 *
 * This file is part of WarpX.
 *
 * License: BSD-3-Clause-LBNL
 */
#ifndef WARPX_COMMUTIL_H_
#define WARPX_COMMUTIL_H_

#include <AMReX_FabArray.H>
#include <AMReX_Gpu.H>
#include <AMReX_iMultiFab.H>
#include <AMReX_MultiFab.H>
#include <AMReX_Periodicity.H>
#include <AMReX_TypeTraits.H>

#include "WarpX.H"

namespace WarpXCommUtil
{

using comm_float_type = float;

template <class FAB1, class FAB2>
void
mixedCopy (amrex::FabArray<FAB1>& dst, amrex::FabArray<FAB2> const& src, int srccomp, int dstcomp, int numcomp, const amrex::IntVect& nghost)
{
    auto const& srcma = src.const_arrays();
    auto const& dstma = dst.arrays();
    ParallelFor(dst, nghost, numcomp,
    [=] AMREX_GPU_DEVICE (int box_no, int i, int j, int k, int n) noexcept
    {
        dstma[box_no](i,j,k,dstcomp+n) = (typename FAB1::value_type) srcma[box_no](i,j,k,srccomp+n);
    });
    amrex::Gpu::synchronize();
}

void ParallelCopy (amrex::MultiFab&            dst,
                   const amrex::MultiFab&      src,
                   int                         src_comp,
                   int                         dst_comp,
                   int                         num_comp,
                   const amrex::IntVect&       src_nghost,
                   const amrex::IntVect&       dst_nghost,
                   const amrex::Periodicity&   period = amrex::Periodicity::NonPeriodic(),
                   amrex::FabArrayBase::CpOp   op = amrex::FabArrayBase::COPY);

void ParallelAdd (amrex::MultiFab&            dst,
                  const amrex::MultiFab&      src,
                  int                         src_comp,
                  int                         dst_comp,
                  int                         num_comp,
                  const amrex::IntVect&       src_nghost,
                  const amrex::IntVect&       dst_nghost,
                  const amrex::Periodicity&   period = amrex::Periodicity::NonPeriodic());

void FillBoundary (amrex::MultiFab&          mf,
                   const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void FillBoundary (amrex::MultiFab&          mf,
                   amrex::IntVect            ng,
                   const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void FillBoundary (amrex::iMultiFab&         mf,
                   const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void FillBoundary (amrex::iMultiFab&         mf,
                   amrex::IntVect            ng,
                   const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void
FillBoundary (amrex::Vector<amrex::MultiFab*> const& mf, const amrex::Periodicity& period);

void SumBoundary (amrex::MultiFab&          mf,
                  const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void SumBoundary (amrex::MultiFab&          mf,
                  int                       start_comp,
                  int                       num_comps,
                  amrex::IntVect            ng,
                  const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void SumBoundary (amrex::MultiFab&          mf,
                  int                       start_comp,
                  int                       num_comps,
                  amrex::IntVect            src_ng,
                  amrex::IntVect            dst_ng,
                  const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());

void OverrideSync (amrex::MultiFab&          mf,
                   const amrex::Periodicity& period = amrex::Periodicity::NonPeriodic());
}

#endif