void SkeletonOutersideDoubleWeightedAverage::coarsen( hier::Patch& coarse, const hier::Patch& fine, const int dst_component, const int src_component, const hier::Box& coarse_box, const hier::IntVector& ratio) const { boost::shared_ptr<pdat::OuterfaceData<double> > fdata( BOOST_CAST<pdat::OuterfaceData<double>, hier::PatchData>( fine.getPatchData(src_component))); boost::shared_ptr<pdat::OuterfaceData<double> > cdata( BOOST_CAST<pdat::OuterfaceData<double>, hier::PatchData>( coarse.getPatchData(dst_component))); TBOX_ASSERT(fdata); TBOX_ASSERT(cdata); TBOX_ASSERT(cdata->getDepth() == fdata->getDepth()); const hier::Index filo = fdata->getGhostBox().lower(); const hier::Index fihi = fdata->getGhostBox().upper(); const hier::Index cilo = cdata->getGhostBox().lower(); const hier::Index cihi = cdata->getGhostBox().upper(); const boost::shared_ptr<hier::PatchGeometry> fgeom( fine.getPatchGeometry()); const boost::shared_ptr<hier::PatchGeometry> cgeom( coarse.getPatchGeometry()); const hier::Index ifirstc = coarse_box.lower(); const hier::Index ilastc = coarse_box.upper(); int flev_num = fine.getPatchLevelNumber(); int clev_num = coarse.getPatchLevelNumber(); // deal with levels not in hierarchy if (flev_num < 0) flev_num = clev_num + 1; if (clev_num < 0) clev_num = flev_num - 1; double cdx[SAMRAI::MAX_DIM_VAL]; double fdx[SAMRAI::MAX_DIM_VAL]; getDx(clev_num, cdx); getDx(flev_num, fdx); for (int d = 0; d < cdata->getDepth(); ++d) { // loop over lower and upper outerside arrays for (int i = 0; i < 2; ++i) { if (d_dim == tbox::Dimension(1)) { SAMRAI_F77_FUNC(cartwgtavgoutfacedoub1d, CARTWGTAVGOUTFACEDOUB1D) ( ifirstc(0), ilastc(0), filo(0), fihi(0), cilo(0), cihi(0), &ratio[0], fdx, cdx, fdata->getPointer(0, i, d), cdata->getPointer(0, i, d)); } else if (d_dim == tbox::Dimension(2)) { SAMRAI_F77_FUNC(cartwgtavgoutfacedoub2d0, CARTWGTAVGOUTFACEDOUB2D0) ( ifirstc(0), ifirstc(1), ilastc(0), ilastc(1), filo(0), filo(1), fihi(0), fihi(1), cilo(0), cilo(1), cihi(0), cihi(1), &ratio[0], fdx, cdx, fdata->getPointer(0, i, d), cdata->getPointer(0, i, d)); SAMRAI_F77_FUNC(cartwgtavgoutfacedoub2d1, CARTWGTAVGOUTFACEDOUB2D1) ( ifirstc(0), ifirstc(1), ilastc(0), ilastc(1), filo(0), filo(1), fihi(0), fihi(1), cilo(0), cilo(1), cihi(0), cihi(1), &ratio[0], fdx, cdx, fdata->getPointer(1, i, d), cdata->getPointer(1, i, d)); } else if (d_dim == tbox::Dimension(3)) { SAMRAI_F77_FUNC(cartwgtavgoutfacedoub3d0, CARTWGTAVGOUTFACEDOUB3D0) ( ifirstc(0), ifirstc(1), ifirstc(2), ilastc(0), ilastc(1), ilastc(2), filo(0), filo(1), filo(2), fihi(0), fihi(1), fihi(2), cilo(0), cilo(1), cilo(2), cihi(0), cihi(1), cihi(2), &ratio[0], fdx, cdx, fdata->getPointer(0, i, d), cdata->getPointer(0, i, d)); SAMRAI_F77_FUNC(cartwgtavgoutfacedoub3d1, CARTWGTAVGOUTFACEDOUB3D1) ( ifirstc(0), ifirstc(1), ifirstc(2), ilastc(0), ilastc(1), ilastc(2), filo(0), filo(1), filo(2), fihi(0), fihi(1), fihi(2), cilo(0), cilo(1), cilo(2), cihi(0), cihi(1), cihi(2), &ratio[0], fdx, cdx, fdata->getPointer(1, i, d), cdata->getPointer(1, i, d)); SAMRAI_F77_FUNC(cartwgtavgoutfacedoub3d2, CARTWGTAVGOUTFACEDOUB3D2) ( ifirstc(0), ifirstc(1), ifirstc(2), ilastc(0), ilastc(1), ilastc(2), filo(0), filo(1), filo(2), fihi(0), fihi(1), fihi(2), cilo(0), cilo(1), cilo(2), cihi(0), cihi(1), cihi(2), &ratio[0], fdx, cdx, fdata->getPointer(2, i, d), cdata->getPointer(2, i, d)); } else { TBOX_ERROR("SkeletonOutersideDoubleWeightedAverage error...\n" << "d_dim > 3 not supported." << endl); } } } }