void MCLinOp::makeCoefficients (MultiFab& cs, const MultiFab& fn, int level) { const int nc = fn.nComp(); // // Determine index type of incoming MultiFab. // const IndexType iType(fn.boxArray().ixType()); const IndexType cType(D_DECL(IndexType::CELL, IndexType::CELL, IndexType::CELL)); const IndexType xType(D_DECL(IndexType::NODE, IndexType::CELL, IndexType::CELL)); const IndexType yType(D_DECL(IndexType::CELL, IndexType::NODE, IndexType::CELL)); #if (BL_SPACEDIM == 3) const IndexType zType(D_DECL(IndexType::CELL, IndexType::CELL, IndexType::NODE)); #endif int cdir; if (iType == cType) { cdir = -1; } else if (iType == xType) { cdir = 0; } else if (iType == yType) { cdir = 1; } #if (BL_SPACEDIM == 3) else if (iType == zType) { cdir = 2; } #endif else BoxLib::Abort("MCLinOp::makeCoeffients(): Bad index type"); BoxArray d(gbox[level]); if (cdir >= 0) d.surroundingNodes(cdir); int nGrow=0; cs.define(d, nc, nGrow, Fab_allocate); cs.setVal(0.0); const BoxArray& grids = gbox[level]; for (MFIter csmfi(cs); csmfi.isValid(); ++csmfi) { const Box& grd = grids[csmfi.index()]; FArrayBox& csfab = cs[csmfi]; const FArrayBox& fnfab = fn[csmfi]; switch(cdir) { case -1: FORT_AVERAGECC( csfab.dataPtr(), ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()), fnfab.dataPtr(), ARLIM(fnfab.loVect()), ARLIM(fnfab.hiVect()), grd.loVect(), grd.hiVect(), &nc); break; case 0: case 1: case 2: if ( harmavg ) { FORT_HARMONIC_AVERAGEEC( csfab.dataPtr(), ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()), fnfab.dataPtr(), ARLIM(fnfab.loVect()), ARLIM(fnfab.hiVect()), grd.loVect(), grd.hiVect(), &nc, &cdir); } else { FORT_AVERAGEEC( csfab.dataPtr(), ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()), fnfab.dataPtr(), ARLIM(fnfab.loVect()), ARLIM(fnfab.hiVect()), grd.loVect(), grd.hiVect(), &nc, &cdir); } break; default: BoxLib::Error("MCLinOp::makeCoeffients(): bad coefficient coarsening direction!"); } } }
void LinOp::makeCoefficients (MultiFab& cs, const MultiFab& fn, int level) { BL_PROFILE("LinOp::makeCoefficients()"); int nc = 1; // // Determine index type of incoming MultiFab. // const IndexType iType(fn.boxArray().ixType()); const IndexType cType(D_DECL(IndexType::CELL, IndexType::CELL, IndexType::CELL)); const IndexType xType(D_DECL(IndexType::NODE, IndexType::CELL, IndexType::CELL)); const IndexType yType(D_DECL(IndexType::CELL, IndexType::NODE, IndexType::CELL)); #if (BL_SPACEDIM == 3) const IndexType zType(D_DECL(IndexType::CELL, IndexType::CELL, IndexType::NODE)); #endif int cdir; if (iType == cType) { cdir = -1; } else if (iType == xType) { cdir = 0; } else if (iType == yType) { cdir = 1; #if (BL_SPACEDIM == 3) } else if (iType == zType) { cdir = 2; #endif } else { BoxLib::Error("LinOp::makeCoeffients: Bad index type"); } BoxArray d(gbox[level]); if (cdir >= 0) d.surroundingNodes(cdir); // // Only single-component solves supported (verified) by this class. // const int nComp=1; const int nGrow=0; cs.define(d, nComp, nGrow, Fab_allocate); const bool tiling = true; switch (cdir) { case -1: #ifdef _OPENMP #pragma omp parallel #endif for (MFIter csmfi(cs,tiling); csmfi.isValid(); ++csmfi) { const Box& tbx = csmfi.tilebox(); FArrayBox& csfab = cs[csmfi]; const FArrayBox& fnfab = fn[csmfi]; FORT_AVERAGECC(csfab.dataPtr(), ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()),fnfab.dataPtr(), ARLIM(fnfab.loVect()),ARLIM(fnfab.hiVect()), tbx.loVect(),tbx.hiVect(), &nc); } break; case 0: case 1: case 2: if (harmavg) { #ifdef _OPENMP #pragma omp parallel #endif for (MFIter csmfi(cs,tiling); csmfi.isValid(); ++csmfi) { const Box& tbx = csmfi.tilebox(); FArrayBox& csfab = cs[csmfi]; const FArrayBox& fnfab = fn[csmfi]; FORT_HARMONIC_AVERAGEEC(csfab.dataPtr(), ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()), fnfab.dataPtr(), ARLIM(fnfab.loVect()), ARLIM(fnfab.hiVect()), tbx.loVect(),tbx.hiVect(), &nc,&cdir); } } else { #ifdef _OPENMP #pragma omp parallel #endif for (MFIter csmfi(cs,tiling); csmfi.isValid(); ++csmfi) { const Box& tbx = csmfi.tilebox(); FArrayBox& csfab = cs[csmfi]; const FArrayBox& fnfab = fn[csmfi]; FORT_AVERAGEEC(csfab.dataPtr(),ARLIM(csfab.loVect()), ARLIM(csfab.hiVect()),fnfab.dataPtr(), ARLIM(fnfab.loVect()),ARLIM(fnfab.hiVect()), tbx.loVect(),tbx.hiVect(), &nc, &cdir); } } break; default: BoxLib::Error("LinOp:: bad coefficient coarsening direction!"); } }