#include #include #include #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "gh.hh" #include "carpet.hh" #include "regrid.hh" namespace CarpetRegrid { using namespace std; using namespace Carpet; int ManualCoordinateList (cGH const * const cctkGH, gh const & hh, gh::mexts & bbsss, gh::rbnds & obss, gh::rprocs & pss) { DECLARE_CCTK_PARAMETERS; int ierr; assert (refinement_levels >= 1); // do nothing if the levels already exist if (reflevel == refinement_levels && !tracking) return 0; assert (bbsss.size() >= 1); vector > bbss = bbsss.at(0); jjvect nboundaryzones, is_internal, is_staggered, shiftout; ierr = GetBoundarySpecification (2*dim, &nboundaryzones[0][0], &is_internal[0][0], &is_staggered[0][0], &shiftout[0][0]); assert (!ierr); rvect physical_min, physical_max; rvect interior_min, interior_max; rvect exterior_min, exterior_max; rvect base_spacing; ierr = GetDomainSpecification (dim, &physical_min[0], &physical_max[0], &interior_min[0], &interior_max[0], &exterior_min[0], &exterior_max[0], &base_spacing[0]); assert (!ierr); bbss.resize (refinement_levels); obss.resize (refinement_levels); pss.resize (refinement_levels); vector > newbbss; if (strcmp(coordinates, "") != 0) { istringstream gp_str(coordinates); try { gp_str >> newbbss; } catch (input_error) { CCTK_WARN (0, "Could not parse parameter \"coordinates\""); } if (newbbss.size() >= spacereffacts.size()) { CCTK_WARN (0, "Parameter \"coordinates\" defines too many refinement levels; at most Carpet::max_refinement_levels - 1 may be defined"); } } vector > newobss; if (smart_outer_boundaries) { // TODO: // assert (domain_from_coordbase); newobss.resize(newbbss.size()); for (size_t rl=0; rl> newobss; } catch (input_error) { CCTK_WARN (0, "Could not parse parameter \"outerbounds\""); } if (newobss.size() >= spacereffacts.size()) { CCTK_WARN (0, "Parameter \"outerbounds\" defines too many refinement levels; at most Carpet::max_refinement_levels - 1 may be defined"); } bool good = newobss.size() == newbbss.size(); if (good) { for (size_t rl=0; rl bbs; gh::cbnds obs; bbs.reserve (newbbss.at(rl-1).size()); obs.reserve (newbbss.at(rl-1).size()); for (size_t c=0; c= offset_firstlevel) { assert (dim==3); offset = rvect(offsetx[c], offsety[c], offsetz[c]); } } ManualCoordinates_OneLevel (cctkGH, hh, rl, refinement_levels, ext.lower() + offset, ext.upper() + offset, ob, bbs, obs); } // if we have more than 1 component, we might want to // check if merging them makes sense if(merge_overlapping_components && bbs.size() > 1) { // now let's check if one or more of our components touch... // we use this array to keep track of which component was merged // with another. int* merged_component = (int*) malloc(sizeof(int)*bbs.size()); // initialize the damn array for(int i=0;i 0) { // uh. this component will be merged merged_component[c] = 1; // calculate union morefun = morefun.expanded_containing(bbs.at(sc)); // update the previous component with the union ! bbs.at(sc) = morefun; } } } // now we need to get rid of those bboxes that were merged vector mergedbbs; for (size_t c=0;c