102 const Real* dx = geom.CellSize();
103 const Real* problo = geom.ProbLo();
105 MultiFab mf_ba(ba, dmap, 1, 0, MFInfo(), *ebf);
107 for (MFIter mfi(mf_ba); mfi.isValid(); ++mfi) {
109 const auto & sfab =
static_cast<EBFArrayBox
const &
>(mf_ba[mfi]);
110 const auto & my_flag = sfab.getEBCellFlagFab();
111 const auto * my_flag_ptr = &my_flag;
113 const Box & bx = mfi.validbox();
115 if (my_flag.getType(bx) == FabType::covered ||
116 my_flag.getType(bx) == FabType::regular) {
continue; }
118 std::array<const CutFab *, AMREX_SPACEDIM> areafrac;
119 const CutFab * bndrycent;
121 for (
int d = 0; d < AMREX_SPACEDIM; ++d) {
122 areafrac[d] = &(*ebf->getAreaFrac()[d])[mfi];
124 bndrycent = &(ebf->getBndryCent()[mfi]);
127 std::unique_ptr<EBCellFlagFab> host_flag;
128 if (my_flag.arena()->isManaged() || my_flag.arena()->isDevice()) {
129 host_flag = std::make_unique<EBCellFlagFab>(my_flag.box(), my_flag.nComp(),
131 Gpu::dtoh_memcpy_async(host_flag->dataPtr(), my_flag.dataPtr(),
132 host_flag->nBytes());
133 Gpu::streamSynchronize();
134 my_flag_ptr = host_flag.get();
137 std::array<std::unique_ptr<CutFab>, AMREX_SPACEDIM> areafrac_h;
138 for (
int d = 0; d < AMREX_SPACEDIM; ++d) {
139 if (areafrac[d]->arena()->isManaged() || areafrac[d]->arena()->isDevice()) {
140 areafrac_h[d] = std::make_unique<CutFab>(areafrac[d]->box(), areafrac[d]->nComp(),
142 Gpu::dtoh_memcpy_async(areafrac_h[d]->dataPtr(), areafrac[d]->dataPtr(),
143 areafrac[d]->size()*
sizeof(Real));
144 Gpu::streamSynchronize();
145 areafrac[d] = areafrac_h[d].get();
149 std::unique_ptr<CutFab> bndrycent_h;
150 if (bndrycent->arena()->isManaged() || bndrycent->arena()->isDevice()) {
151 bndrycent_h = std::make_unique<CutFab>(bndrycent->box(), bndrycent->nComp(),
153 Gpu::dtoh_memcpy_async(bndrycent_h->dataPtr(), bndrycent->dataPtr(),
154 bndrycent->size()*
sizeof(Real));
155 Gpu::streamSynchronize();
156 bndrycent = bndrycent_h.get();
160 eb_to_pvd.EBToPolygon(
162 bx, my_flag_ptr->const_array(),
163 bndrycent->const_array(),
164 areafrac[0]->const_array(),
165 areafrac[1]->const_array(),
166 areafrac[2]->const_array());
169 int cpu = ParallelDescriptor::MyProc();
170 int nProcs = ParallelDescriptor::NProcs();
172 eb_to_pvd.WriteEBVTP(cpu, level);
174 if(ParallelDescriptor::IOProcessor()) {
178 for (MFIter mfi(mf_ba); mfi.isValid(); ++mfi) {
180 const auto & sfab =
static_cast<EBFArrayBox
const &
>(mf_ba[mfi]);
181 const auto & my_flag = sfab.getEBCellFlagFab();
182 const auto * my_flag_ptr = &my_flag;
184 const Box & bx = mfi.validbox();
186 if (my_flag.getType(bx) == FabType::covered ||
187 my_flag.getType(bx) == FabType::regular) {
continue; }
190 std::unique_ptr<EBCellFlagFab> host_flag;
191 if (my_flag.arena()->isManaged() || my_flag.arena()->isDevice()) {
192 host_flag = std::make_unique<EBCellFlagFab>(my_flag.box(), my_flag.nComp(),
194 Gpu::dtoh_memcpy_async(host_flag->dataPtr(), my_flag.dataPtr(),
195 host_flag->nBytes());
196 Gpu::streamSynchronize();
197 my_flag_ptr = host_flag.get();
201 eb_to_pvd.EBGridCoverage(cpu, problo, dx, bx, my_flag_ptr->const_array());
static void WritePVTP(int nProcs)
Definition: ERF_EBToPVD.cpp:225