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
33class VisMF
34 : public VisMFBuffer
35{
36public:
49 explicit VisMF (std::string fafab_name);
50 ~VisMF () = default;
51 VisMF (const VisMF&) = delete;
52 VisMF (VisMF&&) = delete;
53 VisMF& operator= (const VisMF&) = delete;
54 VisMF& operator= (VisMF&&) = delete;
56 struct FabOnDisk
57 {
59 FabOnDisk () = default;
61 FabOnDisk (std::string name, Long offset);
63 std::string m_name;
65 };
67 struct Header
68 {
84 Header (const FabArray<FArrayBox>& mf, VisMF::How how, Version version = Version_v1,
85 bool calcMinMax = true, MPI_Comm = ParallelDescriptor::Communicator());
86
87 ~Header () = default;
88 Header (Header&& rhs) noexcept = default;
89 Header (Header const&) = delete;
90 Header& operator= (Header const&) = delete;
91 Header& operator= (Header &&) = delete;
92
95 int procToWrite = ParallelDescriptor::IOProcessorNumber(),
97 //
98 // The data.
99 //
106 //
107 // These are not defined if they are not in the header
108 //
114 };
115
118 {
119 int rankToRead{-1};
120 int faIndex{-1};
123
124 FabReadLink() = default;
125 FabReadLink(int ranktoread, int faindex, Long fileoffset, const Box &b);
126 };
127
143
149 static std::ifstream *OpenStream(const std::string &fileName);
150 static void CloseStream(const std::string &fileName, bool forceClose = false);
151 static void DeleteStream(const std::string &fileName);
152 static void CloseAllStreams();
153 static bool NoFabHeader(const VisMF::Header &hdr);
154
156 [[nodiscard]] int nComp () const;
158 [[nodiscard]] int nGrow () const;
159 [[nodiscard]] IntVect nGrowVect () const;
161 [[nodiscard]] int size () const;
163 [[nodiscard]] const BoxArray& boxArray () const;
165 [[nodiscard]] Real min (int fabIndex, int nComp) const;
167 [[nodiscard]] Real min (int nComp) const;
169 [[nodiscard]] Real max (int fabIndex, int nComp) const;
171 [[nodiscard]] Real max (int nComp) const;
172
178 [[nodiscard]] const FArrayBox& GetFab (int fabIndex, int compIndex) const;
180 void clear (int fabIndex, int compIndex);
182 void clear (int fabIndex);
184 void clear ();
192 static Long Write (const FabArray<FArrayBox> &mf,
193 const std::string& name,
194 VisMF::How how = NFiles,
195 bool set_ghost = false);
196
197 static void AsyncWrite (const FabArray<FArrayBox>& mf, const std::string& mf_name,
198 bool valid_cells_only = false);
199 static void AsyncWrite (FabArray<FArrayBox>&& mf, const std::string& mf_name,
200 bool valid_cells_only = false);
201
209 static Long WriteOnlyHeader (const FabArray<FArrayBox> & mf,
210 const std::string & mf_name,
211 VisMF::How how = NFiles);
213 static void RemoveFiles(const std::string &name, bool verbose = false);
214
224 static void Read (FabArray<FArrayBox> &mf,
225 const std::string &name,
226 const char *faHeader = nullptr,
227 int coordinatorProc = ParallelDescriptor::IOProcessorNumber(),
228 int allow_empty_mf = 0);
229
231 static bool Exist (const std::string &name);
232
234 static void ReadFAHeader (const std::string &fafabName,
235 Vector<char> &header);
236
238 static bool Check (const std::string &name);
240 static Long FileOffset (std::ostream& os);
242 FArrayBox* readFAB (int idx, const std::string& mf_name);
244 FArrayBox* readFAB (int idx, int icomp);
245
246 static int GetNOutFiles ();
247 static void SetNOutFiles (int noutfiles, MPI_Comm comm = ParallelDescriptor::Communicator());
248
249 static int GetMFFileInStreams () { return nMFFileInStreams; }
250 static void SetMFFileInStreams (int nstreams, MPI_Comm comm = ParallelDescriptor::Communicator());
251
252 static int GetVerbose () { return verbose; }
253 static void SetVerbose (int v) { verbose = v; }
254
257 { currentVersion = version; }
258
259 static bool GetGroupSets () { return groupSets; }
260 static void SetGroupSets (bool groupsets) { groupSets = groupsets; }
261
262 static bool GetSetBuf () { return setBuf; }
263 static void SetSetBuf (bool setbuf) { setBuf = setbuf; }
264
265 static bool GetUseSingleRead () { return useSingleRead; }
266 static void SetUseSingleRead (bool usesingleread) { useSingleRead = usesingleread; }
267
268 static bool GetUseSingleWrite () { return useSingleWrite; }
269 static void SetUseSingleWrite (bool usesinglewrite) { useSingleWrite = usesinglewrite; }
270
271 static bool GetCheckFilePositions () { return checkFilePositions; }
272 static void SetCheckFilePositions (bool cfp) { checkFilePositions = cfp; }
273
275 static void SetUsePersistentIFStreams (bool usepifs) { usePersistentIFStreams = usepifs; }
276
278 static void SetUseSynchronousReads (bool usepsr) { useSynchronousReads = usepsr; }
279
281 static void SetUseDynamicSetSelection (bool usedss) { useDynamicSetSelection = usedss; }
282
283 static bool GetNoFlushAfterWrite () { return noFlushAfterWrite; }
284 static void SetNoFlushAfterWrite (bool nfaw) { noFlushAfterWrite = nfaw; }
285
286 static bool GetBarrierAfterLevel () { return barrierAfterLevel; }
287 static void SetBarrierAfterLevel (bool bal) { barrierAfterLevel = bal; }
288
289 static std::string DirName (const std::string& filename);
290 static std::string BaseName (const std::string& filename);
291
292 static void Initialize ();
293 static void Finalize ();
294
295private:
296 static FabOnDisk Write (const FArrayBox& fab,
297 const std::string& filename,
298 std::ostream& os,
299 Long& bytes);
300
301 static Long WriteHeaderDoit (const std::string &mf_name,
302 VisMF::Header const &hdr);
303
304 static Long WriteHeader (const std::string &mf_name,
305 VisMF::Header &hdr,
306 int procToWrite = ParallelDescriptor::IOProcessorNumber(),
308
310 static void FindOffsets (const FabArray<FArrayBox> &mf,
311 const std::string &filePrefix,
312 VisMF::Header &hdr,
313 VisMF::Header::Version whichVersion,
314 NFilesIter &nfi,
323 static FArrayBox *readFAB (int idx,
324 const std::string &mf_name,
325 const Header &hdr,
326 int whichComp = -1);
328 static void readFAB (FabArray<FArrayBox> &mf,
329 int idx,
330 const std::string &mf_name,
331 const Header& hdr);
332
333 static void AsyncWriteDoit (const FabArray<FArrayBox>& mf, const std::string& mf_name,
334 bool is_rvalue, bool valid_cells_only);
335
337 std::string m_fafabname;
347 static AMREX_EXPORT std::map<std::string, VisMF::PersistentIFStream> persistentIFStreams;
351
355 static AMREX_EXPORT bool setBuf;
365};
366
368std::ostream& operator<< (std::ostream& os, const VisMF::FabOnDisk& fod);
370std::istream& operator>> (std::istream& is, VisMF::FabOnDisk& fod);
372std::ostream& operator<< (std::ostream& os, const Vector<VisMF::FabOnDisk>& fa);
374std::istream& operator>> (std::istream& is, Vector<VisMF::FabOnDisk>& fa);
376std::ostream& operator<< (std::ostream& os, const VisMF::Header& hd);
378std::istream& operator>> (std::istream& is, VisMF::Header& hd);
379
389template <typename FAB>
390// This function does work for MultiFab, but let's disable it to avoid confusion.
391std::enable_if_t<std::is_same_v<FAB,IArrayBox>>
392Write (const FabArray<FAB>& fa, const std::string& name)
393{
394 BL_PROFILE("Write(FabArray)");
395 AMREX_ASSERT(name.back() != '/');
396
397 auto data_descriptor = FAB::getDataDescriptor();
398 int data_bytes = data_descriptor->numBytes();
399
400 bool useSparseFPP = false;
401 const Vector<int> &pmap = fa.DistributionMap().ProcessorMap();
402 std::set<int> procsWithData;
403 Vector<int> procsWithDataVector;
404 for(int i : pmap) {
405 procsWithData.insert(i);
406 }
407 const int nOutFiles = VisMF::GetNOutFiles();
408 if (static_cast<int>(procsWithData.size()) < nOutFiles) {
409 useSparseFPP = true;
410 for (auto i : procsWithData) {
411 procsWithDataVector.push_back(i);
412 }
413 }
414
415 std::string filePrefix = name + "_D_";
416
417 NFilesIter nfi(nOutFiles, filePrefix, VisMF::GetGroupSets(), VisMF::GetSetBuf());
418
419 if (useSparseFPP) {
420 nfi.SetSparseFPP(procsWithDataVector);
421 } else {
422 nfi.SetDynamic();
423 }
424
425 const auto &fio = FAB::getFABio();
426
427 for ( ; nfi.ReadyToWrite(); ++nfi) {
428 for(MFIter mfi(fa); mfi.isValid(); ++mfi) {
429 const FAB &fab = fa[mfi];
430 {
431 std::stringstream hss;
432 fio.write_header(hss, fab, fab.nComp());
433 auto hLength = static_cast<std::streamoff>(hss.tellp());
434 auto tstr = hss.str();
435 nfi.Stream().write(tstr.c_str(), hLength);
436 nfi.Stream().flush();
437 }
438 auto const* fabdata = fab.dataPtr();
439#ifdef AMREX_USE_GPU
440 std::unique_ptr<FAB> hostfab;
441 if (fab.arena()->isManaged() || fab.arena()->isDevice()) {
442 hostfab = std::make_unique<FAB>(fab.box(), fab.nComp(), The_Pinned_Arena());
443 Gpu::dtoh_memcpy_async(hostfab->dataPtr(), fab.dataPtr(),
444 fab.size()*sizeof(typename FAB::value_type));
446 fabdata = hostfab->dataPtr();
447 }
448#endif
449 Long writeDataItems = fab.box().numPts() * fa.nComp();
450 Long writeDataSize = writeDataItems * data_bytes;
451 nfi.Stream().write((char *) fabdata, writeDataSize);
452 nfi.Stream().flush();
453 }
454 }
455
456 int coordinatorProc = ParallelDescriptor::IOProcessorNumber();
457 if (nfi.GetDynamic()) {
458 coordinatorProc = nfi.CoordinatorProc();
459 }
460
461 if (ParallelDescriptor::MyProc() == coordinatorProc) {
462 std::string header_file_name = name + "_H";
464 std::ofstream ofs;
465 ofs.rdbuf()->pubsetbuf(io_buffer.dataPtr(), io_buffer.size());
466 ofs.open(header_file_name.c_str(), std::ios::out | std::ios::trunc);
467 if (!ofs.good()) {
468 amrex::FileOpenFailed(header_file_name);
469 }
470
471 ofs << "amrex::FabArray<" << FAB::getClassName() << "> v1.0\n";
472 ofs << fa.nComp() << '\n';
473 ofs << fa.nGrowVect() << '\n';
474 fa.boxArray().writeOn(ofs);
475 ofs << '\n';
476
477 const DistributionMapping& dm = fa.DistributionMap();
478 int nfabs = fa.boxArray().size();
479 int nFiles = NFilesIter::ActualNFiles(nOutFiles);
480 int nprocs = ParallelDescriptor::NProcs();
481
482 Vector<Long> fabBytes(nfabs, 0);
483 std::map<int, Vector<int> > rankBoxOrder;
484 for (int i = 0; i < nfabs; ++i) {
485 std::stringstream hss;
486 FAB tmp(fa.fabbox(i), fa.nComp(), false);
487 fio.write_header(hss, tmp, tmp.nComp());
488 // Size includes header and data
489 fabBytes[i] = static_cast<std::streamoff>(hss.tellp()) + tmp.size() * data_bytes;
490 rankBoxOrder[dm[i]].push_back(i);
491 }
492
493 Vector<int> fileNumbers;
494 if (nfi.GetDynamic()) {
495 fileNumbers = nfi.FileNumbersWritten();
496 } else if (nfi.GetSparseFPP()) {
497 // if sparse, write to (file number = rank)
498 fileNumbers.resize(nprocs);
499 std::iota(fileNumbers.begin(), fileNumbers.end(), 0);
500 } else {
501 fileNumbers.resize(nprocs);
502 for (int i = 0; i < nprocs; ++i) {
503 fileNumbers[i] = NFilesIter::FileNumber(nFiles, i, VisMF::GetGroupSets());
504 }
505 }
506
507 Vector<VisMF::FabOnDisk> fod(nfabs);
508
509 const Vector< Vector<int> > &fileNumbersWriteOrder = nfi.FileNumbersWriteOrder();
510 for (auto const& rv : fileNumbersWriteOrder) {
511 Long currentOffset = 0;
512 for (auto rank : rv) {
513 auto rbo_it = rankBoxOrder.find(rank);
514 if (rbo_it != rankBoxOrder.end()) {
515 Vector<int> const& index = rbo_it->second;
516 int whichFileNumber = fileNumbers[rank];
517 std::string const& whichFileName =
518 VisMF::BaseName(NFilesIter::FileName(whichFileNumber, filePrefix));
519 for (int i : index) {
520 fod[i].m_name = whichFileName;
521 fod[i].m_head = currentOffset;
522 currentOffset += fabBytes[i];
523 }
524 }
525 }
526 }
527 ofs << fod;
528 }
529}
530
532namespace detail {
533template <typename FAB>
534void read_fab (FAB& fab, VisMF::FabOnDisk const& fod, std::string const& name)
535{
536 std::string fullname = VisMF::DirName(name);
537 fullname += fod.m_name;
538 VisMFBuffer::IO_Buffer io_buffer(VisMFBuffer::GetIOBufferSize());
539 std::ifstream ifs;
540 ifs.rdbuf()->pubsetbuf(io_buffer.dataPtr(), io_buffer.size());
541 ifs.open(fullname.c_str(), std::ios::in | std::ios::binary);
542 if (!ifs.good()) {
543 amrex::FileOpenFailed(fullname);
544 }
545 ifs.seekg(fod.m_head, std::ios::beg);
546 fab.readFrom(ifs);
547}
548}
550
568template <typename FAB>
569// This function does work for MultiFab, but let's disable it to avoid confusion.
570std::enable_if_t<std::is_same_v<FAB,IArrayBox>>
571Read (FabArray<FAB>& fa, const std::string& name)
572{
573 BL_PROFILE("Read(FabArray)");
574 AMREX_ASSERT(name.back() != '/');
575
576 BoxArray ba;
577 int ncomp;
578 IntVect ngrow;
580 {
581 std::string header_file_name = name + "_H";
582 Vector<char> header_file_chars;
583 ParallelDescriptor::ReadAndBcastFile(header_file_name, header_file_chars);
584 std::string header_file_string(header_file_chars.data());
585 std::stringstream ifs(header_file_string, std::istringstream::in);
586
587 std::string type, version;
588 ifs >> type >> version;
589 AMREX_ASSERT(type == "amrex::FabArray<amrex::IArrayBox>" ||
590 type == "amrex::FabArray<amrex::FArrayBox>");
591 ifs >> ncomp;
592 ifs >> ngrow;
593 ba.readFrom(ifs);
594 ifs >> fod;
595 }
596
597 if (fa.empty()) {
598 fa.define(ba, DistributionMapping{ba}, ncomp, ngrow);
599 } else {
601 }
602
603#ifdef AMREX_USE_MPI
604 const int nopensperfile = VisMF::GetMFFileInStreams(); // # of concurrent readers per file
605 const int myproc = ParallelDescriptor::MyProc();
606 const int coordproc = ParallelDescriptor::IOProcessorNumber();
607
608 int nreqs = 0;
609 int allreadsindex = 0;
610 std::map<std::string, int> filenames; // <filename, allreadsindex>
611
612 const int nboxes = fa.size();
613 const auto& dm = fa.DistributionMap();
614 for (int i = 0; i < nboxes; ++i) {
615 if (myproc == dm[i]) {
616 ++nreqs;
617 }
618 if (myproc == coordproc) {
619 std::string const& fname = fod[i].m_name;
620 auto r =filenames.insert(std::make_pair(fname, allreadsindex));
621 if (r.second) {
622 ++allreadsindex;
623 }
624 }
625 }
626
627 const int readtag = ParallelDescriptor::SeqNum();
628 const int donetag = ParallelDescriptor::SeqNum();
629
630 if (myproc == coordproc) {
631 std::multiset<int> availablefiles; // [whichFile] supports multiple reads/file
632 Vector<std::map<int,std::map<Long,int> > > allreads; // [file]<proc,<seek,index>>
633
634 const auto nfiles = static_cast<int>(filenames.size());
635 for (int i = 0; i < nfiles; ++i) {
636 for (int j = 0; j < nopensperfile; ++j) {
637 availablefiles.insert(i);
638 }
639 }
640 allreads.resize(nfiles);
641 for (int i = 0; i < nboxes; ++i) {
642 const auto whichproc = dm[i];
643 const auto iseekpos = fod[i].m_head;
644 std::string const& fname = fod[i].m_name;
645 auto filenamesiter = filenames.find(fname);
646 if (filenamesiter != filenames.end()) {
647 const int fi = filenamesiter->second;
648 allreads[fi][whichproc].insert(std::make_pair(iseekpos,i));
649 } else {
650 amrex::Error("Error in amrex::Read: filename not found "+fname);
651 }
652 }
653
654 int totalioreqs = nboxes;
655 int reqspending = 0;
656 int iopfileindex;
657 std::deque<int> iopreads;
658 std::set<int> busyprocs;
659 while (totalioreqs > 0) {
660 auto afilesiter = availablefiles.begin();
661 while (afilesiter != availablefiles.end()) {
662 const int fi = *afilesiter;
663 if (allreads[fi].empty()) {
664 availablefiles.erase(fi);
665 afilesiter = availablefiles.begin();
666 continue;
667 }
668 auto whichread = allreads[fi].begin();
669 for ( ; whichread != allreads[fi].end(); ++whichread) {
670 const int tryproc = whichread->first;
671 if (busyprocs.find(tryproc) == busyprocs.end()) { // not busy
672 busyprocs.insert(tryproc);
673 Vector<int> vreads;
674 vreads.reserve(whichread->second.size());
675 for (auto const& kv : whichread->second) {
676 vreads.push_back(kv.second);
677 }
678 if (tryproc == coordproc) {
679 iopfileindex = fi;
680 for (auto x : vreads) {
681 iopreads.push_back(x);
682 }
683 } else {
684 ParallelDescriptor::Send(vreads, tryproc, readtag);
685 ++reqspending;
686 }
687 availablefiles.erase(afilesiter);
688 afilesiter = availablefiles.begin();
689 break;
690 }
691 }
692 if (whichread == allreads[fi].end()) {
693 ++afilesiter;
694 } else {
695 allreads[fi].erase(whichread);
696 }
697 }
698
699 while (!iopreads.empty()) {
700 int i = iopreads.front();
701 detail::read_fab(fa[i], fod[i], name);
702 --totalioreqs;
703 iopreads.pop_front();
704 if (iopreads.empty()) {
705 availablefiles.insert(iopfileindex);
706 busyprocs.erase(coordproc);
707 }
708 int doneflag;
709 MPI_Status status;
710 ParallelDescriptor::IProbe(MPI_ANY_SOURCE, donetag, doneflag, status);
711 if (doneflag) {
712 break;
713 }
714 }
715
716 if (reqspending > 0) {
717 Vector<int> idone(2);
718 ParallelDescriptor::Message rmess = ParallelDescriptor::Recv(idone, MPI_ANY_SOURCE,
719 donetag);
720 const int i = idone[0];
721 const int procdone = rmess.pid();
722 totalioreqs -= idone[1];
723 --reqspending;
724 busyprocs.erase(procdone);
725 std::string const& fname = fod[i].m_name;
726 const int fi = filenames.find(fname)->second;
727 availablefiles.insert(fi);
728 }
729 }
730 } else {
731 Vector<int> recreads(nreqs, -1);
732 Vector<int> idone(2);
733 while (nreqs > 0) {
734 ParallelDescriptor::Message rmess = ParallelDescriptor::Recv(recreads, coordproc,
735 readtag);
736 const auto nrmess = static_cast<int>(rmess.count());
737 for (int ir = 0; ir < nrmess; ++ir) {
738 int i = recreads[ir];
739 detail::read_fab(fa[i], fod[i], name);
740 }
741 nreqs -= nrmess;
742 idone[0] = recreads[0];
743 idone[1] = nrmess;
744 ParallelDescriptor::Send(idone, coordproc, donetag);
745 }
746 }
747#else
748 for (MFIter mfi(fa); mfi.isValid(); ++mfi) {
749 detail::read_fab(fa[mfi], fod[mfi.index()], name);
750 }
751#endif
752}
753
754}
755
756#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:567
std::ostream & writeOn(std::ostream &) const
Output this BoxArray to a checkpoint file.
Definition AMReX_BoxArray.cpp:482
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:468
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:614
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
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:231
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:347
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:2171
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:63
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:147
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:35
static bool useSingleWrite
Definition AMReX_VisMF.H:357
IntVect nGrowVect() const
Definition AMReX_VisMF.cpp:495
static bool setBuf
Definition AMReX_VisMF.H:355
static bool useSynchronousReads
Definition AMReX_VisMF.H:360
static void SetGroupSets(bool groupsets)
Definition AMReX_VisMF.H:260
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:363
static void SetNOutFiles(int noutfiles, MPI_Comm comm=ParallelDescriptor::Communicator())
Definition AMReX_VisMF.cpp:156
static bool checkFilePositions
Definition AMReX_VisMF.H:358
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:280
static bool GetSetBuf()
Definition AMReX_VisMF.H:262
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:269
static void SetHeaderVersion(VisMF::Header::Version version)
Definition AMReX_VisMF.H:256
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:337
static void CloseAllStreams()
Definition AMReX_VisMF.cpp:2308
static bool barrierAfterLevel
Definition AMReX_VisMF.H:364
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:352
static int GetVerbose()
Definition AMReX_VisMF.H:252
static Long WriteHeaderDoit(const std::string &mf_name, VisMF::Header const &hdr)
Definition AMReX_VisMF.cpp:922
static bool groupSets
Definition AMReX_VisMF.H:354
static void SetNoFlushAfterWrite(bool nfaw)
Definition AMReX_VisMF.H:284
static VisMF::Header::Version GetHeaderVersion()
Definition AMReX_VisMF.H:255
static void SetCheckFilePositions(bool cfp)
Definition AMReX_VisMF.H:272
static void SetUseSingleRead(bool usesingleread)
Definition AMReX_VisMF.H:266
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:271
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:341
static bool useSingleRead
Definition AMReX_VisMF.H:356
static bool GetUseSynchronousReads()
Definition AMReX_VisMF.H:277
static int GetMFFileInStreams()
Definition AMReX_VisMF.H:249
static int GetNOutFiles()
Definition AMReX_VisMF.cpp:168
static bool GetNoFlushAfterWrite()
Definition AMReX_VisMF.H:283
static VisMF::Header::Version currentVersion
Definition AMReX_VisMF.H:353
static bool usePersistentIFStreams
Definition AMReX_VisMF.H:359
static bool GetGroupSets()
Definition AMReX_VisMF.H:259
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:339
static bool useDynamicSetSelection
Definition AMReX_VisMF.H:361
static bool GetUsePersistentIFStreams()
Definition AMReX_VisMF.H:274
static void SetUseSynchronousReads(bool usepsr)
Definition AMReX_VisMF.H:278
static void SetVerbose(int v)
Definition AMReX_VisMF.H:253
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:42
@ NFiles
Definition AMReX_VisMF.H:42
@ OneFilePerCPU
Definition AMReX_VisMF.H:42
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:287
static bool Exist(const std::string &name)
Does FabArray exist?
Definition AMReX_VisMF.cpp:2088
static bool GetBarrierAfterLevel()
Definition AMReX_VisMF.H:286
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:350
static void Initialize()
Definition AMReX_VisMF.cpp:109
static bool GetUseSingleRead()
Definition AMReX_VisMF.H:265
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:347
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:362
static int nOutFiles
The number of files to write for a FabArray<FArrayBox>.
Definition AMReX_VisMF.H:349
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:275
static void SetUseDynamicSetSelection(bool usedss)
Definition AMReX_VisMF.H:281
static bool GetUseSingleWrite()
Definition AMReX_VisMF.H:268
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:263
static bool NoFabHeader(const VisMF::Header &hdr)
Definition AMReX_VisMF.cpp:2236
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
amrex_long Long
Definition AMReX_INT.H:30
int MyProc() noexcept
Definition AMReX_ParallelDescriptor.H:126
void ReadAndBcastFile(const std::string &filename, Vector< char > &charBuf, bool bExitOnError, const MPI_Comm &comm)
Definition AMReX_ParallelDescriptor.cpp:1491
int NProcs() noexcept
Definition AMReX_ParallelDescriptor.H:246
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:315
MPI_Comm Communicator() noexcept
Definition AMReX_ParallelDescriptor.H:212
Message Send(const T *buf, size_t n, int dst_pid, int tag)
Definition AMReX_ParallelDescriptor.H:1185
int SeqNum() noexcept
Returns sequential message sequence numbers, usually used as tags for send/recv.
Definition AMReX_ParallelDescriptor.H:688
void IProbe(int, int, int &, MPI_Status &)
Definition AMReX_ParallelDescriptor.cpp:1218
int IOProcessorNumber() noexcept
Definition AMReX_ParallelDescriptor.H:271
Message Recv(T *, size_t n, int pid, int tag)
Definition AMReX_ParallelDescriptor.H:1227
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:392
bool match(const BoxArray &x, const BoxArray &y)
Note that two BoxArrays that match are not necessarily equal.
Definition AMReX_BoxArray.cpp:1927
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:823
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:571
std::istream & operator>>(std::istream &is, BoxND< dim > &bx)
Read from istream.
Definition AMReX_Box.H:1825
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2015
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1236
A structure containing info regarding an on-disk FAB.
Definition AMReX_VisMF.H:57
Long m_head
Offset to start of FAB in file.
Definition AMReX_VisMF.H:64
std::string m_name
The two data values in a FabOnDisk structure.
Definition AMReX_VisMF.H:63
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:68
Header & operator=(Header const &)=delete
Vector< Vector< Real > > m_min
The min()s of each component of FABs. [findex][comp].
Definition AMReX_VisMF.H:109
Header(Header const &)=delete
Vector< Real > m_famax
The max()s of each component of the FabArray. [comp].
Definition AMReX_VisMF.H:112
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:70
@ NoFabHeader_v1
-— no fab headers, no fab mins or maxes
Definition AMReX_VisMF.H:75
@ NoFabHeaderMinMax_v1
Definition AMReX_VisMF.H:76
@ Undefined_v1
-— undefined
Definition AMReX_VisMF.H:71
@ Version_v1
Definition AMReX_VisMF.H:72
@ NoFabHeaderFAMinMax_v1
Definition AMReX_VisMF.H:78
int m_vers
The version of the Header.
Definition AMReX_VisMF.H:100
BoxArray m_ba
The BoxArray of the MF.
Definition AMReX_VisMF.H:104
Vector< Vector< Real > > m_max
The max()s of each component of FABs. [findex][comp].
Definition AMReX_VisMF.H:110
Header()
The default constructor.
How m_how
How the MF was written to disk.
Definition AMReX_VisMF.H:101
Header(Header &&rhs) noexcept=default
Vector< FabOnDisk > m_fod
FabOnDisk info for contained FABs.
Definition AMReX_VisMF.H:105
int m_ncomp
Number of components in MF.
Definition AMReX_VisMF.H:102
RealDescriptor m_writtenRD
Definition AMReX_VisMF.H:113
IntVect m_ngrow
The number of ghost cells in MF.
Definition AMReX_VisMF.H:103
Vector< Real > m_famin
The min()s of each component of the FabArray. [comp].
Definition AMReX_VisMF.H:111
This structure is used to store file ifstreams that remain open.
Definition AMReX_VisMF.H:130
~PersistentIFStream()
Definition AMReX_VisMF.cpp:2247
VisMF::IO_Buffer ioBuffer
Definition AMReX_VisMF.H:134
PersistentIFStream(PersistentIFStream &&)=delete
PersistentIFStream & operator=(PersistentIFStream const &)=delete
std::streampos currentPosition
Definition AMReX_VisMF.H:132
std::ifstream * pstr
Definition AMReX_VisMF.H:131
bool isOpen
Definition AMReX_VisMF.H:133
PersistentIFStream(PersistentIFStream const &)=delete
Definition AMReX_ccse-mpi.H:55