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>
46#include <CD_NamespaceHeader.H>
114 define(
const Vector<RefCountedPtr<EBLevelGrid>>& a_eblgs,
115 const Vector<int>& a_refRat,
116 const Vector<Real>& a_dx,
117 const RealVect& a_probLo,
119 const int a_finestLevel)
121 CH_TIME(
"EBAMRParticleMesh::define");
123 CH_assert(a_eblgs.size() > a_finestLevel);
124 CH_assert(a_refRat.size() > a_finestLevel);
125 CH_assert(a_dx.size() > a_finestLevel);
162 template <
auto... Members,
typename P,
typename Traits>
165 const EBAMRCellData& a_meshData,
167 const bool a_forceIrregNGP)
const
169 CH_TIME(
"EBAMRParticleMesh::interpolate");
174 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
175 const DataIterator& dit = dbl.dataIterator();
177 const int nbox = dit.size();
179#pragma omp parallel for schedule(runtime)
180 for (
int mybox = 0; mybox < nbox; mybox++) {
181 const DataIndex& din = dit[mybox];
183 const EBCellFAB& data = (*a_meshData[lvl])[din];
185 interp.template
interpolate<Members...>(a_particles[lvl][din], data, a_interpType, a_forceIrregNGP);
202 template <
typename P,
typename Traits>
205 const EBAMRCellData& a_meshData,
207 const bool a_forceIrregNGP)
const
209 CH_TIME(
"EBAMRParticleMesh::interpolateWeight");
214 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
215 const DataIterator& dit = dbl.dataIterator();
217 const int nbox = dit.size();
219#pragma omp parallel for schedule(runtime)
220 for (
int mybox = 0; mybox < nbox; mybox++) {
221 const DataIndex& din = dit[mybox];
223 const EBCellFAB& data = (*a_meshData[lvl])[din];
225 interp.
interpolateWeight(a_particles[lvl][din], data, a_interpType, a_forceIrregNGP);
249 template <
typename P,
typename Traits>
255 const bool a_forceIrregNGP)
257 CH_TIME(
"EBAMRParticleMesh::depositWeight");
262 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
263 a_interp.
depositWeight(a_rho, a_soa, a_depositionType, a_widthScale, a_forceIrregNGP);
265 const auto patchNGP =
266 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
267 a_interp.
depositWeight(a_rho, a_soa, DepositionType::NGP, a_widthScale, a_forceIrregNGP);
270 switch (a_coarseFineDeposition) {
271 case CoarseFineDeposition::Interp: {
276 case CoarseFineDeposition::Halo: {
277 this->
template depositHaloCore<1>(a_meshData, a_particles, patch);
281 case CoarseFineDeposition::HaloNGP: {
282 this->
template depositHaloNGPCore<1>(a_meshData, a_particles, patch, patchNGP);
286 case CoarseFineDeposition::Transition: {
287 this->
template depositTransitionCore<1>(a_meshData, a_particles, a_depositionType, patch);
314 template <
typename P,
typename Traits,
typename CellGather>
320 const bool a_forceIrregNGP,
321 CellGather a_cellGather)
323 CH_TIME(
"EBAMRParticleMesh::depositGathered");
328 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
335 [&](
const std::size_t a_i, Real* a_out) {
336 a_out[0] = a_cellGather(a_soa, a_i);
339 const auto patchNGP =
340 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
347 [&](
const std::size_t a_i, Real* a_out) {
348 a_out[0] = a_cellGather(a_soa, a_i);
352 switch (a_coarseFineDeposition) {
353 case CoarseFineDeposition::Interp: {
358 case CoarseFineDeposition::Halo: {
359 this->
template depositHaloCore<1>(a_meshData, a_particles, patch);
363 case CoarseFineDeposition::HaloNGP: {
364 this->
template depositHaloNGPCore<1>(a_meshData, a_particles, patch, patchNGP);
368 case CoarseFineDeposition::Transition: {
369 this->
template depositTransitionCore<1>(a_meshData, a_particles, a_depositionType, patch);
393 template <
auto... Members,
typename P,
typename Traits>
399 const bool a_forceIrregNGP)
401 CH_TIME(
"EBAMRParticleMesh::deposit");
406 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
407 a_interp.template
deposit<Members...>(a_rho, a_soa, a_depositionType, a_widthScale, a_forceIrregNGP);
409 const auto patchNGP =
410 [&](
const EBParticleMesh& a_interp, EBCellFAB& a_rho,
const auto& a_soa,
const Real a_widthScale) {
411 a_interp.template
deposit<Members...>(a_rho, a_soa, DepositionType::NGP, a_widthScale, a_forceIrregNGP);
414 switch (a_coarseFineDeposition) {
415 case CoarseFineDeposition::Interp: {
416 this->
depositInterpCore(a_meshData, a_particles,
static_cast<int>(
sizeof...(Members)), patch);
420 case CoarseFineDeposition::Halo: {
421 this->
template depositHaloCore<static_cast<int>(
sizeof...(Members))>(a_meshData, a_particles, patch);
425 case CoarseFineDeposition::HaloNGP: {
426 this->
template depositHaloNGPCore<static_cast<int>(
sizeof...(Members))>(a_meshData, a_particles, patch, patchNGP);
430 case CoarseFineDeposition::Transition: {
431 this->
template depositTransitionCore<static_cast<int>(
sizeof...(Members))>(a_meshData,
519 MayDay::Error(
"EBAMRParticleMesh: unsupported CoarseFineDeposition strategy");
528 CH_TIME(
"EBAMRParticleMesh::defineEBParticleMesh");
534 const ProblemDomain& domain =
m_eblgs[lvl]->getDomain();
535 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
536 const EBISLayout& ebisl =
m_eblgs[lvl]->getEBISL();
537 const DataIterator& dit = dbl.dataIterator();
539 m_ebParticleMesh[lvl] = RefCountedPtr<LayoutData<EBParticleMesh>>(
new LayoutData<EBParticleMesh>(dbl));
541 const int nbox = dit.size();
543#pragma omp parallel for schedule(runtime)
544 for (
int mybox = 0; mybox < nbox; mybox++) {
545 const DataIndex& din = dit[mybox];
553 const ProblemDomain& domainFiCo = eblgFiCo.getDomain();
554 const DisjointBoxLayout& dblFiCo = eblgFiCo.getDBL();
555 const EBISLayout& ebislFiCo = eblgFiCo.getEBISL();
556 const DataIterator& ditFiCo = dblFiCo.dataIterator();
557 const int nboxFiCo = ditFiCo.size();
559 m_ebParticleMeshFiCo[lvl] = RefCountedPtr<LayoutData<EBParticleMesh>>(
new LayoutData<EBParticleMesh>(dblFiCo));
561#pragma omp parallel for schedule(runtime)
562 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
563 const DataIndex& din = ditFiCo[mybox];
568 m_dx[lvl] * RealVect::Unit,
584 CH_TIME(
"EBAMRParticleMesh::defineLevelMotion");
588 const EBLevelGrid& eblg = *
m_eblgs[lvl];
589 const DisjointBoxLayout& dbl = eblg.getDBL();
602 CH_TIME(
"EBAMRParticleMesh::defineCoarseFineMotion");
612 m_coarseFinePM[lvl] = RefCountedPtr<EBCoarseFineParticleMesh>(
nullptr);
629 template <
typename Container,
typename PatchDeposit>
632 const Container& a_particles,
634 PatchDeposit a_patchDeposit)
const
636 CH_TIME(
"EBAMRParticleMesh::depositInterpCore");
639 CH_assert(a_meshData[0]->nComp() == a_numComp);
644 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
645 const bool hasCoar = (lvl > 0);
646 const DataIterator& dit = dbl.dataIterator();
649 const int nbox = dit.size();
651#pragma omp parallel for schedule(runtime)
652 for (
int mybox = 0; mybox < nbox; mybox++) {
653 const DataIndex& din = dit[mybox];
656 EBCellFAB& rho = (*a_meshData[lvl])[din];
658 a_patchDeposit(interp, rho, a_particles[lvl][din], 1.0);
666 for (
int comp = 0; comp < a_numComp; comp++) {
667 LevelData<EBCellFAB> coarAlias;
668 LevelData<EBCellFAB> fineAlias;
670 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
671 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
674 m_coarseFinePM[lvl]->addInvalidCoarseToFine(fineAlias, coarAlias);
690 CH_TIME(
"EBAMRParticleMesh::defineOuterHaloMasks");
692 constexpr int comp = 0;
693 constexpr int numComp = 1;
697 for (
int ighost = 1; ighost <=
m_ghost; ighost++) {
698 Vector<RefCountedPtr<LevelData<BaseFab<bool>>>> mask(1 +
m_finestLevel);
701 const DisjointBoxLayout& grids =
m_eblgs[lvl]->getDBL();
702 const DisjointBoxLayout& gridsFine =
m_eblgs[lvl + 1]->getDBL();
703 const ProblemDomain& domain =
m_eblgs[lvl]->getDomain();
705 DisjointBoxLayout gridsCoFi;
706 coarsen(gridsCoFi, gridsFine,
m_refRat[lvl]);
708 mask[lvl] = RefCountedPtr<LevelData<BaseFab<bool>>>(
709 new LevelData<BaseFab<bool>>(grids, numComp, IntVect::Zero));
711 LevelData<BaseFab<bool>>& levelMask = *mask[lvl];
713 const DataIterator& dit = grids.dataIterator();
715 const int nbox = dit.size();
717#pragma omp parallel for schedule(runtime)
718 for (
int mybox = 0; mybox < nbox; mybox++) {
719 const DataIndex& din = dit[mybox];
721 levelMask[din].setVal(
false);
728 const DataIterator& dit = gridsCoFi.dataIterator();
729 const int nbox = dit.size();
731#pragma omp parallel for schedule(runtime) reduction(+ : halo)
732 for (
int mybox = 0; mybox < nbox; mybox++) {
733 const DataIndex& din = dit[mybox];
734 const Box coFiBox = gridsCoFi[din];
735 const Box grownBox = grow(coFiBox, ighost) & domain;
736 IntVectSet myHalo(grownBox);
739 NeighborIterator nit(gridsCoFi);
740 for (nit.begin(din); nit.ok(); ++nit) {
741 myHalo -= gridsCoFi[nit()];
748 LevelData<FArrayBox> coFiMask(gridsCoFi, numComp, ighost * IntVect::Unit);
749 LevelData<FArrayBox> coarMask(grids, numComp, IntVect::Zero);
751 const DataIterator& dit = gridsFine.dataIterator();
752 const int nbox = dit.size();
754#pragma omp parallel for schedule(runtime)
755 for (
int mybox = 0; mybox < nbox; mybox++) {
756 const DataIndex& din = dit[mybox];
758 coFiMask[din].setVal(0.0);
762 const DataIterator& dit = grids.dataIterator();
763 const int nbox = dit.size();
765#pragma omp parallel for schedule(runtime)
766 for (
int mybox = 0; mybox < nbox; mybox++) {
767 const DataIndex& din = dit[mybox];
769 coarMask[din].setVal(0.0);
773 const DataIterator& dit = gridsFine.dataIterator();
774 const int nbox = dit.size();
776#pragma omp parallel for schedule(runtime)
777 for (
int mybox = 0; mybox < nbox; mybox++) {
778 const DataIndex& din = dit[mybox];
779 const Box region = coFiMask[din].box();
780 const IntVectSet curHalo = halo & region;
782 for (IVSIterator ivsit(curHalo); ivsit.ok(); ++ivsit) {
783 coFiMask[din](ivsit(), comp) = 1.0;
789 copier.ghostDefine(gridsCoFi, grids, domain, ighost * IntVect::Unit);
790 coFiMask.copyTo(Interval(comp, comp), coarMask, Interval(comp, comp), copier, LDaddOp<FArrayBox>());
793 const DataIterator& dit = grids.dataIterator();
794 const int nbox = dit.size();
796#pragma omp parallel for schedule(runtime)
797 for (
int mybox = 0; mybox < nbox; mybox++) {
798 const DataIndex& din = dit[mybox];
799 const Box box = grids[din];
800 const FArrayBox& realMask = coarMask[din];
802 BaseFab<bool>& boolMask = levelMask[din];
804 bool emptyMask =
true;
805 for (BoxIterator bit(box); bit.ok(); ++bit) {
806 if (realMask(bit(), comp) > 0.0) {
807 boolMask(bit(), comp) =
true;
817 mask[
m_finestLevel] = RefCountedPtr<LevelData<BaseFab<bool>>>(
nullptr);
835 template <
int NCOMP,
typename Container,
typename PatchDeposit>
837 depositHaloCore(EBAMRCellData& a_meshData,
const Container& a_particles, PatchDeposit a_patchDeposit)
const
839 CH_TIME(
"EBAMRParticleMesh::depositHaloCore");
842 CH_assert(a_meshData[0]->nComp() == NCOMP);
847 constexpr int coarseMaskWidth = 1;
848 Container& particles =
const_cast<Container&
>(a_particles);
852 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
853 const bool hasCoar = (lvl > 0);
856 const DataIterator& dit = dbl.dataIterator();
857 const int nbox = dit.size();
859#pragma omp parallel for schedule(runtime)
860 for (
int mybox = 0; mybox < nbox; mybox++) {
861 const DataIndex& din = dit[mybox];
864 EBCellFAB& rho = (*a_meshData[lvl])[din];
866 a_patchDeposit(interp, rho, a_particles[lvl][din], 1.0);
874 m_coarseFinePM[lvl]->addFineGhostsToCoarse(*a_meshData[lvl - 1], *a_meshData[lvl]);
879 const auto& coarHalo = a_particles.getMaskParticles()[lvl - 1];
880 const Real widthScale =
static_cast<Real
>(
m_refRat[lvl - 1]);
882 const DisjointBoxLayout& dblFiCo = eblgFiCo.getDBL();
884 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl]->template getBufferFiCo<NCOMP>();
886 const DataIterator& ditFiCo = dblFiCo.dataIterator();
888 const int nboxFiCo = ditFiCo.size();
889#pragma omp parallel for schedule(runtime)
890 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
891 const DataIndex& din = ditFiCo[mybox];
894 EBCellFAB& dataFiCo = bufferFiCo[din];
896 dataFiCo.setVal(0.0);
897 a_patchDeposit(interp, dataFiCo, (*coarHalo)[din], widthScale);
900 for (
int comp = 0; comp < NCOMP; comp++) {
901 LevelData<EBCellFAB> meshAlias;
902 LevelData<EBCellFAB> bufAlias;
904 aliasLevelData<EBCellFAB>(meshAlias, &(*a_meshData[lvl]), Interval(comp, comp));
905 aliasLevelData<EBCellFAB>(bufAlias, &bufferFiCo, Interval(comp, comp));
912 particles.clearMaskParticles();
931 template <
int NCOMP,
typename Container,
typename PatchDeposit,
typename PatchDepositNGP>
934 const Container& a_particles,
935 PatchDeposit a_patch,
936 PatchDepositNGP a_patchNGP)
const
938 CH_TIME(
"EBAMRParticleMesh::depositHaloNGPCore");
941 CH_assert(a_meshData[0]->nComp() == NCOMP);
946 constexpr int coarseMaskWidth = 1;
947 Container& particles =
const_cast<Container&
>(a_particles);
952 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
953 const bool hasCoar = (lvl > 0);
956 const DataIterator& dit = dbl.dataIterator();
957 const int nbox = dit.size();
959#pragma omp parallel for schedule(runtime)
960 for (
int mybox = 0; mybox < nbox; mybox++) {
961 const DataIndex& din = dit[mybox];
964 EBCellFAB& rho = (*a_meshData[lvl])[din];
966 a_patch(interp, rho, a_particles[lvl][din], 1.0);
967 a_patchNGP(interp, rho, (*a_particles.getMaskParticles()[lvl])[din], 1.0);
975 for (
int comp = 0; comp < NCOMP; comp++) {
976 LevelData<EBCellFAB> coarAlias;
977 LevelData<EBCellFAB> fineAlias;
979 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
980 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
988 particles.transferParticles(particles.getMaskParticles());
1001 if (a_depositionType == DepositionType::CIC) {
1002 maskWidth = a_refRat / 2;
1004 else if (a_depositionType == DepositionType::TSC) {
1005 maskWidth = a_refRat;
1008 MayDay::Abort(
"EBAMRParticleMesh::getTransitionMaskWidth - logic bust");
1011 MayDay::Abort(
"EBAMRParticleMesh::getTransitionMaskWidth - not enough ghost cells");
1026 CH_TIME(
"EBAMRParticleMesh::defineTransitionMasks");
1028 constexpr int comp = 0;
1029 constexpr int numComp = 1;
1030 const Interval interv = Interval(comp, comp);
1034 for (
int ighost = 1; ighost <=
m_ghost; ighost++) {
1035 Vector<RefCountedPtr<LevelData<BaseFab<bool>>>> mask(1 +
m_finestLevel);
1038 const DisjointBoxLayout& gridsFine =
m_eblgs[lvl + 1]->getDBL();
1039 const EBLevelGrid& eblgFiCo =
m_coarseFinePM[lvl + 1]->getEblgFiCo();
1040 const DisjointBoxLayout& gridsFiCo = eblgFiCo.getDBL();
1041 const ProblemDomain& domainFine =
m_eblgs[lvl + 1]->getDomain();
1043 mask[lvl] = RefCountedPtr<LevelData<BaseFab<bool>>>(
1044 new LevelData<BaseFab<bool>>(gridsFiCo, numComp, IntVect::Zero));
1046 LevelData<BaseFab<bool>>& levelMask = *mask[lvl];
1047 LevelData<FArrayBox> cfivsFine(gridsFine, numComp, ighost * IntVect::Unit);
1048 LevelData<FArrayBox> cfivsFiCo(gridsFiCo, numComp, IntVect::Zero);
1051 const DataIterator& dit = gridsFiCo.dataIterator();
1052 const int nbox = dit.size();
1054#pragma omp parallel for schedule(runtime)
1055 for (
int mybox = 0; mybox < nbox; mybox++) {
1056 const DataIndex& din = dit[mybox];
1058 levelMask[din].setVal(
false);
1059 cfivsFiCo[din].setVal(0.0);
1065 const DataIterator& dit = gridsFine.dataIterator();
1066 const int nbox = dit.size();
1068#pragma omp parallel for schedule(runtime)
1069 for (
int mybox = 0; mybox < nbox; mybox++) {
1070 const DataIndex& din = dit[mybox];
1071 const Box cellBox = gridsFine[din];
1072 const Box ghostBox = grow(cellBox, ighost) & domainFine;
1074 cfivsFine[din].setVal(1.0, ghostBox, comp);
1075 cfivsFine[din].setVal(0.0, cellBox, comp);
1077 NeighborIterator nit(gridsFine);
1078 for (nit.begin(din); nit.ok(); ++nit) {
1079 cfivsFine[din].setVal(0.0, ghostBox & gridsFine[nit()], comp);
1085 copier.ghostDefine(gridsFine, gridsFiCo, domainFine, ighost * IntVect::Unit);
1086 cfivsFine.copyTo(interv, cfivsFiCo, interv, copier, LDaddOp<FArrayBox>());
1088 const DataIterator& dit = gridsFiCo.dataIterator();
1089 const int nbox = dit.size();
1091#pragma omp parallel for schedule(runtime)
1092 for (
int mybox = 0; mybox < nbox; mybox++) {
1093 const DataIndex& din = dit[mybox];
1094 const Box cellBox = gridsFiCo[din];
1095 const FArrayBox& realMask = cfivsFiCo[din];
1097 BaseFab<bool>& boolMask = levelMask[din];
1099 bool emptyMask =
true;
1100 for (BoxIterator bit(cellBox); bit.ok(); ++bit) {
1101 if (realMask(bit(), comp) > 0.5) {
1102 boolMask(bit(), comp) =
true;
1112 mask[
m_finestLevel] = RefCountedPtr<LevelData<BaseFab<bool>>>(
nullptr);
1126 template <
typename Container>
1130 CH_TIME(
"EBAMRParticleMesh::transferMaskParticlesTransition");
1132 if (a_depositionType == DepositionType::NGP) {
1138 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
1139 const Real dxFine =
m_dx[lvl + 1];
1141 const DataIterator& dit = dbl.dataIterator();
1142 const int nbox = dit.size();
1144#pragma omp parallel for schedule(runtime)
1145 for (
int mybox = 0; mybox < nbox; mybox++) {
1146 const DataIndex& din = dit[mybox];
1149 if (!mask.isUsable()) {
1153 const Box maskBox = mask.box();
1155 auto& valid = a_particles[lvl][din];
1156 auto& maskLeaf = (*a_particles.getMaskParticles()[lvl])[din];
1159 while (i < valid.size()) {
1160 const RealVect pos = valid.position(i);
1162 for (
int dir = 0; dir < SpaceDim; dir++) {
1163 iv[dir] =
static_cast<int>(std::floor((pos[dir] -
m_probLo[dir]) / dxFine));
1165 if (maskBox.contains(iv) && mask(iv, 0)) {
1166 maskLeaf.append(pos, valid.weight(i), valid.gather(i));
1168 const std::size_t k = maskLeaf.size() - 1;
1170 maskLeaf.particleID(k) = valid.particleID(i);
1171 maskLeaf.rankID(k) = valid.rankID(i);
1199 template <
int NCOMP,
typename Container,
typename PatchDeposit>
1202 const Container& a_particles,
1204 PatchDeposit a_patch)
const
1206 CH_TIME(
"EBAMRParticleMesh::depositTransitionCore");
1209 CH_assert(a_meshData[0]->nComp() == NCOMP);
1211 if (a_depositionType == DepositionType::NGP) {
1219 Container& particles =
const_cast<Container&
>(a_particles);
1224 const DisjointBoxLayout& dbl =
m_eblgs[lvl]->getDBL();
1225 const DataIterator& dit = dbl.dataIterator();
1226 const int nbox = dit.size();
1228#pragma omp parallel for schedule(runtime)
1229 for (
int mybox = 0; mybox < nbox; mybox++) {
1230 const DataIndex& din = dit[mybox];
1233 EBCellFAB& rho = (*a_meshData[lvl])[din];
1235 a_patch(interp, rho, a_particles[lvl][din], 1.0);
1243 for (
int comp = 0; comp < NCOMP; comp++) {
1244 LevelData<EBCellFAB> coarAlias;
1245 LevelData<EBCellFAB> fineAlias;
1247 aliasLevelData<EBCellFAB>(coarAlias, &(*a_meshData[lvl - 1]), Interval(comp, comp));
1248 aliasLevelData<EBCellFAB>(fineAlias, &(*a_meshData[lvl]), Interval(comp, comp));
1250 m_coarseFinePM[lvl]->addFineGhostsToCoarse(coarAlias, fineAlias);
1258 const DisjointBoxLayout& dblFiCo =
m_coarseFinePM[lvl + 1]->getEblgFiCo().getDBL();
1259 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl + 1]->template getBufferFiCo<NCOMP>();
1261 const DataIterator& ditFiCo = dblFiCo.dataIterator();
1262 const int nboxFiCo = ditFiCo.size();
1264#pragma omp parallel for schedule(runtime)
1265 for (
int mybox = 0; mybox < nboxFiCo; mybox++) {
1266 const DataIndex& din = ditFiCo[mybox];
1268 EBCellFAB& dataFiCo = bufferFiCo[din];
1270 dataFiCo.setVal(0.0);
1273 if (mask.isUsable()) {
1276 a_patch(interp, dataFiCo, (*a_particles.getMaskParticles()[lvl])[din], 1.0);
1283 LevelData<EBCellFAB>& bufferFiCo =
m_coarseFinePM[lvl + 1]->template getBufferFiCo<NCOMP>();
1285 m_coarseFinePM[lvl + 1]->addFiCoDataToFine(*a_meshData[lvl + 1], bufferFiCo);
1287 m_coarseFinePM[lvl + 1]->restrictAndAddFiCoDataToCoar(*a_meshData[lvl],
1289 EBCoarseFineParticleMesh::Average::Conservative);
1293 particles.transferParticles(particles.getMaskParticles());
1297#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 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:74
int m_ghost
Number of ghost cells in the mesh data holders.
Definition CD_EBAMRParticleMesh.H:471
void defineTransitionMasks()
Build the per-width transition masks: the fine-side transition band, on the refined-coarse grid.
Definition CD_EBAMRParticleMesh.H:1024
void depositWeight(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const bool a_forceIrregNGP)
Deposit the container-owned weight onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:251
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:164
~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:114
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:204
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:998
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:1128
void depositGathered(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const bool a_forceIrregNGP, CellGather a_cellGather)
Deposit a custom per-particle scalar (computed by a_cellGather) onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:316
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:506
Vector< RefCountedPtr< EBCoarseFineParticleMesh > > m_coarseFinePM
Per-level coarse-fine mesh operators (null on level 0).
Definition CD_EBAMRParticleMesh.H:496
Vector< Real > m_dx
Per-level grid spacing (isotropic).
Definition CD_EBAMRParticleMesh.H:461
void errorUnsupported() const
Abort on an unrecognized coarse-fine deposition strategy.
Definition CD_EBAMRParticleMesh.H:517
void defineEBParticleMesh()
Build the per-level per-patch EBParticleMesh leaves (valid grids + refined-coarse grids).
Definition CD_EBAMRParticleMesh.H:526
int m_finestLevel
Finest AMR level index.
Definition CD_EBAMRParticleMesh.H:476
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:688
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:933
RealVect m_probLo
Lower-left corner of the physical domain.
Definition CD_EBAMRParticleMesh.H:466
bool m_isDefined
Whether define() has been called.
Definition CD_EBAMRParticleMesh.H:481
Vector< RefCountedPtr< LayoutData< EBParticleMesh > > > m_ebParticleMesh
Per-level per-patch deposition/interpolation leaves.
Definition CD_EBAMRParticleMesh.H:486
Vector< RefCountedPtr< EBLevelGrid > > m_eblgs
Per-level EB level grids.
Definition CD_EBAMRParticleMesh.H:451
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:511
Vector< Copier > m_levelCopiers
Per-level valid+ghost -> valid Copiers (fold ghost-deposited mass into the owner patch).
Definition CD_EBAMRParticleMesh.H:491
void deposit(EBAMRCellData &a_meshData, const ParticleContainer< P, Traits > &a_particles, const DepositionType a_depositionType, const CoarseFineDeposition a_coarseFineDeposition, const bool a_forceIrregNGP)
Deposit one or more payload columns onto the AMR mesh.
Definition CD_EBAMRParticleMesh.H:395
EBAMRParticleMesh()
Default constructor. Leaves the object undefined; call define().
Definition CD_EBAMRParticleMesh.H:84
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:1201
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:631
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:501
void depositHaloCore(EBAMRCellData &a_meshData, const Container &a_particles, PatchDeposit a_patchDeposit) const
The CoarseFineDeposition::Halo deposition algorithm.
Definition CD_EBAMRParticleMesh.H:837
void defineCoarseFineMotion()
Build the per-level coarse-fine mesh operators (null on level 0).
Definition CD_EBAMRParticleMesh.H:600
void defineLevelMotion()
Build the per-level valid+ghost -> valid Copiers.
Definition CD_EBAMRParticleMesh.H:582
Vector< int > m_refRat
Per-level refinement ratios.
Definition CD_EBAMRParticleMesh.H:456
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