1#ifndef AMREX_MultiFabUtil_H_
2#define AMREX_MultiFabUtil_H_
3#include <AMReX_Config.H>
11#include <AMReX_MultiFabUtil_C.H>
19 const MultiFab& nd,
int scomp,
20 int ncomp,
int ngrow = 0);
22 const MultiFab& nd,
int scomp,
23 int ncomp,
IntVect const& ng_vect);
32 const Vector<const MultiFab*>& edge,
35 const Vector<const MultiFab*>& edge,
45 const Vector<const MultiFab*>& fc,
48 const Vector<const MultiFab*>& fc,
52 template <
typename CMF,
typename FMF,
53 std::enable_if_t<IsFabArray_v<CMF> && IsFabArray_v<FMF>,
int> = 0>
55 const Array<const FMF*,AMREX_SPACEDIM>& fc,
58 template <
typename CMF,
typename FMF,
59 std::enable_if_t<IsFabArray_v<CMF> && IsFabArray_v<FMF>,
int> = 0>
61 const Array<const FMF*,AMREX_SPACEDIM>& fc,
66 const Vector<const MultiFab*>& fc,
67 const Geometry& geom);
70 const Array<const MultiFab*,AMREX_SPACEDIM>& fc,
71 const Geometry& geom);
77 bool use_harmonic_averaging =
false);
83 bool use_harmonic_averaging =
false);
86 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> = 0>
88 const Vector<MF*>&
crse,
92 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> = 0>
94 const Vector<MF*>&
crse,
98 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> = 0>
100 const Array<MF*,AMREX_SPACEDIM>&
crse,
104 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> = 0>
106 const Array<MF*,AMREX_SPACEDIM>&
crse,
115 template <
typename FAB>
117 const IntVect& ratio,
int ngcrse=0);
120 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> = 0>
122 const Array<MF*,AMREX_SPACEDIM>&
crse,
123 const IntVect& ratio,
const Geometry& crse_geom);
125 template <
typename FAB>
127 const IntVect& ratio,
const Geometry& crse_geom);
131 const Vector<MultiFab*>&
crse,
135 const Array<MultiFab*,AMREX_SPACEDIM>&
crse,
142 const IntVect& ratio,
int ngcrse=0);
145 template <
typename FAB>
147 FabArray<FAB>& S_crse,
150 bool mfiter_is_definitely_safe=
false);
158 void average_down (
const MultiFab& S_fine, MultiFab& S_crse,
159 const Geometry& fgeom,
const Geometry& cgeom,
160 int scomp,
int ncomp,
const IntVect& ratio);
161 void average_down (
const MultiFab& S_fine, MultiFab& S_crse,
162 const Geometry& fgeom,
const Geometry& cgeom,
163 int scomp,
int ncomp,
int rr);
168 template<
typename FAB>
169 void average_down (
const FabArray<FAB>& S_fine, FabArray<FAB>& S_crse,
170 int scomp,
int ncomp,
const IntVect& ratio);
171 template<
typename FAB>
172 void average_down (
const FabArray<FAB>& S_fine, FabArray<FAB>& S_crse,
173 int scomp,
int ncomp,
int rr);
178 int scomp,
int ncomp,
180 const Geometry& cgeom,
const Geometry& fgeom);
187 void writeFabs (
const MultiFab& mf,
const std::string& name);
188 void writeFabs (
const MultiFab& mf,
int comp,
int ncomp,
const std::string& name);
194 const Geometry& geom,
int start_comp,
int ncomp,
195 bool interpolate=
false,
196 RealBox
const& bnd_rbx = RealBox());
205 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> FOO = 0>
214 template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> FOO = 0>
220 template <
typename FAB>
221 iMultiFab
makeFineMask (
const FabArray<FAB>& cmf,
const BoxArray& fba,
const IntVect& ratio,
222 int crse_value = 0,
int fine_value = 1,
223 MFInfo
const& info = MFInfo());
224 iMultiFab
makeFineMask (
const BoxArray& cba,
const DistributionMapping& cdm,
225 const BoxArray& fba,
const IntVect& ratio,
226 int crse_value = 0,
int fine_value = 1,
227 MFInfo
const& info = MFInfo());
228 template <
typename FAB>
229 iMultiFab
makeFineMask (
const FabArray<FAB>& cmf,
const BoxArray& fba,
const IntVect& ratio,
230 Periodicity
const& period,
int crse_value,
int fine_value,
231 MFInfo
const& info = MFInfo());
232 iMultiFab
makeFineMask (
const BoxArray& cba,
const DistributionMapping& cdm,
233 const IntVect& cnghost,
const BoxArray& fba,
const IntVect& ratio,
234 Periodicity
const& period,
int crse_value,
int fine_value,
235 MFInfo
const& info = MFInfo());
236 template <
typename FAB>
237 iMultiFab
makeFineMask (
const FabArray<FAB>& cmf,
const FabArray<FAB>& fmf,
239 Periodicity
const& period,
int crse_value,
int fine_value,
240 MFInfo
const& info = MFInfo());
241 template <
typename FAB>
242 iMultiFab
makeFineMask (
const FabArray<FAB>& cmf,
const FabArray<FAB>& fmf,
244 Periodicity
const& period,
int crse_value,
int fine_value,
245 LayoutData<int>& has_cf,
246 MFInfo
const& info = MFInfo());
248 MultiFab
makeFineMask (
const BoxArray& cba,
const DistributionMapping& cdm,
249 const BoxArray& fba,
const IntVect& ratio,
251 MFInfo
const& info = MFInfo());
254 void computeDivergence (MultiFab& divu,
const Array<MultiFab const*,AMREX_SPACEDIM>& umac,
255 const Geometry& geom);
258 void computeGradient (MultiFab& grad,
const Array<MultiFab const*,AMREX_SPACEDIM>& umac,
259 const Geometry& geom);
268 Periodicity
const& period);
271 template <
typename T,
typename U>
274 T mf_out(mf_in.boxArray(), mf_in.DistributionMap(), mf_in.nComp(), mf_in.nGrowVect());
277#pragma omp parallel if (Gpu::notInLaunchRegion())
281 const Long n = mfi.fabbox().numPts() * mf_in.nComp();
282 auto *
pdst = mf_out[mfi].dataPtr();
283 auto const* psrc = mf_in [mfi].dataPtr();
286 pdst[i] =
static_cast<typename T::value_type
>(psrc[i]);
352 template <
typename Op,
typename T,
typename FAB,
typename F,
353 std::enable_if_t<IsBaseFab<FAB>::value
354#ifndef AMREX_USE_CUDA
355 && IsCallableR<T,F,int,int,int,int>::value
359 ReduceToPlane (
int direction,
Box const& domain, FabArray<FAB>
const& mf,
F const& f);
405 template <
typename Op,
typename FA,
typename F,
406 std::enable_if_t<IsMultiFabLike_v<FA>
407#ifndef AMREX_USE_CUDA
408 && IsCallableR<
typename FA::value_type,
456 template <
typename Op,
typename FA,
typename F,
457 std::enable_if_t<IsMultiFabLike_v<FA>
458#ifndef AMREX_USE_CUDA
459 && IsCallableR<
typename FA::value_type,
490 template <
typename Op,
typename FA,
typename F,
491 std::enable_if_t<IsMultiFabLike_v<FA>
492#ifndef AMREX_USE_CUDA
493 && IsCallableR<
typename FA::value_type,
515 Gpu::HostVector<Real>
sumToLine (MultiFab
const& mf,
int icomp,
int ncomp,
516 Box const& domain,
int direction,
bool local =
false);
526 Vector<Geometry>
const& geom,
527 Vector<IntVect>
const& ratio,
557 void FillRandom (MultiFab& mf,
int scomp,
int ncomp);
583 [[nodiscard]] Vector<MultiFab>
convexify (Vector<MultiFab const*>
const& mf,
584 Vector<IntVect>
const& refinement_ratio);
589template <
typename FAB>
592 int crse_value,
int fine_value,
MFInfo const& info)
599template <
typename FAB>
602 Periodicity const& period,
int crse_value,
int fine_value,
606 fba, ratio, period, crse_value, fine_value, info);
609template <
typename FAB>
613 Periodicity const& period,
int crse_value,
int fine_value,
617 mask.setVal(crse_value);
620 1, 0,
MFInfo().SetAlloc(
false));
622 mask.setVal(fine_value, cpc, 0, 1);
627template <
typename FAB>
631 Periodicity const& period,
int crse_value,
int fine_value,
635 mask.setVal(crse_value);
638 1, 0,
MFInfo().SetAlloc(
false));
640 mask.setVal(fine_value, cpc, 0, 1);
642 has_cf =
mask.RecvLayoutMask(cpc);
649template <
typename FAB>
651 const IntVect& ratio,
int ngcrse,
bool mfiter_is_definitely_safe)
657 int ncomp =
crse.nComp();
658 using value_type =
typename FAB::value_type;
663#pragma omp parallel if (Gpu::notInLaunchRegion())
667 const Box& bx = mfi.growntilebox(ngcrse);
673 amrex_avgdown_nodes(tbx,crsearr,finearr,0,0,ncomp,ratio);
682 crse.ParallelCopy(ctmp,0,0,ncomp,ngcrse,ngcrse);
691template<
typename FAB>
697template<
typename FAB>
699 int scomp,
int ncomp,
const IntVect& ratio)
706 using value_type =
typename FAB::value_type;
719 auto const& crsema = S_crse.
arrays();
721 if (is_cell_centered) {
725 amrex_avgdown(i,j,k,n,crsema[box_no],finema[box_no],scomp,scomp,ratio);
731 amrex_avgdown_nodes(i,j,k,n,crsema[box_no],finema[box_no],scomp,scomp,ratio);
741#pragma omp parallel if (Gpu::notInLaunchRegion())
746 const Box& bx = mfi.tilebox();
750 if (is_cell_centered) {
753 amrex_avgdown(i,j,k,n,crsearr,finearr,scomp,scomp,ratio);
758 amrex_avgdown_nodes(i,j,k,n,crsearr,finearr,scomp,scomp,ratio);
770 auto const& crsema = crse_S_fine.
arrays();
772 if (is_cell_centered) {
776 amrex_avgdown(i,j,k,n,crsema[box_no],finema[box_no],0,scomp,ratio);
782 amrex_avgdown_nodes(i,j,k,n,crsema[box_no],finema[box_no],0,scomp,ratio);
792#pragma omp parallel if (Gpu::notInLaunchRegion())
797 const Box& bx = mfi.tilebox();
805 if (is_cell_centered) {
808 amrex_avgdown(i,j,k,n,crsearr,finearr,0,scomp,ratio);
813 amrex_avgdown_nodes(i,j,k,n,crsearr,finearr,0,scomp,ratio);
839 int numcomp,
IntVect nghost,
bool local)
842 BL_ASSERT(
x.DistributionMap() ==
y.DistributionMap());
843 BL_ASSERT(
x.nGrowVect().allGE(nghost) &&
y.nGrowVect().allGE(nghost));
848 auto const& xma =
x.const_arrays();
849 auto const& yma =
y.const_arrays();
854 auto const& xfab = xma[box_no];
855 auto const& yfab = yma[box_no];
856 for (
int n = 0; n < numcomp; ++n) {
857 t += f(xfab(i,j,k,xcomp+n) , yfab(i,j,k,ycomp+n));
865#pragma omp parallel if (!system::regtest_reduction) reduction(+:sm)
869 Box const& bx = mfi.growntilebox(nghost);
874 sm += f(xfab(i,j,k,xcomp+n) , yfab(i,j,k,ycomp+n));
894template <
typename MMF,
typename Pred,
typename F>
901 int numcomp,
IntVect nghost,
bool local)
905 BL_ASSERT(
x.DistributionMap() ==
y.DistributionMap());
907 BL_ASSERT(
x.nGrowVect().allGE(nghost) &&
y.nGrowVect().allGE(nghost));
913 auto const& xma =
x.const_arrays();
914 auto const& yma =
y.const_arrays();
915 auto const& mma =
mask.const_arrays();
920 if (pf(mma[box_no](i,j,k))) {
921 auto const& xfab = xma[box_no];
922 auto const& yfab = yma[box_no];
923 for (
int n = 0; n < numcomp; ++n) {
924 t += f(xfab(i,j,k,xcomp+n) , yfab(i,j,k,ycomp+n));
933#pragma omp parallel if (!system::regtest_reduction) reduction(+:sm)
937 Box const& bx = mfi.growntilebox(nghost);
940 auto const& mfab =
mask.const_array(mfi);
943 if (pf(mfab(i,j,k))) {
944 sm += f(xfab(i,j,k,xcomp+n) , yfab(i,j,k,ycomp+n));
957template <
typename CMF,
typename FMF,
958 std::enable_if_t<IsFabArray_v<CMF> && IsFabArray_v<FMF>,
int> FOO>
967template <
typename CMF,
typename FMF,
968 std::enable_if_t<IsFabArray_v<CMF> && IsFabArray_v<FMF>,
int> FOO>
978 auto const& ccma = cc.arrays();
980 auto const& fyma = fc[1]->const_arrays();,
981 auto const& fzma = fc[2]->const_arrays(););
985#if (AMREX_SPACEDIM == 1)
989 amrex_avg_fc_to_cc(i,j,k, ccma[box_no],
AMREX_D_DECL(fxma[box_no],
993#
if (AMREX_SPACEDIM == 1)
1005#pragma omp parallel if (Gpu::notInLaunchRegion())
1009 const Box bx = mfi.growntilebox(ng_vect);
1010 auto const& ccarr = cc.array(mfi);
1011 AMREX_D_TERM(
auto const& fxarr = fc[0]->const_array(mfi);,
1012 auto const& fyarr = fc[1]->const_array(mfi);,
1013 auto const& fzarr = fc[2]->const_array(mfi););
1015#if (AMREX_SPACEDIM == 1)
1020 amrex_avg_fc_to_cc(i,j,k, ccarr, fxarr, dcomp, gd);
1025 amrex_avg_fc_to_cc(i,j,k, ccarr,
AMREX_D_DECL(fxarr,fyarr,fzarr), dcomp);
1032template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int>>
1035 const IntVect& ratio,
int ngcrse)
1045template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int>>
1052template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int>>
1055 int ratio,
int ngcrse)
1060template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int>>
1063 const IntVect& ratio,
int ngcrse)
1065 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
1070template <
typename FAB>
1072 const IntVect& ratio,
int ngcrse)
1078 const auto type =
fine.ixType();
1080 for (dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1081 if (type.nodeCentered(dir)) {
break; }
1083 auto tmptype = type;
1085 if (dir >= AMREX_SPACEDIM || !tmptype.cellCentered()) {
1086 amrex::Abort(
"average_down_faces: not face index type");
1088 const int ncomp =
crse.nComp();
1093 auto const& crsema =
crse.arrays();
1094 auto const& finema =
fine.const_arrays();
1098 amrex_avgdown_faces(i,j,k,n, crsema[box_no], finema[box_no], 0, 0, ratio, dir);
1107#pragma omp parallel if (Gpu::notInLaunchRegion())
1111 const Box& bx = mfi.growntilebox(ngcrse);
1112 auto const& crsearr =
crse.array(mfi);
1113 auto const& finearr =
fine.const_array(mfi);
1116 amrex_avgdown_faces(i,j,k,n, crsearr, finearr, 0, 0, ratio, dir);
1126 crse.ParallelCopy(ctmp,0,0,ncomp,ngcrse,ngcrse);
1130template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int>>
1135 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
1140template <
typename FAB>
1150template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> FOO>
1153 using T =
typename MF::value_type;
1154 const int ncomp = mf.nComp();
1156 auto* dp = dv.
data();
1158 auto loc = cell.
dim3();
1161 Box const& box = mfi.validbox();
1164 auto const& fab = mf.const_array(mfi);
1167 for (
int n = 0; n < ncomp; ++n) {
1168 dp[n] = fab(loc.x,loc.y,loc.z,n);
1181template <typename MF, std::enable_if_t<IsFabArray<MF>::value,
int> FOO>
1184 bool do_bnd = (!bnd_bx.
isEmpty());
1186 BoxArray const& ba = mf.boxArray();
1188 const auto nboxes =
static_cast<int>(ba.
size());
1194 for (
int i = 0; i < nboxes; ++i) {
1195 Box const& b = ba[i];
1203 procmap.push_back(dm[i]);
1204 index_map.push_back(i);
1208 for (
int i = 0; i < nboxes; ++i) {
1209 Box const& b = ba[i];
1210 Box const& b1d = bnd_bx & b;
1213 procmap.push_back(dm[i]);
1214 index_map.push_back(i);
1224 MF rmf(rba, rdm, mf.nComp(),
IntVect(0),
1225 MFInfo().SetArena(mf.arena()));
1227#pragma omp parallel if (Gpu::notInLaunchRegion())
1230 Box const& b = mfi.validbox();
1231 auto const& dfab = rmf.array(mfi);
1232 auto const& sfab = mf.const_array(index_map[mfi.index()]);
1236 dfab(i,j,k,n) = sfab(i,j,k,n);
1245template <
typename Op,
typename T,
typename F>
1246void reduce_to_plane (Array4<T>
const& ar,
int direction,
Box const& bx,
int box_no,
1249#if defined(AMREX_USE_GPU)
1254 constexpr int nthreads = 128;
1255 auto nblocks =
static_cast<int>(b2d.numPts());
1256#ifdef AMREX_USE_SYCL
1258 amrex::launch<nthreads>(nblocks, shared_mem_bytes,
Gpu::gpuStream(),
1261 int bid = h.blockIdx();
1262 int tid = h.threadIdx();
1267 int bid = blockIdx.x;
1268 int tid = threadIdx.x;
1273 if (direction == 0) {
1274 int k = bid / len.y;
1275 int j = bid - k*len.y;
1278 for (
int i = blo.x + tid; i < blo.x+len.x; i += nthreads) {
1279 Op().local_update(tmp, f(box_no,i,j,k));
1282 }
else if (direction == 1) {
1283 int k = bid / len.x;
1284 int i = bid - k*len.x;
1287 for (
int j = blo.y + tid; j < blo.y+len.y; j += nthreads) {
1288 Op().local_update(tmp, f(box_no,i,j,k));
1292 int j = bid / len.x;
1293 int i = bid - j*len.x;
1296 for (
int k = blo.z + tid; k < blo.z+len.z; k += nthreads) {
1297 Op().local_update(tmp, f(box_no,i,j,k));
1301#ifdef AMREX_USE_SYCL
1302 Op().template parallel_update<T>(*p, tmp, h);
1304 Op().template parallel_update<T,nthreads>(*p, tmp);
1309 if (direction == 0) {
1312 Op().local_update(ar(0,j,k), f(box_no,i,j,k));
1314 }
else if (direction == 1) {
1317 Op().local_update(ar(i,0,k), f(box_no,i,j,k));
1322 Op().local_update(ar(i,j,0), f(box_no,i,j,k));
1330template <
typename Op,
typename T,
typename FAB,
typename F,
1331 std::enable_if_t<IsBaseFab<FAB>::value
1332#ifndef AMREX_USE_CUDA
1333 && IsCallableR<T,F,int,int,int,int>::value
1341 Box domain2d = domain;
1348 r.template setVal<RunOn::Device>(initval);
1349 auto const& ar = r.
array();
1351 for (
MFIter mfi(mf,
MFItInfo().UseDefaultStream().DisableDeviceSync());
1354 Box bx = mfi.validbox() & domain;
1356 int box_no = mfi.LocalIndex();
1357 detail::reduce_to_plane<Op, T>(ar, direction, bx, box_no, f);
1369template <
typename Op,
typename FA,
typename F>
1370FA reduce_to_plane (
int direction, Box
const& domain, FA
const& mf, F
const& f)
1372 using T =
typename FA::value_type;
1378 amrex::Abort(
"ReduceToPlaneMF: mf's BoxArray must have a rectangular domain.");
1384 BoxList bl = mf.boxArray().boxList();
1385 for (
auto& b : bl) {
1386 b.setRange(direction, 0);
1388 BoxArray ba(std::move(bl));
1389 FA tmpfa(ba, mf.DistributionMap(), 1, 0);
1390 tmpfa.setVal(initval);
1392 for (MFIter mfi(mf); mfi.isValid(); ++mfi)
1394 Box bx = mfi.validbox() & ndomain;
1396 int box_no = mfi.LocalIndex();
1397 detail::reduce_to_plane<Op, T>(tmpfa.array(mfi), direction, bx, box_no, f);
1406template <
typename Op,
typename FA,
typename F,
1407 std::enable_if_t<IsMultiFabLike_v<FA>
1408#ifndef AMREX_USE_CUDA
1409 && IsCallableR<
typename FA::value_type,
1415 auto [fa3, fa2] = ReduceToPlaneMF2<Op>(direction, domain, mf, f);
1416 fa3.ParallelCopy(fa2);
1417 return std::move(fa3);
1420template <
typename Op,
typename FA,
typename F,
1421 std::enable_if_t<IsMultiFabLike_v<FA>
1422#ifndef AMREX_USE_CUDA
1423 && IsCallableR<
typename FA::value_type,
1430 using T =
typename FA::value_type;
1435 auto tmpmf = detail::reduce_to_plane<Op>(direction, domain, mf, f);
1439 auto const& ba3d = mf.boxArray();
1440 auto const& dm3d = mf.DistributionMap();
1441 int dlo = domain.
smallEnd(direction);
1442 for (
int i = 0, N = mf.size(); i < N; ++i) {
1444 if (b.
smallEnd(direction) <= dlo && dlo <= b.
bigEnd(direction)) {
1447 procmap2d.push_back(dm3d[i]);
1454 FA mf2d(ba2d, dm2d, 1, 0);
1455 mf2d.setVal(initval);
1457 static_assert(std::is_same_v<Op, ReduceOpSum>,
"Currently only ReduceOpSum is supported.");
1458 mf2d.ParallelAdd(tmpmf);
1460 return std::make_pair(std::move(tmpmf), std::move(mf2d));
1463template <
typename Op,
typename FA,
typename F,
1464 std::enable_if_t<IsMultiFabLike_v<FA>
1465#ifndef AMREX_USE_CUDA
1466 && IsCallableR<
typename FA::value_type,
1477 "ReduceToPlaneMF2Patchy: subdomains are not supported; domain must cover the full extent of mf.boxArray().");
1479 using T =
typename FA::value_type;
1483 BoxList bl_patch2d = mf.boxArray().boxList();
1484 for (
auto& b : bl_patch2d) {
1485 b.setRange(direction, 0);
1487 BoxArray ba_patch2d(std::move(bl_patch2d));
1488 FA tmpmf(ba_patch2d, mf.DistributionMap(), 1, 0);
1489 tmpmf.setVal(initval);
1493 Box bx = mfi.validbox() & ndomain;
1495 int box_no = mfi.LocalIndex();
1496 detail::reduce_to_plane<Op, T>(tmpmf.array(mfi), direction, bx, box_no, f);
1502 BoxArray ba2d(std::move(bl_unique));
1506 FA mf2d(ba2d, dm2d, 1, 0);
1507 mf2d.setVal(initval);
1509 static_assert(std::is_same_v<Op, ReduceOpSum>,
"Currently only ReduceOpSum is supported.");
1510 mf2d.ParallelAdd(tmpmf);
1512 return std::make_pair(std::move(tmpmf), std::move(mf2d));
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:551
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define BL_ASSERT(EX)
Definition AMReX_BLassert.H:39
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_HOST_DEVICE_PARALLEL_FOR_1D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:109
#define AMREX_HOST_DEVICE_PARALLEL_FOR_3D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:110
#define AMREX_HOST_DEVICE_PARALLEL_FOR_4D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:111
#define AMREX_LAUNCH_HOST_DEVICE_LAMBDA(...)
Definition AMReX_GpuLaunch.nolint.H:16
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1139
Real * pdst
Definition AMReX_HypreMLABecLap.cpp:1140
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
#define AMREX_LOOP_3D(bx, i, j, k, block)
Definition AMReX_Loop.nolint.H:4
#define AMREX_LOOP_4D(bx, ncomp, i, j, k, n, block)
Definition AMReX_Loop.nolint.H:16
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
A FortranArrayBox(FAB)-like object.
Definition AMReX_BaseFab.H:190
Array4< T const > array() const noexcept
Definition AMReX_BaseFab.H:382
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:568
IndexType ixType() const noexcept
Return index type of this BoxArray.
Definition AMReX_BoxArray.H:858
BoxList boxList() const
Create a BoxList from this BoxArray.
Definition AMReX_BoxArray.cpp:949
void removeOverlap(bool simplify=true)
Change the BoxArray to one with no overlap and then simplify it (see the simplify function in BoxList...
Definition AMReX_BoxArray.cpp:1456
BoxArray & coarsen(int refinement_ratio)
Coarsen each Box in the BoxArray to the specified ratio.
Definition AMReX_BoxArray.cpp:672
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:615
A class for managing a List of Boxes that share a common IndexType. This class implements operations ...
Definition AMReX_BoxList.H:52
bool isEmpty() const noexcept
Is this BoxList empty?
Definition AMReX_BoxList.H:135
int simplify(bool best=false)
Merge adjacent Boxes in this BoxList. Return the number of Boxes merged. If "best" is specified we do...
Definition AMReX_BoxList.cpp:654
void push_back(const Box &bn)
Append a Box to this BoxList.
Definition AMReX_BoxList.H:93
__host__ __device__ const IntVectND< dim > & bigEnd() const &noexcept
Return the inclusive upper bound of the box.
Definition AMReX_Box.H:123
__host__ __device__ bool isEmpty() const noexcept
Checks if it is an empty BoxND.
Definition AMReX_Box.H:204
__host__ __device__ bool contains(const IntVectND< dim > &p) const noexcept
Return true if argument is contained within BoxND.
Definition AMReX_Box.H:212
__host__ __device__ IndexTypeND< dim > ixType() const noexcept
Return the indexing type.
Definition AMReX_Box.H:135
__host__ __device__ BoxND & setRange(int dir, int sm_index, int n_cells=1) noexcept
Set the entire range in a given direction, starting at sm_index with length n_cells....
Definition AMReX_Box.H:1108
__host__ __device__ bool ok() const noexcept
Checks if it is a proper BoxND (including a valid type).
Definition AMReX_Box.H:208
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:111
Definition AMReX_FabFactory.H:76
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
bool isFusingCandidate() const noexcept
Is this a good candidate for kernel fusing?
Definition AMReX_FabArrayBase.cpp:2704
bool is_cell_centered() const noexcept
This tests on whether the FabArray is cell-centered.
Definition AMReX_FabArrayBase.cpp:2698
bool is_nodal() const noexcept
This tests on whether the FabArray is fully nodal.
Definition AMReX_FabArrayBase.cpp:2686
IndexType ixType() const noexcept
Return index type.
Definition AMReX_FabArrayBase.H:86
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:131
int nComp() const noexcept
Return number of variables (aka components) associated with each point.
Definition AMReX_FabArrayBase.H:83
const BoxArray & boxArray() const noexcept
Return a constant reference to the BoxArray that defines the valid region associated with this FabArr...
Definition AMReX_FabArrayBase.H:95
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:349
Array4< typename FabArray< FAB >::value_type const > const_array(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:589
void ParallelCopy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:849
Array4< typename FabArray< FAB >::value_type const > array(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:565
MultiArray4< typename FabArray< FAB >::value_type > arrays() noexcept
Definition AMReX_FabArray.H:637
MultiArray4< typename FabArray< FAB >::value_type const > const_arrays() const noexcept
Definition AMReX_FabArray.H:651
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
Periodicity periodicity() const noexcept
Definition AMReX_Geometry.H:356
GPU-compatible tuple.
Definition AMReX_Tuple.H:98
static constexpr int warp_size
Definition AMReX_GpuDevice.H:236
__host__ static __device__ constexpr IntVectND< dim > TheUnitVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:689
__host__ static __device__ constexpr IntVectND< dim > TheZeroVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:679
__host__ __device__ constexpr Dim3 dim3() const noexcept
Definition AMReX_IntVect.H:173
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:85
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:169
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
iterator begin() noexcept
Definition AMReX_PODVector.H:674
iterator end() noexcept
Definition AMReX_PODVector.H:678
T * data() noexcept
Definition AMReX_PODVector.H:666
This provides length of period for periodic domains. 0 means it is not periodic in that direction....
Definition AMReX_Periodicity.H:17
static const Periodicity & NonPeriodic() noexcept
Definition AMReX_Periodicity.cpp:52
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
A Collection of IArrayBoxes.
Definition AMReX_iMultiFab.H:34
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
amrex_long Long
Definition AMReX_INT.H:30
__host__ __device__ Dim3 length(Array4< T > const &a) noexcept
Return the spatial extents of an Array4 in Dim3 form.
Definition AMReX_Array4.H:1345
__host__ __device__ Dim3 lbound(Array4< T > const &a) noexcept
Return the inclusive lower bounds of an Array4 in Dim3 form.
Definition AMReX_Array4.H:1317
__host__ __device__ BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) coarsening ratio.
Definition AMReX_Box.H:1409
std::array< T, N > Array
Definition AMReX_Array.H:26
void Sum(T &v, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:221
void copy(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
A host-to-device copy routine. Note this is just a wrapper around memcpy, so it assumes contiguous st...
Definition AMReX_GpuContainers.H:128
static constexpr DeviceToHost deviceToHost
Definition AMReX_GpuContainers.H:106
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:310
bool inLaunchRegion() noexcept
Definition AMReX_GpuControl.H:92
bool inNoSyncRegion() noexcept
Definition AMReX_GpuControl.H:152
gpuStream_t gpuStream() noexcept
Definition AMReX_GpuDevice.H:291
MPI_Comm CommunicatorSub() noexcept
sub-communicator for current frame
Definition AMReX_ParallelContext.H:70
Definition AMReX_Amr.cpp:49
__host__ __device__ BoxND< dim > convert(const BoxND< dim > &b, const IntVectND< dim > &typ) noexcept
Return a BoxND with different type.
Definition AMReX_Box.H:1558
void FillRandomNormal(MultiFab &mf, int scomp, int ncomp, Real mean, Real stddev)
Fill MultiFab with random numbers from normal distribution.
Definition AMReX_MultiFabUtil.cpp:1238
int nComp(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2851
void FillRandom(MultiFab &mf, int scomp, int ncomp)
Fill MultiFab with random numbers from uniform distribution.
Definition AMReX_MultiFabUtil.cpp:1225
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:193
void average_down(const MultiFab &S_fine, MultiFab &S_crse, const Geometry &fgeom, const Geometry &cgeom, int scomp, int ncomp, int rr)
Definition AMReX_MultiFabUtil.cpp:336
__host__ __device__ void cast(BaseFab< Tto > &tofab, BaseFab< Tfrom > const &fromfab, Box const &bx, SrcComp scomp, DestComp dcomp, NumComps ncomp) noexcept
Definition AMReX_BaseFabUtility.H:13
std::unique_ptr< MultiFab > get_slice_data(int dir, Real coord, const MultiFab &cc, const Geometry &geom, int start_comp, int ncomp, bool interpolate, RealBox const &bnd_rbx)
Definition AMReX_MultiFabUtil.cpp:574
Vector< typename MF::value_type > get_cell_data(MF const &mf, IntVect const &cell)
Get data in a cell of MultiFab/FabArray.
Definition AMReX_MultiFabUtil.H:1151
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
void average_face_to_cellcenter(MultiFab &cc, int dcomp, const Vector< const MultiFab * > &fc, IntVect const &ng_vect)
Definition AMReX_MultiFabUtil.cpp:155
iMultiFab makeFineMask(const BoxArray &cba, const DistributionMapping &cdm, const BoxArray &fba, const IntVect &ratio, int crse_value, int fine_value, MFInfo const &info)
Definition AMReX_MultiFabUtil.cpp:629
BaseFab< T > ReduceToPlane(int direction, Box const &domain, FabArray< FAB > const &mf, F const &f)
Reduce FabArray/MultiFab data to a plane Fab.
Definition AMReX_MultiFabUtil.H:1337
std::pair< FA, FA > ReduceToPlaneMF2(int direction, Box const &domain, FA const &mf, F const &f)
Reduce FabArray/MultiFab data to plane FabArray.
Definition AMReX_MultiFabUtil.H:1428
Vector< MultiFab > convexify(Vector< MultiFab const * > const &mf, Vector< IntVect > const &refinement_ratio)
Convexify AMR data.
Definition AMReX_MultiFabUtil.cpp:1251
FA ReduceToPlaneMF(int direction, Box const &domain, FA const &mf, F const &f)
Reduce FabArray/MultiFab data to plane FabArray.
Definition AMReX_MultiFabUtil.H:1413
std::pair< FA, FA > ReduceToPlaneMF2Patchy(int direction, Box const &domain, FA const &mf, F const &f)
Reduce FabArray/MultiFab data to plane FabArray for patchy BoxArrays.
Definition AMReX_MultiFabUtil.H:1471
void average_down_faces(const Vector< const MF * > &fine, const Vector< MF * > &crse, const IntVect &ratio, int ngcrse=0)
Average fine face-based FabArray onto crse face-based FabArray.
Definition AMReX_MultiFabUtil.H:1033
MultiFab periodicShift(MultiFab const &mf, IntVect const &offset, Periodicity const &period)
Periodic shift MultiFab.
Definition AMReX_MultiFabUtil.cpp:818
Real volumeWeightedSum(Vector< MultiFab const * > const &mf, int icomp, Vector< Geometry > const &geom, Vector< IntVect > const &ratio, bool local)
Volume weighted sum for a vector of MultiFabs.
Definition AMReX_MultiFabUtil.cpp:984
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:30
bool isMFIterSafe(const FabArrayBase &x, const FabArrayBase &y)
Definition AMReX_MFIter.H:249
MultiFab ToMultiFab(const iMultiFab &imf)
Convert iMultiFab to MultiFab.
Definition AMReX_MultiFabUtil.cpp:564
void writeFabs(const MultiFab &mf, const std::string &name)
Write each fab individually.
Definition AMReX_MultiFabUtil.cpp:551
Real NormHelper(const MultiFab &x, int xcomp, const MultiFab &y, int ycomp, F const &f, int numcomp, IntVect nghost, bool local)
Returns part of a norm based on two MultiFabs.
Definition AMReX_MultiFabUtil.H:836
void computeDivergence(MultiFab &divu, const Array< MultiFab const *, 3 > &umac, const Geometry &geom)
Computes divergence of face-data stored in the umac MultiFab.
Definition AMReX_MultiFabUtil.cpp:717
void average_down_edges(const Vector< const MultiFab * > &fine, const Vector< MultiFab * > &crse, const IntVect &ratio, int ngcrse)
Average fine edge-based MultiFab onto crse edge-based MultiFab.
Definition AMReX_MultiFabUtil.cpp:469
Gpu::HostVector< Real > sumToLine(MultiFab const &mf, int icomp, int ncomp, Box const &domain, int direction, bool local)
Sum MultiFab data to line.
Definition AMReX_MultiFabUtil.cpp:842
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
void print_state(const MultiFab &mf, const IntVect &cell, const int n, const IntVect &ng)
Output state data for a single zone.
Definition AMReX_MultiFabUtil.cpp:546
bool TilingIfNotGPU() noexcept
Definition AMReX_MFIter.H:12
void sum_fine_to_coarse(const MultiFab &S_fine, MultiFab &S_crse, int scomp, int ncomp, const IntVect &ratio, const Geometry &cgeom, const Geometry &)
Definition AMReX_MultiFabUtil.cpp:415
void average_cellcenter_to_face(const Vector< MultiFab * > &fc, const MultiFab &cc, const Geometry &geom, int ncomp, bool use_harmonic_averaging)
Average cell-centered MultiFab onto face-based MultiFab with geometric weighting.
Definition AMReX_MultiFabUtil.cpp:240
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:240
const int[]
Definition AMReX_BLProfiler.cpp:1664
void average_node_to_cellcenter(MultiFab &cc, int dcomp, const MultiFab &nd, int scomp, int ncomp, int ngrow)
Average nodal-based MultiFab onto cell-centered MultiFab.
Definition AMReX_MultiFabUtil.cpp:62
void FourthOrderInterpFromFineToCoarse(MultiFab &cmf, int scomp, int ncomp, MultiFab const &fmf, IntVect const &ratio)
Fourth-order interpolation from fine to coarse level.
Definition AMReX_MultiFabUtil.cpp:1138
FabArray< BaseFab< Long > > ToLongMultiFab(const iMultiFab &imf)
Convert iMultiFab to Long.
Definition AMReX_MultiFabUtil.cpp:569
MF get_line_data(MF const &mf, int dir, IntVect const &cell, Box const &bnd_bx=Box())
Get data in a line of MultiFab/FabArray.
Definition AMReX_MultiFabUtil.H:1182
void computeGradient(MultiFab &grad, const Array< MultiFab const *, 3 > &umac, const Geometry &geom)
Computes gradient of face-data stored in the umac MultiFab.
Definition AMReX_MultiFabUtil.cpp:769
void average_edge_to_cellcenter(MultiFab &cc, int dcomp, const Vector< const MultiFab * > &edge, int ngrow)
Average edge-based MultiFab onto cell-centered MultiFab.
Definition AMReX_MultiFabUtil.cpp:104
void average_down_nodal(const FabArray< FAB > &S_fine, FabArray< FAB > &S_crse, const IntVect &ratio, int ngcrse=0, bool mfiter_is_definitely_safe=false)
Average fine node-based MultiFab onto crse node-centered MultiFab.
Definition AMReX_MultiFabUtil.H:650
A multidimensional array accessor.
Definition AMReX_Array4.H:283
parallel copy or add
Definition AMReX_FabArrayBase.H:538
Definition AMReX_Geometry.H:25
int coord
Definition AMReX_Geometry.H:59
FabArray memory allocation information.
Definition AMReX_FabArray.H:66
Definition AMReX_MFIter.H:20
Struct for holding types.
Definition AMReX_TypeList.H:13