void CleverNodeInjection<TYPE>::coarsen( SAMRAI::hier::Patch& coarse, const SAMRAI::hier::Patch& fine, const int dst_component, const int src_component, const SAMRAI::hier::Box& coarse_box, const SAMRAI::hier::IntVector& ratio) const { boost::shared_ptr<CleverNodeData<TYPE> > fine_data( SHARED_PTR_CAST(CleverNodeData<TYPE> , fine.getPatchData(src_component))); boost::shared_ptr<CleverNodeData<TYPE> > coarse_data( SHARED_PTR_CAST(CleverNodeData<TYPE> , coarse.getPatchData(dst_component))); const SAMRAI::hier::Box coarse_ghost_box = SAMRAI::pdat::NodeGeometry::toNodeBox(coarse_data->getGhostBox()); const SAMRAI::hier::Box fine_ghost_box = SAMRAI::pdat::NodeGeometry::toNodeBox(fine_data->getGhostBox()); const hier::Index filo = fine_data->getGhostBox().lower(); const hier::Index fihi = fine_data->getGhostBox().upper(); const hier::Index cilo = coarse_data->getGhostBox().lower(); const hier::Index cihi = coarse_data->getGhostBox().upper(); const hier::Index ifirstc = coarse_box.lower(); const hier::Index ilastc = coarse_box.upper(); for(int depth = 0; depth < coarse_data->getDepth(); depth++) { if (fine.getDim() == SAMRAI::tbox::Dimension(2)) { F90_FUNC(conavgclevernodedoub2d, CONAVGCLEVERNODEDOUB2D) (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], fine_data->getPointer(depth), coarse_data->getPointer(depth)); } else { TBOX_ERROR("CleverNodeInjection error...\n" << "dim != 2 not supported." << std::endl); } } }
void Elastic::Boundary_Conditions::set_embedded_boundary (const SAMRAI::hier::Patch& patch, const int &level_set_id, const int &dv_mixed_id) { boost::shared_ptr<SAMRAI::pdat::SideData<double> > level_set_ptr= boost::dynamic_pointer_cast<SAMRAI::pdat::SideData<double> > (patch.getPatchData(level_set_id)); SAMRAI::pdat::SideData<double> &level_set(*level_set_ptr); boost::shared_ptr<SAMRAI::pdat::SideData<double> > dv_mixed_ptr; if(dv_mixed_id!=invalid_id) dv_mixed_ptr=boost::dynamic_pointer_cast <SAMRAI::pdat::SideData<double> >(patch.getPatchData(dv_mixed_id)); const SAMRAI::tbox::Dimension dimension(patch.getDim()); const Gamra::Dir dim(dimension.getValue()); const SAMRAI::hier::Box gbox=level_set.getGhostBox(); const SAMRAI::hier::Box box=level_set.getBox(); boost::shared_ptr<SAMRAI::geom::CartesianPatchGeometry> geom = boost::dynamic_pointer_cast<SAMRAI::geom::CartesianPatchGeometry> (patch.getPatchGeometry()); /* Corners are not synced, so we set the level set to a generic * negative value and dv_mixed to zero. Setting dv_mixed to zero * implies that we do not care about faults that intersect that * corner (nor should we). */ for(Gamra::Dir ix=0; ix<dim; ++ix) { const Gamra::Dir iy(ix.next(dim)); const Gamra::Dir iz(iy.next(dim)); std::vector<std::vector<int> > corners(dim); corners[ix].push_back(box.lower(ix)); corners[ix].push_back(box.upper(ix)+1); if(geom->getTouchesRegularBoundary(iy,0)) corners[iy].push_back(gbox.lower(iy)); if(geom->getTouchesRegularBoundary(iy,1)) corners[iy].push_back(gbox.upper(iy)); if(dim==3) { if(geom->getTouchesRegularBoundary(iz,0)) corners[iz].push_back(gbox.lower(iz)); if(geom->getTouchesRegularBoundary(iz,1)) corners[iz].push_back(gbox.upper(iz)); } SAMRAI::pdat::SideIndex x(SAMRAI::hier::Index(dimension),ix, SAMRAI::pdat::SideIndex::Lower); for(std::vector<int>::iterator i=corners[ix].begin(); i!=corners[ix].end(); ++i) { x[ix]=*i; if(dim==2) { for(std::vector<int>::iterator j=corners[iy].begin(); j!=corners[iy].end();++j) { x[iy]=*j; set_embedded_values(x,dim,level_set,dv_mixed_ptr); } } else { for(std::vector<int>::iterator j=corners[iy].begin(); j!=corners[iy].end();++j) for(int kk=gbox.lower(iz); kk<=gbox.upper(iz); ++kk) { x[iy]=*j; x[iz]=kk; set_embedded_values(x,dim,level_set,dv_mixed_ptr); } for(std::vector<int>::iterator k=corners[iz].begin(); k!=corners[iz].end();++k) { for(int jj=gbox.lower(iy); jj<=gbox.upper(iy); ++jj) { x[iy]=jj; x[iz]=*k; set_embedded_values(x,dim,level_set,dv_mixed_ptr); } } } } } }