13#ifndef CD_EBAMRPARTICLEMESH_H
14#define CD_EBAMRPARTICLEMESH_H
22#include <RefCountedPtr.H>
25#include <DataIterator.H>
26#include <NeighborIterator.H>
31#include <EBLevelGrid.H>
33#include <IntVectSet.H>
34#include <BoxIterator.H>
47#include <CD_NamespaceHeader.H>
135 define(
const Vector<RefCountedPtr<EBLevelGrid>>& a_eblgs,
136 const Vector<int>& a_refRat,
137 const Vector<Real>& a_dx,
138 const RealVect& a_probLo,
140 const int a_finestLevel)
142 CH_TIME(
"EBAMRParticleMesh::define");
144 CH_assert(a_eblgs.size() > a_finestLevel);
145 CH_assert(a_refRat.size() > a_finestLevel);
146 CH_assert(a_dx.size() > a_finestLevel);
183 template <
auto... Members,
typename P,
typename Traits>
186 const EBAMRCellData& a_meshData,
188 const bool a_forceIrregNGP)
const
190 CH_TIME(
"EBAMRParticleMesh::interpolate");
195 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
196 const DataIterator& dit = dbl.dataIterator();
198 const int nbox = dit.size();
200#pragma omp parallel for schedule(runtime)
201 for (
int mybox = 0; mybox < nbox; mybox++) {
202 const DataIndex& din = dit[mybox];
204 const EBCellFAB& data = (*a_meshData[lvl])[din];
206 interp.template
interpolate<Members...>(a_particles[lvl][din], data, a_interpType, a_forceIrregNGP);
223 template <
typename P,
typename Traits>
226 const EBAMRCellData& a_meshData,
228 const bool a_forceIrregNGP)
const
230 CH_TIME(
"EBAMRParticleMesh::interpolateWeight");
235 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
236 const DataIterator& dit = dbl.dataIterator();
238 const int nbox = dit.size();
240#pragma omp parallel for schedule(runtime)
241 for (
int mybox = 0; mybox < nbox; mybox++) {
242 const DataIndex& din = dit[mybox];
244 const EBCellFAB& data = (*a_meshData[lvl])[din];
246 interp.
interpolateWeight(a_particles[lvl][din], data, a_interpType, a_forceIrregNGP);
270 template <
typename P,
typename Traits>
278 CH_TIME(
"EBAMRParticleMesh::depositWeight");
288 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
289 a_interp.
depositWeight(a_rho, a_soa, a_depositionType, a_widthScale, forceIrregNGP);
291 const auto patchNGP =
292 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
293 a_interp.
depositWeight(a_rho, a_soa, DepositionType::NGP, a_widthScale, forceIrregNGP);
296 switch (a_coarseFineDeposition) {
297 case CoarseFineDeposition::Interp: {
302 case CoarseFineDeposition::Halo: {
303 this->
template depositHaloCore<1>(a_meshData, a_particles, patch);
307 case CoarseFineDeposition::HaloNGP: {
308 this->
template depositHaloNGPCore<1>(a_meshData, a_particles, patch, patchNGP);
312 case CoarseFineDeposition::Transition: {
313 this->
template depositTransitionCore<1>(a_meshData, a_particles, a_depositionType, patch);
340 template <
typename P,
typename Traits,
typename CellGather>
347 CellGather a_cellGather)
349 CH_TIME(
"EBAMRParticleMesh::depositGathered");
357 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
364 [&](
const std::size_t a_i, Real* a_out) {
365 a_out[0] = a_cellGather(a_soa, a_i);
368 const auto patchNGP =
369 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
376 [&](
const std::size_t a_i, Real* a_out) {
377 a_out[0] = a_cellGather(a_soa, a_i);
381 switch (a_coarseFineDeposition) {
382 case CoarseFineDeposition::Interp: {
387 case CoarseFineDeposition::Halo: {
388 this->
template depositHaloCore<1>(a_meshData, a_particles, patch);
392 case CoarseFineDeposition::HaloNGP: {
393 this->
template depositHaloNGPCore<1>(a_meshData, a_particles, patch, patchNGP);
397 case CoarseFineDeposition::Transition: {
398 this->
template depositTransitionCore<1>(a_meshData, a_particles, a_depositionType, patch);
422 template <
auto... Members,
typename P,
typename Traits>
430 CH_TIME(
"EBAMRParticleMesh::deposit");
438 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
439 a_interp.template
deposit<Members...>(a_rho, a_soa, a_depositionType, a_widthScale, forceIrregNGP);
441 const auto patchNGP =
442 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
443 a_interp.template
deposit<Members...>(a_rho, a_soa, DepositionType::NGP, a_widthScale, forceIrregNGP);
446 switch (a_coarseFineDeposition) {
447 case CoarseFineDeposition::Interp: {
448 this->
depositInterpCore(a_meshData, a_particles,
static_cast<int>(
sizeof...(Members)), patch);
452 case CoarseFineDeposition::Halo: {
453 this->
template depositHaloCore<static_cast<int>(
sizeof...(Members))>(a_meshData, a_particles, patch);
457 case CoarseFineDeposition::HaloNGP: {
458 this->
template depositHaloNGPCore<static_cast<int>(
sizeof...(Members))>(a_meshData, a_particles, patch, patchNGP);
462 case CoarseFineDeposition::Transition: {
463 this->
template depositTransitionCore<static_cast<int>(
sizeof...(Members))>(a_meshData,
551 MayDay::Error(
"EBAMRParticleMesh: unsupported CoarseFineDeposition strategy");
560 CH_TIME(
"EBAMRParticleMesh::defineEBParticleMesh");
566 const ProblemDomain& domain =
m_eblgs[lvl]->getDomain();
567 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
568 const EBISLayout& ebisl =
m_eblgs[lvl]->getEBISL();
569 const DataIterator& dit = dbl.dataIterator();
571 m_ebParticleMesh[lvl] = RefCountedPtr<LayoutData<EBParticleMesh>>(
new LayoutData<EBParticleMesh>(dbl));
573 const int nbox = dit.size();
575#pragma omp parallel for schedule(runtime)
576 for (
int mybox = 0; mybox < nbox; mybox++) {
577 const DataIndex& din = dit[mybox];
585 const ProblemDomain& domainFiCo = eblgFiCo.getDomain();
586 const DisjointBoxLayout& dblFiCo = eblgFiCo.getDBL();
587 const EBISLayout& ebislFiCo = eblgFiCo.getEBISL();
588 const DataIterator& ditFiCo = dblFiCo.dataIterator();
589 const int nboxFiCo = ditFiCo.size();
591 m_ebParticleMeshFiCo[lvl] = RefCountedPtr<LayoutData<EBParticleMesh>>(
new LayoutData<EBParticleMesh>(dblFiCo));
593#pragma omp parallel for schedule(runtime)
594 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
595 const DataIndex& din = ditFiCo[mybox];
600 m_dx[lvl] * RealVect::Unit,
616 CH_TIME(
"EBAMRParticleMesh::defineLevelMotion");
620 const EBLevelGrid& eblg = *
m_eblgs[lvl];
621 const DisjointBoxLayout& dbl = eblg.getDBL();
634 CH_TIME(
"EBAMRParticleMesh::defineCoarseFineMotion");
644 m_coarseFinePM[lvl] = RefCountedPtr<EBCoarseFineParticleMesh>(
nullptr);
661 template <
typename Container,
typename PatchDeposit>
664 const Container& a_particles,
666 PatchDeposit a_patchDeposit)
const
668 CH_TIME(
"EBAMRParticleMesh::depositInterpCore");
671 CH_assert(a_meshData[0]->nComp() == a_numComp);
676 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
677 const bool hasCoar = (lvl > 0);
678 const DataIterator& dit = dbl.dataIterator();
681 const int nbox = dit.size();
683#pragma omp parallel for schedule(runtime)
684 for (
int mybox = 0; mybox < nbox; mybox++) {
685 const DataIndex& din = dit[mybox];
688 EBCellFAB& rho = (*a_meshData[lvl])[din];
690 a_patchDeposit(interp, rho, a_particles[lvl][din], 1.0);
698 for (
int comp = 0; comp < a_numComp; comp++) {
699 LevelData<EBCellFAB> coarAlias;
700 LevelData<EBCellFAB> fineAlias;
702 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
703 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
706 m_coarseFinePM[lvl]->addInvalidCoarseToFine(fineAlias, coarAlias);
722 CH_TIME(
"EBAMRParticleMesh::defineOuterHaloMasks");
724 constexpr int comp = 0;
725 constexpr int numComp = 1;
729 for (
int ighost = 1; ighost <=
m_ghost; ighost++) {
730 Vector<RefCountedPtr<LevelData<BaseFab<bool>>>> mask(1 +
m_finestLevel);
733 const DisjointBoxLayout& grids =
m_eblgs[lvl]->getDBL();
734 const DisjointBoxLayout& gridsFine =
m_eblgs[lvl + 1]->getDBL();
735 const ProblemDomain& domain =
m_eblgs[lvl]->getDomain();
737 DisjointBoxLayout gridsCoFi;
738 coarsen(gridsCoFi, gridsFine,
m_refRat[lvl]);
740 mask[lvl] = RefCountedPtr<LevelData<BaseFab<bool>>>(
741 new LevelData<BaseFab<bool>>(grids, numComp, IntVect::Zero));
743 LevelData<BaseFab<bool>>& levelMask = *mask[lvl];
745 const DataIterator& dit = grids.dataIterator();
747 const int nbox = dit.size();
749#pragma omp parallel for schedule(runtime)
750 for (
int mybox = 0; mybox < nbox; mybox++) {
751 const DataIndex& din = dit[mybox];
753 levelMask[din].setVal(
false);
760 const DataIterator& dit = gridsCoFi.dataIterator();
761 const int nbox = dit.size();
763#pragma omp parallel for schedule(runtime) reduction(+ : halo)
764 for (
int mybox = 0; mybox < nbox; mybox++) {
765 const DataIndex& din = dit[mybox];
766 const Box coFiBox = gridsCoFi[din];
767 const Box grownBox = grow(coFiBox, ighost) & domain;
768 IntVectSet myHalo(grownBox);
771 NeighborIterator nit(gridsCoFi);
772 for (nit.begin(din); nit.ok(); ++nit) {
773 myHalo -= gridsCoFi[nit()];
780 LevelData<FArrayBox> coFiMask(gridsCoFi, numComp, ighost * IntVect::Unit);
781 LevelData<FArrayBox> coarMask(grids, numComp, IntVect::Zero);
783 const DataIterator& dit = gridsFine.dataIterator();
784 const int nbox = dit.size();
786#pragma omp parallel for schedule(runtime)
787 for (
int mybox = 0; mybox < nbox; mybox++) {
788 const DataIndex& din = dit[mybox];
790 coFiMask[din].setVal(0.0);
794 const DataIterator& dit = grids.dataIterator();
795 const int nbox = dit.size();
797#pragma omp parallel for schedule(runtime)
798 for (
int mybox = 0; mybox < nbox; mybox++) {
799 const DataIndex& din = dit[mybox];
801 coarMask[din].setVal(0.0);
805 const DataIterator& dit = gridsFine.dataIterator();
806 const int nbox = dit.size();
808#pragma omp parallel for schedule(runtime)
809 for (
int mybox = 0; mybox < nbox; mybox++) {
810 const DataIndex& din = dit[mybox];
811 const Box region = coFiMask[din].box();
812 const IntVectSet curHalo = halo & region;
814 for (IVSIterator ivsit(curHalo); ivsit.ok(); ++ivsit) {
815 coFiMask[din](ivsit(), comp) = 1.0;
821 copier.ghostDefine(gridsCoFi, grids, domain, ighost * IntVect::Unit);
822 coFiMask.copyTo(Interval(comp, comp), coarMask, Interval(comp, comp), copier, LDaddOp<FArrayBox>());
825 const DataIterator& dit = grids.dataIterator();
826 const int nbox = dit.size();
828#pragma omp parallel for schedule(runtime)
829 for (
int mybox = 0; mybox < nbox; mybox++) {
830 const DataIndex& din = dit[mybox];
831 const Box box = grids[din];
832 const FArrayBox& realMask = coarMask[din];
834 BaseFab<bool>& boolMask = levelMask[din];
836 bool emptyMask =
true;
837 for (BoxIterator bit(box); bit.ok(); ++bit) {
838 if (realMask(bit(), comp) > 0.0) {
839 boolMask(bit(), comp) =
true;
849 mask[
m_finestLevel] = RefCountedPtr<LevelData<BaseFab<bool>>>(
nullptr);
867 template <
int NCOMP,
typename Container,
typename PatchDeposit>
869 depositHaloCore(EBAMRCellData& a_meshData,
const Container& a_particles, PatchDeposit a_patchDeposit)
const
871 CH_TIME(
"EBAMRParticleMesh::depositHaloCore");
874 CH_assert(a_meshData[0]->nComp() == NCOMP);
879 constexpr int coarseMaskWidth = 1;
880 Container& particles =
const_cast<Container&
>(a_particles);
884 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
885 const bool hasCoar = (lvl > 0);
888 const DataIterator& dit = dbl.dataIterator();
889 const int nbox = dit.size();
891#pragma omp parallel for schedule(runtime)
892 for (
int mybox = 0; mybox < nbox; mybox++) {
893 const DataIndex& din = dit[mybox];
896 EBCellFAB& rho = (*a_meshData[lvl])[din];
898 a_patchDeposit(interp, rho, a_particles[lvl][din], 1.0);
906 m_coarseFinePM[lvl]->addFineGhostsToCoarse(*a_meshData[lvl - 1], *a_meshData[lvl]);
911 const auto& coarHalo = a_particles.getMaskParticles()[lvl - 1];
912 const Real widthScale =
static_cast<Real
>(
m_refRat[lvl - 1]);
914 const DisjointBoxLayout& dblFiCo = eblgFiCo.getDBL();
916 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl]->template getBufferFiCo<NCOMP>();
918 const DataIterator& ditFiCo = dblFiCo.dataIterator();
920 const int nboxFiCo = ditFiCo.size();
921#pragma omp parallel for schedule(runtime)
922 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
923 const DataIndex& din = ditFiCo[mybox];
926 EBCellFAB& dataFiCo = bufferFiCo[din];
928 dataFiCo.setVal(0.0);
929 a_patchDeposit(interp, dataFiCo, (*coarHalo)[din], widthScale);
932 for (
int comp = 0; comp < NCOMP; comp++) {
933 LevelData<EBCellFAB> meshAlias;
934 LevelData<EBCellFAB> bufAlias;
936 aliasLevelData<EBCellFAB>(meshAlias, &(*a_meshData[lvl]), Interval(comp, comp));
937 aliasLevelData<EBCellFAB>(bufAlias, &bufferFiCo, Interval(comp, comp));
944 particles.clearMaskParticles();
963 template <
int NCOMP,
typename Container,
typename PatchDeposit,
typename PatchDepositNGP>
966 const Container& a_particles,
967 PatchDeposit a_patch,
968 PatchDepositNGP a_patchNGP)
const
970 CH_TIME(
"EBAMRParticleMesh::depositHaloNGPCore");
973 CH_assert(a_meshData[0]->nComp() == NCOMP);
978 constexpr int coarseMaskWidth = 1;
979 Container& particles =
const_cast<Container&
>(a_particles);
984 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
985 const bool hasCoar = (lvl > 0);
988 const DataIterator& dit = dbl.dataIterator();
989 const int nbox = dit.size();
991#pragma omp parallel for schedule(runtime)
992 for (
int mybox = 0; mybox < nbox; mybox++) {
993 const DataIndex& din = dit[mybox];
996 EBCellFAB& rho = (*a_meshData[lvl])[din];
998 a_patch(interp, rho, a_particles[lvl][din], 1.0);
999 a_patchNGP(interp, rho, (*a_particles.getMaskParticles()[lvl])[din], 1.0);
1007 for (
int comp = 0; comp < NCOMP; comp++) {
1008 LevelData<EBCellFAB> coarAlias;
1009 LevelData<EBCellFAB> fineAlias;
1011 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
1012 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
1014 m_coarseFinePM[lvl]->addFineGhostsToCoarse(coarAlias, fineAlias);
1020 particles.transferParticles(particles.getMaskParticles());
1033 if (a_depositionType == DepositionType::CIC) {
1034 maskWidth = a_refRat / 2;
1036 else if (a_depositionType == DepositionType::TSC) {
1037 maskWidth = a_refRat;
1040 MayDay::Abort(
"EBAMRParticleMesh::getTransitionMaskWidth - logic bust");
1043 MayDay::Abort(
"EBAMRParticleMesh::getTransitionMaskWidth - not enough ghost cells");
1058 CH_TIME(
"EBAMRParticleMesh::defineTransitionMasks");
1060 constexpr int comp = 0;
1061 constexpr int numComp = 1;
1062 const Interval interv = Interval(comp, comp);
1066 for (
int ighost = 1; ighost <=
m_ghost; ighost++) {
1067 Vector<RefCountedPtr<LevelData<BaseFab<bool>>>> mask(1 +
m_finestLevel);
1070 const DisjointBoxLayout& gridsFine =
m_eblgs[lvl + 1]->getDBL();
1071 const EBLevelGrid& eblgFiCo =
m_coarseFinePM[lvl + 1]->getEblgFiCo();
1072 const DisjointBoxLayout& gridsFiCo = eblgFiCo.getDBL();
1073 const ProblemDomain& domainFine =
m_eblgs[lvl + 1]->getDomain();
1075 mask[lvl] = RefCountedPtr<LevelData<BaseFab<bool>>>(
1076 new LevelData<BaseFab<bool>>(gridsFiCo, numComp, IntVect::Zero));
1078 LevelData<BaseFab<bool>>& levelMask = *mask[lvl];
1079 LevelData<FArrayBox> cfivsFine(gridsFine, numComp, ighost * IntVect::Unit);
1080 LevelData<FArrayBox> cfivsFiCo(gridsFiCo, numComp, IntVect::Zero);
1083 const DataIterator& dit = gridsFiCo.dataIterator();
1084 const int nbox = dit.size();
1086#pragma omp parallel for schedule(runtime)
1087 for (
int mybox = 0; mybox < nbox; mybox++) {
1088 const DataIndex& din = dit[mybox];
1090 levelMask[din].setVal(
false);
1091 cfivsFiCo[din].setVal(0.0);
1097 const DataIterator& dit = gridsFine.dataIterator();
1098 const int nbox = dit.size();
1100#pragma omp parallel for schedule(runtime)
1101 for (
int mybox = 0; mybox < nbox; mybox++) {
1102 const DataIndex& din = dit[mybox];
1103 const Box cellBox = gridsFine[din];
1104 const Box ghostBox = grow(cellBox, ighost) & domainFine;
1106 cfivsFine[din].setVal(1.0, ghostBox, comp);
1107 cfivsFine[din].setVal(0.0, cellBox, comp);
1109 NeighborIterator nit(gridsFine);
1110 for (nit.begin(din); nit.ok(); ++nit) {
1111 cfivsFine[din].setVal(0.0, ghostBox & gridsFine[nit()], comp);
1117 copier.ghostDefine(gridsFine, gridsFiCo, domainFine, ighost * IntVect::Unit);
1118 cfivsFine.copyTo(interv, cfivsFiCo, interv, copier, LDaddOp<FArrayBox>());
1120 const DataIterator& dit = gridsFiCo.dataIterator();
1121 const int nbox = dit.size();
1123#pragma omp parallel for schedule(runtime)
1124 for (
int mybox = 0; mybox < nbox; mybox++) {
1125 const DataIndex& din = dit[mybox];
1126 const Box cellBox = gridsFiCo[din];
1127 const FArrayBox& realMask = cfivsFiCo[din];
1129 BaseFab<bool>& boolMask = levelMask[din];
1131 bool emptyMask =
true;
1132 for (BoxIterator bit(cellBox); bit.ok(); ++bit) {
1133 if (realMask(bit(), comp) > 0.5) {
1134 boolMask(bit(), comp) =
true;
1144 mask[
m_finestLevel] = RefCountedPtr<LevelData<BaseFab<bool>>>(
nullptr);
1158 template <
typename Container>
1162 CH_TIME(
"EBAMRParticleMesh::transferMaskParticlesTransition");
1164 if (a_depositionType == DepositionType::NGP) {
1170 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
1171 const Real dxFine =
m_dx[lvl + 1];
1173 const DataIterator& dit = dbl.dataIterator();
1174 const int nbox = dit.size();
1176#pragma omp parallel for schedule(runtime)
1177 for (
int mybox = 0; mybox < nbox; mybox++) {
1178 const DataIndex& din = dit[mybox];
1181 if (!mask.isUsable()) {
1185 const Box maskBox = mask.box();
1187 auto& valid = a_particles[lvl][din];
1188 auto& maskLeaf = (*a_particles.getMaskParticles()[lvl])[din];
1191 while (i < valid.size()) {
1192 const RealVect pos = valid.position(i);
1194 for (
int dir = 0; dir < SpaceDim; dir++) {
1195 iv[dir] =
static_cast<int>(std::floor((pos[dir] -
m_probLo[dir]) / dxFine));
1197 if (maskBox.contains(iv) && mask(iv, 0)) {
1198 maskLeaf.append(pos, valid.weight(i), valid.gather(i));
1200 const std::size_t k = maskLeaf.size() - 1;
1202 maskLeaf.particleID(k) = valid.particleID(i);
1203 maskLeaf.rankID(k) = valid.rankID(i);
1231 template <
int NCOMP,
typename Container,
typename PatchDeposit>
1234 const Container& a_particles,
1236 PatchDeposit a_patch)
const
1238 CH_TIME(
"EBAMRParticleMesh::depositTransitionCore");
1241 CH_assert(a_meshData[0]->nComp() == NCOMP);
1243 if (a_depositionType == DepositionType::NGP) {
1251 Container& particles =
const_cast<Container&
>(a_particles);
1256 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
1257 const DataIterator& dit = dbl.dataIterator();
1258 const int nbox = dit.size();
1260#pragma omp parallel for schedule(runtime)
1261 for (
int mybox = 0; mybox < nbox; mybox++) {
1262 const DataIndex& din = dit[mybox];
1265 EBCellFAB& rho = (*a_meshData[lvl])[din];
1267 a_patch(interp, rho, a_particles[lvl][din], 1.0);
1275 for (
int comp = 0; comp < NCOMP; comp++) {
1276 LevelData<EBCellFAB> coarAlias;
1277 LevelData<EBCellFAB> fineAlias;
1279 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
1280 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
1282 m_coarseFinePM[lvl]->addFineGhostsToCoarse(coarAlias, fineAlias);
1290 const DisjointBoxLayout& dblFiCo =
m_coarseFinePM[lvl + 1]->getEblgFiCo().getDBL();
1291 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl + 1]->template getBufferFiCo<NCOMP>();
1293 const DataIterator& ditFiCo = dblFiCo.dataIterator();
1294 const int nboxFiCo = ditFiCo.size();
1296#pragma omp parallel for schedule(runtime)
1297 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
1298 const DataIndex& din = ditFiCo[mybox];
1300 EBCellFAB& dataFiCo = bufferFiCo[din];
1302 dataFiCo.setVal(0.0);
1305 if (mask.isUsable()) {
1308 a_patch(interp, dataFiCo, (*a_particles.getMaskParticles()[lvl])[din], 1.0);
1315 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl + 1]->template getBufferFiCo<NCOMP>();
1317 m_coarseFinePM[lvl + 1]->addFiCoDataToFine(*a_meshData[lvl + 1], bufferFiCo);
1319 m_coarseFinePM[lvl + 1]->restrictAndAddFiCoDataToCoar(*a_meshData[lvl],
1321 EBCoarseFineParticleMesh::Average::Conservative);
1325 particles.transferParticles(particles.getMaskParticles());
1329#include <CD_NamespaceFooter.H>
Declaration of deposition algorithms in an AMR context.
CoarseFineDeposition
Coarse-fine deposition types (see CD_EBAMRParticleMesh for how these are handled).
Definition CD_CoarseFineDeposition.H:28
Agglomeration of useful data operations.
Declaration of deposition types.
DepositionType
Deposition types.
Definition CD_DepositionType.H:24
Class for holding data across EBAMR hierarchies.
Declaration of a Copier class for making incrementation between LevelData<EBCellFAB> easier.
Declaration of a class for handling particle deposition arithmetic near refinement boundaries.
Single-patch ParticleSoA deposit/interpolate onto an embedded-boundary mesh.
Declaration of cut-cell deposition strategies.
IrregularDeposition
How a deposition scheme treats the cut cells.
Definition CD_IrregularDeposition.H:36
@ NGP
Put the particle's entire cloud in its own cell when that cell is a cut cell.
Declaration of various useful OpenMP-related utilities.
Declaration of an AMR-hierarchy container that owns per-patch ParticleSoA leaves.
static void setValue(LevelData< MFInterfaceFAB< T > > &a_lhs, const T &a_value)
Set value in an MFInterfaceFAB data holder.
Definition CD_DataOpsImplem.H:24
AMR driver that deposits/interpolates ParticleContainer particles across the hierarchy.
Definition CD_EBAMRParticleMesh.H:95
int m_ghost
Number of ghost cells in the mesh data holders.
Definition CD_EBAMRParticleMesh.H:503
void defineTransitionMasks()
Build the per-width transition masks: the fine-side transition band, on the refined-coarse grid.
Definition CD_EBAMRParticleMesh.H:1056
void interpolate(ParticleContainer< P, Traits > &a_particles, const EBAMRCellData &a_meshData, const DepositionType a_interpType, const bool a_forceIrregNGP) const
Interpolate a mesh field onto one or more payload columns, across all levels.
Definition CD_EBAMRParticleMesh.H:185
~EBAMRParticleMesh()=default
Destructor.
void define(const Vector< RefCountedPtr< EBLevelGrid > > &a_eblgs, const Vector< int > &a_refRat, const Vector< Real > &a_dx, const RealVect &a_probLo, const int a_ghost, const int a_finestLevel)
Define the per-level leaves, coarse-fine mesh operators, and halo/transition masks.
Definition CD_EBAMRParticleMesh.H:135
void interpolateWeight(ParticleContainer< P, Traits > &a_particles, const EBAMRCellData &a_meshData, const DepositionType a_interpType, const bool a_forceIrregNGP) const
Interpolate a mesh field onto the container-owned weight column, across all levels.
Definition CD_EBAMRParticleMesh.H:225
int getTransitionMaskWidth(const DepositionType a_depositionType, const int a_refRat) const
Transition-mask width for a kernel: CIC -> refRat/2, TSC -> refRat (NGP is handled upstream).
Definition CD_EBAMRParticleMesh.H:1030
void transferMaskParticlesTransition(Container &a_particles, const DepositionType a_depositionType) const
Move the coarse-side transition particles into the container mask holder (using the FiCo mask).
Definition CD_EBAMRParticleMesh.H:1160
EBAMRParticleMesh & operator=(const EBAMRParticleMesh &)=delete
Copy assignment is deleted.
std::map< int, Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > > m_outerHaloMasks
Outer-halo masks keyed by halo width: per-level coarse cells just outside the fine patch.
Definition CD_EBAMRParticleMesh.H:538
Vector< RefCountedPtr< EBCoarseFineParticleMesh > > m_coarseFinePM
Per-level coarse-fine mesh operators (null on level 0).
Definition CD_EBAMRParticleMesh.H:528
Vector< Real > m_dx
Per-level grid spacing (isotropic).
Definition CD_EBAMRParticleMesh.H:493
void errorUnsupported() const
Abort on an unrecognized coarse-fine deposition strategy.
Definition CD_EBAMRParticleMesh.H:549
void defineEBParticleMesh()
Build the per-level per-patch EBParticleMesh leaves (valid grids + refined-coarse grids).
Definition CD_EBAMRParticleMesh.H:558
int m_finestLevel
Finest AMR level index.
Definition CD_EBAMRParticleMesh.H:508
EBAMRParticleMesh(const EBAMRParticleMesh &)=delete
Copy construction is deleted (shared RefCountedPtr state).
void defineOuterHaloMasks()
Build the per-width outer-halo masks: per level, the coarse cells just outside the fine patch.
Definition CD_EBAMRParticleMesh.H:720
void depositHaloNGPCore(EBAMRCellData &a_meshData, const Container &a_particles, PatchDeposit a_patch, PatchDepositNGP a_patchNGP) const
The CoarseFineDeposition::HaloNGP deposition algorithm.
Definition CD_EBAMRParticleMesh.H:965
RealVect m_probLo
Lower-left corner of the physical domain.
Definition CD_EBAMRParticleMesh.H:498
void deposit(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const IrregularDeposition a_irregularDeposition)
Deposit one or more payload columns onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:424
bool m_isDefined
Whether define() has been called.
Definition CD_EBAMRParticleMesh.H:513
Vector< RefCountedPtr< LayoutData< EBParticleMesh > > > m_ebParticleMesh
Per-level per-patch deposition/interpolation leaves.
Definition CD_EBAMRParticleMesh.H:518
Vector< RefCountedPtr< EBLevelGrid > > m_eblgs
Per-level EB level grids.
Definition CD_EBAMRParticleMesh.H:483
std::map< int, Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > > m_transitionMasks
Transition masks keyed by width: per-level fine-side transition band, on the refined-coarse grid.
Definition CD_EBAMRParticleMesh.H:543
Vector< Copier > m_levelCopiers
Per-level valid+ghost -> valid Copiers (fold ghost-deposited mass into the owner patch).
Definition CD_EBAMRParticleMesh.H:523
void depositWeight(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const IrregularDeposition a_irregularDeposition)
Deposit the container-owned weight onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:272
EBAMRParticleMesh()
Default constructor. Leaves the object undefined; call define().
Definition CD_EBAMRParticleMesh.H:105
void depositGathered(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const IrregularDeposition a_irregularDeposition, CellGather a_cellGather)
Deposit a custom per-particle scalar (computed by a_cellGather) onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:342
void depositTransitionCore(EBAMRCellData &a_meshData, const Container &a_particles, const DepositionType a_depositionType, PatchDeposit a_patch) const
The CoarseFineDeposition::Transition deposition algorithm.
Definition CD_EBAMRParticleMesh.H:1233
void depositInterpCore(EBAMRCellData &a_meshData, const Container &a_particles, const int a_numComp, PatchDeposit a_patchDeposit) const
The CoarseFineDeposition::Interp deposition algorithm, parameterized by the per-patch deposit.
Definition CD_EBAMRParticleMesh.H:663
Vector< RefCountedPtr< LayoutData< EBParticleMesh > > > m_ebParticleMeshFiCo
Per-level per-patch leaves on the refined-coarse (FiCo) grid (null on level 0).
Definition CD_EBAMRParticleMesh.H:533
void depositHaloCore(EBAMRCellData &a_meshData, const Container &a_particles, PatchDeposit a_patchDeposit) const
The CoarseFineDeposition::Halo deposition algorithm.
Definition CD_EBAMRParticleMesh.H:869
void defineCoarseFineMotion()
Build the per-level coarse-fine mesh operators (null on level 0).
Definition CD_EBAMRParticleMesh.H:632
void defineLevelMotion()
Build the per-level valid+ghost -> valid Copiers.
Definition CD_EBAMRParticleMesh.H:614
Vector< int > m_refRat
Per-level refinement ratios.
Definition CD_EBAMRParticleMesh.H:488
A Copier class for making copying between BoxLayoutData<EBCellFAB> easier. This increments EBCellFABs...
Definition CD_EBAddOp.H:28
A class for handling particle deposition clouds that hang over refinement boundaries....
Definition CD_EBCoarseFineParticleMesh.H:42
Deposits/interpolates ParticleSoA leaves on a single patch, with embedded-boundary (cut-cell) awarene...
Definition CD_EBParticleMesh.H:71
void depositWeight(EBCellFAB &a_meshData, const int a_comp, const ParticleSoA< P, Traits > &a_particles, const DepositionType a_depositionType, const Real a_widthScale, const bool a_forceIrregNGP) const
Deposit the container-owned weight column onto mesh component a_comp.
Definition CD_EBParticleMesh.H:136
void interpolateWeight(ParticleSoA< P, Traits > &a_particles, const EBCellFAB &a_meshData, const int a_comp, const DepositionType a_interpType, const bool a_forceIrregNGP) const
Interpolate mesh component a_comp onto the container-owned weight column.
Definition CD_EBParticleMesh.H:360
void depositGathered(EBCellFAB &a_meshData, const int a_comp, const ParticleSoA< P, Traits > &a_particles, const DepositionType a_depositionType, const Real a_widthScale, const bool a_forceIrregNGP, GatherFunc &&a_gather) const
Deposit a custom per-particle scalar (computed by a_gather) onto mesh component a_comp.
Definition CD_EBParticleMesh.H:263
AMR-hierarchy container of computational particles, stored per patch in Struct-of-Arrays form.
Definition CD_ParticleContainer.H:123