4#include <AMReX_Config.H>
58template <typename T, std::enable_if_t<!IsBaseFab<T>::value,
int> = 0>
92 template <
typename T,
typename... Ts>
94 tags.emplace_back(std::forward<T>(t));
95 return SetTag(std::forward<Ts>(ts)...);
163 explicit operator bool() const noexcept {
176template <
class DFAB,
class SFAB,
177 std::enable_if_t<std::conjunction_v<
179 std::is_convertible<
typename SFAB::value_type,
180 typename DFAB::value_type>>,
int> BAR = 0>
184 Copy(dst,src,srccomp,dstcomp,numcomp,
IntVect(nghost));
187template <
class DFAB,
class SFAB,
188 std::enable_if_t<std::conjunction_v<
189 IsBaseFab<DFAB>, IsBaseFab<SFAB>,
190 std::is_convertible<
typename SFAB::value_type,
191 typename DFAB::value_type>>,
int> BAR = 0>
197 using DT =
typename DFAB::value_type;
202 if constexpr (std::is_same_v<typename SFAB::value_type, typename DFAB::value_type>) {
211 auto const& dstarr = dst.
arrays();
215 dstarr[box_no](i,j,k,dstcomp+n) = DT(srcarr[box_no](i,j,k,srccomp+n));
224#pragma omp parallel if (Gpu::notInLaunchRegion())
228 const Box& bx = mfi.growntilebox(nghost);
232 auto const& dstFab = dst.
array(mfi);
235 dstFab(i,j,k,dstcomp+n) = DT(srcFab(i,j,k,srccomp+n));
243 class bar = std::enable_if_t<IsBaseFab<FAB>::value> >
247 Add(dst,src,srccomp,dstcomp,numcomp,
IntVect(nghost));
251 class bar = std::enable_if_t<IsBaseFab<FAB>::value> >
259 auto const& dstfa = dst.
arrays();
264 dstfa[box_no](i,j,k,n+dstcomp) += srcfa[box_no](i,j,k,n+srccomp);
273#pragma omp parallel if (Gpu::notInLaunchRegion())
277 const Box& bx = mfi.growntilebox(nghost);
280 auto const srcFab = src.
array(mfi);
281 auto dstFab = dst.
array(mfi);
284 dstFab(i,j,k,n+dstcomp) += srcFab(i,j,k,n+srccomp);
388#ifdef AMREX_STRICT_MODE
400#ifdef AMREX_STRICT_MODE
429#ifdef AMREX_STRICT_MODE
441#ifdef AMREX_STRICT_MODE
459 return (f !=
nullptr);
530 const FAB&
get (
int K)
const noexcept {
return *(this->
fabPtr(K)); }
536 FAB&
get (
int K)
noexcept {
return *(this->
fabPtr(K)); }
546 FAB
const*
fabPtr (
int K)
const noexcept;
548 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
552 this->
fabPtr(mfi)->prefetchToHost();
558 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
562 this->
fabPtr(mfi)->prefetchToDevice();
568 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
571 return fabPtr(mfi)->const_array();
574 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
577 return fabPtr(mfi)->array();
580 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
583 return fabPtr(K)->const_array();
586 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
589 return fabPtr(K)->array();
592 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
595 return fabPtr(mfi)->const_array();
598 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
601 return fabPtr(K)->const_array();
604 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
607 return fabPtr(mfi)->const_array(start_comp);
610 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
613 return fabPtr(mfi)->array(start_comp);
616 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
619 return fabPtr(K)->const_array(start_comp);
622 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
625 return fabPtr(K)->array(start_comp);
628 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
631 return fabPtr(mfi)->const_array(start_comp);
634 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
637 return fabPtr(K)->const_array(start_comp);
640 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
647 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
654 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
662 void setFab (
int boxno, std::unique_ptr<FAB> elem);
665 template <
class F=FAB, std::enable_if_t<std::is_move_constructible_v<F>,
int> = 0>
672 template <
class F=FAB, std::enable_if_t<std::is_move_constructible_v<F>,
int> = 0>
700 template <
typename SFAB,
typename DFAB = FAB,
701 std::enable_if_t<std::conjunction_v<
703 std::is_convertible<
typename SFAB::value_type,
704 typename DFAB::value_type>>,
int> = 0>
720 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
725 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
729 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
737 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
743 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
755 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
762 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
772 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
775 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
783 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
786 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
789 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
790 void abs (
int comp,
int ncomp,
int nghost = 0);
792 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
795 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
798 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
801 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
804 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
807 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
810 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
814 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
818 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
822 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
826 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
830 template <typename I, class F=FAB, std::enable_if_t<IsBaseFab<F>::value && std::is_integral_v<I> && (
sizeof(I) >=
sizeof(
Long)),
int> = 0>
842 template <typename F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
843 typename F::value_type
844 sum (
int comp,
IntVect const& nghost,
bool local =
false)
const;
860 [[deprecated(
"Use FabArray::ParallelCopy() instead.")]]
894 {
ParallelCopy(src,src_comp,dest_comp,num_comp,0,0,period,op); }
896 [[deprecated(
"Use FabArray::ParallelCopy() instead.")]]
903 {
ParallelCopy(src,src_comp,dest_comp,num_comp, period, op); }
955 bool deterministic =
false);
986 IntVect(dst_nghost),period,op); }
997 bool to_ghost_cells_only =
false,
998 bool deterministic =
false);
1010 bool to_ghost_cells_only =
false,
1011 bool deterministic =
false);
1045 void ParallelCopy (
const FabArray<FAB>& src,
int src_comp,
int dest_comp,
int num_comp,
1065 [[deprecated(
"Use FabArray::ParallelCopy() instead.")]]
1076 [[deprecated(
"Use FabArray::ParallelCopy() instead.")]]
1085 {
ParallelCopy(src,src_comp,dest_comp,num_comp,src_nghost,dst_nghost,period,op); }
1099 void copyTo (FAB& dest,
int nghost = 0)
const;
1108 void copyTo (FAB& dest,
int scomp,
int dcomp,
int ncomp,
int nghost = 0)
const;
1128 template <
typename BUF=value_type>
1132 template <
typename BUF=value_type>
1135 template <
typename BUF=value_type>
1140 template <
typename BUF=value_type>
1144 template <
typename BUF=value_type>
1148 template <
typename BUF=value_type>
1151 template <
typename BUF=value_type>
1154 template <
typename BUF=value_type>
1157 template <
typename BUF=value_type>
1160 template <
typename BUF=value_type>
1163 template <
typename BUF=value_type>
1166 template <
typename BUF=value_type>
1170 class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1265 bool deterministic =
false);
1268 bool deterministic =
false);
1270 bool deterministic =
false);
1272 bool deterministic =
false);
1286 bool deterministic =
false);
1289 bool deterministic =
false);
1304 bool deterministic =
false);
1307 bool deterministic =
false);
1333 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1341 class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1344 bool enforce_periodicity_only =
false,
1345 bool override_sync =
false,
1347 bool deterministic =
false);
1352 int scomp,
int dcomp,
int ncomp,
CpOp op);
1354 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1357 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1368 int scomp,
int dcomp,
int ncomp,
CpOp op,
bool deterministic);
1373#if defined(__CUDACC__)
1375 void FB_local_copy_cuda_graph_1 (
const FB& TheFB,
int scomp,
int ncomp);
1376 void FB_local_copy_cuda_graph_n (
const FB& TheFB,
int scomp,
int ncomp);
1384#if defined(__CUDACC__)
1386 void FB_pack_send_buffer_cuda_graph (
const FB& TheFB,
int scomp,
int ncomp,
1391 void FB_unpack_recv_buffer_cuda_graph (
const FB& TheFB,
int dcomp,
int ncomp,
1395 bool is_thread_safe);
1399 template <
typename BUF = value_type>
1406 template <
typename BUF = value_type>
1411 CpOp op,
bool is_thread_safe,
1412 std::uint64_t
id,
bool deterministic);
1414 template <
typename BUF>
1419 int ncomp, std::uint64_t
id);
1421 template <
typename BUF>
1426 int ncomp, std::uint64_t
id)
const;
1430 template <
typename BUF = value_type>
1436 template <
typename BUF = value_type>
1441 CpOp op,
bool is_thread_safe);
1457 template <typename F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1458 typename F::value_type
1460 [[maybe_unused]]
bool ignore_covered =
false)
const;
1474 template <typename IFAB, typename F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1475 typename F::value_type
1477 bool local =
false)
const;
1508#if defined(BL_USE_MPI3)
1509 if (win != MPI_WIN_NULL) { MPI_Win_free(&win); }
1519#if defined(BL_USE_MPI3)
1524#if defined(BL_USE_MPI3)
1525 rhs.win = MPI_WIN_NULL;
1534#if defined(BL_USE_MPI3)
1536 rhs.win = MPI_WIN_NULL;
1546#if defined(BL_USE_MPI3)
1547 MPI_Win win = MPI_WIN_NULL;
1555 using Iterator =
typename std::vector<FAB*>::iterator;
1559 bool alloc_single_chunk);
1561 void setFab_assert (
int K, FAB
const& fab)
const;
1563 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1564 void build_arrays ()
const;
1566 void clear_arrays ();
1569 std::map<std::uint64_t,
1570 std::unique_ptr<TagVector<Array4CopyTag<value_type>>>>
1571 m_fb_local_copy_handler;
1573 using RecvSendCopyHandlerKey = std::tuple<std::uint64_t,std::size_t,int>;
1574 std::map<RecvSendCopyHandlerKey,
1575 std::unique_ptr<TagVector<CommRecvBufTag<value_type>>>>
1576 m_recv_copy_handler;
1577 mutable std::map<RecvSendCopyHandlerKey,
1578 std::unique_ptr<TagVector<CommSendBufTag<value_type>>>>
1579 m_send_copy_handler;
1587 template <
typename BUF=value_type>
1589 char*& the_recv_data,
1597 template <
typename BUF=value_type>
1607 template <
typename BUF=value_type>
1609 char*& the_send_data,
1617 template <
typename BUF=value_type>
1634 std::unique_ptr<FBData<FAB>>
fbd;
1635 std::unique_ptr<PCData<FAB>>
pcd;
1653 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1655 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost);
1668 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1670 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost);
1686 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1690 int dstcomp,
int numcomp,
const IntVect& nghost);
1705 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1708 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost);
1724 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1727 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost);
1742 template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,
int> = 0>
1745 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost);
1758 int li = localindex(K);
1759 if (li >= 0 && li < std::ssize(m_fabs_v) && m_fabs_v[li] != 0) {
1771 int li = mfi.LocalIndex();
1772 if (li < std::ssize(m_fabs_v) && m_fabs_v[li] !=
nullptr) {
1786 int li = mfi.LocalIndex();
1787 return m_fabs_v[li];
1796 int li = mfi.LocalIndex();
1797 return m_fabs_v[li];
1804 int li = localindex(K);
1806 return m_fabs_v[li];
1813 int li = localindex(K);
1815 return m_fabs_v[li];
1819template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
1825 static_assert(
sizeof(A) ==
sizeof(AC),
"sizeof(Array4<T>) != sizeof(Array4<T const>)");
1826 if (!m_hp_arrays && local_size() > 0) {
1827 const int n = local_size();
1832 m_hp_arrays = std::malloc(n*2*
sizeof(A));
1834 for (
int li = 0; li < n; ++li) {
1836 new ((A*)m_hp_arrays+li) A(m_fabs_v[li]->array());
1837 new ((AC*)m_hp_arrays+li+n) AC(m_fabs_v[li]->const_array());
1839 new ((A*)m_hp_arrays+li) A{};
1840 new ((AC*)m_hp_arrays+li+n) AC{};
1843 m_arrays.
hp = (A*)m_hp_arrays;
1844 m_const_arrays.
hp = (AC*)m_hp_arrays + n;
1846 m_arrays.
dp = (A*)m_dp_arrays;
1847 m_const_arrays.
dp = (AC*)m_dp_arrays + n;
1858FabArray<FAB>::clear_arrays ()
1863 m_dp_arrays =
nullptr;
1865 std::free(m_hp_arrays);
1867 m_hp_arrays =
nullptr;
1868 m_arrays.
hp =
nullptr;
1869 m_const_arrays.
hp =
nullptr;
1877 const int li = localindex(K);
1878 if (li >= 0 && li < std::ssize(m_fabs_v) && m_fabs_v[li] !=
nullptr) {
1882 for (
auto const& t : m_tags) {
1883 updateMemUsage(t, -nbytes,
nullptr);
1886 return std::exchange(m_fabs_v[li],
nullptr);
1898 if (li >= 0 && li < std::ssize(m_fabs_v) && m_fabs_v[li] !=
nullptr) {
1902 for (
auto const& t : m_tags) {
1903 updateMemUsage(t, -nbytes,
nullptr);
1906 return std::exchange(m_fabs_v[li],
nullptr);
1916 if (define_function_called)
1918 define_function_called =
false;
1923 for (
auto *
x : m_fabs_v) {
1926 m_factory->destroy(
x);
1932 m_dallocator.
m_arena =
nullptr;
1936 for (
auto const& t : m_tags) {
1937 updateMemUsage(t, -nbytes,
nullptr);
1941 if (m_single_chunk_arena) {
1942 m_single_chunk_arena.reset();
1944 m_single_chunk_size = 0;
1949 m_fb_local_copy_handler.clear();
1950 m_recv_copy_handler.clear();
1951 m_send_copy_handler.clear();
1958template <
typename SFAB,
typename DFAB,
1959 std::enable_if_t<std::conjunction_v<
1961 std::is_convertible<
typename SFAB::value_type,
1962 typename DFAB::value_type>>,
int>>
1967 amrex::Copy(*
this, src, scomp, dcomp, ncomp, nghost);
1971template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
1976 amrex::Add(*
this, src, scomp, dcomp, ncomp, nghost);
1980template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
1988template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
1992 setVal(val,0,n_comp,nghost);
1996template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2004template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2008 setVal(val,region,0,n_comp,nghost);
2015 m_FA_stats.recordBuild();
2023 m_FA_stats.recordBuild();
2043 : m_factory(factory.clone()),
2052 : m_factory(rhs.Factory().clone()),
2062 auto const& rhsfab = *(rhs.
m_fabs_v[i]);
2075 , m_factory (std::move(rhs.m_factory))
2076 , m_dallocator (rhs.m_dallocator)
2077 , m_single_chunk_arena(std::move(rhs.m_single_chunk_arena))
2078 , m_single_chunk_size(std::exchange(rhs.m_single_chunk_size,0))
2079 , define_function_called(rhs.define_function_called)
2080 , m_fabs_v (std::move(rhs.m_fabs_v))
2082 , m_dp_arrays (std::exchange(rhs.m_dp_arrays,
nullptr))
2084 , m_hp_arrays (std::exchange(rhs.m_hp_arrays,
nullptr))
2085 , m_arrays (rhs.m_arrays)
2086 , m_const_arrays(rhs.m_const_arrays)
2087 , m_tags (std::move(rhs.m_tags))
2088 , shmem (std::move(rhs.shmem))
2090 , m_fb_local_copy_handler(std::move(rhs.m_fb_local_copy_handler))
2091 , m_recv_copy_handler(std::move(rhs.m_recv_copy_handler))
2092 , m_send_copy_handler(std::move(rhs.m_send_copy_handler))
2096 m_FA_stats.recordBuild();
2097 rhs.define_function_called =
false;
2098 rhs.m_fabs_v.clear();
2111 m_factory = std::move(rhs.m_factory);
2112 m_dallocator = rhs.m_dallocator;
2113 m_single_chunk_arena = std::move(rhs.m_single_chunk_arena);
2114 std::swap(m_single_chunk_size, rhs.m_single_chunk_size);
2115 define_function_called = rhs.define_function_called;
2116 std::swap(m_fabs_v, rhs.m_fabs_v);
2118 std::swap(m_dp_arrays, rhs.m_dp_arrays);
2120 std::swap(m_hp_arrays, rhs.m_hp_arrays);
2121 m_arrays = rhs.m_arrays;
2122 m_const_arrays = rhs.m_const_arrays;
2123 std::swap(m_tags, rhs.m_tags);
2124 shmem = std::move(rhs.shmem);
2126 std::swap(m_fb_local_copy_handler, rhs.m_fb_local_copy_handler);
2127 std::swap(m_recv_copy_handler, rhs.m_recv_copy_handler);
2128 std::swap(m_send_copy_handler, rhs.m_send_copy_handler);
2131 rhs.define_function_called =
false;
2132 rhs.m_fabs_v.clear();
2142 m_FA_stats.recordDelete();
2150 if (!define_function_called) {
return false; }
2158 if (
get(fai).box() != fabbox(fai.index()))
2178 return define_function_called;
2190 define(bxs,dm,nvar,
IntVect(ngrow),info,a_factory);
2202 std::unique_ptr<FabFactory<FAB> > factory(a_factory.
clone());
2204 auto *default_arena = m_dallocator.
m_arena;
2207 m_factory = std::move(factory);
2210 define_function_called =
true;
2231 if (shmem.alloc) { alloc_single_chunk =
false; }
2232 if constexpr (!IsBaseFab_v<FAB>) { alloc_single_chunk =
false; }
2234 const int n = indexArray.
size();
2236 shmem.alloc = (nworkers > 1);
2238 bool alloc = !shmem.alloc;
2241 fab_info.SetAlloc(alloc).SetShared(shmem.alloc).SetArena(ar);
2243 if (alloc_single_chunk) {
2244 m_single_chunk_size = 0L;
2245 for (
int i = 0; i < n; ++i) {
2246 int K = indexArray[i];
2247 const Box& tmpbox = fabbox(K);
2248 m_single_chunk_size += factory.
nBytes(tmpbox, n_comp, K);
2251 m_single_chunk_arena = std::make_unique<detail::SingleChunkArena>(ar, m_single_chunk_size);
2252 fab_info.SetArena(m_single_chunk_arena.get());
2255 m_fabs_v.reserve(n);
2258 for (
int i = 0; i < n; ++i)
2260 int K = indexArray[i];
2261 const Box& tmpbox = fabbox(K);
2262 m_fabs_v.push_back(factory.
create(tmpbox, n_comp, fab_info, K));
2267 m_tags.emplace_back(
"All");
2268 for (
auto const& t : m_region_tag) {
2269 m_tags.push_back(t);
2271 for (
auto const& t : tags) {
2272 m_tags.push_back(t);
2274 for (
auto const& t: m_tags) {
2275 updateMemUsage(t, nbytes, ar);
2285 Vector<Long>
offset(n,0);
2286 Vector<Long> nextoffset(nworkers,-1);
2287 for (
int i = 0; i < n; ++i) {
2288 int K = indexArray[i];
2289 int owner = distributionMap[K] - teamlead;
2290 Long s = m_fabs_v[i]->size();
2292 shmem.n_values += s;
2293 shmem.n_points += m_fabs_v[i]->numPts();
2295 if (nextoffset[owner] < 0) {
2297 nextoffset[owner] = s;
2299 offset[i] = nextoffset[owner];
2300 nextoffset[owner] += s;
2304 size_t bytes = shmem.n_values*
sizeof(value_type);
2307 Vector<value_type*> dps;
2309#if defined (BL_USE_MPI3)
2311 static MPI_Info info = MPI_INFO_NULL;
2312 if (info == MPI_INFO_NULL) {
2313 MPI_Info_create(&info);
2314 MPI_Info_set(info,
"alloc_shared_noncontig",
"true");
2319 BL_MPI_REQUIRE( MPI_Win_allocate_shared(bytes,
sizeof(value_type),
2320 info, team_comm, &mfp, &shmem.win) );
2322 for (
int w = 0; w < nworkers; ++w) {
2325 value_type *dptr = 0;
2326 BL_MPI_REQUIRE( MPI_Win_shared_query(shmem.win, w, &sz, &disp, &dptr) );
2328 dps.push_back(dptr);
2333 amrex::Abort(
"BaseFab::define: to allocate shared memory, USE_MPI3 must be true");
2337 for (
int i = 0; i < n; ++i) {
2338 int K = indexArray[i];
2339 int owner = distributionMap[K] - teamlead;
2340 value_type *p = dps[owner] +
offset[i];
2341 m_fabs_v[i]->setPtr(p, m_fabs_v[i]->size());
2344 for (
Long i = 0; i < shmem.n_values; i++, mfp++) {
2345 new (mfp) value_type;
2355FabArray<FAB>::setFab_assert (
int K, FAB
const& fab)
const
2370 n_comp = elem->nComp();
2373 setFab_assert(boxno, *elem);
2375 if (m_fabs_v.empty()) {
2376 m_fabs_v.resize(indexArray.size(),
nullptr);
2379 const int li = localindex(boxno);
2381 m_factory->destroy(m_fabs_v[li]);
2383 m_fabs_v[li] = elem.release();
2387template <
class F, std::enable_if_t<std::is_move_constructible_v<F>,
int> >
2392 n_comp = elem.nComp();
2395 setFab_assert(boxno, elem);
2397 if (m_fabs_v.empty()) {
2398 m_fabs_v.resize(indexArray.size(),
nullptr);
2401 const int li = localindex(boxno);
2403 m_factory->destroy(m_fabs_v[li]);
2405 m_fabs_v[li] =
new FAB(std::move(elem));
2413 n_comp = elem->nComp();
2416 setFab_assert(mfi.
index(), *elem);
2418 if (m_fabs_v.empty()) {
2419 m_fabs_v.resize(indexArray.size(),
nullptr);
2424 m_factory->destroy(m_fabs_v[li]);
2426 m_fabs_v[li] = elem.release();
2430template <
class F, std::enable_if_t<std::is_move_constructible_v<F>,
int> >
2435 n_comp = elem.nComp();
2438 setFab_assert(mfi.
index(), elem);
2440 if (m_fabs_v.empty()) {
2441 m_fabs_v.resize(indexArray.size(),
nullptr);
2446 m_factory->destroy(m_fabs_v[li]);
2448 m_fabs_v[li] =
new FAB(std::move(elem));
2452template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2460template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2466 if (n_grow.max() > 0)
2470 bool use_mfparfor =
true;
2471 const int nboxes = local_size();
2473 if (boxarray[indexArray[0]].numPts() >
Long(65*65*65)) {
2474 use_mfparfor =
false;
2477 for (
int i = 0; i < nboxes; ++i) {
2478 const Long npts = boxarray[indexArray[i]].numPts();
2479 if (npts >=
Long(64*64*64)) {
2480 use_mfparfor =
false;
2482 }
else if (npts <=
Long(17*17*17)) {
2487 const IntVect nghost = n_grow;
2489 auto const& ma = this->arrays();
2493 auto const& a = ma[box_no];
2497 for (
int n = 0; n < ncomp; ++n) {
2498 a(i,j,k,strt_comp+n) = val;
2509 Box const& vbx = mfi.validbox();
2510 auto const& a = this->array(mfi);
2513#if (AMREX_SPACEDIM == 3)
2514 if (nghost[2] > 0) {
2518 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2520 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2523#if (AMREX_SPACEDIM >= 2)
2524 if (nghost[1] > 0) {
2527 b.
grow(0, nghost[0]);
2528 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2530 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2533 if (nghost[0] > 0) {
2536 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2538 tags.emplace_back(Tag{.dfab = a, .dbox = b});
2545 tag.dfab(i,j,k,strt_comp+n) = val;
2556 get(fai).template setComplement<RunOn::Host>(val, fai.validbox(), strt_comp, ncomp);
2563template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2567 setDomainBndry(val, 0, n_comp, geom);
2571template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2581 for (
int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
2583 int n = domain_box.
length(idim);
2584 domain_box.
grow(idim, n);
2589#pragma omp parallel if (Gpu::notInLaunchRegion())
2593 const Box& gbx = fai.fabbox();
2596 get(fai).template setComplement<RunOn::Device>(val, domain_box, strt_comp, ncomp);
2603template <typename I, class F, std::enable_if_t<IsBaseFab<F>::value && std::is_integral_v<I> && (
sizeof(I) >=
sizeof(
Long)),
int> FOO>
2608 mem[mfi] +=
static_cast<I
>((*this)[mfi].nBytesOwned());
2613template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
2614typename F::value_type
2619 using T =
typename FAB::value_type;
2623 auto const& ma = this->const_arrays();
2628 return ma[box_no](i,j,k,comp);
2634#pragma omp parallel if (!system::regtest_reduction) reduction(+:sm)
2638 Box const& bx = mfi.growntilebox(nghost);
2639 auto const& a = this->const_array(mfi);
2643 tmp += a(i,j,k,comp);
2660 copyTo(dest, 0, 0, dest.nComp(), nghost);
2664template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2668 setVal(val,0,n_comp,n_grow);
2672template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2681template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2692template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2706 auto const& fa = this->arrays();
2710 fa[box_no](i,j,k,n+comp) = val;
2719#pragma omp parallel if (Gpu::notInLaunchRegion())
2723 const Box& bx = fai.growntilebox(nghost);
2724 auto fab = this->array(fai);
2727 fab(i,j,k,n+comp) = val;
2734template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2746template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2757 BL_PROFILE(
"FabArray::setVal(val,region,comp,ncomp,nghost)");
2761 auto const& fa = this->arrays();
2766 fa[box_no](i,j,k,n+comp) = val;
2777#pragma omp parallel if (Gpu::notInLaunchRegion())
2781 Box b = fai.growntilebox(nghost) & region;
2784 auto fab = this->array(fai);
2787 fab(i,j,k,n+comp) = val;
2795template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
2803template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2813 auto const& fa = this->arrays();
2817 fa[box_no](i,j,k,n+comp) = std::abs(fa[box_no](i,j,k,n+comp));
2826#pragma omp parallel if (Gpu::notInLaunchRegion())
2830 const Box& bx = mfi.growntilebox(nghost);
2831 auto fab = this->array(mfi);
2834 fab(i,j,k,n+comp) = std::abs(fab(i,j,k,n+comp));
2841template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2849 auto const& fa = this->arrays();
2853 fa[box_no](i,j,k,n+comp) += val;
2862#pragma omp parallel if (Gpu::notInLaunchRegion())
2866 const Box& bx = mfi.growntilebox(nghost);
2867 auto fab = this->array(mfi);
2870 fab(i,j,k,n+comp) += val;
2877template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2881 BL_PROFILE(
"FabArray::plus(val, region, comp, num_comp, nghost)");
2885 auto const& fa = this->arrays();
2890 fa[box_no](i,j,k,n+comp) += val;
2900#pragma omp parallel if (Gpu::notInLaunchRegion())
2904 const Box& bx = mfi.growntilebox(nghost) & region;
2906 auto fab = this->array(mfi);
2909 fab(i,j,k,n+comp) += val;
2917template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2925 auto const& fa = this->arrays();
2929 fa[box_no](i,j,k,n+comp) *= val;
2938#pragma omp parallel if (Gpu::notInLaunchRegion())
2942 const Box& bx = mfi.growntilebox(nghost);
2943 auto fab = this->array(mfi);
2946 fab(i,j,k,n+comp) *= val;
2953template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
2957 BL_PROFILE(
"FabArray::mult(val, region, comp, num_comp, nghost)");
2961 auto const& fa = this->arrays();
2966 fa[box_no](i,j,k,n+comp) *= val;
2976#pragma omp parallel if (Gpu::notInLaunchRegion())
2980 const Box& bx = mfi.growntilebox(nghost) & region;
2982 auto fab = this->array(mfi);
2985 fab(i,j,k,n+comp) *= val;
2993template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
3001 auto const& fa = this->arrays();
3005 fa[box_no](i,j,k,n+comp) = numerator / fa[box_no](i,j,k,n+comp);
3014#pragma omp parallel if (Gpu::notInLaunchRegion())
3018 const Box& bx = mfi.growntilebox(nghost);
3019 auto fab = this->array(mfi);
3022 fab(i,j,k,n+comp) = numerator / fab(i,j,k,n+comp);
3029template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
3033 BL_PROFILE(
"FabArray::invert(numerator, region, comp, num_comp, nghost)");
3037 auto const& fa = this->arrays();
3042 fa[box_no](i,j,k,n+comp) = numerator / fa[box_no](i,j,k,n+comp);
3052#pragma omp parallel if (Gpu::notInLaunchRegion())
3056 const Box& bx = mfi.growntilebox(nghost) & region;
3058 auto fab = this->array(mfi);
3061 fab(i,j,k,n+comp) = numerator / fab(i,j,k,n+comp);
3086template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3088 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost)
3092 AMREX_ASSERT(
y.nGrowVect().allGE(nghost) &&
x.nGrowVect().allGE(nghost));
3098 auto const& yma =
y.arrays();
3099 auto const& xma =
x.const_arrays();
3103 yma[box_no](i,j,k,ycomp+n) += a * xma[box_no](i,j,k,xcomp+n);
3112#pragma omp parallel if (Gpu::notInLaunchRegion())
3116 const Box& bx = mfi.growntilebox(nghost);
3119 auto const& xfab =
x.const_array(mfi);
3120 auto const& yfab =
y.array(mfi);
3123 yfab(i,j,k,ycomp+n) += a * xfab(i,j,k,xcomp+n);
3131template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3134 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost)
3138 AMREX_ASSERT(
y.nGrowVect().allGE(nghost) &&
x.nGrowVect().allGE(nghost));
3144 auto const& yfa =
y.arrays();
3145 auto const& xfa =
x.const_arrays();
3149 yfa[box_no](i,j,k,n+ycomp) = xfa[box_no](i,j,k,n+xcomp)
3150 + a * yfa[box_no](i,j,k,n+ycomp);
3159#pragma omp parallel if (Gpu::notInLaunchRegion())
3163 const Box& bx = mfi.growntilebox(nghost);
3164 auto const& xFab =
x.const_array(mfi);
3165 auto const& yFab =
y.array(mfi);
3168 yFab(i,j,k,n+ycomp) = xFab(i,j,k,n+xcomp)
3169 + a * yFab(i,j,k,n+ycomp);
3176template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3179 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost)
3185 y.nGrowVect().allGE(nghost) &&
3193 auto const& yma =
y.arrays();
3199 yma[box_no](i,j,k,ycomp+n) = xma2[box_no](i,j,k,xcomp+n)
3200 + a2 * (yma [box_no](i,j,k,ycomp+n)
3201 + a1 * xma1[box_no](i,j,k,xcomp+n));
3210#pragma omp parallel if (Gpu::notInLaunchRegion())
3214 const Box& bx = mfi.growntilebox(nghost);
3219 auto const& yfab =
y.array(mfi);
3222 yfab(i,j,k,ycomp+n) = xfab2(i,j,k,xcomp+n)
3223 + a2 * (yfab (i,j,k,ycomp+n)
3224 + a1 * xfab1(i,j,k,xcomp+n));
3232template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3235 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost)
3252 auto const& y1ma = y1.
arrays();
3254 auto const& y2ma = y2.
arrays();
3259 y1ma[box_no](i,j,k,ycomp+n) += a1 * x1ma[box_no](i,j,k,xcomp+n);
3260 y2ma[box_no](i,j,k,ycomp+n) += a2 * x2ma[box_no](i,j,k,xcomp+n);
3269#pragma omp parallel if (Gpu::notInLaunchRegion())
3273 const Box& bx = mfi.growntilebox(nghost);
3277 auto const& y1fab = y1.
array(mfi);
3279 auto const& y2fab = y2.
array(mfi);
3282 y1fab(i,j,k,ycomp+n) += a1 * x1fab(i,j,k,xcomp+n);
3283 y2fab(i,j,k,ycomp+n) += a2 * x2fab(i,j,k,xcomp+n);
3291template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3294 int xcomp,
int ycomp,
int ncomp,
IntVect const& nghost)
3302 x.nGrowVect().allGE(nghost));
3308 auto const& y1ma = y1.
arrays();
3309 auto const& y2ma = y2.
arrays();
3310 auto const& xma =
x.const_arrays();
3314 y1ma[box_no](i,j,k,ycomp+n) += a1 * y2ma[box_no](i,j,k,ycomp+n);
3315 y2ma[box_no](i,j,k,ycomp+n) += a2 * xma[box_no](i,j,k,xcomp+n);
3324#pragma omp parallel if (Gpu::notInLaunchRegion())
3328 const Box& bx = mfi.growntilebox(nghost);
3331 auto const& xfab =
x.const_array(mfi);
3332 auto const& y1fab = y1.
array(mfi);
3333 auto const& y2fab = y2.
array(mfi);
3336 y1fab(i,j,k,ycomp+n) += a1 * y2fab(i,j,k,ycomp+n);
3337 y2fab(i,j,k,ycomp+n) += a2 * xfab(i,j,k,xcomp+n);
3345template <class F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3350 int dstcomp,
int numcomp,
const IntVect& nghost)
3362 auto const& dstma = dst.
arrays();
3363 auto const& xma =
x.const_arrays();
3364 auto const& yma =
y.const_arrays();
3368 dstma[box_no](i,j,k,dstcomp+n) = a*xma[box_no](i,j,k,xcomp+n)
3369 + b*yma[box_no](i,j,k,ycomp+n);
3378#pragma omp parallel if (Gpu::notInLaunchRegion())
3382 const Box& bx = mfi.growntilebox(nghost);
3383 auto const& xfab =
x.const_array(mfi);
3384 auto const& yfab =
y.const_array(mfi);
3385 auto const& dfab = dst.
array(mfi);
3388 dfab(i,j,k,dstcomp+n) = a*xfab(i,j,k,xcomp+n) + b*yfab(i,j,k,ycomp+n);
3395template <
typename BUF>
3400 if ( n_grow.max() > 0 ) {
3402 FillBoundary_finish<BUF>();
3407template <
typename BUF>
3412 if ( n_grow.max() > 0 ) {
3413 FillBoundary_nowait<BUF>(0,
nComp(), n_grow, period, cross);
3414 FillBoundary_finish<BUF>();
3419template <
typename BUF>
3425 "FillBoundary: asked to fill more ghost cells than we have");
3426 if ( nghost.
max() > 0 ) {
3427 FillBoundary_nowait<BUF>(0,
nComp(), nghost, period, cross);
3428 FillBoundary_finish<BUF>();
3433template <
typename BUF>
3438 if ( n_grow.max() > 0 ) {
3440 FillBoundary_finish<BUF>();
3445template <
typename BUF>
3450 if ( n_grow.max() > 0 ) {
3451 FillBoundary_nowait<BUF>(scomp, ncomp, n_grow, period, cross);
3452 FillBoundary_finish<BUF>();
3457template <
typename BUF>
3464 "FillBoundary: asked to fill more ghost cells than we have");
3465 if ( nghost.
max() > 0 ) {
3466 FillBoundary_nowait<BUF>(scomp, ncomp, nghost, period, cross);
3467 FillBoundary_finish<BUF>();
3472template <
typename BUF>
3480template <
typename BUF>
3484 FillBoundary_nowait<BUF>(0,
nComp(),
nGrowVect(), period, cross);
3488template <
typename BUF>
3492 FillBoundary_nowait<BUF>(0,
nComp(), nghost, period, cross);
3496template <
typename BUF>
3507 BL_PROFILE(
"FabArray::FillBoundaryAndSync()");
3508 if (n_grow.max() > 0 || !is_cell_centered()) {
3519 BL_PROFILE(
"FabArray::FillBoundaryAndSync()");
3520 if (nghost.
max() > 0 || !is_cell_centered()) {
3539 FBEP_nowait(scomp, ncomp, nghost, period,
false,
false,
true);
3555 if (!is_cell_centered()) {
3566 if (!is_cell_centered()) {
3584 FBEP_nowait(scomp, ncomp,
IntVect(0), period,
false,
false,
true);
3599 SumBoundary(0, n_comp,
IntVect(0), period, deterministic);
3606 SumBoundary(scomp, ncomp,
IntVect(0), period, deterministic);
3613 SumBoundary(scomp, ncomp, this->
nGrowVect(), nghost, period, deterministic);
3622 SumBoundary_nowait(scomp, ncomp, src_nghost, dst_nghost, period, deterministic);
3623 SumBoundary_finish();
3630 SumBoundary_nowait(0, n_comp,
IntVect(0), period, deterministic);
3637 SumBoundary_nowait(scomp, ncomp,
IntVect(0), period, deterministic);
3644 SumBoundary_nowait(scomp, ncomp, this->
nGrowVect(), nghost, period, deterministic);
3651 BL_PROFILE(
"FabArray<FAB>::SumBoundary_nowait()");
3657 FBEP_nowait(scomp, ncomp, dst_nghost, period,
false,
false,
false, src_nghost, deterministic);
3664 BL_PROFILE(
"FabArray<FAB>::SumBoundary_finish()");
3685 FBEP_nowait(scomp, ncomp,
nGrowVect(), period,
false,
true);
3697 FBEP_nowait(scomp, ncomp, nghost, period,
false,
true);
3703template <
typename BUF>
3707 FBEP_nowait<BUF>(scomp, ncomp,
nGrowVect(), period, cross);
3711template <
typename BUF>
3716 FBEP_nowait<BUF>(scomp, ncomp, nghost, period, cross);
3720template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>Z>
3728 int ncomp = this->
nComp();
3732 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
3734 domain.
grow(i, ngrow[i]);
3740 auto const& fa = this->arrays();
3744 auto const& fab = fa[box_no];
3749 }
else if (domain.
contains(i,j,k)) {
3750 fab(i,j,k,n) = notcovered;
3752 fab(i,j,k,n) = physbnd;
3762#pragma omp parallel if (Gpu::notInLaunchRegion())
3766 auto const& fab = this->array(mfi);
3767 Box const& fbx = mfi.growntilebox();
3768 Box const& gbx = fbx & domain;
3769 Box const& vbx = mfi.validbox();
3773 fab(i,j,k,n) = interior;
3775 fab(i,j,k,n) = notcovered;
3777 fab(i,j,k,n) = physbnd;
3788template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
3792 BL_PROFILE(
"FabArray::setVal(val, thecmd, scomp, ncomp)");
3797 CMD_local_setVal_gpu(val, thecmd, scomp, ncomp);
3798 CMD_remote_setVal_gpu(val, thecmd, scomp, ncomp);
3806 auto N_locs =
static_cast<int>(LocTags.size());
3808#pragma omp parallel for if (thecmd.m_threadsafe_loc)
3810 for (
int i = 0; i < N_locs; ++i) {
3812 (*this)[tag.
dstIndex].template setVal<RunOn::Host>(val, tag.
dbox, scomp, ncomp);
3815 for (
const auto & RcvTag : RcvTags) {
3816 auto N =
static_cast<int>(RcvTag.second.size());
3818#pragma omp parallel for if (thecmd.m_threadsafe_rcv)
3820 for (
int i = 0; i < N; ++i) {
3822 (*this)[tag.
dstIndex].template setVal<RunOn::Host>(val, tag.
dbox, scomp, ncomp);
3829template <class F, std::enable_if_t<IsBaseFab<F>::value,
int>>
3837#pragma omp parallel if (thecmd.m_threadsafe_rcv)
3846 auto N_locs =
static_cast<int>(LocTags.size());
3847 for (
int i = 0; i < N_locs; ++i) {
3852 for (
const auto & RcvTag : RcvTags) {
3853 auto N =
static_cast<int>(RcvTag.second.size());
3854 for (
int i = 0; i < N; ++i) {
3863template <typename F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3864typename F::value_type
3866 [[maybe_unused]]
bool ignore_covered)
const
3870 using RT =
typename F::value_type;
3875 if ( this->is_cell_centered() && this->hasEBFabFactory() && ignore_covered )
3881 auto const& flagsma = flags.const_arrays();
3882 auto const& ma = this->const_arrays();
3886 if (flagsma[box_no](i,j,k).isCovered()) {
3890 auto const& a = ma[box_no];
3891 for (
int n = 0; n < ncomp; ++n) {
3892 tmp =
amrex::max(tmp, std::abs(a(i,j,k,comp+n)));
3901#pragma omp parallel reduction(max:nm0)
3904 Box const& bx = mfi.growntilebox(nghost);
3906 auto const& flag = flags.const_array(mfi);
3907 auto const& a = this->const_array(mfi);
3910 if (!flag(i,j,k).isCovered()) {
3911 nm0 = std::max(nm0, std::abs(a(i,j,k,comp+n)));
3923 auto const& ma = this->const_arrays();
3927 return std::abs(ma[box_no](i,j,k,comp+n));
3933#pragma omp parallel reduction(max:nm0)
3936 Box const& bx = mfi.growntilebox(nghost);
3937 auto const& a = this->const_array(mfi);
3940 nm0 = std::max(nm0, std::abs(a(i,j,k,comp+n)));
3954template <typename IFAB, typename F, std::enable_if_t<IsBaseFab<F>::value,
int> FOO>
3955typename F::value_type
3957 IntVect const& nghost,
bool local)
const
3961 using RT =
typename F::value_type;
3967 auto const& ma = this->const_arrays();
3968 auto const& maskma =
mask.const_arrays();
3972 if (maskma[box_no](i,j,k)) {
3974 auto const& a = ma[box_no];
3975 for (
int n = 0; n < ncomp; ++n) {
3976 tmp =
amrex::max(tmp, std::abs(a(i,j,k,comp+n)));
3987#pragma omp parallel reduction(max:nm0)
3990 Box const& bx = mfi.growntilebox(nghost);
3991 auto const& a = this->const_array(mfi);
3992 auto const& mskfab =
mask.const_array(mfi);
3995 if (mskfab(i,j,k)) {
3996 nm0 = std::max(nm0, std::abs(a(i,j,k,comp+n)));
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:551
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
#define AMREX_NODISCARD
Definition AMReX_Extension.H:252
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:32
#define AMREX_HOST_DEVICE_FOR_4D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:107
#define AMREX_HOST_DEVICE_PARALLEL_FOR_4D(...)
Definition AMReX_GpuLaunchMacrosC.nolint.H:111
#define AMREX_IF_ON_DEVICE(CODE)
Definition AMReX_GpuQualifiers.H:56
#define AMREX_IF_ON_HOST(CODE)
Definition AMReX_GpuQualifiers.H:58
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1139
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
#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
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:132
virtual void free(void *pt)=0
A pure virtual function for deleting the arena pointed to by pt.
virtual void * alloc(std::size_t sz)=0
A FortranArrayBox(FAB)-like object.
Definition AMReX_BaseFab.H:190
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:564
__host__ __device__ BoxND & grow(int i) noexcept
Definition AMReX_Box.H:641
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:154
__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__ BoxND & shift(int dir, int nzones) noexcept
Shift this BoxND nzones indexing positions in coordinate direction dir.
Definition AMReX_Box.H:509
__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
Definition AMReX_EBFabFactory.H:32
const FabArray< EBCellFlagFab > & getMultiEBCellFlagFab() const noexcept
EB cell flags for all boxes.
Definition AMReX_EBFabFactory.H:73
bool isAllRegular() const noexcept
Definition AMReX_EBFabFactory.cpp:148
Base class for FabArray.
Definition AMReX_FabArrayBase.H:42
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
void clear()
Definition AMReX_FabArrayBase.cpp:207
Vector< int > indexArray
Definition AMReX_FabArrayBase.H:446
static FabArrayStats m_FA_stats
Definition AMReX_FabArrayBase.H:726
static bool getAllocSingleChunk()
Definition AMReX_FabArrayBase.H:730
bool isFusingCandidate() const noexcept
Is this a good candidate for kernel fusing?
Definition AMReX_FabArrayBase.cpp:2705
int size() const noexcept
Return the number of FABs in the FabArray.
Definition AMReX_FabArrayBase.H:110
FabArrayBase & operator=(const FabArrayBase &rhs)=default
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow)
Definition AMReX_FabArrayBase.cpp:175
CopyComTag::CopyComTagsContainer CopyComTagsContainer
Definition AMReX_FabArrayBase.H:220
CopyComTag::MapOfCopyComTagContainers MapOfCopyComTagContainers
Definition AMReX_FabArrayBase.H:221
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:131
int local_size() const noexcept
Return the number of local FABs in the FabArray.
Definition AMReX_FabArrayBase.H:113
CpOp
parallel copy or add
Definition AMReX_FabArrayBase.H:394
@ ADD
Definition AMReX_FabArrayBase.H:394
@ COPY
Definition AMReX_FabArrayBase.H:394
DistributionMapping distributionMap
Definition AMReX_FabArrayBase.H:445
friend void FillBoundary(Vector< FabArray< FAB > * > const &mf, const Periodicity &period)
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:351
void ParallelCopyToGhost_finish()
Definition AMReX_FabArrayCommI.H:381
void setFab(int boxno, std::unique_ptr< FAB > elem)
Explicitly set the Kth FAB in the FabArray to point to elem.
Definition AMReX_FabArray.H:2367
void copy(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, int src_nghost, int dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:1066
void setFab(const MFIter &mfi, FAB &&elem)
Explicitly set the FAB associated with mfi in the FabArray to point to elem.
Definition AMReX_FabArray.H:2432
F::value_type sum(int comp, IntVect const &nghost, bool local=false) const
Returns the sum of component "comp".
Definition AMReX_FabArray.H:2615
TagVector< CommSendBufTag< value_type > > const * get_send_copy_tag_vector(Vector< char * > const &send_data, Vector< std::size_t > const &send_size, Vector< CopyComTagsContainer const * > const &send_cctc, int ncomp, std::uint64_t id) const
void SumBoundary_nowait(int scomp, int ncomp, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Definition AMReX_FabArray.H:3635
void abs(int comp, int ncomp, int nghost=0)
Definition AMReX_FabArray.H:2797
void FBEP_nowait(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period, bool cross, bool enforce_periodicity_only=false, bool override_sync=false, IntVect const &sumboundary_src_nghost=IntVect(-1), bool deterministic=false)
Definition AMReX_FabArrayCommI.H:10
void copy(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const IntVect &src_nghost, const IntVect &dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:1077
Array4< typename FabArray< FAB >::value_type const > const_array(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:593
static void unpack_recv_buffer_cpu(FabArray< FAB > &dst, int dcomp, int ncomp, Vector< char * > const &recv_data, Vector< std::size_t > const &recv_size, Vector< const CopyComTagsContainer * > const &recv_cctc, CpOp op, bool is_thread_safe)
Definition AMReX_FBI.H:1411
void * m_dp_arrays
Definition AMReX_FabArray.H:1494
void ParallelCopy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:855
void setFab(const MFIter &mfi, std::unique_ptr< FAB > elem)
Explicitly set the FAB associated with mfi in the FabArray to point to elem.
Definition AMReX_FabArray.H:2410
typename std::conditional_t< IsBaseFab< FAB >::value, FAB, FABType >::value_type value_type
Definition AMReX_FabArray.H:362
std::unique_ptr< FabArray< FAB > > os_temp
Definition AMReX_FabArray.H:1638
void FillBoundary(const IntVect &nghost, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3421
const FabFactory< FAB > & Factory() const noexcept
Definition AMReX_FabArray.H:449
void mult(value_type val, const Box ®ion, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:2955
void invert(value_type numerator, const Box ®ion, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:3031
void CMD_remote_setVal_gpu(value_type x, const CommMetaData &thecmd, int scomp, int ncomp)
Definition AMReX_FBI.H:683
void Redistribute(const FabArray< FAB > &src, int scomp, int dcomp, int ncomp, const IntVect &nghost)
Copy from src to this. this and src have the same BoxArray, but different DistributionMapping.
Definition AMReX_FabArrayCommI.H:979
void prefetchToDevice(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:559
void FillBoundary_nowait(const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3482
void shift(const IntVect &v)
Shift the boxarray by vector v.
Definition AMReX_FabArray.H:3070
FAB * release(int K)
Release ownership of the FAB. This function is not thread safe.
Definition AMReX_FabArray.H:1875
bool ok() const
Return true if the FabArray is well-defined. That is, the FabArray has a BoxArray and DistributionMap...
Definition AMReX_FabArray.H:2148
Array4< typename FabArray< FAB >::value_type const > array(const MFIter &mfi, int start_comp) const noexcept
Definition AMReX_FabArray.H:605
const FAB & operator[](const MFIter &mfi) const noexcept
Return a constant reference to the FAB associated with mfi.
Definition AMReX_FabArray.H:515
void ParallelAdd_nowait(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:866
void setDomainBndry(value_type val, int strt_comp, int ncomp, const Geometry &geom)
Set ncomp values outside the Geometry domain to val, starting at start_comp.
Definition AMReX_FabArray.H:2573
FabArray(FabArray< FAB > &&rhs) noexcept
Definition AMReX_FabArray.H:2073
Array4< typename FabArray< FAB >::value_type const > array(int K, int start_comp) const noexcept
Definition AMReX_FabArray.H:617
FabArray(const BoxArray &bxs, const DistributionMapping &dm, int nvar, const IntVect &ngrow, const MFInfo &info=MFInfo(), const FabFactory< FAB > &factory=DefaultFabFactory< FAB >())
Definition AMReX_FabArray.H:2037
bool defined(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:1769
void setVal(value_type val, const CommMetaData &thecmd, int scomp, int ncomp)
Definition AMReX_FabArray.H:3790
void setVal(value_type val, const Box ®ion, int comp, int ncomp, const IntVect &nghost)
Definition AMReX_FabArray.H:2748
void OverrideSync_nowait(int scomp, int ncomp, const Periodicity &period)
Definition AMReX_FabArray.H:3581
FabArray(const FabArray< FAB > &rhs)=delete
void ParallelCopyToGhost(const FabArray< FAB > &src, int scomp, int dcomp, int ncomp, const IntVect &snghost, const IntVect &dnghost, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArrayCommI.H:350
void ParallelCopy_finish()
Definition AMReX_FabArrayCommI.H:669
void setVal(value_type val, const Box ®ion, int comp, int ncomp, int nghost=0)
Set the value of num_comp components in the valid region of each FAB in the FabArray,...
Definition AMReX_FabArray.H:2736
static void pack_send_buffer_cpu(FabArray< FAB > const &src, int scomp, int ncomp, Vector< char * > const &send_data, Vector< std::size_t > const &send_size, Vector< const CopyComTagsContainer * > const &send_cctc)
Definition AMReX_FBI.H:1372
FAB & get(int K) noexcept
Return a reference to the FAB associated with the Kth element.
Definition AMReX_FabArray.H:536
void setVal(value_type val, int comp, int ncomp, const IntVect &nghost)
Definition AMReX_FabArray.H:2694
static void Saypy_Saxpy(FabArray< FAB > &y1, value_type a1, FabArray< FAB > &y2, value_type a2, FabArray< FAB > const &x, int xcomp, int ycomp, int ncomp, IntVect const &nghost)
y1 += a1*y2; y2 += a2*x;
Definition AMReX_FabArray.H:3292
FAB const * fabPtr(int K) const noexcept
Definition AMReX_FabArray.H:1811
void SumBoundary_nowait(const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Definition AMReX_FabArray.H:3628
void abs(int comp, int ncomp, const IntVect &nghost)
Definition AMReX_FabArray.H:2805
void ParallelCopy(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, int src_nghost, int dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:937
Long m_single_chunk_size
Definition AMReX_FabArray.H:1484
FAB & get(const MFIter &mfi) noexcept
Returns a reference to the FAB associated mfi.
Definition AMReX_FabArray.H:524
static void LinComb(FabArray< FAB > &dst, value_type a, const FabArray< FAB > &x, int xcomp, value_type b, const FabArray< FAB > &y, int ycomp, int dstcomp, int numcomp, const IntVect &nghost)
dst = a*x + b*y
Definition AMReX_FabArray.H:3347
void OverrideSync_nowait(const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:3574
void setDomainBndry(value_type val, const Geometry &geom)
Set all values outside the Geometry domain to val.
Definition AMReX_FabArray.H:2565
std::unique_ptr< PCData< FAB > > pcd
Definition AMReX_FabArray.H:1635
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow, const MFInfo &info=MFInfo(), const FabFactory< FAB > &factory=DefaultFabFactory< FAB >())
Define this FabArray identically to that performed by the constructor having an analogous function si...
Definition AMReX_FabArray.H:2183
void ParallelAdd_nowait(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const IntVect &src_nghost, const IntVect &dst_nghost, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:967
void PC_local_cpu(const CPC &thecpc, FabArray< FAB > const &src, int scomp, int dcomp, int ncomp, CpOp op)
Definition AMReX_PCI.H:8
std::unique_ptr< FBData< FAB > > fbd
Definition AMReX_FabArray.H:1634
std::unique_ptr< detail::SingleChunkArena > m_single_chunk_arena
Definition AMReX_FabArray.H:1483
void SumBoundary_nowait(int scomp, int ncomp, IntVect const &src_nghost, IntVect const &dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Definition AMReX_FabArray.H:3649
FabArray(const FabArray< FAB > &rhs, MakeType maketype, int scomp, int ncomp)
Definition AMReX_FabArray.H:2051
void ParallelAdd(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic())
This function copies data from src to this FabArray. Each FAB in fa is intersected with all FABs in t...
Definition AMReX_FabArray.H:852
FAB fab_type
Definition AMReX_FabArray.H:364
void setVal(value_type val, const IntVect &nghost)
Definition AMReX_FabArray.H:1990
void BuildMask(const Box &phys_domain, const Periodicity &period, value_type covered, value_type notcovered, value_type physbnd, value_type interior)
Definition AMReX_FabArray.H:3722
void LocalCopy(FabArray< SFAB > const &src, int scomp, int dcomp, int ncomp, IntVect const &nghost)
Perform local copy of FabArray data.
Definition AMReX_FabArray.H:1964
void FB_local_add_cpu(const FB &TheFB, int scomp, int ncomp)
Definition AMReX_FBI.H:442
bool SharedMemory() const noexcept
Definition AMReX_FabArray.H:1552
LayoutData< int > RecvLayoutMask(const CommMetaData &thecmd)
Definition AMReX_FabArray.H:3831
void FillBoundary_nowait(const IntVect &nghost, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3490
Vector< std::string > m_tags
Definition AMReX_FabArray.H:1500
void ParallelCopyToGhost_nowait(const FabArray< FAB > &src, int scomp, int dcomp, int ncomp, const IntVect &snghost, const IntVect &dnghost, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArrayCommI.H:367
void invert(value_type numerator, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:2995
void ParallelAdd_nowait(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:905
void FB_local_add_gpu(const FB &TheFB, int scomp, int ncomp, bool deterministic)
Definition AMReX_FBI.H:605
Array4< typename FabArray< FAB >::value_type const > array(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:569
void FB_local_copy_gpu(const FB &TheFB, int scomp, int ncomp)
Definition AMReX_FBI.H:533
Arena * arena() const noexcept
Definition AMReX_FabArray.H:452
Array4< typename FabArray< FAB >::value_type const > const_array(int K) const noexcept
Definition AMReX_FabArray.H:599
void plus(value_type val, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:2843
DataAllocator m_dallocator
Definition AMReX_FabArray.H:1482
void copy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:861
static void unpack_recv_buffer_gpu(FabArray< FAB > &dst, int dcomp, int ncomp, Vector< char * > const &recv_data, Vector< std::size_t > const &recv_size, Vector< const CopyComTagsContainer * > const &recv_cctc, CpOp op, bool is_thread_safe, std::uint64_t id, bool deterministic)
Definition AMReX_FBI.H:1210
void FillBoundaryAndSync_finish()
Definition AMReX_FabArray.H:3544
void ParallelCopy_nowait(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, int src_nghost, int dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:977
static void Saxpy_Saxpy(FabArray< FAB > &y1, value_type a1, FabArray< FAB > const &x1, FabArray< FAB > &y2, value_type a2, FabArray< FAB > const &x2, int xcomp, int ycomp, int ncomp, IntVect const &nghost)
y1 += a1*x1; y2 += a2*x2;
Definition AMReX_FabArray.H:3233
void FillBoundary_nowait(bool cross=false)
Definition AMReX_FabArray.H:3474
static void Saxpy_Xpay(FabArray< FAB > &y, value_type a1, FabArray< FAB > const &x1, value_type a2, FabArray< FAB > const &x2, int xcomp, int ycomp, int ncomp, IntVect const &nghost)
y = x2+a2*(y+a1*x1)
Definition AMReX_FabArray.H:3177
static void Xpay(FabArray< FAB > &y, value_type a, FabArray< FAB > const &x, int xcomp, int ycomp, int ncomp, IntVect const &nghost)
y = x + a*y
Definition AMReX_FabArray.H:3133
void clear()
Releases FAB memory in the FabArray.
Definition AMReX_FabArray.H:1914
void FillBoundary_nowait(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3713
const Vector< std::string > & tags() const noexcept
Definition AMReX_FabArray.H:454
void CMD_local_setVal_gpu(value_type x, const CommMetaData &thecmd, int scomp, int ncomp)
Definition AMReX_FBI.H:653
void FillBoundary_nowait(int scomp, int ncomp, bool cross=false)
Definition AMReX_FabArray.H:3498
Array4< typename FabArray< FAB >::value_type > array(const MFIter &mfi) noexcept
Definition AMReX_FabArray.H:575
value_type * singleChunkPtr() noexcept
Definition AMReX_FabArray.H:467
std::vector< FAB * > m_fabs_v
The data.
Definition AMReX_FabArray.H:1491
void setBndry(value_type val)
Set all values in the boundary region to val.
Definition AMReX_FabArray.H:2454
void ParallelAdd(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const IntVect &src_nghost, const IntVect &dst_nghost, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:929
bool define_function_called
has define() been called?
Definition AMReX_FabArray.H:1487
void ParallelAdd(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const Periodicity &period=Periodicity::NonPeriodic())
This function copies data from src to this FabArray. Each FAB in src is intersected with all FABs in ...
Definition AMReX_FabArray.H:882
FabArray() noexcept
Constructs an empty FabArray<FAB>.
Definition AMReX_FabArray.H:2012
void FillBoundary_test()
Definition AMReX_FabArrayCommI.H:1006
bool defined(int K) const noexcept
Definition AMReX_FabArray.H:1756
FAB * fabPtr(int K) noexcept
Definition AMReX_FabArray.H:1802
void ParallelAdd(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, int src_nghost, int dst_nghost, const Periodicity &period=Periodicity::NonPeriodic())
Similar to the above function, except that source and destination are grown by src_nghost and dst_ngh...
Definition AMReX_FabArray.H:920
const FAB & atLocalIdx(int L) const noexcept
Definition AMReX_FabArray.H:540
std::unique_ptr< FabFactory< FAB > > m_factory
Definition AMReX_FabArray.H:1481
void setVal(value_type val)
Set all components in the entire region of each FAB to val.
Definition AMReX_FabArray.H:2666
void setVal(value_type val, int comp, int ncomp, int nghost=0)
Set the value of num_comp components in the valid region of each FAB in the FabArray,...
Definition AMReX_FabArray.H:2683
void copy(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:897
MultiArray4< typename FabArray< FAB >::value_type > arrays() noexcept
Definition AMReX_FabArray.H:641
MultiArray4< typename FabArray< FAB >::value_type const > arrays() const noexcept
Definition AMReX_FabArray.H:648
void setVal(value_type val, int nghost)
Set all components in the valid region of each FAB in the FabArray to val, including nghost boundary ...
Definition AMReX_FabArray.H:1982
void copyTo(FAB &dest, int nghost=0) const
Copy the values contained in the intersection of the valid + nghost region of this FabArray with the ...
Definition AMReX_FabArray.H:2658
void ParallelAdd_nowait(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, int src_nghost, int dst_nghost, const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:957
void setBndry(value_type val, int strt_comp, int ncomp)
Set ncomp values in the boundary region, starting at start_comp to val.
Definition AMReX_FabArray.H:2462
void setVal(value_type val, const Box ®ion, const IntVect &nghost)
Definition AMReX_FabArray.H:2006
void FillBoundary_nowait(int scomp, int ncomp, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3705
const FAB & get(const MFIter &mfi) const noexcept
Return a constant reference to the FAB associated with mfi.
Definition AMReX_FabArray.H:518
void SumBoundary_finish()
Definition AMReX_FabArray.H:3662
std::size_t singleChunkSize() const noexcept
Definition AMReX_FabArray.H:479
void SumBoundary_nowait(int scomp, int ncomp, IntVect const &nghost, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Definition AMReX_FabArray.H:3642
void capacityOfFabs(LayoutData< I > &mem) const
Get capacity of the FabArray.
Definition AMReX_FabArray.H:2605
void mult(value_type val, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:2919
void FB_local_copy_cpu(const FB &TheFB, int scomp, int ncomp)
Definition AMReX_FBI.H:383
static void Saxpy(FabArray< FAB > &y, value_type a, FabArray< FAB > const &x, int xcomp, int ycomp, int ncomp, IntVect const &nghost)
y += a*x
Definition AMReX_FabArray.H:3087
MultiArray4< value_type > m_arrays
Definition AMReX_FabArray.H:1497
void FillBoundaryAndSync_nowait(const Periodicity &period=Periodicity::NonPeriodic())
Definition AMReX_FabArray.H:3528
void PC_local_gpu(const CPC &thecpc, FabArray< FAB > const &src, int scomp, int dcomp, int ncomp, CpOp op, bool deterministic)
Definition AMReX_PCI.H:90
Array4< typename FabArray< FAB >::value_type const > const_array(int K, int start_comp) const noexcept
Definition AMReX_FabArray.H:635
void FillBoundaryAndSync_nowait(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period)
Definition AMReX_FabArray.H:3535
Array4< typename FabArray< FAB >::value_type > array(int K) noexcept
Definition AMReX_FabArray.H:587
void * m_hp_arrays
Definition AMReX_FabArray.H:1496
ShMem shmem
Definition AMReX_FabArray.H:1550
void LocalAdd(FabArray< FAB > const &src, int scomp, int dcomp, int ncomp, IntVect const &nghost)
Perform local addition of FabArray data.
Definition AMReX_FabArray.H:1973
void setFab(int boxno, FAB &&elem)
Explicitly set the Kth FAB in the FabArray to point to elem.
Definition AMReX_FabArray.H:2389
FabArray< FAB > & operator=(FabArray< FAB > &&rhs) noexcept
Definition AMReX_FabArray.H:2104
MultiArray4< value_type const > m_const_arrays
Definition AMReX_FabArray.H:1498
void ParallelCopy(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:888
bool hasEBFabFactory() const noexcept
Definition AMReX_FabArray.H:456
Array4< typename FabArray< FAB >::value_type const > array(int K) const noexcept
Definition AMReX_FabArray.H:581
TagVector< Array4CopyTag< value_type > > const * FB_get_local_copy_tag_vector(const FB &TheFB)
Definition AMReX_FBI.H:490
bool isAllRegular() const noexcept
Definition AMReX_FabArray.H:481
Array4< typename FabArray< FAB >::value_type const > const_array(const MFIter &mfi, int start_comp) const noexcept
Definition AMReX_FabArray.H:629
void plus(value_type val, const Box ®ion, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:2879
FAB * fabPtr(const MFIter &mfi) noexcept
Return pointer to FAB.
Definition AMReX_FabArray.H:1782
Array4< typename FabArray< FAB >::value_type > array(const MFIter &mfi, int start_comp) noexcept
Definition AMReX_FabArray.H:611
void OverrideSync_finish()
Definition AMReX_FabArray.H:3589
static void pack_send_buffer_gpu(FabArray< FAB > const &src, int scomp, int ncomp, Vector< char * > const &send_data, Vector< std::size_t > const &send_size, Vector< const CopyComTagsContainer * > const &send_cctc, std::uint64_t id)
Definition AMReX_FBI.H:1112
FAB * release(const MFIter &mfi)
Release ownership of the FAB. This function is not thread safe.
Definition AMReX_FabArray.H:1895
MultiArray4< typename FabArray< FAB >::value_type const > const_arrays() const noexcept
Definition AMReX_FabArray.H:655
TagVector< CommRecvBufTag< value_type > > const * get_recv_copy_tag_vector(Vector< char * > const &recv_data, Vector< std::size_t > const &recv_size, Vector< CopyComTagsContainer const * > const &recv_cctc, int ncomp, std::uint64_t id)
void prefetchToHost(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:549
FAB & atLocalIdx(int L) noexcept
Return a reference to the FAB associated with local index L.
Definition AMReX_FabArray.H:539
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, const IntVect &ngrow, const MFInfo &info=MFInfo(), const FabFactory< FAB > &factory=DefaultFabFactory< FAB >())
Definition AMReX_FabArray.H:2195
void ParallelCopy_nowait(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:869
const FAB & get(int K) const noexcept
Return a constant reference to the FAB associated with the Kth element.
Definition AMReX_FabArray.H:530
void FillBoundary_finish()
Definition AMReX_FabArrayCommI.H:219
FAB const * fabPtr(const MFIter &mfi) const noexcept
Definition AMReX_FabArray.H:1792
void ParallelCopy_nowait(const FabArray< FAB > &src, int src_comp, int dest_comp, int num_comp, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:911
Array4< typename FabArray< FAB >::value_type > array(int K, int start_comp) noexcept
Definition AMReX_FabArray.H:623
bool isDefined() const
Definition AMReX_FabArray.H:2176
void setVal(value_type val, const Box ®ion, int nghost)
Set all components in the valid region of each FAB in the FabArray to val, including nghost boundary ...
Definition AMReX_FabArray.H:1998
value_type const * singleChunkPtr() const noexcept
Definition AMReX_FabArray.H:473
~FabArray()
The destructor – deletes all FABs in the array.
Definition AMReX_FabArray.H:2140
Definition AMReX_FabFactory.H:50
virtual Long nBytes(const Box &box, int ncomps, int) const
Definition AMReX_FabFactory.H:64
virtual FabFactory< FAB > * clone() const =0
virtual FAB * create(const Box &box, int ncomps, const FabInfo &info, int box_index) const =0
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
const Box & Domain() const noexcept
Returns our rectangular domain.
Definition AMReX_Geometry.H:216
bool isPeriodic(int dir) const noexcept
Is the domain periodic in the specified direction?
Definition AMReX_Geometry.H:337
GPU-compatible tuple.
Definition AMReX_Tuple.H:98
__host__ __device__ constexpr bool allGE(const IntVectND< dim > &rhs) const noexcept
Returns true if this is greater than or equal to argument for all components. NOTE: This is NOT a str...
Definition AMReX_IntVect.H:542
__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:771
__host__ __device__ constexpr int max() const noexcept
maximum (no absolute values) value
Definition AMReX_IntVect.H:313
__host__ __device__ constexpr bool allLE(const IntVectND< dim > &rhs) const noexcept
Returns true if this is less than or equal to argument for all components. NOTE: This is NOT a strict...
Definition AMReX_IntVect.H:492
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:88
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:172
int index() const noexcept
The index into the underlying BoxArray of the current FAB.
Definition AMReX_MFIter.H:175
int LocalIndex() const noexcept
Return local index into the vector of fab pointers, m_fabs_v When AllBoxes is on, local_index_map is ...
Definition AMReX_MFIter.H:190
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
bool isAnyPeriodic() const noexcept
Definition AMReX_Periodicity.H:22
bool isPeriodic(int dir) const noexcept
Definition AMReX_Periodicity.H:26
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Long size() const noexcept
Definition AMReX_Vector.H:53
amrex_long Long
Definition AMReX_INT.H:30
void EnforcePeriodicity(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period)
Definition AMReX_FabArray.H:3692
void SumBoundary(int scomp, int ncomp, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Definition AMReX_FabArray.H:3604
void SumBoundary(int scomp, int ncomp, IntVect const &nghost, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Sum values in overlapped cells.
Definition AMReX_FabArray.H:3611
void OverrideSync(const Periodicity &period=Periodicity::NonPeriodic())
Synchronize nodal data.
Definition AMReX_FabArray.H:3552
void FillBoundary(bool cross=false)
Copy on intersection within a FabArray.
Definition AMReX_FabArray.H:3397
F::value_type norminf(int comp, int ncomp, IntVect const &nghost, bool local=false, bool ignore_covered=false) const
Return infinity norm.
Definition AMReX_FabArray.H:3865
void OverrideSync(int scomp, int ncomp, const Periodicity &period)
Synchronize nodal data.
Definition AMReX_FabArray.H:3563
void FillBoundary(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3459
void FillBoundaryAndSync(int scomp, int ncomp, const IntVect &nghost, const Periodicity &period)
Fill ghost cells and synchronize nodal data.
Definition AMReX_FabArray.H:3516
void FillBoundary(const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3409
void FillBoundary(int scomp, int ncomp, bool cross=false)
Definition AMReX_FabArray.H:3435
void FillBoundaryAndSync(const Periodicity &period=Periodicity::NonPeriodic())
Fill ghost cells and synchronize nodal data.
Definition AMReX_FabArray.H:3505
void SumBoundary(const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Sum values in overlapped cells.
Definition AMReX_FabArray.H:3597
void SumBoundary(int scomp, int ncomp, IntVect const &src_nghost, IntVect const &dst_nghost, const Periodicity &period=Periodicity::NonPeriodic(), bool deterministic=false)
Sum values in overlapped cells.
Definition AMReX_FabArray.H:3618
void EnforcePeriodicity(const Periodicity &period)
Fill ghost cells with values from their corresponding cells across periodic boundaries,...
Definition AMReX_FabArray.H:3670
void FillBoundary(int scomp, int ncomp, const Periodicity &period, bool cross=false)
Definition AMReX_FabArray.H:3447
F::value_type norminf(FabArray< IFAB > const &mask, int comp, int ncomp, IntVect const &nghost, bool local=false) const
Return infinity norm in masked region.
Definition AMReX_FabArray.H:3956
void EnforcePeriodicity(int scomp, int ncomp, const Periodicity &period)
Definition AMReX_FabArray.H:3681
Arena * The_Comms_Arena()
Definition AMReX_Arena.cpp:880
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:860
Arena * The_Arena()
Definition AMReX_Arena.cpp:820
int MyProc() noexcept
Definition AMReX_ParallelDescriptor.H:128
void Min(KeyValuePair< K, V > &vi, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:161
void Sum(T &v, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:221
void Max(KeyValuePair< K, V > &vi, MPI_Comm comm)
Definition AMReX_ParallelReduce.H:133
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:310
bool inLaunchRegion() noexcept
Definition AMReX_GpuControl.H:88
bool inNoSyncRegion() noexcept
Definition AMReX_GpuControl.H:148
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:421
MPI_Comm CommunicatorSub() noexcept
sub-communicator for current frame
Definition AMReX_ParallelContext.H:70
int MyTeamLead() noexcept
Definition AMReX_ParallelDescriptor.H:325
int TeamSize() noexcept
Definition AMReX_ParallelDescriptor.H:310
const ProcessTeam & MyTeam() noexcept
Definition AMReX_ParallelDescriptor.H:365
int MPI_Comm
Definition AMReX_ccse-mpi.H:51
Definition AMReX_Amr.cpp:50
std::enable_if_t< IsFabArray< MF >::value > FillBoundaryAndSync_nowait(Vector< MF * > const &mf, Vector< int > const &scomp, Vector< int > const &ncomp, Vector< IntVect > const &nghost, Vector< Periodicity > const &period)
Launch FillBoundaryAndSync_nowait across a vector of FabArrays.
Definition AMReX_FabArrayCommI.H:1136
MakeType
Definition AMReX_MakeType.H:7
@ make_alias
Definition AMReX_MakeType.H:7
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:139
std::enable_if_t< IsFabArray< MF >::value > FillBoundaryAndSync_finish(Vector< MF * > const &mf)
Wait for outstanding FillBoundaryAndSync_nowait operations launched with the vector helper to complet...
Definition AMReX_FabArrayCommI.H:1178
__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
int nComp(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2852
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
std::unique_ptr< char, TheFaArenaDeleter > TheFaArenaPointer
Definition AMReX_FabArray.H:105
DistributionMapping const & DistributionMap(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2867
IntVect nGrowVect(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2857
std::enable_if_t< IsFabArray< MF >::value > FillBoundary_finish(Vector< MF * > const &mf)
Wait for outstanding FillBoundary_nowait operations launched with the vector helper to complete.
Definition AMReX_FabArrayCommI.H:1113
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 Copy(FabArray< DFAB > &dst, FabArray< SFAB > const &src, int srccomp, int dstcomp, int numcomp, int nghost)
Definition AMReX_FabArray.H:182
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:30
Long nBytesOwned(T const &) noexcept
Definition AMReX_FabArray.H:59
bool isMFIterSafe(const FabArrayBase &x, const FabArrayBase &y)
Definition AMReX_MFIter.H:252
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:44
void setBndry(MF &dst, typename MF::value_type val, int scomp, int ncomp)
dst = val in ghost cells.
Definition AMReX_FabArrayUtility.H:1934
__host__ __device__ T abs(const GpuComplex< T > &a_z) noexcept
Return the absolute value of a complex number.
Definition AMReX_GpuComplex.H:361
bool TilingIfNotGPU() noexcept
Definition AMReX_MFIter.H:12
void Add(FabArray< FAB > &dst, FabArray< FAB > const &src, int srccomp, int dstcomp, int numcomp, int nghost)
Definition AMReX_FabArray.H:245
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:241
void OverrideSync_finish(FabArray< FAB > &fa)
Definition AMReX_FabArrayUtility.H:1501
void update_fab_stats(Long n, Long s, size_t szt) noexcept
Definition AMReX_BaseFab.cpp:146
void setVal(MF &dst, typename MF::value_type val)
dst = val
Definition AMReX_FabArrayUtility.H:1927
BoxArray const & boxArray(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2862
void OverrideSync_nowait(FabArray< FAB > &fa, FabArray< IFAB > const &msk, const Periodicity &period)
Definition AMReX_FabArrayUtility.H:1454
__host__ __device__ constexpr int get(IntVectND< dim > const &iv) noexcept
Get I'th element of IntVectND<dim>
Definition AMReX_IntVect.H:1334
Definition AMReX_TagParallelFor.H:58
A multidimensional array accessor.
Definition AMReX_Array4.H:283
Definition AMReX_DataAllocator.H:9
Arena * arena() const noexcept
Definition AMReX_DataAllocator.H:24
Arena * m_arena
Definition AMReX_DataAllocator.H:10
Definition AMReX_FabArray.H:109
const FabArrayBase::FB * fb
Definition AMReX_FabArray.H:111
bool deterministic
Definition AMReX_FabArray.H:128
char * the_recv_data
Definition AMReX_FabArray.H:116
Vector< MPI_Request > recv_reqs
Definition AMReX_FabArray.H:121
Vector< char * > recv_data
Definition AMReX_FabArray.H:119
Vector< MPI_Status > recv_stat
Definition AMReX_FabArray.H:122
int scomp
Definition AMReX_FabArray.H:112
Vector< int > recv_from
Definition AMReX_FabArray.H:118
char * the_send_data
Definition AMReX_FabArray.H:117
Vector< MPI_Request > send_reqs
Definition AMReX_FabArray.H:125
Vector< char * > send_data
Definition AMReX_FabArray.H:124
Vector< std::size_t > recv_size
Definition AMReX_FabArray.H:120
int ncomp
Definition AMReX_FabArray.H:113
int tag
Definition AMReX_FabArray.H:126
parallel copy or add
Definition AMReX_FabArrayBase.H:538
Used by a bunch of routines when communicating via MPI.
Definition AMReX_FabArrayBase.H:195
Box dbox
Definition AMReX_FabArrayBase.H:196
int dstIndex
Definition AMReX_FabArrayBase.H:198
FillBoundary.
Definition AMReX_FabArrayBase.H:488
void recordBuild() noexcept
Definition AMReX_FabArrayBase.H:704
Definition AMReX_FabArray.H:354
FAB value_type
Definition AMReX_FabArray.H:355
for shared memory
Definition AMReX_FabArray.H:1503
ShMem(ShMem &&rhs) noexcept
Definition AMReX_FabArray.H:1517
Long n_values
Definition AMReX_FabArray.H:1544
Long n_points
Definition AMReX_FabArray.H:1545
bool alloc
Definition AMReX_FabArray.H:1543
ShMem & operator=(ShMem &&rhs) noexcept
Definition AMReX_FabArray.H:1528
ShMem(const ShMem &)=delete
Definition AMReX_TypeTraits.H:18
FabArray memory allocation information.
Definition AMReX_FabArray.H:67
MFInfo & SetTag(T &&t, Ts &&... ts) noexcept
Definition AMReX_FabArray.H:93
MFInfo & SetTag(const std::string &t) noexcept
Definition AMReX_FabArray.H:87
Arena * arena
Definition AMReX_FabArray.H:71
MFInfo & SetArena(Arena *ar) noexcept
Definition AMReX_FabArray.H:78
MFInfo & SetTag() noexcept
Definition AMReX_FabArray.H:80
bool alloc
Definition AMReX_FabArray.H:69
MFInfo & SetAlloc(bool a) noexcept
Definition AMReX_FabArray.H:74
bool alloc_single_chunk
Definition AMReX_FabArray.H:70
MFInfo & SetAllocSingleChunk(bool a) noexcept
Definition AMReX_FabArray.H:76
Vector< std::string > tags
Definition AMReX_FabArray.H:72
MFInfo & SetTag(const char *t) noexcept
Definition AMReX_FabArray.H:82
Definition AMReX_MFIter.H:20
MFItInfo & DisableDeviceSync() noexcept
Definition AMReX_MFIter.H:47
Definition AMReX_FabArray.H:155
Array4< T > const *__restrict__ hp
Definition AMReX_FabArray.H:171
__host__ __device__ Array4< T > const & operator[](int li) const noexcept
Definition AMReX_FabArray.H:157
Array4< T > const *__restrict__ dp
Definition AMReX_FabArray.H:169
Definition AMReX_FabArray.H:133
int actual_n_rcvs
Definition AMReX_FabArray.H:139
Vector< std::size_t > recv_size
Definition AMReX_FabArray.H:146
int DC
Definition AMReX_FabArray.H:140
Vector< MPI_Request > send_reqs
Definition AMReX_FabArray.H:148
int tag
Definition AMReX_FabArray.H:138
const FabArray< FAB > * src
Definition AMReX_FabArray.H:136
char * the_recv_data
Definition AMReX_FabArray.H:142
FabArrayBase::CpOp op
Definition AMReX_FabArray.H:137
Vector< MPI_Request > recv_reqs
Definition AMReX_FabArray.H:147
char * the_send_data
Definition AMReX_FabArray.H:143
const FabArrayBase::CPC * cpc
Definition AMReX_FabArray.H:135
Vector< int > recv_from
Definition AMReX_FabArray.H:144
bool deterministic
Definition AMReX_FabArray.H:149
int NC
Definition AMReX_FabArray.H:140
int SC
Definition AMReX_FabArray.H:140
Vector< char * > recv_data
Definition AMReX_FabArray.H:145
void MemoryBarrier() const
memory fence
Definition AMReX_ParallelDescriptor.H:161
const team_t & get() const
Definition AMReX_ParallelDescriptor.H:189
Definition AMReX_TagParallelFor.H:158
Definition AMReX_FabArray.H:99
char * pointer
Definition AMReX_FabArray.H:100
void operator()(pointer p) const noexcept
Definition AMReX_FabArray.H:101
Struct for holding types.
Definition AMReX_TypeList.H:13