Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_VisMF.H
Go to the documentation of this file.
1
2#ifndef AMREX_VISMF_H_
3#define AMREX_VISMF_H_
4#include <AMReX_Config.H>
5
6#include <AMReX_AsyncOut.H>
7#include <AMReX_BLProfiler.H>
8#include <AMReX_FabArray.H>
9#include <AMReX_FArrayBox.H>
10#include <AMReX_FabConv.H>
11#include <AMReX_NFiles.H>
13#include <AMReX_VisMFBuffer.H>
14
15#include <fstream>
16#include <iostream>
17#include <sstream>
18#include <deque>
19#include <map>
20#include <numeric>
21#include <string>
22#include <type_traits>
23
24namespace amrex {
25
26class IArrayBox;
27
32class VisMF
33 : public VisMFBuffer
34{
35public:
48 explicit VisMF (std::string fafab_name);
49 ~VisMF () = default;
50 VisMF (const VisMF&) = delete;
51 VisMF (VisMF&&) = delete;
52 VisMF& operator= (const VisMF&) = delete;
53 VisMF& operator= (VisMF&&) = delete;
55 struct FabOnDisk
56 {
58 FabOnDisk () = default;
60 FabOnDisk (std::string name, Long offset);
62 std::string m_name;
63 Long m_head = 0;
64 };
66 struct Header
67 {
83 Header (const FabArray<FArrayBox>& mf, VisMF::How how, Version version = Version_v1,
84 bool calcMinMax = true, MPI_Comm = ParallelDescriptor::Communicator());
85
86 ~Header () = default;
87 Header (Header&& rhs) noexcept = default;
88 Header (Header const&) = delete;
89 Header& operator= (Header const&) = delete;
90 Header& operator= (Header &&) = delete;
91
94 int procToWrite = ParallelDescriptor::IOProcessorNumber(),
96 //
97 // The data.
98 //
105 //
106 // These are not defined if they are not in the header
107 //
113 };
114
117 {
118 int rankToRead{-1};
119 int faIndex{-1};
120 Long fileOffset{-1};
122
123 FabReadLink() = default;
124 FabReadLink(int ranktoread, int faindex, Long fileoffset, const Box &b);
125 };
126
142
148 static std::ifstream *OpenStream(const std::string &fileName);
149 static void CloseStream(const std::string &fileName, bool forceClose = false);
150 static void DeleteStream(const std::string &fileName);
151 static void CloseAllStreams();
152 static bool NoFabHeader(const VisMF::Header &hdr);
153
155 [[nodiscard]] int nComp () const;
157 [[nodiscard]] int nGrow () const;
158 [[nodiscard]] IntVect nGrowVect () const;
160 [[nodiscard]] int size () const;
162 [[nodiscard]] const BoxArray& boxArray () const;
164 [[nodiscard]] Real min (int fabIndex, int nComp) const;
166 [[nodiscard]] Real min (int nComp) const;
168 [[nodiscard]] Real max (int fabIndex, int nComp) const;
170 [[nodiscard]] Real max (int nComp) const;
171
177 [[nodiscard]] const FArrayBox& GetFab (int fabIndex, int compIndex) const;
179 void clear (int fabIndex, int compIndex);
181 void clear (int fabIndex);
183 void clear ();
191 static Long Write (const FabArray<FArrayBox> &mf,
192 const std::string& name,
193 VisMF::How how = NFiles,
194 bool set_ghost = false);
195
196 static void AsyncWrite (const FabArray<FArrayBox>& mf, const std::string& mf_name,
197 bool valid_cells_only = false);
198 static void AsyncWrite (FabArray<FArrayBox>&& mf, const std::string& mf_name,
199 bool valid_cells_only = false);
200
208 static Long WriteOnlyHeader (const FabArray<FArrayBox> & mf,
209 const std::string & mf_name,
210 VisMF::How how = NFiles);
212 static void RemoveFiles(const std::string &name, bool verbose = false);
213
223 static void Read (FabArray<FArrayBox> &mf,
224 const std::string &name,
225 const char *faHeader = nullptr,
226 int coordinatorProc = ParallelDescriptor::IOProcessorNumber(),
227 int allow_empty_mf = 0);
228
230 static bool Exist (const std::string &name);
231
233 static void ReadFAHeader (const std::string &fafabName,
234 Vector<char> &header);
235
237 static bool Check (const std::string &name);
239 static Long FileOffset (std::ostream& os);
241 FArrayBox* readFAB (int idx, const std::string& mf_name);
243 FArrayBox* readFAB (int idx, int icomp);
244
245 static int GetNOutFiles ();
246 static void SetNOutFiles (int noutfiles, MPI_Comm comm = ParallelDescriptor::Communicator());
247
248 static int GetMFFileInStreams () { return nMFFileInStreams; }
249 static void SetMFFileInStreams (int nstreams, MPI_Comm comm = ParallelDescriptor::Communicator());
250
251 static int GetVerbose () { return verbose; }
252 static void SetVerbose (int v) { verbose = v; }
253
256 { currentVersion = version; }
257
258 static bool GetGroupSets () { return groupSets; }
259 static void SetGroupSets (bool groupsets) { groupSets = groupsets; }
260
261 static bool GetSetBuf () { return setBuf; }
262 static void SetSetBuf (bool setbuf) { setBuf = setbuf; }
263
264 static bool GetUseSingleRead () { return useSingleRead; }
265 static void SetUseSingleRead (bool usesingleread) { useSingleRead = usesingleread; }
266
267 static bool GetUseSingleWrite () { return useSingleWrite; }
268 static void SetUseSingleWrite (bool usesinglewrite) { useSingleWrite = usesinglewrite; }
269
270 static bool GetCheckFilePositions () { return checkFilePositions; }
271 static void SetCheckFilePositions (bool cfp) { checkFilePositions = cfp; }
272
274 static void SetUsePersistentIFStreams (bool usepifs) { usePersistentIFStreams = usepifs; }
275
277 static void SetUseSynchronousReads (bool usepsr) { useSynchronousReads = usepsr; }
278
280 static void SetUseDynamicSetSelection (bool usedss) { useDynamicSetSelection = usedss; }
281
282 static bool GetNoFlushAfterWrite () { return noFlushAfterWrite; }
283 static void SetNoFlushAfterWrite (bool nfaw) { noFlushAfterWrite = nfaw; }
284
285 static bool GetBarrierAfterLevel () { return barrierAfterLevel; }
286 static void SetBarrierAfterLevel (bool bal) { barrierAfterLevel = bal; }
287
288 static std::string DirName (const std::string& filename);
289 static std::string BaseName (const std::string& filename);
290
291 static void Initialize ();
292 static void Finalize ();
293
294private:
295 static FabOnDisk Write (const FArrayBox& fab,
296 const std::string& filename,
297 std::ostream& os,
298 Long& bytes);
299
300 static Long WriteHeaderDoit (const std::string &mf_name,
301 VisMF::Header const &hdr);
302
303 static Long WriteHeader (const std::string &mf_name,
304 VisMF::Header &hdr,
305 int procToWrite = ParallelDescriptor::IOProcessorNumber(),
307
309 static void FindOffsets (const FabArray<FArrayBox> &mf,
310 const std::string &filePrefix,
311 VisMF::Header &hdr,
312 VisMF::Header::Version whichVersion,
313 NFilesIter &nfi,
322 static FArrayBox *readFAB (int idx,
323 const std::string &mf_name,
324 const Header &hdr,
325 int whichComp = -1);
327 static void readFAB (FabArray<FArrayBox> &mf,
328 int idx,
329 const std::string &mf_name,
330 const Header& hdr);
331
332 static void AsyncWriteDoit (const FabArray<FArrayBox>& mf, const std::string& mf_name,
333 bool is_rvalue, bool valid_cells_only);
334
336 std::string m_fafabname;
346 static AMREX_EXPORT std::map<std::string, VisMF::PersistentIFStream> persistentIFStreams;
350
354 static AMREX_EXPORT bool setBuf;
364};
365
367std::ostream& operator<< (std::ostream& os, const VisMF::FabOnDisk& fod);
369std::istream& operator>> (std::istream& is, VisMF::FabOnDisk& fod);
371std::ostream& operator<< (std::ostream& os, const Vector<VisMF::FabOnDisk>& fa);
373std::istream& operator>> (std::istream& is, Vector<VisMF::FabOnDisk>& fa);
375std::ostream& operator<< (std::ostream& os, const VisMF::Header& hd);
377std::istream& operator>> (std::istream& is, VisMF::Header& hd);
378
388template <typename FAB>
389// This function does work for MultiFab, but let's disable it to avoid confusion.
390std::enable_if_t<std::is_same_v<FAB,IArrayBox>>
391Write (const FabArray<FAB>& fa, const std::string& name)
392{
393 BL_PROFILE("Write(FabArray)");
394 AMREX_ASSERT(name.back() != '/');
395
396 auto data_descriptor = FAB::getDataDescriptor();
397 int data_bytes = data_descriptor->numBytes();
398
399 bool useSparseFPP = false;
400 const Vector<int> &pmap = fa.DistributionMap().ProcessorMap();
401 std::set<int> procsWithData;
402 Vector<int> procsWithDataVector;
403 for(int i : pmap) {
404 procsWithData.insert(i);
405 }
406 const int nOutFiles = VisMF::GetNOutFiles();
407 if (static_cast<int>(procsWithData.size()) < nOutFiles) {
408 useSparseFPP = true;
409 for (auto i : procsWithData) {
410 procsWithDataVector.push_back(i);
411 }
412 }
413
414 std::string filePrefix = name + "_D_";
415
416 NFilesIter nfi(nOutFiles, filePrefix, VisMF::GetGroupSets(), VisMF::GetSetBuf());
417
418 if (useSparseFPP) {
419 nfi.SetSparseFPP(procsWithDataVector);
420 } else {
421 nfi.SetDynamic();
422 }
423
424 const auto &fio = FAB::getFABio();
425
426 for ( ; nfi.ReadyToWrite(); ++nfi) {
427 for(MFIter mfi(fa); mfi.isValid(); ++mfi) {
428 const FAB &fab = fa[mfi];
429 {
430 std::stringstream hss;
431 fio.write_header(hss, fab, fab.nComp());
432 auto hLength = static_cast<std::streamoff>(hss.tellp());
433 auto tstr = hss.str();
434 nfi.Stream().write(tstr.c_str(), hLength);
435 nfi.Stream().flush();
436 }
437 auto const* fabdata = fab.dataPtr();
438#ifdef AMREX_USE_GPU
439 std::unique_ptr<FAB> hostfab;
440 if (fab.arena()->isManaged() || fab.arena()->isDevice()) {
441 hostfab = std::make_unique<FAB>(fab.box(), fab.nComp(), The_Pinned_Arena());
442 Gpu::dtoh_memcpy_async(hostfab->dataPtr(), fab.dataPtr(),
443 fab.size()*sizeof(typename FAB::value_type));
445 fabdata = hostfab->dataPtr();
446 }
447#endif
448 Long writeDataItems = fab.box().numPts() * fa.nComp();
449 Long writeDataSize = writeDataItems * data_bytes;
450 nfi.Stream().write((char *) fabdata, writeDataSize);
451 nfi.Stream().flush();
452 }
453 }
454
455 int coordinatorProc = ParallelDescriptor::IOProcessorNumber();
456 if (nfi.GetDynamic()) {
457 coordinatorProc = nfi.CoordinatorProc();
458 }
459
460 if (ParallelDescriptor::MyProc() == coordinatorProc) {
461 std::string header_file_name = name + "_H";
463 std::ofstream ofs;
464 ofs.rdbuf()->pubsetbuf(io_buffer.dataPtr(), io_buffer.size());
465 ofs.open(header_file_name.c_str(), std::ios::out | std::ios::trunc);
466 if (!ofs.good()) {
467 amrex::FileOpenFailed(header_file_name);
468 }
469
470 ofs << "amrex::FabArray<" << FAB::getClassName() << "> v1.0\n";
471 ofs << fa.nComp() << '\n';
472 ofs << fa.nGrowVect() << '\n';
473 fa.boxArray().writeOn(ofs);
474 ofs << '\n';
475
476 const DistributionMapping& dm = fa.DistributionMap();
477 int nfabs = fa.boxArray().size();
478 int nFiles = NFilesIter::ActualNFiles(nOutFiles);
479 int nprocs = ParallelDescriptor::NProcs();
480
481 Vector<Long> fabBytes(nfabs, 0);
482 std::map<int, Vector<int> > rankBoxOrder;
483 for (int i = 0; i < nfabs; ++i) {
484 std::stringstream hss;
485 FAB tmp(fa.fabbox(i), fa.nComp(), false);
486 fio.write_header(hss, tmp, tmp.nComp());
487 // Size includes header and data
488 fabBytes[i] = static_cast<std::streamoff>(hss.tellp()) + tmp.size() * data_bytes;
489 rankBoxOrder[dm[i]].push_back(i);
490 }
491
492 Vector<int> fileNumbers;
493 if (nfi.GetDynamic()) {
494 fileNumbers = nfi.FileNumbersWritten();
495 } else if (nfi.GetSparseFPP()) {
496 // if sparse, write to (file number = rank)
497 fileNumbers.resize(nprocs);
498 std::iota(fileNumbers.begin(), fileNumbers.end(), 0);
499 } else {
500 fileNumbers.resize(nprocs);
501 for (int i = 0; i < nprocs; ++i) {
502 fileNumbers[i] = NFilesIter::FileNumber(nFiles, i, VisMF::GetGroupSets());
503 }
504 }
505
506 Vector<VisMF::FabOnDisk> fod(nfabs);
507
508 const Vector< Vector<int> > &fileNumbersWriteOrder = nfi.FileNumbersWriteOrder();
509 for (auto const& rv : fileNumbersWriteOrder) {
510 Long currentOffset = 0;
511 for (auto rank : rv) {
512 auto rbo_it = rankBoxOrder.find(rank);
513 if (rbo_it != rankBoxOrder.end()) {
514 Vector<int> const& index = rbo_it->second;
515 int whichFileNumber = fileNumbers[rank];
516 std::string const& whichFileName =
517 VisMF::BaseName(NFilesIter::FileName(whichFileNumber, filePrefix));
518 for (int i : index) {
519 fod[i].m_name = whichFileName;
520 fod[i].m_head = currentOffset;
521 currentOffset += fabBytes[i];
522 }
523 }
524 }
525 }
526 ofs << fod;
527 }
528}
529
530namespace detail {
531template <typename FAB>
532void read_fab (FAB& fab, VisMF::FabOnDisk const& fod, std::string const& name)
533{
534 std::string fullname = VisMF::DirName(name);
535 fullname += fod.m_name;
537 std::ifstream ifs;
538 ifs.rdbuf()->pubsetbuf(io_buffer.dataPtr(), io_buffer.size());
539 ifs.open(fullname.c_str(), std::ios::in | std::ios::binary);
540 if (!ifs.good()) {
541 amrex::FileOpenFailed(fullname);
542 }
543 ifs.seekg(fod.m_head, std::ios::beg);
544 fab.readFrom(ifs);
545}
546}
547
565template <typename FAB>
566// This function does work for MultiFab, but let's disable it to avoid confusion.
567std::enable_if_t<std::is_same_v<FAB,IArrayBox>>
568Read (FabArray<FAB>& fa, const std::string& name)
569{
570 BL_PROFILE("Read(FabArray)");
571 AMREX_ASSERT(name.back() != '/');
572
573 BoxArray ba;
574 int ncomp;
575 IntVect ngrow;
577 {
578 std::string header_file_name = name + "_H";
579 Vector<char> header_file_chars;
580 ParallelDescriptor::ReadAndBcastFile(header_file_name, header_file_chars);
581 std::string header_file_string(header_file_chars.data());
582 std::stringstream ifs(header_file_string, std::istringstream::in);
583
584 std::string type, version;
585 ifs >> type >> version;
586 AMREX_ASSERT(type == "amrex::FabArray<amrex::IArrayBox>" ||
587 type == "amrex::FabArray<amrex::FArrayBox>");
588 ifs >> ncomp;
589 ifs >> ngrow;
590 ba.readFrom(ifs);
591 ifs >> fod;
592 }
593
594 if (fa.empty()) {
595 fa.define(ba, DistributionMapping{ba}, ncomp, ngrow);
596 } else {
598 }
599
600#ifdef AMREX_USE_MPI
601 const int nopensperfile = VisMF::GetMFFileInStreams(); // # of concurrent readers per file
602 const int myproc = ParallelDescriptor::MyProc();
603 const int coordproc = ParallelDescriptor::IOProcessorNumber();
604
605 int nreqs = 0;
606 int allreadsindex = 0;
607 std::map<std::string, int> filenames; // <filename, allreadsindex>
608
609 const int nboxes = fa.size();
610 const auto& dm = fa.DistributionMap();
611 for (int i = 0; i < nboxes; ++i) {
612 if (myproc == dm[i]) {
613 ++nreqs;
614 }
615 if (myproc == coordproc) {
616 std::string const& fname = fod[i].m_name;
617 auto r =filenames.insert(std::make_pair(fname, allreadsindex));
618 if (r.second) {
619 ++allreadsindex;
620 }
621 }
622 }
623
624 const int readtag = ParallelDescriptor::SeqNum();
625 const int donetag = ParallelDescriptor::SeqNum();
626
627 if (myproc == coordproc) {
628 std::multiset<int> availablefiles; // [whichFile] supports multiple reads/file
629 Vector<std::map<int,std::map<Long,int> > > allreads; // [file]<proc,<seek,index>>
630
631 const auto nfiles = static_cast<int>(filenames.size());
632 for (int i = 0; i < nfiles; ++i) {
633 for (int j = 0; j < nopensperfile; ++j) {
634 availablefiles.insert(i);
635 }
636 }
637 allreads.resize(nfiles);
638 for (int i = 0; i < nboxes; ++i) {
639 const auto whichproc = dm[i];
640 const auto iseekpos = fod[i].m_head;
641 std::string const& fname = fod[i].m_name;
642 auto filenamesiter = filenames.find(fname);
643 if (filenamesiter != filenames.end()) {
644 const int fi = filenamesiter->second;
645 allreads[fi][whichproc].insert(std::make_pair(iseekpos,i));
646 } else {
647 amrex::Error("Error in amrex::Read: filename not found "+fname);
648 }
649 }
650
651 int totalioreqs = nboxes;
652 int reqspending = 0;
653 int iopfileindex;
654 std::deque<int> iopreads;
655 std::set<int> busyprocs;
656 while (totalioreqs > 0) {
657 auto afilesiter = availablefiles.begin();
658 while (afilesiter != availablefiles.end()) {
659 const int fi = *afilesiter;
660 if (allreads[fi].empty()) {
661 availablefiles.erase(fi);
662 afilesiter = availablefiles.begin();
663 continue;
664 }
665 auto whichread = allreads[fi].begin();
666 for ( ; whichread != allreads[fi].end(); ++whichread) {
667 const int tryproc = whichread->first;
668 if (busyprocs.find(tryproc) == busyprocs.end()) { // not busy
669 busyprocs.insert(tryproc);
670 Vector<int> vreads;
671 vreads.reserve(whichread->second.size());
672 for (auto const& kv : whichread->second) {
673 vreads.push_back(kv.second);
674 }
675 if (tryproc == coordproc) {
676 iopfileindex = fi;
677 for (auto x : vreads) {
678 iopreads.push_back(x);
679 }
680 } else {
681 ParallelDescriptor::Send(vreads, tryproc, readtag);
682 ++reqspending;
683 }
684 availablefiles.erase(afilesiter);
685 afilesiter = availablefiles.begin();
686 break;
687 }
688 }
689 if (whichread == allreads[fi].end()) {
690 ++afilesiter;
691 } else {
692 allreads[fi].erase(whichread);
693 }
694 }
695
696 while (!iopreads.empty()) {
697 int i = iopreads.front();
698 detail::read_fab(fa[i], fod[i], name);
699 --totalioreqs;
700 iopreads.pop_front();
701 if (iopreads.empty()) {
702 availablefiles.insert(iopfileindex);
703 busyprocs.erase(coordproc);
704 }
705 int doneflag;
706 MPI_Status status;
707 ParallelDescriptor::IProbe(MPI_ANY_SOURCE, donetag, doneflag, status);
708 if (doneflag) {
709 break;
710 }
711 }
712
713 if (reqspending > 0) {
714 Vector<int> idone(2);
715 ParallelDescriptor::Message rmess = ParallelDescriptor::Recv(idone, MPI_ANY_SOURCE,
716 donetag);
717 const int i = idone[0];
718 const int procdone = rmess.pid();
719 totalioreqs -= idone[1];
720 --reqspending;
721 busyprocs.erase(procdone);
722 std::string const& fname = fod[i].m_name;
723 const int fi = filenames.find(fname)->second;
724 availablefiles.insert(fi);
725 }
726 }
727 } else {
728 Vector<int> recreads(nreqs, -1);
729 Vector<int> idone(2);
730 while (nreqs > 0) {
731 ParallelDescriptor::Message rmess = ParallelDescriptor::Recv(recreads, coordproc,
732 readtag);
733 const auto nrmess = static_cast<int>(rmess.count());
734 for (int ir = 0; ir < nrmess; ++ir) {
735 int i = recreads[ir];
736 detail::read_fab(fa[i], fod[i], name);
737 }
738 nreqs -= nrmess;
739 idone[0] = recreads[0];
740 idone[1] = nrmess;
741 ParallelDescriptor::Send(idone, coordproc, donetag);
742 }
743 }
744#else
745 for (MFIter mfi(fa); mfi.isValid(); ++mfi) {
746 detail::read_fab(fa[mfi], fod[mfi.index()], name);
747 }
748#endif
749}
750
751}
752
753#endif /*BL_VISMF_H*/
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:551
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_EXPORT
Definition AMReX_Extension.H:191
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:551
std::ostream & writeOn(std::ostream &) const
Output this BoxArray to a checkpoint file.
Definition AMReX_BoxArray.cpp:475
int readFrom(std::istream &is)
Initialize the BoxArray from the supplied istream. It is an error if the BoxArray has already been in...
Definition AMReX_BoxArray.cpp:461
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:598
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:41
const Vector< int > & ProcessorMap() const noexcept
Returns a constant reference to the mapping of boxes in the underlying BoxArray to the CPU that holds...
Definition AMReX_DistributionMapping.cpp:47
A Fortran Array of REALs.
Definition AMReX_FArrayBox.H:229
IntVect nGrowVect() const noexcept
Definition AMReX_FabArrayBase.H:80
int size() const noexcept
Return the number of FABs in the FabArray.
Definition AMReX_FabArrayBase.H:110
const DistributionMapping & DistributionMap() const noexcept
Return constant reference to associated DistributionMapping.
Definition AMReX_FabArrayBase.H:131
bool empty() const noexcept
Definition AMReX_FabArrayBase.H:89
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
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:345
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:2128
Definition AMReX_MFIter.H:57
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:141
This class encapsulates writing to nfiles.
Definition AMReX_NFiles.H:27
Vector< int > FileNumbersWritten()
these are the file numbers to which each rank wrote [rank] a rank only writes to one file
Definition AMReX_NFiles.cpp:517
static int ActualNFiles(int nOutFiles)
this returns the actual number of files used the range [1, nProcs] is enforced
Definition AMReX_NFiles.H:130
bool GetDynamic() const
Definition AMReX_NFiles.H:54
bool GetSparseFPP() const
Definition AMReX_NFiles.H:65
std::fstream & Stream()
Definition AMReX_NFiles.H:98
void SetSparseFPP(const Vector< int > &ranksToWrite)
call this to use a file per process for a sparse set of writers. ranksToWrite.size() will set noutfil...
Definition AMReX_NFiles.cpp:114
bool ReadyToWrite(bool appendFirst=false)
if appendFirst is true, the first set for this iterator will open the files in append mode
Definition AMReX_NFiles.cpp:204
const Vector< Vector< int > > & FileNumbersWriteOrder() const
these are the order of ranks which wrote to each file [filenumber][ranks in order they wrote to filen...
Definition AMReX_NFiles.H:198
int FileNumber() const
Definition AMReX_NFiles.H:161
const std::string & FileName() const
Definition AMReX_NFiles.H:160
int CoordinatorProc() const
this is the processor coordinating dynamic set selection
Definition AMReX_NFiles.H:184
void SetDynamic(int deciderproc=-1)
call this to use dynamic set selection deciderproc defaults to nprocs - 1 if < 0
Definition AMReX_NFiles.cpp:69
Hold the description and status of communication data.
Definition AMReX_ParallelDescriptor.H:57
A Descriptor of the Real Type.
Definition AMReX_FabConv.H:105
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
T * dataPtr() noexcept
get access to the underlying data pointer
Definition AMReX_Vector.H:49
Long size() const noexcept
Definition AMReX_Vector.H:53
Definition AMReX_VisMFBuffer.H:13
static Long GetIOBufferSize()
Definition AMReX_VisMFBuffer.H:26
File I/O for FabArray<FArrayBox>. Wrapper class for reading/writing FabArray<FArrayBox> objects to di...
Definition AMReX_VisMF.H:34
static bool useSingleWrite
Definition AMReX_VisMF.H:356
IntVect nGrowVect() const
Definition AMReX_VisMF.cpp:495
static bool setBuf
Definition AMReX_VisMF.H:354
static bool useSynchronousReads
Definition AMReX_VisMF.H:359
static void SetGroupSets(bool groupsets)
Definition AMReX_VisMF.H:259
Real max(int fabIndex, int nComp) const
The max of the FAB (in valid region) at specified index and component.
Definition AMReX_VisMF.cpp:538
static bool noFlushAfterWrite
Definition AMReX_VisMF.H:362
static void SetNOutFiles(int noutfiles, MPI_Comm comm=ParallelDescriptor::Communicator())
Definition AMReX_VisMF.cpp:156
static bool checkFilePositions
Definition AMReX_VisMF.H:357
static Long FileOffset(std::ostream &os)
The file offset of the passed ostream.
Definition AMReX_VisMF.cpp:579
static std::ifstream * OpenStream(const std::string &fileName)
Open the stream if it is not already open Close the stream if not persistent or forced Close all open...
Definition AMReX_VisMF.cpp:2258
static bool GetUseDynamicSetSelection()
Definition AMReX_VisMF.H:279
static bool GetSetBuf()
Definition AMReX_VisMF.H:261
const BoxArray & boxArray() const
The BoxArray of the on-disk FabArray<FArrayBox>.
Definition AMReX_VisMF.cpp:507
static void SetUseSingleWrite(bool usesinglewrite)
Definition AMReX_VisMF.H:268
static void SetHeaderVersion(VisMF::Header::Version version)
Definition AMReX_VisMF.H:255
static void Read(FabArray< FArrayBox > &mf, const std::string &name, const char *faHeader=nullptr, int coordinatorProc=ParallelDescriptor::IOProcessorNumber(), int allow_empty_mf=0)
Read a FabArray<FArrayBox> from disk written using VisMF::Write(). If the FabArray<FArrayBox> fafab h...
Definition AMReX_VisMF.cpp:1583
static Long WriteHeader(const std::string &mf_name, VisMF::Header &hdr, int procToWrite=ParallelDescriptor::IOProcessorNumber(), MPI_Comm comm=ParallelDescriptor::Communicator())
Definition AMReX_VisMF.cpp:954
std::string m_fafabname
Name of the FabArray<FArrayBox>.
Definition AMReX_VisMF.H:336
static void CloseAllStreams()
Definition AMReX_VisMF.cpp:2308
static bool barrierAfterLevel
Definition AMReX_VisMF.H:363
static void AsyncWriteDoit(const FabArray< FArrayBox > &mf, const std::string &mf_name, bool is_rvalue, bool valid_cells_only)
Definition AMReX_VisMF.cpp:2347
int size() const
Definition AMReX_VisMF.cpp:501
static int verbose
Definition AMReX_VisMF.H:351
static int GetVerbose()
Definition AMReX_VisMF.H:251
static Long WriteHeaderDoit(const std::string &mf_name, VisMF::Header const &hdr)
Definition AMReX_VisMF.cpp:922
static bool groupSets
Definition AMReX_VisMF.H:353
static void SetNoFlushAfterWrite(bool nfaw)
Definition AMReX_VisMF.H:283
static VisMF::Header::Version GetHeaderVersion()
Definition AMReX_VisMF.H:254
static void SetCheckFilePositions(bool cfp)
Definition AMReX_VisMF.H:271
static void SetUseSingleRead(bool usesingleread)
Definition AMReX_VisMF.H:265
FArrayBox * readFAB(int idx, const std::string &mf_name)
Read the entire fab (all components).
Definition AMReX_VisMF.cpp:595
static bool GetCheckFilePositions()
Definition AMReX_VisMF.H:270
const FArrayBox & GetFab(int fabIndex, int compIndex) const
The FAB at the specified index and component. Reads it from disk if necessary. This reads only the sp...
Definition AMReX_VisMF.cpp:563
static void DeleteStream(const std::string &fileName)
Definition AMReX_VisMF.cpp:2297
static Long Write(const FabArray< FArrayBox > &mf, const std::string &name, VisMF::How how=NFiles, bool set_ghost=false)
Write a FabArray<FArrayBox> to disk in a "smart" way. Returns the total number of bytes written on th...
Definition AMReX_VisMF.cpp:979
Vector< Vector< FArrayBox * > > m_pa
We manage the FABs individually.
Definition AMReX_VisMF.H:340
static bool useSingleRead
Definition AMReX_VisMF.H:355
static bool GetUseSynchronousReads()
Definition AMReX_VisMF.H:276
static int GetMFFileInStreams()
Definition AMReX_VisMF.H:248
static int GetNOutFiles()
Definition AMReX_VisMF.cpp:168
static bool GetNoFlushAfterWrite()
Definition AMReX_VisMF.H:282
static VisMF::Header::Version currentVersion
Definition AMReX_VisMF.H:352
static bool usePersistentIFStreams
Definition AMReX_VisMF.H:358
static bool GetGroupSets()
Definition AMReX_VisMF.H:258
static std::string DirName(const std::string &filename)
Definition AMReX_VisMF.cpp:625
static Long WriteOnlyHeader(const FabArray< FArrayBox > &mf, const std::string &mf_name, VisMF::How how=NFiles)
Write only the header-file corresponding to FabArray<FArrayBox> to disk without the corresponding FAB...
Definition AMReX_VisMF.cpp:1183
VisMF(VisMF &&)=delete
int nGrow() const
The grow factor of the on-disk FabArray<FArrayBox>.
Definition AMReX_VisMF.cpp:489
Header m_hdr
The VisMF header as read from disk.
Definition AMReX_VisMF.H:338
static bool useDynamicSetSelection
Definition AMReX_VisMF.H:360
static bool GetUsePersistentIFStreams()
Definition AMReX_VisMF.H:273
static void SetUseSynchronousReads(bool usepsr)
Definition AMReX_VisMF.H:277
static void SetVerbose(int v)
Definition AMReX_VisMF.H:252
VisMF & operator=(const VisMF &)=delete
static void CloseStream(const std::string &fileName, bool forceClose=false)
Definition AMReX_VisMF.cpp:2280
How
How we write out FabArray<FArrayBox>s. These are deprecated, we always use NFiles....
Definition AMReX_VisMF.H:41
@ NFiles
Definition AMReX_VisMF.H:41
@ OneFilePerCPU
Definition AMReX_VisMF.H:41
static void AsyncWrite(const FabArray< FArrayBox > &mf, const std::string &mf_name, bool valid_cells_only=false)
Definition AMReX_VisMF.cpp:2314
static void Finalize()
Definition AMReX_VisMF.cpp:149
void clear()
Delete()s all the FABs.
Definition AMReX_VisMF.cpp:2226
static void SetBarrierAfterLevel(bool bal)
Definition AMReX_VisMF.H:286
static bool Exist(const std::string &name)
Does FabArray exist?
Definition AMReX_VisMF.cpp:2088
static bool GetBarrierAfterLevel()
Definition AMReX_VisMF.H:285
static void SetMFFileInStreams(int nstreams, MPI_Comm comm=ParallelDescriptor::Communicator())
Definition AMReX_VisMF.cpp:162
static void ReadFAHeader(const std::string &fafabName, Vector< char > &header)
Read only the header of a FabArray, header will be resized here.
Definition AMReX_VisMF.cpp:2102
~VisMF()=default
static int nMFFileInStreams
Definition AMReX_VisMF.H:349
static void Initialize()
Definition AMReX_VisMF.cpp:109
static bool GetUseSingleRead()
Definition AMReX_VisMF.H:264
static std::map< std::string, VisMF::PersistentIFStream > persistentIFStreams
Persistent streams. These open on demand and should be closed when not needed with CloseAllStreams....
Definition AMReX_VisMF.H:346
static std::string BaseName(const std::string &filename)
Definition AMReX_VisMF.cpp:607
static void RemoveFiles(const std::string &name, bool verbose=false)
this will remove nfiles associated with name and the header
Definition AMReX_VisMF.cpp:1374
static bool allowSparseWrites
Definition AMReX_VisMF.H:361
static int nOutFiles
The number of files to write for a FabArray<FArrayBox>.
Definition AMReX_VisMF.H:348
int nComp() const
The number of components in the on-disk FabArray<FArrayBox>.
Definition AMReX_VisMF.cpp:483
Real min(int fabIndex, int nComp) const
The min of the FAB (in valid region) at specified index and component.
Definition AMReX_VisMF.cpp:513
static bool Check(const std::string &name)
Check if the multifab is ok, false is returned if not ok.
Definition AMReX_VisMF.cpp:2113
static void SetUsePersistentIFStreams(bool usepifs)
Definition AMReX_VisMF.H:274
static void SetUseDynamicSetSelection(bool usedss)
Definition AMReX_VisMF.H:280
static bool GetUseSingleWrite()
Definition AMReX_VisMF.H:267
static void FindOffsets(const FabArray< FArrayBox > &mf, const std::string &filePrefix, VisMF::Header &hdr, VisMF::Header::Version whichVersion, NFilesIter &nfi, MPI_Comm comm=ParallelDescriptor::Communicator())
fileNumbers must be passed in for dynamic set selection [proc]
Definition AMReX_VisMF.cpp:1217
VisMF(const VisMF &)=delete
static void SetSetBuf(bool setbuf)
Definition AMReX_VisMF.H:262
static bool NoFabHeader(const VisMF::Header &hdr)
Definition AMReX_VisMF.cpp:2236
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:260
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:303
MPI_Comm Communicator() noexcept
Definition AMReX_ParallelDescriptor.H:210
int MyProc() noexcept
return the rank number local to the current Parallel Context
Definition AMReX_ParallelDescriptor.H:125
void ReadAndBcastFile(const std::string &filename, Vector< char > &charBuf, bool bExitOnError, const MPI_Comm &comm)
Definition AMReX_ParallelDescriptor.cpp:1491
Message Send(const T *buf, size_t n, int dst_pid, int tag)
Definition AMReX_ParallelDescriptor.H:1109
int SeqNum() noexcept
Returns sequential message sequence numbers, usually used as tags for send/recv.
Definition AMReX_ParallelDescriptor.H:613
int NProcs() noexcept
return the number of MPI ranks local to the current Parallel Context
Definition AMReX_ParallelDescriptor.H:243
void IProbe(int, int, int &, MPI_Status &)
Definition AMReX_ParallelDescriptor.cpp:1218
int IOProcessorNumber() noexcept
Definition AMReX_ParallelDescriptor.H:266
Message Recv(T *, size_t n, int pid, int tag)
Definition AMReX_ParallelDescriptor.H:1151
void read_fab(FAB &fab, VisMF::FabOnDisk const &fod, std::string const &name)
Definition AMReX_VisMF.H:532
int MPI_Comm
Definition AMReX_ccse-mpi.H:51
Definition AMReX_Amr.cpp:49
void FileOpenFailed(const std::string &file)
Output a message and abort when couldn't open the file.
Definition AMReX_Utility.cpp:137
std::enable_if_t< std::is_same_v< FAB, IArrayBox > > Write(const FabArray< FAB > &fa, const std::string &name)
Write iMultiFab/FabArray<IArrayBox>
Definition AMReX_VisMF.H:391
bool match(const BoxArray &x, const BoxArray &y)
Note that two BoxArrays that match are not necessarily equal.
Definition AMReX_BoxArray.cpp:1918
void Error(const std::string &msg)
Print out message to cerr and exit via amrex::Abort().
Definition AMReX.cpp:224
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:745
std::enable_if_t< std::is_same_v< FAB, IArrayBox > > Read(FabArray< FAB > &fa, const std::string &name)
Read iMultiFab/FabArray<IArrayBox>
Definition AMReX_VisMF.H:568
std::istream & operator>>(std::istream &is, BoxND< dim > &bx)
Read from istream.
Definition AMReX_Box.H:1718
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:1908
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1236
Definition AMReX_FabArrayCommI.H:1000
A structure containing info regarding an on-disk FAB.
Definition AMReX_VisMF.H:56
Long m_head
Offset to start of FAB in file.
Definition AMReX_VisMF.H:63
std::string m_name
The two data values in a FabOnDisk structure.
Definition AMReX_VisMF.H:62
FabOnDisk()=default
The default constructor – null out all fields.
An on-disk FabArray<FArrayBox> contains this info in a header file.
Definition AMReX_VisMF.H:67
Header & operator=(Header const &)=delete
Vector< Vector< Real > > m_min
The min()s of each component of FABs. [findex][comp].
Definition AMReX_VisMF.H:108
Header(Header const &)=delete
Vector< Real > m_famax
The max()s of each component of the FabArray. [comp].
Definition AMReX_VisMF.H:111
void CalculateMinMax(const FabArray< FArrayBox > &mf, int procToWrite=ParallelDescriptor::IOProcessorNumber(), MPI_Comm=ParallelDescriptor::Communicator())
Calculate the min and max arrays.
Definition AMReX_VisMF.cpp:745
Version
The versions of the FabArray<FArrayBox> Header code.
Definition AMReX_VisMF.H:69
@ NoFabHeader_v1
-— no fab headers, no fab mins or maxes
Definition AMReX_VisMF.H:74
@ NoFabHeaderMinMax_v1
Definition AMReX_VisMF.H:75
@ Undefined_v1
-— undefined
Definition AMReX_VisMF.H:70
@ Version_v1
Definition AMReX_VisMF.H:71
@ NoFabHeaderFAMinMax_v1
Definition AMReX_VisMF.H:77
int m_vers
The version of the Header.
Definition AMReX_VisMF.H:99
BoxArray m_ba
The BoxArray of the MF.
Definition AMReX_VisMF.H:103
Vector< Vector< Real > > m_max
The max()s of each component of FABs. [findex][comp].
Definition AMReX_VisMF.H:109
Header()
The default constructor.
How m_how
How the MF was written to disk.
Definition AMReX_VisMF.H:100
Header(Header &&rhs) noexcept=default
Vector< FabOnDisk > m_fod
FabOnDisk info for contained FABs.
Definition AMReX_VisMF.H:104
int m_ncomp
Number of components in MF.
Definition AMReX_VisMF.H:101
RealDescriptor m_writtenRD
Definition AMReX_VisMF.H:112
IntVect m_ngrow
The number of ghost cells in MF.
Definition AMReX_VisMF.H:102
Vector< Real > m_famin
The min()s of each component of the FabArray. [comp].
Definition AMReX_VisMF.H:110
This structure is used to store file ifstreams that remain open.
Definition AMReX_VisMF.H:129
~PersistentIFStream()
Definition AMReX_VisMF.cpp:2247
VisMF::IO_Buffer ioBuffer
Definition AMReX_VisMF.H:133
PersistentIFStream(PersistentIFStream &&)=delete
PersistentIFStream & operator=(PersistentIFStream const &)=delete
std::streampos currentPosition
Definition AMReX_VisMF.H:131
std::ifstream * pstr
Definition AMReX_VisMF.H:130
bool isOpen
Definition AMReX_VisMF.H:132
PersistentIFStream(PersistentIFStream const &)=delete
Definition AMReX_ccse-mpi.H:55