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
121 = std::lower_bound(indexArray.begin(), indexArray.end(), K);
122 if (low != indexArray.end() && *low == K) {
123 return static_cast<int>(low - indexArray.begin());
124 }
125 else {
126 return -1;
127 }
128 }
129
131 [[nodiscard]] const DistributionMapping& DistributionMap () const noexcept { return distributionMap; }
132
136 [[nodiscard]] bool is_nodal () const noexcept;
140 [[nodiscard]] bool is_nodal (int dir) const noexcept;
144 [[nodiscard]] bool is_cell_centered () const noexcept;
145
146 void setMultiGhost(bool a_multi_ghost) {m_multi_ghost = a_multi_ghost;}
147
148 // These are provided for convenience to keep track of how many
149 // ghost cells are up to date. The number of filled ghost cells
150 // is updated by FillBoundary and ParallelCopy.
151 [[nodiscard]] IntVect nGrowFilled () const noexcept { return n_filled; }
152 void setNGrowFilled (IntVect const& ng) noexcept { n_filled = ng; }
153
155 [[nodiscard]] bool isFusingCandidate () const noexcept;
156
158 struct CacheStats
159 {
160 int size{0};
161 int maxsize{0};
162 Long maxuse{0};
163 Long nuse{0};
164 Long nbuild{0};
165 Long nerase{0};
166 Long bytes{0};
167 Long bytes_hwm{0};
168 std::string name;
169 explicit CacheStats (std::string name_)
170 : name(std::move(name_)) {;}
171 void recordBuild () noexcept {
172 ++size;
173 ++nbuild;
174 maxsize = std::max(maxsize, size);
175 }
176 void recordErase (Long n) noexcept {
177 // n: how many times the item to be deleted has been used.
178 --size;
179 ++nerase;
180 maxuse = std::max(maxuse, n);
181 }
182 void recordUse () noexcept { ++nuse; }
183 void print () const {
184 amrex::Print(Print::AllProcs) << "### " << name << " ###\n"
185 << " tot # of builds : " << nbuild << "\n"
186 << " tot # of erasures: " << nerase << "\n"
187 << " tot # of uses : " << nuse << "\n"
188 << " max cache size : " << maxsize << "\n"
189 << " max # of uses : " << maxuse << "\n";
190 }
191 };
195 {
200 CopyComTag () noexcept = default;
201 CopyComTag (const Box& db, const Box& sb, int didx, int sidx) noexcept
202 : dbox(db), sbox(sb), dstIndex(didx), srcIndex(sidx) {}
203 bool operator< (const CopyComTag& rhs) const noexcept {
204 return (srcIndex < rhs.srcIndex) || ((srcIndex == rhs.srcIndex) && (
205 (sbox.smallEnd() < rhs.sbox.smallEnd()
206 || ((sbox.smallEnd() == rhs.sbox.smallEnd()) && (
207 (dstIndex < rhs.dstIndex) || ((dstIndex == rhs.dstIndex) && (
208 (dbox.smallEnd() < rhs.dbox.smallEnd()))))))));
209 }
210 //
211 // Some typedefs & helper functions used throughout the code.
212 //
213 using CopyComTagsContainer = std::vector<CopyComTag>;
214
215 using MapOfCopyComTagContainers = std::map<int,CopyComTagsContainer>;
216 };
217 //
218 // Some useful typedefs.
219 //
222 //
224
230 struct BDKey {
231 BDKey () noexcept = default;
232 BDKey (const BoxArray::RefID& baid, const DistributionMapping::RefID& dmid) noexcept
233 : m_ba_id(baid), m_dm_id(dmid) {}
234 bool operator< (const BDKey& rhs) const noexcept {
235 return (m_ba_id < rhs.m_ba_id) ||
236 ((m_ba_id == rhs.m_ba_id) && (m_dm_id < rhs.m_dm_id));
237 }
238 bool operator== (const BDKey& rhs) const noexcept {
239 return m_ba_id == rhs.m_ba_id && m_dm_id == rhs.m_dm_id;
240 }
241 bool operator!= (const BDKey& rhs) const noexcept {
242 return m_ba_id != rhs.m_ba_id || m_dm_id != rhs.m_dm_id;
243 }
244 friend std::ostream& operator<< (std::ostream& os, const BDKey& id);
245 private:
246 BoxArray::RefID m_ba_id;
248 };
249
250 [[nodiscard]] BDKey getBDKey () const noexcept {
252 }
253
254 void updateBDKey ();
255
256 //
268
269 //
272 {
273 int fromProc{0};
274 int toProc{0};
275 int fabIndex{0};
276 int fineIndex{0};
277 int srcComp{0};
278 int destComp{0};
279 int nComp{0};
280 int face{0};
282 int fillBoxId{0};
286 };
287
290
293
295 static void Initialize ();
296 static void Finalize ();
303
304 struct FPinfo
305 {
306 FPinfo (const FabArrayBase& srcfa,
307 const FabArrayBase& dstfa,
308 const Box& dstdomain,
309 const IntVect& dstng,
310 const BoxConverter& coarsener,
311 const Box& fdomain,
312 const Box& cdomain,
313 const EB2::IndexSpace* index_space);
314
315 [[nodiscard]] Long bytes () const;
316
320 std::unique_ptr<FabFactory<FArrayBox> > fact_crse_patch;
321 std::unique_ptr<FabFactory<FArrayBox> > fact_fine_patch;
322 //
327 std::unique_ptr<BoxConverter> m_coarsener;
328 //
330 };
331
332 using FPinfoCache = std::multimap<BDKey,FabArrayBase::FPinfo*>;
333 using FPinfoCacheIter = FPinfoCache::iterator;
334
336
337 static CacheStats m_FPinfo_stats;
338
339 static const FPinfo& TheFPinfo (const FabArrayBase& srcfa,
340 const FabArrayBase& dstfa,
341 const IntVect& dstng,
342 const BoxConverter& coarsener,
343 const Geometry& fgeom,
344 const Geometry& cgeom,
345 const EB2::IndexSpace*);
346
347 void flushFPinfo (bool no_assertion=false) const;
348
349 //
351 struct CFinfo
352 {
353 CFinfo (const FabArrayBase& finefa,
354 const Geometry& finegm,
355 const IntVect& ng,
356 bool include_periodic,
357 bool include_physbndry);
358
359 [[nodiscard]] Long bytes () const;
360
361 static Box Domain (const Geometry& geom, const IntVect& ng,
362 bool include_periodic, bool include_physbndry);
363
367 //
373 //
375 };
376
377 using CFinfoCache = std::multimap<BDKey,FabArrayBase::CFinfo*>;
378 using CFinfoCacheIter = CFinfoCache::iterator;
379
381
382 static CacheStats m_CFinfo_stats;
383
384 static const CFinfo& TheCFinfo (const FabArrayBase& finefa,
385 const Geometry& finegm,
386 const IntVect& ng,
387 bool include_periodic,
388 bool include_physbndry);
389
390 void flushCFinfo (bool no_assertion=false) const;
391
392 //
394 enum CpOp { COPY = 0, ADD = 1 };
395
396 const TileArray* getTileArray (const IntVect& tilesize) const;
397
398 // Memory Usage Tags
399 struct meminfo {
402 };
403 static std::map<std::string, meminfo> m_mem_usage;
404
405 static void updateMemUsage (std::string const& tag, Long nbytes, Arena const* ar);
406 static void printMemUsage ();
407 static Long queryMemUsage (const std::string& tag = std::string("All"));
408 static Long queryMemUsageHWM (const std::string& tag = std::string("All"));
409
410 static void pushRegionTag (const char* t);
411 static void pushRegionTag (std::string t);
412 static void popRegionTag ();
413
414 static AMREX_EXPORT std::vector<std::string> m_region_tag;
415 struct RegionTag {
416 RegionTag (const char* t) : tagged(true) { pushRegionTag(t); }
417 RegionTag (const std::string& t) : tagged(true) { pushRegionTag(t); }
418 RegionTag (RegionTag const&) = delete;
419 RegionTag (RegionTag && rhs) noexcept : tagged(rhs.tagged) { rhs.tagged = false; }
420 RegionTag& operator= (RegionTag const&) = delete;
422 ~RegionTag () { if (tagged) { popRegionTag(); } }
423 private:
424 bool tagged = false;
425 };
426
427//#ifndef AMREX_USE_GPU
428//protected:
429//#endif
430
431 void clear ();
432
438 const std::vector<bool>& OwnerShip () const noexcept { return ownership; }
439 bool isOwner (int li) const noexcept { return ownership[li]; }
440
441 //
442 // The data ...
443 //
447 std::vector<bool> ownership;
450 mutable BDKey m_bdkey;
451 IntVect n_filled; // Note that IntVect is zero by default.
452 bool m_multi_ghost = false;
453
454 //
455 // Tiling
456 //
457 // We use tile size as the key for the inner map.
458
459 using TAMap = std::map<std::pair<IntVect,IntVect>, TileArray>;
460 using TACache = std::map<BDKey, TAMap>;
461 //
463 static CacheStats m_TAC_stats;
464 //
465 void buildTileArray (const IntVect& tilesize, TileArray& ta) const;
466 //
467 void flushTileArray (const IntVect& tilesize = IntVect::TheZeroVector(),
468 bool no_assertion=false) const;
469 static void flushTileArrayCache ();
470
472 {
473 // The cache of local and send/recv per FillBoundary() or ParallelCopy().
474 bool m_threadsafe_loc = false;
475 bool m_threadsafe_rcv = false;
476 std::unique_ptr<CopyComTagsContainer> m_LocTags;
477 std::unique_ptr<MapOfCopyComTagContainers> m_SndTags;
478 std::unique_ptr<MapOfCopyComTagContainers> m_RcvTags;
479 };
480
481 void define_fb_metadata (CommMetaData& cmd, const IntVect& nghost, bool cross,
482 const Periodicity& period, bool multi_ghost) const;
483
484 //
486 struct FB
488 {
489 FB (const FabArrayBase& fa, const IntVect& nghost,
490 bool cross, const Periodicity& period,
491 bool enforce_periodicity_only, bool override_sync,
492 bool multi_ghost, IntVect const& sumboundary_src_nghost);
493
494 std::uint64_t m_id = std::numeric_limits<std::uint64_t>::max();
500 bool m_epo;
503 //
505 bool m_multi_ghost = false;
506 //
507#if defined(__CUDACC__) && defined (AMREX_USE_CUDA)
508 CudaGraph<CopyMemory> m_localCopy;
509 CudaGraph<CopyMemory> m_copyToBuffer;
510 CudaGraph<CopyMemory> m_copyFromBuffer;
511#endif
512 //
513 [[nodiscard]] Long bytes () const;
514 private:
515 void define_fb (const FabArrayBase& fa);
516 void define_epo (const FabArrayBase& fa);
517 void define_os (const FabArrayBase& fa);
518 void define_sb (const FabArrayBase& fa);
519 void tag_one_box (int krcv, BoxArray const& ba, DistributionMapping const& dm,
520 bool build_recv_tag);
521 };
522 //
523 using FBCache = std::multimap<BDKey,FabArrayBase::FB*>;
524 using FBCacheIter = FBCache::iterator;
525 //
527 static CacheStats m_FBC_stats;
528 //
529 const FB& getFB (const IntVect& nghost, const Periodicity& period,
530 bool cross=false, bool enforce_periodicity_only = false,
531 bool override_sync = false,
532 IntVect const& sumboundary_src_nghost = IntVect(-1)) const;
533
534 //
536 struct CPC
538 {
539 CPC (const FabArrayBase& dstfa, const IntVect& dstng,
540 const FabArrayBase& srcfa, const IntVect& srcng,
541 const Periodicity& period, bool to_ghost_cells_only = false,
542 const IntVect& offset = IntVect(0));
543 CPC (const BoxArray& dstba, const DistributionMapping& dstdm,
544 const Vector<int>& dstidx, const IntVect& dstng,
545 const BoxArray& srcba, const DistributionMapping& srcdm,
546 const Vector<int>& srcidx, const IntVect& srcng,
547 const Periodicity& period, int myproc);
548 CPC (const BoxArray& ba, const IntVect& ng,
549 const DistributionMapping& dstdm, const DistributionMapping& srcdm);
550
551 [[nodiscard]] Long bytes () const;
552
553 std::uint64_t m_id = std::numeric_limits<std::uint64_t>::max();
560 bool m_tgco;
563 //
565
566 private:
567 void define (const BoxArray& ba_dst, const DistributionMapping& dm_dst,
568 const Vector<int>& imap_dst,
569 const BoxArray& ba_src, const DistributionMapping& dm_src,
570 const Vector<int>& imap_src,
571 int MyProc = ParallelDescriptor::MyProc());
572 };
573
574 //
575 using CPCache = std::multimap<BDKey,FabArrayBase::CPC*>;
576 using CPCacheIter = CPCache::iterator;
577 //
579 static CacheStats m_CPC_stats;
580 //
581 const CPC& getCPC (const IntVect& dstng, const FabArrayBase& src, const IntVect& srcng,
582 const Periodicity& period, bool to_ghost_cells_only = false,
583 const IntVect& offset = IntVect(0)) const;
584
585 //
587 struct RB90
589 {
590 RB90 (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
593 private:
594 void define (const FabArrayBase& fa);
595 };
596 //
597 using RB90Cache = std::multimap<BDKey,FabArrayBase::RB90*>;
598 using RB90CacheIter = RB90Cache::iterator;
599 //
601 //
602 const RB90& getRB90 (const IntVect& nghost, const Box& domain) const;
603 //
604 void flushRB90 (bool no_assertion=false) const;
605 static void flushRB90Cache ();
606
607 //
609 struct RB180
611 {
612 RB180 (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
615 private:
616 void define (const FabArrayBase& fa);
617 };
618 //
619 using RB180Cache = std::multimap<BDKey,FabArrayBase::RB180*>;
620 using RB180CacheIter = RB180Cache::iterator;
621 //
623 //
624 const RB180& getRB180 (const IntVect& nghost, const Box& domain) const;
625 //
626 void flushRB180 (bool no_assertion=false) const;
627 static void flushRB180Cache ();
628
629 //
631 struct PolarB
633 {
634 PolarB (const FabArrayBase& fa, const IntVect& nghost, Box const& domain);
637 private:
638 void define (const FabArrayBase& fa);
639 };
640 //
641 using PolarBCache = std::multimap<BDKey,FabArrayBase::PolarB*>;
642 using PolarBCacheIter = PolarBCache::iterator;
643 //
645 //
646 const PolarB& getPolarB (const IntVect& nghost, const Box& domain) const;
647 //
648 void flushPolarB (bool no_assertion=false) const;
649 static void flushPolarBCache ();
650
651#ifdef AMREX_USE_GPU
652 //
655 {
656 ParForInfo (const FabArrayBase& fa, const IntVect& nghost);
657 ~ParForInfo ();
658
659 int getNBlocksPerBox (int nthreads) const {
660 return int((m_ncellsmax+nthreads-1)/nthreads);
661 }
662 BoxIndexer const* getBoxes () const { return m_boxes; }
663
664 ParForInfo () = delete;
665 ParForInfo (ParForInfo const&) = delete;
666 ParForInfo (ParForInfo &&) = delete;
667 void operator= (ParForInfo const&) = delete;
668 void operator= (ParForInfo &&) = delete;
669
670 BATransformer m_bat;
673 BoxIndexer* m_boxes = nullptr;
674 char* m_hp = nullptr;
675 };
676
677 ParForInfo const& getParForInfo (const IntVect& nghost) const;
678
679 static std::multimap<BDKey,ParForInfo*> m_TheParForCache;
680
681 void flushParForInfo (bool no_assertion=false) const; // flushes its own cache
682 static void flushParForCache (); // flushes the entire cache
683
684#endif
685
686 //
688 static std::map<BDKey, int> m_BD_count;
689 //
691 void clearThisBD (bool no_assertion=false) const;
692 //
694 void addThisBD ();
695 //
697 {
703
704 void recordBuild () noexcept {
706 ++num_build;
708 }
709 void recordDelete () noexcept {
711 }
712 void recordMaxNumBoxArrays (int n) noexcept {
714 }
715 void recordMaxNumBAUse (int n) noexcept {
716 max_num_ba_use = std::max(max_num_ba_use, n);
717 }
718 void print () const {
719 amrex::Print(Print::AllProcs) << "### FabArray ###\n"
720 << " tot # of builds : " << num_build << "\n"
721 << " max # of FabArrays : " << max_num_fabarrays << "\n"
722 << " max # of BoxArrays : " << max_num_boxarrays << "\n"
723 << " max # of BoxArray uses: " << max_num_ba_use << "\n";
724 }
725 };
727
729
730 [[nodiscard]] static bool getAllocSingleChunk () { return m_alloc_single_chunk; }
731
732 [[nodiscard]] static std::uint64_t getNextCommMetaDataId ();
733
734private:
735
736 void flushFB (bool no_assertion=false) const;
737 static void flushFBCache ();
738
739 void flushCPC (bool no_assertion=false) const;
740 static void flushCPCache ();
741};
742
744namespace detail {
745 class SingleChunkArena final
746 : public Arena
747 {
748 public:
749 SingleChunkArena (Arena* a_arena, std::size_t a_size);
750 ~SingleChunkArena () override;
751
752 SingleChunkArena () = delete;
753 SingleChunkArena (const SingleChunkArena& rhs) = delete;
754 SingleChunkArena (SingleChunkArena&& rhs) = delete;
755 SingleChunkArena& operator= (const SingleChunkArena& rhs) = delete;
756 SingleChunkArena& operator= (SingleChunkArena&& rhs) = delete;
757
758 [[nodiscard]] void* alloc (std::size_t sz) override;
759 void free (void* pt) override;
760
761 // isDeviceAccessible and isHostAccessible can both be true.
762 [[nodiscard]] bool isDeviceAccessible () const override;
763 [[nodiscard]] bool isHostAccessible () const override;
764
765 [[nodiscard]] bool isManaged () const override;
766 [[nodiscard]] bool isDevice () const override;
767 [[nodiscard]] bool isPinned () const override;
768
769 [[nodiscard]] void* data () const noexcept { return (void*) m_root; }
770
771 private:
772 DataAllocator m_dallocator;
773 char* m_root = nullptr;
774 char* m_free = nullptr;
775 std::size_t m_size = 0;
776 };
777}
779
780[[nodiscard]] int nComp (FabArrayBase const& fa);
781[[nodiscard]] IntVect nGrowVect (FabArrayBase const& fa);
782[[nodiscard]] BoxArray const& boxArray (FabArrayBase const& fa);
783[[nodiscard]] DistributionMapping const& DistributionMap (FabArrayBase const& fa);
784
785#ifdef BL_USE_MPI
786bool CheckRcvStats (Vector<MPI_Status>& recv_stats, const Vector<std::size_t>& recv_size, int tag);
787#endif
788
789std::ostream& operator<< (std::ostream& os, const FabArrayBase::BDKey& id);
790
791}
792
793#endif
#define AMREX_EXPORT
Definition AMReX_Extension.H:191
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:124
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:567
IndexType ixType() const noexcept
Return index type of this BoxArray.
Definition AMReX_BoxArray.H:857
RefID getRefID() const noexcept
Return a unique ID of the reference.
Definition AMReX_BoxArray.H:854
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:614
bool empty() const noexcept
Return whether the BoxArray is empty.
Definition AMReX_BoxArray.H:620
Definition AMReX_Box.H:1257
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:111
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:2471
static Long bytesOfMapOfCopyComTagContainers(const MapOfCopyComTagContainers &)
Definition AMReX_FabArrayBase.cpp:226
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
static std::multimap< BDKey, ParForInfo * > m_TheParForCache
Definition AMReX_FabArrayBase.H:679
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:2522
void clear()
Definition AMReX_FabArrayBase.cpp:210
void flushPolarB(bool no_assertion=false) const
This flushes its own PolarB.
Definition AMReX_FabArrayBase.cpp:1839
std::multimap< BDKey, FabArrayBase::FPinfo * > FPinfoCache
Definition AMReX_FabArrayBase.H:332
Vector< int > indexArray
Definition AMReX_FabArrayBase.H:446
FabArrayBase()=default
static void pushRegionTag(const char *t)
Definition AMReX_FabArrayBase.cpp:2671
static TACache m_TheTileArrayCache
Definition AMReX_FabArrayBase.H:462
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:669
const TileArray * getTileArray(const IntVect &tilesize) const
Definition AMReX_FabArrayBase.cpp:2344
static void flushRB90Cache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1502
static FabArrayStats m_FA_stats
Definition AMReX_FabArrayBase.H:726
static bool getAllocSingleChunk()
Definition AMReX_FabArrayBase.H:730
BDKey m_bdkey
Definition AMReX_FabArrayBase.H:450
void addThisBD()
add the current BD into BD count database
Definition AMReX_FabArrayBase.cpp:2552
void setNGrowFilled(IntVect const &ng) noexcept
Definition AMReX_FabArrayBase.H:152
static void popRegionTag()
Definition AMReX_FabArrayBase.cpp:2683
static CFinfoCache m_TheCrseFineCache
Definition AMReX_FabArrayBase.H:380
RB90Cache::iterator RB90CacheIter
Definition AMReX_FabArrayBase.H:598
const RB90 & getRB90(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1511
static PolarBCache m_ThePolarBCache
Definition AMReX_FabArrayBase.H:644
void flushParForInfo(bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2776
void updateBDKey()
Definition AMReX_FabArrayBase.cpp:2564
static CacheStats m_FBC_stats
Definition AMReX_FabArrayBase.H:527
void buildTileArray(const IntVect &tilesize, TileArray &ta) const
Definition AMReX_FabArrayBase.cpp:2379
FBCache::iterator FBCacheIter
Definition AMReX_FabArrayBase.H:524
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:414
FabArrayBase(FabArrayBase &&rhs) noexcept=default
static void flushRB180Cache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1666
int n_comp
Definition AMReX_FabArrayBase.H:449
static void printMemUsage()
Definition AMReX_FabArrayBase.cpp:2637
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:1301
static CacheStats m_FPinfo_stats
Definition AMReX_FabArrayBase.H:337
~FabArrayBase()=default
bool isFusingCandidate() const noexcept
Is this a good candidate for kernel fusing?
Definition AMReX_FabArrayBase.cpp:2707
bool is_cell_centered() const noexcept
This tests on whether the FabArray is cell-centered.
Definition AMReX_FabArrayBase.cpp:2701
bool is_nodal() const noexcept
This tests on whether the FabArray is fully nodal.
Definition AMReX_FabArrayBase.cpp:2689
bool isOwner(int li) const noexcept
Definition AMReX_FabArrayBase.H:439
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:2068
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:2660
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:2286
std::multimap< BDKey, FabArrayBase::RB180 * > RB180Cache
Definition AMReX_FabArrayBase.H:619
static CacheStats m_CPC_stats
Definition AMReX_FabArrayBase.H:579
static RB180Cache m_TheRB180Cache
Definition AMReX_FabArrayBase.H:622
IntVect nGrowFilled() const noexcept
Definition AMReX_FabArrayBase.H:151
FabArrayBase & operator=(const FabArrayBase &rhs)=default
void flushFPinfo(bool no_assertion=false) const
Definition AMReX_FabArrayBase.cpp:2128
void define(const BoxArray &bxs, const DistributionMapping &dm, int nvar, int ngrow)
Definition AMReX_FabArrayBase.cpp:178
const RB180 & getRB180(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1675
static CacheStats m_TAC_stats
Definition AMReX_FabArrayBase.H:463
static CacheStats m_CFinfo_stats
Definition AMReX_FabArrayBase.H:382
void setMultiGhost(bool a_multi_ghost)
Definition AMReX_FabArrayBase.H:146
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:438
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:579
static void updateMemUsage(std::string const &tag, Long nbytes, Arena const *ar)
Definition AMReX_FabArrayBase.cpp:2629
static FPinfoCache m_TheFillPatchCache
Definition AMReX_FabArrayBase.H:335
static IntVect mfiter_tile_size
Default tilesize in MFIter.
Definition AMReX_FabArrayBase.H:289
ParForInfo const & getParForInfo(const IntVect &nghost) const
Definition AMReX_FabArrayBase.cpp:2757
static std::map< BDKey, int > m_BD_count
Keep track of how many FabArrays are built with the same BDKey.
Definition AMReX_FabArrayBase.H:688
static bool m_alloc_single_chunk
Definition AMReX_FabArrayBase.H:728
std::map< std::pair< IntVect, IntVect >, TileArray > TAMap
Definition AMReX_FabArrayBase.H:459
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:576
CopyComTag::CopyComTagsContainer CopyComTagsContainer
Definition AMReX_FabArrayBase.H:220
static FBCache m_TheFBCache
Definition AMReX_FabArrayBase.H:526
std::multimap< BDKey, FabArrayBase::FB * > FBCache
Definition AMReX_FabArrayBase.H:523
RB180Cache::iterator RB180CacheIter
Definition AMReX_FabArrayBase.H:620
BDKey getBDKey() const noexcept
Definition AMReX_FabArrayBase.H:250
static void flushParForCache()
Definition AMReX_FabArrayBase.cpp:2788
CopyComTag::MapOfCopyComTagContainers MapOfCopyComTagContainers
Definition AMReX_FabArrayBase.H:221
static std::map< std::string, meminfo > m_mem_usage
Definition AMReX_FabArrayBase.H:403
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:131
static CPCache m_TheCPCache
Definition AMReX_FabArrayBase.H:578
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:448
static const CFinfo & TheCFinfo(const FabArrayBase &finefa, const Geometry &finegm, const IntVect &ng, bool include_periodic, bool include_physbndry)
Definition AMReX_FabArrayBase.cpp:2244
void flushRB90(bool no_assertion=false) const
This flushes its own RB90.
Definition AMReX_FabArrayBase.cpp:1490
static Long queryMemUsage(const std::string &tag=std::string("All"))
Definition AMReX_FabArrayBase.cpp:2649
std::vector< bool > ownership
Definition AMReX_FabArrayBase.H:447
std::multimap< BDKey, FabArrayBase::CPC * > CPCache
Definition AMReX_FabArrayBase.H:575
std::multimap< BDKey, FabArrayBase::CFinfo * > CFinfoCache
Definition AMReX_FabArrayBase.H:377
bool empty() const noexcept
Definition AMReX_FabArrayBase.H:89
std::multimap< BDKey, FabArrayBase::RB90 * > RB90Cache
Definition AMReX_FabArrayBase.H:597
static RB90Cache m_TheRB90Cache
Definition AMReX_FabArrayBase.H:600
static void flushTileArrayCache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:2508
void flushRB180(bool no_assertion=false) const
This flushes its own RB180.
Definition AMReX_FabArrayBase.cpp:1654
CpOp
parallel copy or add
Definition AMReX_FabArrayBase.H:394
@ ADD
Definition AMReX_FabArrayBase.H:394
@ COPY
Definition AMReX_FabArrayBase.H:394
bool m_multi_ghost
Definition AMReX_FabArrayBase.H:452
IntVect n_filled
Definition AMReX_FabArrayBase.H:451
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:460
static void flushPolarBCache()
This flushes the entire cache.
Definition AMReX_FabArrayBase.cpp:1851
DistributionMapping distributionMap
Definition AMReX_FabArrayBase.H:445
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:220
FPinfoCache::iterator FPinfoCacheIter
Definition AMReX_FabArrayBase.H:333
friend void FillBoundary(Vector< FabArray< FAB > * > const &mf, const Periodicity &period)
CFinfoCache::iterator CFinfoCacheIter
Definition AMReX_FabArrayBase.H:378
static std::uint64_t getNextCommMetaDataId()
Definition AMReX_FabArrayBase.cpp:2799
static void Finalize()
Definition AMReX_FabArrayBase.cpp:2303
PolarBCache::iterator PolarBCacheIter
Definition AMReX_FabArrayBase.H:642
static int MaxComp
The maximum number of components to copy() at a time.
Definition AMReX_FabArrayBase.H:292
BoxArray boxarray
Definition AMReX_FabArrayBase.H:444
static IntVect comm_tile_size
communication tile size
Definition AMReX_FabArrayBase.H:302
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:641
const PolarB & getPolarB(const IntVect &nghost, const Box &domain) const
Definition AMReX_FabArrayBase.cpp:1860
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:347
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
__host__ static __device__ constexpr IntVectND< dim > TheZeroVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:679
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:85
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:28
Long size() const noexcept
Definition AMReX_Vector.H:53
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:49
int nComp(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2854
DistributionMapping const & DistributionMap(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2869
IntVect nGrowVect(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2859
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
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
BoxArray const & boxArray(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2864
Definition AMReX_BoxArray.H:842
Definition AMReX_Box.H:2152
Definition AMReX_DistributionMapping.H:371
Definition AMReX_FabArrayBase.H:230
bool operator==(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:238
bool operator<(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:234
bool operator!=(const BDKey &rhs) const noexcept
Definition AMReX_FabArrayBase.H:241
BDKey() noexcept=default
friend std::ostream & operator<<(std::ostream &os, const BDKey &id)
Definition AMReX_FabArrayBase.cpp:2622
coarse/fine boundary
Definition AMReX_FabArrayBase.H:352
Box m_fine_domain
Definition AMReX_FabArrayBase.H:369
IntVect m_ng
Definition AMReX_FabArrayBase.H:370
Long bytes() const
Definition AMReX_FabArrayBase.cpp:2235
bool m_include_periodic
Definition AMReX_FabArrayBase.H:371
static Box Domain(const Geometry &geom, const IntVect &ng, bool include_periodic, bool include_physbndry)
Definition AMReX_FabArrayBase.cpp:2216
bool m_include_physbndry
Definition AMReX_FabArrayBase.H:372
Long m_nuse
Definition AMReX_FabArrayBase.H:374
BoxArray ba_cfb
Definition AMReX_FabArrayBase.H:364
BDKey m_fine_bdk
Definition AMReX_FabArrayBase.H:368
Vector< int > fine_grid_idx
local array
Definition AMReX_FabArrayBase.H:366
DistributionMapping dm_cfb
Definition AMReX_FabArrayBase.H:365
parallel copy or add
Definition AMReX_FabArrayBase.H:538
BoxArray m_srcba
Definition AMReX_FabArrayBase.H:561
IntVect m_srcng
Definition AMReX_FabArrayBase.H:556
bool m_tgco
Definition AMReX_FabArrayBase.H:560
BoxArray m_dstba
Definition AMReX_FabArrayBase.H:562
BDKey m_srcbdk
Definition AMReX_FabArrayBase.H:554
std::uint64_t m_id
Definition AMReX_FabArrayBase.H:553
Long bytes() const
Definition AMReX_FabArrayBase.cpp:237
BDKey m_dstbdk
Definition AMReX_FabArrayBase.H:555
Long m_nuse
Definition AMReX_FabArrayBase.H:564
IntVect m_offset
Definition AMReX_FabArrayBase.H:558
Periodicity m_period
Definition AMReX_FabArrayBase.H:559
IntVect m_dstng
Definition AMReX_FabArrayBase.H:557
Definition AMReX_FabArrayBase.H:472
bool m_threadsafe_loc
Definition AMReX_FabArrayBase.H:474
bool m_threadsafe_rcv
Definition AMReX_FabArrayBase.H:475
std::unique_ptr< MapOfCopyComTagContainers > m_RcvTags
Definition AMReX_FabArrayBase.H:478
std::unique_ptr< MapOfCopyComTagContainers > m_SndTags
Definition AMReX_FabArrayBase.H:477
std::unique_ptr< CopyComTagsContainer > m_LocTags
Definition AMReX_FabArrayBase.H:476
Used by a bunch of routines when communicating via MPI.
Definition AMReX_FabArrayBase.H:195
Box sbox
Definition AMReX_FabArrayBase.H:197
CopyComTag() noexcept=default
std::vector< CopyComTag > CopyComTagsContainer
Definition AMReX_FabArrayBase.H:213
bool operator<(const CopyComTag &rhs) const noexcept
Definition AMReX_FabArrayBase.H:203
int srcIndex
Definition AMReX_FabArrayBase.H:199
Box dbox
Definition AMReX_FabArrayBase.H:196
int dstIndex
Definition AMReX_FabArrayBase.H:198
std::map< int, CopyComTagsContainer > MapOfCopyComTagContainers
Definition AMReX_FabArrayBase.H:215
FillBoundary.
Definition AMReX_FabArrayBase.H:488
bool m_multi_ghost
Definition AMReX_FabArrayBase.H:505
Long m_nuse
Definition AMReX_FabArrayBase.H:504
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:497
bool m_cross
Definition AMReX_FabArrayBase.H:499
IndexType m_typ
Definition AMReX_FabArrayBase.H:495
Long bytes() const
Definition AMReX_FabArrayBase.cpp:257
Periodicity m_period
Definition AMReX_FabArrayBase.H:502
std::uint64_t m_id
Definition AMReX_FabArrayBase.H:494
bool m_epo
Definition AMReX_FabArrayBase.H:500
bool m_override_sync
Definition AMReX_FabArrayBase.H:501
IntVect m_crse_ratio
BoxArray in FabArrayBase may have crse_ratio.
Definition AMReX_FabArrayBase.H:496
IntVect m_sb_snghost
Definition AMReX_FabArrayBase.H:498
Definition AMReX_FabArrayBase.H:305
std::unique_ptr< FabFactory< FArrayBox > > fact_crse_patch
Definition AMReX_FabArrayBase.H:320
DistributionMapping dm_patch
Definition AMReX_FabArrayBase.H:319
BDKey m_srcbdk
Definition AMReX_FabArrayBase.H:323
Long bytes() const
Definition AMReX_FabArrayBase.cpp:2059
BoxArray ba_crse_patch
Definition AMReX_FabArrayBase.H:317
std::unique_ptr< FabFactory< FArrayBox > > fact_fine_patch
Definition AMReX_FabArrayBase.H:321
std::unique_ptr< BoxConverter > m_coarsener
Definition AMReX_FabArrayBase.H:327
Box m_dstdomain
Definition AMReX_FabArrayBase.H:325
IntVect m_dstng
Definition AMReX_FabArrayBase.H:326
Long m_nuse
Definition AMReX_FabArrayBase.H:329
BDKey m_dstbdk
Definition AMReX_FabArrayBase.H:324
BoxArray ba_fine_patch
Definition AMReX_FabArrayBase.H:318
Definition AMReX_FabArrayBase.H:697
Long num_build
Definition AMReX_FabArrayBase.H:702
void recordDelete() noexcept
Definition AMReX_FabArrayBase.H:709
int max_num_boxarrays
Definition AMReX_FabArrayBase.H:700
void recordMaxNumBAUse(int n) noexcept
Definition AMReX_FabArrayBase.H:715
void recordMaxNumBoxArrays(int n) noexcept
Definition AMReX_FabArrayBase.H:712
void print() const
Definition AMReX_FabArrayBase.H:718
int max_num_fabarrays
Definition AMReX_FabArrayBase.H:699
int max_num_ba_use
Definition AMReX_FabArrayBase.H:701
int num_fabarrays
Definition AMReX_FabArrayBase.H:698
void recordBuild() noexcept
Definition AMReX_FabArrayBase.H:704
Used for collecting information used in communicating FABs.
Definition AMReX_FabArrayBase.H:272
int srcComp
Definition AMReX_FabArrayBase.H:277
int toProc
Definition AMReX_FabArrayBase.H:274
int fromProc
Definition AMReX_FabArrayBase.H:273
int fabArrayId
Definition AMReX_FabArrayBase.H:281
int procThatHasData
Definition AMReX_FabArrayBase.H:284
int procThatNeedsData
Definition AMReX_FabArrayBase.H:283
int destComp
Definition AMReX_FabArrayBase.H:278
int face
Definition AMReX_FabArrayBase.H:280
Box box
Definition AMReX_FabArrayBase.H:285
int fabIndex
Definition AMReX_FabArrayBase.H:275
int nComp
Definition AMReX_FabArrayBase.H:279
int fineIndex
Definition AMReX_FabArrayBase.H:276
int fillBoxId
Definition AMReX_FabArrayBase.H:282
For ParallelFor(FabArray)
Definition AMReX_FabArrayBase.H:655
ParForInfo(ParForInfo const &)=delete
Long m_ncellsmax
Definition AMReX_FabArrayBase.H:672
BATransformer m_bat
Definition AMReX_FabArrayBase.H:670
ParForInfo(ParForInfo &&)=delete
BoxIndexer const * getBoxes() const
Definition AMReX_FabArrayBase.H:662
char * m_hp
Definition AMReX_FabArrayBase.H:674
int getNBlocksPerBox(int nthreads) const
Definition AMReX_FabArrayBase.H:659
void operator=(ParForInfo const &)=delete
~ParForInfo()
Definition AMReX_FabArrayBase.cpp:2751
IntVect m_ng
Definition AMReX_FabArrayBase.H:671
BoxIndexer * m_boxes
Definition AMReX_FabArrayBase.H:673
Fill polar boundary in spherical coordinates.
Definition AMReX_FabArrayBase.H:633
Box m_domain
Definition AMReX_FabArrayBase.H:636
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:635
Rotate Boundary by 180.
Definition AMReX_FabArrayBase.H:611
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:613
Box m_domain
Definition AMReX_FabArrayBase.H:614
Rotate Boundary by 90.
Definition AMReX_FabArrayBase.H:589
Box m_domain
Definition AMReX_FabArrayBase.H:592
IntVect m_ngrow
Definition AMReX_FabArrayBase.H:591
Definition AMReX_FabArrayBase.H:415
~RegionTag()
Definition AMReX_FabArrayBase.H:422
RegionTag & operator=(RegionTag const &)=delete
RegionTag(RegionTag &&rhs) noexcept
Definition AMReX_FabArrayBase.H:419
RegionTag(const std::string &t)
Definition AMReX_FabArrayBase.H:417
RegionTag(RegionTag const &)=delete
RegionTag(const char *t)
Definition AMReX_FabArrayBase.H:416
Tiling.
Definition AMReX_FabArrayBase.H:259
Vector< int > indexMap
Definition AMReX_FabArrayBase.H:262
Vector< int > localIndexMap
Definition AMReX_FabArrayBase.H:263
Long bytes() const
Definition AMReX_FabArrayBase.cpp:277
Vector< int > localTileIndexMap
Definition AMReX_FabArrayBase.H:264
Vector< int > numLocalTiles
Definition AMReX_FabArrayBase.H:261
Long nuse
Definition AMReX_FabArrayBase.H:260
Vector< Box > tileArray
Definition AMReX_FabArrayBase.H:265
Definition AMReX_FabArrayBase.H:399
Long nbytes
Definition AMReX_FabArrayBase.H:400
Long nbytes_hwm
Definition AMReX_FabArrayBase.H:401