Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_FabArrayBase.H
Go to the documentation of this file.
1#ifndef BL_FABARRAYBASE_H_
2#define BL_FABARRAYBASE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_BoxArray.H>
10#include <AMReX_Periodicity.H>
11#include <AMReX_Print.H>
12#include <AMReX_Arena.H>
13#include <AMReX_Gpu.H>
14
15#ifdef AMREX_USE_OMP
16#include <omp.h>
17#endif
18
19#include <cstdint>
20#include <ostream>
21#include <string>
22#include <utility>
23
24
25namespace amrex {
26
27class MFIter;
28class Geometry;
29class FArrayBox;
30template <typename FAB> class FabFactory;
31template <typename FAB> class FabArray;
32
33namespace EB2 { class IndexSpace; }
34
42{
43 friend class MFIter;
44
45 template <class FAB> friend void FillBoundary (Vector<FabArray<FAB>*> const& mf, const Periodicity& period);
46
47public:
48
49 FabArrayBase () = default;
50 ~FabArrayBase () = default;
51
52 FabArrayBase (const BoxArray& bxs,
53 const DistributionMapping& dm,
54 int nvar,
55 int ngrow);
56
57 FabArrayBase (const BoxArray& bxs,
58 const DistributionMapping& dm,
59 int nvar,
60 const IntVect& ngrow);
61
62 FabArrayBase (FabArrayBase&& rhs) noexcept = default;
63 FabArrayBase (const FabArrayBase& rhs) = default;
64 FabArrayBase& operator= (const FabArrayBase& rhs) = default;
66
67 void define (const BoxArray& bxs,
68 const DistributionMapping& dm,
69 int nvar,
70 int ngrow);
71
72 void define (const BoxArray& bxs,
73 const DistributionMapping& dm,
74 int nvar,
75 const IntVect& ngrow);
76
78 [[nodiscard]] int nGrow (int direction = 0) const noexcept { return n_grow[direction]; }
79
80 [[nodiscard]] IntVect nGrowVect () const noexcept { return n_grow; }
81
83 [[nodiscard]] int nComp () const noexcept { return n_comp; }
84
86 [[nodiscard]] IndexType ixType () const noexcept { return boxarray.ixType(); }
87
88 //Return whether this FabArray is empty
89 [[nodiscard]] bool empty () const noexcept { return boxarray.empty(); }
90
95 [[nodiscard]] const BoxArray& boxArray () const noexcept { return boxarray; }
96
101 [[nodiscard]] Box box (int K) const noexcept { return boxarray[K]; }
102
107 [[nodiscard]] Box fabbox (int K) const noexcept;
108
110 [[nodiscard]] int size () const noexcept { return static_cast<int>(boxarray.size()); }
111
113 [[nodiscard]] int local_size () const noexcept { return static_cast<int>(indexArray.size()); }
114
116 [[nodiscard]] const Vector<int> &IndexArray () const noexcept { return indexArray; }
117
119 [[nodiscard]] int localindex (int K) const noexcept {
120 auto low = std::ranges::lower_bound(indexArray, K);
121 if (low != indexArray.end() && *low == K) {
122 return static_cast<int>(low - indexArray.begin());
123 }
124 else {
125 return -1;
126 }
127 }
128
130 [[nodiscard]] const DistributionMapping& DistributionMap () const noexcept { return distributionMap; }
131
135 [[nodiscard]] bool is_nodal () const noexcept;
139 [[nodiscard]] bool is_nodal (int dir) const noexcept;
143 [[nodiscard]] bool is_cell_centered () const noexcept;
144
145 void setMultiGhost(bool a_multi_ghost) {m_multi_ghost = a_multi_ghost;}
146
147 // These are provided for convenience to keep track of how many
148 // ghost cells are up to date. The number of filled ghost cells
149 // is updated by FillBoundary and ParallelCopy.
150 [[nodiscard]] IntVect nGrowFilled () const noexcept { return n_filled; }
151 void setNGrowFilled (IntVect const& ng) noexcept { n_filled = ng; }
152
154 [[nodiscard]] bool isFusingCandidate () const noexcept;
155
157 struct CacheStats
158 {
159 int size{0};
160 int maxsize{0};
161 Long maxuse{0};
162 Long nuse{0};
163 Long nbuild{0};
164 Long nerase{0};
165 Long bytes{0};
166 Long bytes_hwm{0};
167 std::string name;
168 explicit CacheStats (std::string name_)
169 : name(std::move(name_)) {}
170 void recordBuild () noexcept {
171 ++size;
172 ++nbuild;
173 maxsize = std::max(maxsize, size);
174 }
175 void recordErase (Long n) noexcept {
176 // n: how many times the item to be deleted has been used.
177 --size;
178 ++nerase;
179 maxuse = std::max(maxuse, n);
180 }
181 void recordUse () noexcept { ++nuse; }
182 void print () const {
183 amrex::Print(Print::AllProcs) << "### " << name << " ###\n"
184 << " tot # of builds : " << nbuild << "\n"
185 << " tot # of erasures: " << nerase << "\n"
186 << " tot # of uses : " << nuse << "\n"
187 << " max cache size : " << maxsize << "\n"
188 << " max # of uses : " << maxuse << "\n";
189 }
190 };
194 {
199 CopyComTag () noexcept = default;
200 CopyComTag (const Box& db, const Box& sb, int didx, int sidx) noexcept
201 : dbox(db), sbox(sb), dstIndex(didx), srcIndex(sidx) {}
202 bool operator< (const CopyComTag& rhs) const noexcept {
203 return (srcIndex < rhs.srcIndex) || ((srcIndex == rhs.srcIndex) && (
204 (sbox.smallEnd() < rhs.sbox.smallEnd()
205 || ((sbox.smallEnd() == rhs.sbox.smallEnd()) && (
206 (dstIndex < rhs.dstIndex) || ((dstIndex == rhs.dstIndex) && (
207 (dbox.smallEnd() < rhs.dbox.smallEnd()))))))));
208 }
209 //
210 // Some typedefs & helper functions used throughout the code.
211 //
212 using CopyComTagsContainer = std::vector<CopyComTag>;
213
214 using MapOfCopyComTagContainers = std::map<int,CopyComTagsContainer>;
215 };
216 //
217 // Some useful typedefs.
218 //
221 //
223
229 struct BDKey {
230 BDKey () noexcept = default;
231 BDKey (const BoxArray::RefID& baid, const DistributionMapping::RefID& dmid) noexcept
232 : m_ba_id(baid), m_dm_id(dmid) {}
233 bool operator< (const BDKey& rhs) const noexcept {
234 return (m_ba_id < rhs.m_ba_id) ||
235 ((m_ba_id == rhs.m_ba_id) && (m_dm_id < rhs.m_dm_id));
236 }
237 bool operator== (const BDKey& rhs) const noexcept {
238 return m_ba_id == rhs.m_ba_id && m_dm_id == rhs.m_dm_id;
239 }
240 bool operator!= (const BDKey& rhs) const noexcept {
241 return m_ba_id != rhs.m_ba_id || m_dm_id != rhs.m_dm_id;
242 }
243 friend std::ostream& operator<< (std::ostream& os, const BDKey& id);
244 private:
245 BoxArray::RefID m_ba_id;
247 };
248
249 [[nodiscard]] BDKey getBDKey () const noexcept {
251 }
252
253 void updateBDKey ();
254
255 //
267
268 //
271 {
272 int fromProc{0};
273 int toProc{0};
274 int fabIndex{0};
275 int fineIndex{0};
276 int srcComp{0};
277 int destComp{0};
278 int nComp{0};
279 int face{0};
281 int fillBoxId{0};
285 };
286
289
292
294 static void Initialize ();
295 static void Finalize ();
302
303 struct FPinfo
304 {
305 FPinfo (const FabArrayBase& srcfa,
306 const FabArrayBase& dstfa,
307 const Box& dstdomain,
308 const IntVect& dstng,
309 const BoxConverter& coarsener,
310 const Box& fdomain,
311 const Box& cdomain,
312 const EB2::IndexSpace* index_space);
313
314 [[nodiscard]] Long bytes () const;
315
319 std::unique_ptr<FabFactory<FArrayBox> > fact_crse_patch;
320 std::unique_ptr<FabFactory<FArrayBox> > fact_fine_patch;
321 //
326 std::unique_ptr<BoxConverter> m_coarsener;
327 //
329 };
330
331 using FPinfoCache = std::multimap<BDKey,FabArrayBase::FPinfo*>;
332 using FPinfoCacheIter = FPinfoCache::iterator;
333
335
336 static CacheStats m_FPinfo_stats;
337
338 static const FPinfo& TheFPinfo (const FabArrayBase& srcfa,
339 const FabArrayBase& dstfa,
340 const IntVect& dstng,
341 const BoxConverter& coarsener,
342 const Geometry& fgeom,
343 const Geometry& cgeom,
344 const EB2::IndexSpace*);
345
346 void flushFPinfo (bool no_assertion=false) const;
347
348 //
350 struct CFinfo
351 {
352 CFinfo (const FabArrayBase& finefa,
353 const Geometry& finegm,
354 const IntVect& ng,
355 bool include_periodic,
356 bool include_physbndry);
357
358 [[nodiscard]] Long bytes () const;
359
360 static Box Domain (const Geometry& geom, const IntVect& ng,
361 bool include_periodic, bool include_physbndry);
362
366 //
372 //
374 };
375
376 using CFinfoCache = std::multimap<BDKey,FabArrayBase::CFinfo*>;
377 using CFinfoCacheIter = CFinfoCache::iterator;
378
380
381 static CacheStats m_CFinfo_stats;
382
383 static const CFinfo& TheCFinfo (const FabArrayBase& finefa,
384 const Geometry& finegm,
385 const IntVect& ng,
386 bool include_periodic,
387 bool include_physbndry);
388
389 void flushCFinfo (bool no_assertion=false) const;
390
391 //
393 enum CpOp { COPY = 0, ADD = 1 };
394
395 const TileArray* getTileArray (const IntVect& tilesize) const;
396
397 // Memory Usage Tags
398 struct meminfo {
401 };
402 static std::map<std::string, meminfo> m_mem_usage;
403
404 static void updateMemUsage (std::string const& tag, Long nbytes, Arena const* ar);
405 static void printMemUsage ();
406 static Long queryMemUsage (const std::string& tag = std::string("All"));
407 static Long queryMemUsageHWM (const std::string& tag = std::string("All"));
408
409 static void pushRegionTag (const char* t);
410 static void pushRegionTag (std::string t);
411 static void popRegionTag ();
412
413 static AMREX_EXPORT std::vector<std::string> m_region_tag;
414 struct RegionTag {
415 RegionTag (const char* t) : tagged(true) { pushRegionTag(t); }
416 RegionTag (const std::string& t) : tagged(true) { pushRegionTag(t); }
417 RegionTag (RegionTag const&) = delete;
418 RegionTag (RegionTag && rhs) noexcept : tagged(rhs.tagged) { rhs.tagged = false; }
419 RegionTag& operator= (RegionTag const&) = delete;
421 ~RegionTag () { if (tagged) { popRegionTag(); } }
422 private:
423 bool tagged = false;
424 };
425
426//#ifndef AMREX_USE_GPU
427//protected:
428//#endif
429
430 void clear ();
431
437 const std::vector<bool>& OwnerShip () const noexcept { return ownership; }
438 bool isOwner (int li) const noexcept { return ownership[li]; }
439
440 //
441 // The data ...
442 //
446 std::vector<bool> ownership;
449 mutable BDKey m_bdkey;
450 IntVect n_filled; // Note that IntVect is zero by default.
451 bool m_multi_ghost = false;
452
453 //
454 // Tiling
455 //
456 // We use tile size as the key for the inner map.
457
458 using TAMap = std::map<std::pair<IntVect,IntVect>, TileArray>;
459 using TACache = std::map<BDKey, TAMap>;
460 //
462 static CacheStats m_TAC_stats;
463 //
464 void buildTileArray (const IntVect& tilesize, TileArray& ta) const;
465 //
466 void flushTileArray (const IntVect& tilesize = IntVect::TheZeroVector(),
467 bool no_assertion=false) const;
468 static void flushTileArrayCache ();
469
471 {
472 // The cache of local and send/recv per FillBoundary() or ParallelCopy().
473 bool m_threadsafe_loc = false;
474 bool m_threadsafe_rcv = false;
475 std::unique_ptr<CopyComTagsContainer> m_LocTags;
476 std::unique_ptr<MapOfCopyComTagContainers> m_SndTags;
477 std::unique_ptr<MapOfCopyComTagContainers> m_RcvTags;
478 };
479
480 void define_fb_metadata (CommMetaData& cmd, const IntVect& nghost, bool cross,
481 const Periodicity& period, bool multi_ghost) const;
482
483 //
485 struct FB
487 {
488 FB (const FabArrayBase& fa, const IntVect& nghost,
489 bool cross, const Periodicity& period,
490 bool enforce_periodicity_only, bool override_sync,
491 bool multi_ghost, IntVect const& sumboundary_src_nghost);
492
493 std::uint64_t m_id = std::numeric_limits<std::uint64_t>::max();
499 bool m_epo;
502 //
504 bool m_multi_ghost = false;
505 //
506#if defined(__CUDACC__) && defined (AMREX_USE_CUDA)
507 CudaGraph<CopyMemory> m_localCopy;
508 CudaGraph<CopyMemory> m_copyToBuffer;
509 CudaGraph<CopyMemory> m_copyFromBuffer;
510#endif
511 //
512 [[nodiscard]] Long bytes () const;
513 private:
514 void define_fb (const FabArrayBase& fa);
515 void define_epo (const FabArrayBase& fa);
516 void define_os (const FabArrayBase& fa);
517 void define_sb (const FabArrayBase& fa);
518 void tag_one_box (int krcv, BoxArray const& ba, DistributionMapping const& dm,
519 bool build_recv_tag);
520 };
521 //
522 using FBCache = std::multimap<BDKey,FabArrayBase::FB*>;
523 using FBCacheIter = FBCache::iterator;
524 //
526 static CacheStats m_FBC_stats;
527 //
528 const FB& getFB (const IntVect& nghost, const Periodicity& period,
529 bool cross=false, bool enforce_periodicity_only = false,
530 bool override_sync = false,
531 IntVect const& sumboundary_src_nghost = IntVect(-1)) const;
532
533 //
535 struct CPC
537 {
538 CPC (const FabArrayBase& dstfa, const IntVect& dstng,
539 const FabArrayBase& srcfa, const IntVect& srcng,
540 const Periodicity& period, bool to_ghost_cells_only = false,
541 const IntVect& offset = IntVect(0));
542 CPC (const BoxArray& dstba, const DistributionMapping& dstdm,
543 const Vector<int>& dstidx, const IntVect& dstng,
544 const BoxArray& srcba, const DistributionMapping& srcdm,
545 const Vector<int>& srcidx, const IntVect& srcng,
546 const Periodicity& period, int myproc);
547 CPC (const BoxArray& ba, const IntVect& ng,
548 const DistributionMapping& dstdm, const DistributionMapping& srcdm);
549
550 [[nodiscard]] Long bytes () const;
551
552 std::uint64_t m_id = std::numeric_limits<std::uint64_t>::max();
559 bool m_tgco;
562 //
564
565 private:
566 void define (const BoxArray& ba_dst, const DistributionMapping& dm_dst,
567 const Vector<int>& imap_dst,
568 const BoxArray& ba_src, const DistributionMapping& dm_src,
569 const Vector<int>& imap_src,
570 int MyProc = ParallelDescriptor::MyProc());
571 };
572
573 //
574 using CPCache = std::multimap<BDKey,FabArrayBase::CPC*>;
575 using CPCacheIter = CPCache::iterator;
576 //
578 static CacheStats m_CPC_stats;
579 //
580 const CPC& getCPC (const IntVect& dstng, const FabArrayBase& src, const IntVect& srcng,
581 const Periodicity& period, bool to_ghost_cells_only = false,
582 const IntVect& offset = IntVect(0)) const;
583
584 //
586 struct RB90
588 {
589 RB90 (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
592 private:
593 void define (const FabArrayBase& fa);
594 };
595 //
596 using RB90Cache = std::multimap<BDKey,FabArrayBase::RB90*>;
597 using RB90CacheIter = RB90Cache::iterator;
598 //
600 //
601 const RB90& getRB90 (const IntVect& nghost, const Box& domain) const;
602 //
603 void flushRB90 (bool no_assertion=false) const;
604 static void flushRB90Cache ();
605
606 //
608 struct RB180
610 {
611 RB180 (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
614 private:
615 void define (const FabArrayBase& fa);
616 };
617 //
618 using RB180Cache = std::multimap<BDKey,FabArrayBase::RB180*>;
619 using RB180CacheIter = RB180Cache::iterator;
620 //
622 //
623 const RB180& getRB180 (const IntVect& nghost, const Box& domain) const;
624 //
625 void flushRB180 (bool no_assertion=false) const;
626 static void flushRB180Cache ();
627
628 //
630 struct PolarB
632 {
633 PolarB (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
636 private:
637 void define (const FabArrayBase& fa);
638 };
639 //
640 using PolarBCache = std::multimap<BDKey,FabArrayBase::PolarB*>;
641 using PolarBCacheIter = PolarBCache::iterator;
642 //
644 //
645 const PolarB& getPolarB (const IntVect& nghost, const Box& domain) const;
646 //
647 void flushPolarB (bool no_assertion=false) const;
648 static void flushPolarBCache ();
649
650#ifdef AMREX_USE_GPU
651 //
654 {
655 ParForInfo (const FabArrayBase& fa, const IntVect& nghost);
656 ~ParForInfo ();
657
658 int getNBlocksPerBox (int nthreads) const {
659 return int((m_ncellsmax+nthreads-1)/nthreads);
660 }
661 BoxIndexer const* getBoxes () const { return m_boxes; }
662
663 ParForInfo () = delete;
664 ParForInfo (ParForInfo const&) = delete;
665 ParForInfo (ParForInfo &&) = delete;
666 void operator= (ParForInfo const&) = delete;
667 void operator= (ParForInfo &&) = delete;
668
669 BATransformer m_bat;
672 BoxIndexer* m_boxes = nullptr;
673 char* m_hp = nullptr;
674 };
675
676 ParForInfo const& getParForInfo (const IntVect& nghost) const;
677
678 static std::multimap<BDKey,ParForInfo*> m_TheParForCache;
679
680 void flushParForInfo (bool no_assertion=false) const; // flushes its own cache
681 static void flushParForCache (); // flushes the entire cache
682
683#endif
684
685 //
687 static std::map<BDKey, int> m_BD_count;
688 //
690 void clearThisBD (bool no_assertion=false) const;
691 //
693 void addThisBD ();
694 //
696 {
702
703 void recordBuild () noexcept {
705 ++num_build;
707 }
708 void recordDelete () noexcept {
710 }
711 void recordMaxNumBoxArrays (int n) noexcept {
713 }
714 void recordMaxNumBAUse (int n) noexcept {
715 max_num_ba_use = std::max(max_num_ba_use, n);
716 }
717 void print () const {
718 amrex::Print(Print::AllProcs) << "### FabArray ###\n"
719 << " tot # of builds : " << num_build << "\n"
720 << " max # of FabArrays : " << max_num_fabarrays << "\n"
721 << " max # of BoxArrays : " << max_num_boxarrays << "\n"
722 << " max # of BoxArray uses: " << max_num_ba_use << "\n";
723 }
724 };
726
728
729 [[nodiscard]] static bool getAllocSingleChunk () { return m_alloc_single_chunk; }
730
731 [[nodiscard]] static std::uint64_t getNextCommMetaDataId ();
732
733private:
734
735 void flushFB (bool no_assertion=false) const;
736 static void flushFBCache ();
737
738 void flushCPC (bool no_assertion=false) const;
739 static void flushCPCache ();
740};
741
743namespace detail {
744 class SingleChunkArena final
745 : public Arena
746 {
747 public:
748 SingleChunkArena (Arena* a_arena, std::size_t a_size);
749 ~SingleChunkArena () override;
750
751 SingleChunkArena () = delete;
752 SingleChunkArena (const SingleChunkArena& rhs) = delete;
753 SingleChunkArena (SingleChunkArena&& rhs) = delete;
754 SingleChunkArena& operator= (const SingleChunkArena& rhs) = delete;
755 SingleChunkArena& operator= (SingleChunkArena&& rhs) = delete;
756
757 [[nodiscard]] void* alloc (std::size_t sz) override;
758 void free (void* pt) override;
759
760 // isDeviceAccessible and isHostAccessible can both be true.
761 [[nodiscard]] bool isDeviceAccessible () const override;
762 [[nodiscard]] bool isHostAccessible () const override;
763
764 [[nodiscard]] bool isManaged () const override;
765 [[nodiscard]] bool isDevice () const override;
766 [[nodiscard]] bool isPinned () const override;
767
768 [[nodiscard]] void* data () const noexcept { return (void*) m_root; }
769
770 private:
771 DataAllocator m_dallocator;
772 char* m_root = nullptr;
773 char* m_free = nullptr;
774 std::size_t m_size = 0;
775 };
776}
778
779[[nodiscard]] int nComp (FabArrayBase const& fa);
780[[nodiscard]] IntVect nGrowVect (FabArrayBase const& fa);
781[[nodiscard]] BoxArray const& boxArray (FabArrayBase const& fa);
782[[nodiscard]] DistributionMapping const& DistributionMap (FabArrayBase const& fa);
783
784#ifdef BL_USE_MPI
785bool CheckRcvStats (Vector<MPI_Status>& recv_stats, const Vector<std::size_t>& recv_size, int tag);
786#endif
787
788std::ostream& operator<< (std::ostream& os, const FabArrayBase::BDKey& id);
789
790}
791
792#endif
#define AMREX_EXPORT
Definition AMReX_Extension.H:191
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1139
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:132
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:564
IndexType ixType() const noexcept
Return index type of this BoxArray.
Definition AMReX_BoxArray.H:854
RefID getRefID() const noexcept
Return a unique ID of the reference.
Definition AMReX_BoxArray.H:851
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:611
bool empty() const noexcept
Return whether the BoxArray is empty.
Definition AMReX_BoxArray.H:617
Definition AMReX_Box.H:1266
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:112
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
RefID getRefID() const noexcept
This gives a unique ID of the reference, which is different from dmID above.
Definition AMReX_DistributionMapping.H:385
Definition AMReX_EB2.H:28
Base class for FabArray.
Definition AMReX_FabArrayBase.H:42
void flushTileArray(const IntVect &tilesize=IntVect::TheZeroVector(), bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2469
static Long bytesOfMapOfCopyComTagContainers(const MapOfCopyComTagContainers &)
Definition AMReX_FabArrayBase.cpp:223
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
static std::multimap< BDKey, ParForInfo * > m_TheParForCache
Definition AMReX_FabArrayBase.H:678
void clearThisBD(bool no_assertion=false) const
clear BD count and caches associated with this BD, if no other is using this BD.
Definition AMReX_FabArrayBase.cpp:2520
void clear()
Definition AMReX_FabArrayBase.cpp:207
void flushPolarB(bool no_assertion=false) const
This flushes its own PolarB.
Definition AMReX_FabArrayBase.cpp:1837
std::multimap< BDKey, FabArrayBase::FPinfo * > FPinfoCache
Definition AMReX_FabArrayBase.H:331
Vector< int > indexArray
Definition AMReX_FabArrayBase.H:445
FabArrayBase()=default
static void pushRegionTag(const char *t)
Definition AMReX_FabArrayBase.cpp:2669
static TACache m_TheTileArrayCache
Definition AMReX_FabArrayBase.H:461
const Vector< int > & IndexArray() const noexcept
Return constant reference to indices in the FabArray that we have access.
Definition AMReX_FabArrayBase.H:116
void define_fb_metadata(CommMetaData &cmd, const IntVect &nghost, bool cross, const Periodicity &period, bool multi_ghost) const
Definition AMReX_FabArrayBase.cpp:666
const TileArray * getTileArray(const IntVect &tilesize) const
Definition AMReX_FabArrayBase.cpp:2342
static void flushRB90Cache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1499
static FabArrayStats m_FA_stats
Definition AMReX_FabArrayBase.H:725
static bool getAllocSingleChunk()
Definition AMReX_FabArrayBase.H:729
BDKey m_bdkey
Definition AMReX_FabArrayBase.H:449
void addThisBD()
add the current BD into BD count database
Definition AMReX_FabArrayBase.cpp:2550
void setNGrowFilled(IntVect const &ng) noexcept
Definition AMReX_FabArrayBase.H:151
static void popRegionTag()
Definition AMReX_FabArrayBase.cpp:2681
static CFinfoCache m_TheCrseFineCache
Definition AMReX_FabArrayBase.H:379
RB90Cache::iterator RB90CacheIter
Definition AMReX_FabArrayBase.H:597
const RB90 & getRB90(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1508
static PolarBCache m_ThePolarBCache
Definition AMReX_FabArrayBase.H:643
void flushParForInfo(bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2774
void updateBDKey()
Definition AMReX_FabArrayBase.cpp:2562
static CacheStats m_FBC_stats
Definition AMReX_FabArrayBase.H:526
void buildTileArray(const IntVect &tilesize, TileArray &ta) const
Definition AMReX_FabArrayBase.cpp:2377
FBCache::iterator FBCacheIter
Definition AMReX_FabArrayBase.H:523
static void Initialize()
Initialize from ParmParse with "fabarray" prefix.
Definition AMReX_FabArrayBase.cpp:95
static std::vector< std::string > m_region_tag
Definition AMReX_FabArrayBase.H:413
FabArrayBase(FabArrayBase &&rhs) noexcept=default
static void flushRB180Cache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1663
int n_comp
Definition AMReX_FabArrayBase.H:448
static void printMemUsage()
Definition AMReX_FabArrayBase.cpp:2635
const FB & getFB(const IntVect &nghost, const Periodicity &period, bool cross=false, bool enforce_periodicity_only=false, bool override_sync=false, IntVect const &sumboundary_src_nghost=IntVect(-1)) const
Definition AMReX_FabArrayBase.cpp:1298
static CacheStats m_FPinfo_stats
Definition AMReX_FabArrayBase.H:336
~FabArrayBase()=default
bool isFusingCandidate() const noexcept
Is this a good candidate for kernel fusing?
Definition AMReX_FabArrayBase.cpp:2705
bool is_cell_centered() const noexcept
This tests on whether the FabArray is cell-centered.
Definition AMReX_FabArrayBase.cpp:2699
bool is_nodal() const noexcept
This tests on whether the FabArray is fully nodal.
Definition AMReX_FabArrayBase.cpp:2687
bool isOwner(int li) const noexcept
Definition AMReX_FabArrayBase.H:438
static const FPinfo & TheFPinfo(const FabArrayBase &srcfa, const FabArrayBase &dstfa, const IntVect &dstng, const BoxConverter &coarsener, const Geometry &fgeom, const Geometry &cgeom, const EB2::IndexSpace *)
Definition AMReX_FabArrayBase.cpp:2066
IndexType ixType() const noexcept
Return index type.
Definition AMReX_FabArrayBase.H:86
static Long queryMemUsageHWM(const std::string &tag=std::string("All"))
Definition AMReX_FabArrayBase.cpp:2658
int size() const noexcept
Return the number of FABs in the FabArray.
Definition AMReX_FabArrayBase.H:110
void flushCFinfo(bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2284
std::multimap< BDKey, FabArrayBase::RB180 * > RB180Cache
Definition AMReX_FabArrayBase.H:618
static CacheStats m_CPC_stats
Definition AMReX_FabArrayBase.H:578
static RB180Cache m_TheRB180Cache
Definition AMReX_FabArrayBase.H:621
IntVect nGrowFilled() const noexcept
Definition AMReX_FabArrayBase.H:150
FabArrayBase & operator=(const FabArrayBase &rhs)=default
void flushFPinfo(bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2126
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow)
Definition AMReX_FabArrayBase.cpp:175
const RB180 & getRB180(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1672
static CacheStats m_TAC_stats
Definition AMReX_FabArrayBase.H:462
static CacheStats m_CFinfo_stats
Definition AMReX_FabArrayBase.H:381
void setMultiGhost(bool a_multi_ghost)
Definition AMReX_FabArrayBase.H:145
const std::vector< bool > & OwnerShip() const noexcept
Return owenership of fabs. The concept of ownership only applies when UPC++ team is used....
Definition AMReX_FabArrayBase.H:437
const CPC & getCPC(const IntVect &dstng, const FabArrayBase &src, const IntVect &srcng, const Periodicity &period, bool to_ghost_cells_only=false, const IntVect &offset=IntVect(0)) const
Definition AMReX_FabArrayBase.cpp:576
static void updateMemUsage(std::string const &tag, Long nbytes, Arena const *ar)
Definition AMReX_FabArrayBase.cpp:2627
static FPinfoCache m_TheFillPatchCache
Definition AMReX_FabArrayBase.H:334
static IntVect mfiter_tile_size
Default tilesize in MFIter.
Definition AMReX_FabArrayBase.H:288
ParForInfo const & getParForInfo(const IntVect &nghost) const
Definition AMReX_FabArrayBase.cpp:2755
static std::map< BDKey, int > m_BD_count
Keep track of how many FabArrays are built with the same BDKey.
Definition AMReX_FabArrayBase.H:687
static bool m_alloc_single_chunk
Definition AMReX_FabArrayBase.H:727
std::map< std::pair< IntVect, IntVect >, TileArray > TAMap
Definition AMReX_FabArrayBase.H:458
int nGrow(int direction=0) const noexcept
Return the grow factor that defines the region of definition.
Definition AMReX_FabArrayBase.H:78
CPCache::iterator CPCacheIter
Definition AMReX_FabArrayBase.H:575
CopyComTag::CopyComTagsContainer CopyComTagsContainer
Definition AMReX_FabArrayBase.H:219
static FBCache m_TheFBCache
Definition AMReX_FabArrayBase.H:525
std::multimap< BDKey, FabArrayBase::FB * > FBCache
Definition AMReX_FabArrayBase.H:522
RB180Cache::iterator RB180CacheIter
Definition AMReX_FabArrayBase.H:619
BDKey getBDKey() const noexcept
Definition AMReX_FabArrayBase.H:249
static void flushParForCache()
Definition AMReX_FabArrayBase.cpp:2786
CopyComTag::MapOfCopyComTagContainers MapOfCopyComTagContainers
Definition AMReX_FabArrayBase.H:220
static std::map< std::string, meminfo > m_mem_usage
Definition AMReX_FabArrayBase.H:402
int localindex(int K) const noexcept
Return local index in the vector of FABs.
Definition AMReX_FabArrayBase.H:119
FabArrayBase(const FabArrayBase &rhs)=default
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:130
static CPCache m_TheCPCache
Definition AMReX_FabArrayBase.H:577
int local_size() const noexcept
Return the number of local FABs in the FabArray.
Definition AMReX_FabArrayBase.H:113
IntVect n_grow
Definition AMReX_FabArrayBase.H:447
static const CFinfo & TheCFinfo(const FabArrayBase &finefa, const Geometry &finegm, const IntVect &ng, bool include_periodic, bool include_physbndry)
Definition AMReX_FabArrayBase.cpp:2242
void flushRB90(bool no_assertion=false) const
This flushes its own RB90.
Definition AMReX_FabArrayBase.cpp:1487
static Long queryMemUsage(const std::string &tag=std::string("All"))
Definition AMReX_FabArrayBase.cpp:2647
std::vector< bool > ownership
Definition AMReX_FabArrayBase.H:446
std::multimap< BDKey, FabArrayBase::CPC * > CPCache
Definition AMReX_FabArrayBase.H:574
std::multimap< BDKey, FabArrayBase::CFinfo * > CFinfoCache
Definition AMReX_FabArrayBase.H:376
bool empty() const noexcept
Definition AMReX_FabArrayBase.H:89
std::multimap< BDKey, FabArrayBase::RB90 * > RB90Cache
Definition AMReX_FabArrayBase.H:596
static RB90Cache m_TheRB90Cache
Definition AMReX_FabArrayBase.H:599
static void flushTileArrayCache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:2506
void flushRB180(bool no_assertion=false) const
This flushes its own RB180.
Definition AMReX_FabArrayBase.cpp:1651
CpOp
parallel copy or add
Definition AMReX_FabArrayBase.H:393
@ ADD
Definition AMReX_FabArrayBase.H:393
@ COPY
Definition AMReX_FabArrayBase.H:393
bool m_multi_ghost
Definition AMReX_FabArrayBase.H:451
IntVect n_filled
Definition AMReX_FabArrayBase.H:450
Box box(int K) const noexcept
Return the Kth Box in the BoxArray. That is, the valid region of the Kth grid.
Definition AMReX_FabArrayBase.H:101
std::map< BDKey, TAMap > TACache
Definition AMReX_FabArrayBase.H:459
static void flushPolarBCache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1849
DistributionMapping distributionMap
Definition AMReX_FabArrayBase.H:444
Box fabbox(int K) const noexcept
Return the Kth FABs Box in the FabArray. That is, the region the Kth fab is actually defined on.
Definition AMReX_FabArrayBase.cpp:217
FPinfoCache::iterator FPinfoCacheIter
Definition AMReX_FabArrayBase.H:332
friend void FillBoundary(Vector< FabArray< FAB > * > const &mf, const Periodicity &period)
CFinfoCache::iterator CFinfoCacheIter
Definition AMReX_FabArrayBase.H:377
static std::uint64_t getNextCommMetaDataId()
Definition AMReX_FabArrayBase.cpp:2797
static void Finalize()
Definition AMReX_FabArrayBase.cpp:2301
PolarBCache::iterator PolarBCacheIter
Definition AMReX_FabArrayBase.H:641
static int MaxComp
The maximum number of components to copy() at a time.
Definition AMReX_FabArrayBase.H:291
BoxArray boxarray
Definition AMReX_FabArrayBase.H:443
static IntVect comm_tile_size
communication tile size
Definition AMReX_FabArrayBase.H:301
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
std::multimap< BDKey, FabArrayBase::PolarB * > PolarBCache
Definition AMReX_FabArrayBase.H:640
const PolarB & getPolarB(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1858
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:344
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
__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
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
This provides length of period for periodic domains. 0 means it is not periodic in that direction....
Definition AMReX_Periodicity.H:17
This class provides the user with a few print options.
Definition AMReX_Print.H:35
static constexpr int AllProcs
Definition AMReX_Print.H:38
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
Long size() const noexcept
Definition AMReX_Vector.H:54
amrex_long Long
Definition AMReX_INT.H:30
int MyProc() noexcept
Definition AMReX_ParallelDescriptor.H:128
std::string const & name()
Definition AMReX_Machine.cpp:46
Definition AMReX_Amr.cpp:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
int nComp(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2852
DistributionMapping const & DistributionMap(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2867
IntVect nGrowVect(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2857
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
const int[]
Definition AMReX_BLProfiler.cpp:1664
BoxArray const & boxArray(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2862
Definition AMReX_BoxArray.H:839
Definition AMReX_Box.H:2170
Definition AMReX_DistributionMapping.H:371
Definition AMReX_FabArrayBase.H:229
bool operator==(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:237
bool operator<(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:233
bool operator!=(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:240
BDKey() noexcept=default
friend std::ostream & operator<<(std::ostream &os, const BDKey &id)
Definition AMReX_FabArrayBase.cpp:2620
coarse/fine boundary
Definition AMReX_FabArrayBase.H:351
Box m_fine_domain
Definition AMReX_FabArrayBase.H:368
IntVect m_ng
Definition AMReX_FabArrayBase.H:369
Long bytes() const
Definition AMReX_FabArrayBase.cpp:2233
bool m_include_periodic
Definition AMReX_FabArrayBase.H:370
static Box Domain(const Geometry &geom, const IntVect &ng, bool include_periodic, bool include_physbndry)
Definition AMReX_FabArrayBase.cpp:2214
bool m_include_physbndry
Definition AMReX_FabArrayBase.H:371
Long m_nuse
Definition AMReX_FabArrayBase.H:373
BoxArray ba_cfb
Definition AMReX_FabArrayBase.H:363
BDKey m_fine_bdk
Definition AMReX_FabArrayBase.H:367
Vector< int > fine_grid_idx
local array
Definition AMReX_FabArrayBase.H:365
DistributionMapping dm_cfb
Definition AMReX_FabArrayBase.H:364
parallel copy or add
Definition AMReX_FabArrayBase.H:537
BoxArray m_srcba
Definition AMReX_FabArrayBase.H:560
IntVect m_srcng
Definition AMReX_FabArrayBase.H:555
bool m_tgco
Definition AMReX_FabArrayBase.H:559
BoxArray m_dstba
Definition AMReX_FabArrayBase.H:561
BDKey m_srcbdk
Definition AMReX_FabArrayBase.H:553
std::uint64_t m_id
Definition AMReX_FabArrayBase.H:552
Long bytes() const
Definition AMReX_FabArrayBase.cpp:234
BDKey m_dstbdk
Definition AMReX_FabArrayBase.H:554
Long m_nuse
Definition AMReX_FabArrayBase.H:563
IntVect m_offset
Definition AMReX_FabArrayBase.H:557
Periodicity m_period
Definition AMReX_FabArrayBase.H:558
IntVect m_dstng
Definition AMReX_FabArrayBase.H:556
Definition AMReX_FabArrayBase.H:471
bool m_threadsafe_loc
Definition AMReX_FabArrayBase.H:473
bool m_threadsafe_rcv
Definition AMReX_FabArrayBase.H:474
std::unique_ptr< MapOfCopyComTagContainers > m_RcvTags
Definition AMReX_FabArrayBase.H:477
std::unique_ptr< MapOfCopyComTagContainers > m_SndTags
Definition AMReX_FabArrayBase.H:476
std::unique_ptr< CopyComTagsContainer > m_LocTags
Definition AMReX_FabArrayBase.H:475
Used by a bunch of routines when communicating via MPI.
Definition AMReX_FabArrayBase.H:194
Box sbox
Definition AMReX_FabArrayBase.H:196
CopyComTag() noexcept=default
std::vector< CopyComTag > CopyComTagsContainer
Definition AMReX_FabArrayBase.H:212
bool operator<(const CopyComTag &rhs) const noexcept
Definition AMReX_FabArrayBase.H:202
int srcIndex
Definition AMReX_FabArrayBase.H:198
Box dbox
Definition AMReX_FabArrayBase.H:195
int dstIndex
Definition AMReX_FabArrayBase.H:197
std::map< int, CopyComTagsContainer > MapOfCopyComTagContainers
Definition AMReX_FabArrayBase.H:214
FillBoundary.
Definition AMReX_FabArrayBase.H:487
bool m_multi_ghost
Definition AMReX_FabArrayBase.H:504
Long m_nuse
Definition AMReX_FabArrayBase.H:503
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:496
bool m_cross
Definition AMReX_FabArrayBase.H:498
IndexType m_typ
Definition AMReX_FabArrayBase.H:494
Long bytes() const
Definition AMReX_FabArrayBase.cpp:254
Periodicity m_period
Definition AMReX_FabArrayBase.H:501
std::uint64_t m_id
Definition AMReX_FabArrayBase.H:493
bool m_epo
Definition AMReX_FabArrayBase.H:499
bool m_override_sync
Definition AMReX_FabArrayBase.H:500
IntVect m_crse_ratio
BoxArray in FabArrayBase may have crse_ratio.
Definition AMReX_FabArrayBase.H:495
IntVect m_sb_snghost
Definition AMReX_FabArrayBase.H:497
Definition AMReX_FabArrayBase.H:304
std::unique_ptr< FabFactory< FArrayBox > > fact_crse_patch
Definition AMReX_FabArrayBase.H:319
DistributionMapping dm_patch
Definition AMReX_FabArrayBase.H:318
BDKey m_srcbdk
Definition AMReX_FabArrayBase.H:322
Long bytes() const
Definition AMReX_FabArrayBase.cpp:2057
BoxArray ba_crse_patch
Definition AMReX_FabArrayBase.H:316
std::unique_ptr< FabFactory< FArrayBox > > fact_fine_patch
Definition AMReX_FabArrayBase.H:320
std::unique_ptr< BoxConverter > m_coarsener
Definition AMReX_FabArrayBase.H:326
Box m_dstdomain
Definition AMReX_FabArrayBase.H:324
IntVect m_dstng
Definition AMReX_FabArrayBase.H:325
Long m_nuse
Definition AMReX_FabArrayBase.H:328
BDKey m_dstbdk
Definition AMReX_FabArrayBase.H:323
BoxArray ba_fine_patch
Definition AMReX_FabArrayBase.H:317
Definition AMReX_FabArrayBase.H:696
Long num_build
Definition AMReX_FabArrayBase.H:701
void recordDelete() noexcept
Definition AMReX_FabArrayBase.H:708
int max_num_boxarrays
Definition AMReX_FabArrayBase.H:699
void recordMaxNumBAUse(int n) noexcept
Definition AMReX_FabArrayBase.H:714
void recordMaxNumBoxArrays(int n) noexcept
Definition AMReX_FabArrayBase.H:711
void print() const
Definition AMReX_FabArrayBase.H:717
int max_num_fabarrays
Definition AMReX_FabArrayBase.H:698
int max_num_ba_use
Definition AMReX_FabArrayBase.H:700
int num_fabarrays
Definition AMReX_FabArrayBase.H:697
void recordBuild() noexcept
Definition AMReX_FabArrayBase.H:703
Used for collecting information used in communicating FABs.
Definition AMReX_FabArrayBase.H:271
int srcComp
Definition AMReX_FabArrayBase.H:276
int toProc
Definition AMReX_FabArrayBase.H:273
int fromProc
Definition AMReX_FabArrayBase.H:272
int fabArrayId
Definition AMReX_FabArrayBase.H:280
int procThatHasData
Definition AMReX_FabArrayBase.H:283
int procThatNeedsData
Definition AMReX_FabArrayBase.H:282
int destComp
Definition AMReX_FabArrayBase.H:277
int face
Definition AMReX_FabArrayBase.H:279
Box box
Definition AMReX_FabArrayBase.H:284
int fabIndex
Definition AMReX_FabArrayBase.H:274
int nComp
Definition AMReX_FabArrayBase.H:278
int fineIndex
Definition AMReX_FabArrayBase.H:275
int fillBoxId
Definition AMReX_FabArrayBase.H:281
For ParallelFor(FabArray)
Definition AMReX_FabArrayBase.H:654
ParForInfo(ParForInfo const &)=delete
Long m_ncellsmax
Definition AMReX_FabArrayBase.H:671
BATransformer m_bat
Definition AMReX_FabArrayBase.H:669
ParForInfo(ParForInfo &&)=delete
BoxIndexer const * getBoxes() const
Definition AMReX_FabArrayBase.H:661
char * m_hp
Definition AMReX_FabArrayBase.H:673
int getNBlocksPerBox(int nthreads) const
Definition AMReX_FabArrayBase.H:658
void operator=(ParForInfo const &)=delete
~ParForInfo()
Definition AMReX_FabArrayBase.cpp:2749
IntVect m_ng
Definition AMReX_FabArrayBase.H:670
BoxIndexer * m_boxes
Definition AMReX_FabArrayBase.H:672
Fill polar boundary in spherical coordinates.
Definition AMReX_FabArrayBase.H:632
Box m_domain
Definition AMReX_FabArrayBase.H:635
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:634
Rotate Boundary by 180.
Definition AMReX_FabArrayBase.H:610
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:612
Box m_domain
Definition AMReX_FabArrayBase.H:613
Rotate Boundary by 90.
Definition AMReX_FabArrayBase.H:588
Box m_domain
Definition AMReX_FabArrayBase.H:591
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:590
Definition AMReX_FabArrayBase.H:414
~RegionTag()
Definition AMReX_FabArrayBase.H:421
RegionTag & operator=(RegionTag const &)=delete
RegionTag(RegionTag &&rhs) noexcept
Definition AMReX_FabArrayBase.H:418
RegionTag(const std::string &t)
Definition AMReX_FabArrayBase.H:416
RegionTag(RegionTag const &)=delete
RegionTag(const char *t)
Definition AMReX_FabArrayBase.H:415
Tiling.
Definition AMReX_FabArrayBase.H:258
Vector< int > indexMap
Definition AMReX_FabArrayBase.H:261
Vector< int > localIndexMap
Definition AMReX_FabArrayBase.H:262
Long bytes() const
Definition AMReX_FabArrayBase.cpp:274
Vector< int > localTileIndexMap
Definition AMReX_FabArrayBase.H:263
Vector< int > numLocalTiles
Definition AMReX_FabArrayBase.H:260
Long nuse
Definition AMReX_FabArrayBase.H:259
Vector< Box > tileArray
Definition AMReX_FabArrayBase.H:264
Definition AMReX_FabArrayBase.H:398
Long nbytes
Definition AMReX_FabArrayBase.H:399
Long nbytes_hwm
Definition AMReX_FabArrayBase.H:400