From 1f8ed8eea75ce7f304d0178968b9461662ef7a32 Mon Sep 17 00:00:00 2001 From: schnetter <> Date: Mon, 12 May 2003 14:25:00 +0000 Subject: Handle global mode. Untested. darcs-hash:20030512142540-07bb3-f06f82c44036c5410c1b8b5c0aa8159a6d90f1eb.gz --- Carpet/CarpetInterp/src/interp.cc | 355 +++++++++++++++++++++----------------- 1 file changed, 196 insertions(+), 159 deletions(-) (limited to 'Carpet') diff --git a/Carpet/CarpetInterp/src/interp.cc b/Carpet/CarpetInterp/src/interp.cc index 0d34c7d53..574213b1b 100644 --- a/Carpet/CarpetInterp/src/interp.cc +++ b/Carpet/CarpetInterp/src/interp.cc @@ -1,8 +1,9 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.3 2003/05/08 15:35:49 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.4 2003/05/12 16:25:40 schnetter Exp $ #include #include +#include #include #include @@ -18,7 +19,7 @@ #include "interp.hh" extern "C" { - static char const * const rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.3 2003/05/08 15:35:49 schnetter Exp $"; + static char const * const rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetInterp/src/interp.cc,v 1.4 2003/05/12 16:25:40 schnetter Exp $"; CCTK_FILEVERSION(Carpet_CarpetInterp_interp_cc); } @@ -37,18 +38,6 @@ namespace CarpetInterp { - ivect rvect2ivect (rvect const & pos, - rvect const & lower, - rvect const finest_delta) - { - static CCTK_REAL (* const rfloor) (CCTK_REAL const) = floor; - int const stride = maxreflevelfact / reflevelfact; - return (ivect(map(rfloor, (pos - lower) / finest_delta / stride + 0.5)) - * stride); - } - - - void CarpetInterpStartup () { CCTK_OverloadInterpGridArrays (InterpGridArrays); @@ -77,11 +66,9 @@ namespace CarpetInterp { - // We want to be in level mode - assert (reflevel != -1); + // We want to be in global or in level mode if (hh->local_components(reflevel) != 1 && component != -1) { - CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, - "Cannot interpolate in local mode"); + CCTK_WARN (0, "Cannot interpolate in local mode"); } if (hh->local_components(reflevel) != 1) assert (component == -1); @@ -91,18 +78,14 @@ namespace CarpetInterp { const char * coord_system_name = CCTK_CoordSystemName (coord_system_handle); assert (coord_system_name); - rvect lower, upper; + rvect clower, cupper, cdelta; for (int d=0; dcctk_origin_space[d]; - upper[d] = cgh->cctk_origin_space[d] + (cgh->cctk_gsh[d] - 1) * cgh->cctk_delta_space[d] / cgh->cctk_levfac[d]; + ierr = CCTK_CoordRange + (cgh, &clower[d], &cupper[d], d+1, 0, coord_system_name); + assert (!ierr); + cdelta[d] = cgh->cctk_delta_space[d]; } - const ivect gsh (cgh->cctk_gsh ); - const rvect delta ((upper - lower) / rvect((gsh - 1) * maxreflevelfact)); - assert (interp_coords); for (int d=0; d=0 && myproccomponents(reflevel); + int const minrl = reflevel==-1 ? 0 : reflevel; + int const maxrl = reflevel==-1 ? hh->reflevels()-1 : reflevel; + int maxncomps = 0; + for (int rl=minrl; rlcomponents(rl)); + } // Assign interpolation points to components + vector rlev (N_interp_points); // refinement level of point n vector home (N_interp_points); // component of point n - vector homecnts (ncomps); // number of points in component c + vector homecnts ((maxrl-minrl) * maxncomps); // number of points in component c for (int n=0; nextents[reflevel][c][mglevel].contains(ipos)) { - home[n] = c; - break; + for (int rl=maxrl-1; rl>=minrl; --rl) { + + bbox const& baseext = dd->bases[rl][0].exterior; + rvect const lower = clower + cdelta / maxreflevelfact * rvect(baseext.lower()); + rvect const delta = cdelta / maxreflevelfact; + + CCTK_REAL (* const rfloor) (CCTK_REAL const) = floor; + int const stride = maxreflevelfact / reflevelfact; + ivect const ipos = ivect(map(rfloor, (pos - lower) / delta / stride + 0.5)) * stride; + + // TODO: use something faster than a linear search + for (int c=0; ccomponents(rl); ++c) { + if (hh->extents[reflevel][c][mglevel].contains(ipos)) { + rlev[n] = rl; + home[n] = c; + break; + } } } - if (! (home[n]>=0 && home[n]=minrl && rlev[n]=0 && home[n]components(rlev[n]))) { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, - "Interpolation point #%d at real [%g,%g,%g] is at integer [%d,%d,%d], which is not on any grid patch", - n, pos[0], pos[1], pos[2], ipos[0], ipos[1], ipos[2]); + "Interpolation point #%d at [%g,%g,%g] is not on any grid patch", + n, pos[0], pos[1], pos[2]); } - assert (home[n]>=0 && home[n]=minrl && rlev[n]=0 && home[n]components(rlev[n])); + ++ homecnts [home[n] + (rlev[n]-minrl) * maxncomps]; } // for n // Communicate counts - vector allhomecnts(nprocs * ncomps); - MPI_Allgather (&homecnts [0], ncomps, MPI_INT, - &allhomecnts[0], ncomps, MPI_INT, comm); + vector allhomecnts(nprocs * (maxrl-minrl) * maxncomps); + MPI_Allgather (&homecnts [0], (maxrl-minrl) * maxncomps, MPI_INT, + &allhomecnts[0], (maxrl-minrl) * maxncomps, MPI_INT, comm); // Create coordinate patches - vector > allcoords (nprocs * ncomps); + vector > allcoords (nprocs * (maxrl-minrl) * maxncomps); for (int p=0; pcomponents(rl); ++c) { + ivect lo (0); + ivect up (1); + up[0] = allhomecnts[c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p]; + up[1] = dim; + ivect str (1); + ibbox extent (lo, up-str, str); + allcoords [c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p].allocate (extent, p); + } } } // Fill in local coordinate patches { - vector tmpcnts (ncomps); + vector tmpcnts ((maxrl-minrl) * maxncomps); for (int n=0; n=0 && c=0 && tmpcnts[c]=minrl && rl=0 && ccomponents(rl)); + assert (tmpcnts[c + (rl-minrl)*maxncomps] >= 0 + && tmpcnts[c + (rl-minrl)*maxncomps] < homecnts[c + (rl-minrl)*maxncomps]); assert (dim==3); for (int d=0; dcomponents(rl); ++c) { + assert (tmpcnts[c + (rl-minrl)*maxncomps] == homecnts[c + (rl-minrl)*maxncomps]); + } } } // Transfer coordinate patches for (int p=0; pprocessors[reflevel][c]); + for (int rl=minrl; rlcomponents(rl); ++c) { + allcoords[c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p].change_processor (hh->processors[rl][c]); + } } } // Create output patches - vector > alloutputs (nprocs * ncomps); + vector > alloutputs (nprocs * (maxrl-minrl) * maxncomps); for (int p=0; pprocessors[reflevel][c]); + for (int rl=minrl; rlcomponents(rl); ++c) { + ivect lo (0); + ivect up (1); + up[0] = allhomecnts[c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p]; + up[1] = N_output_arrays; + ivect str (1); + ibbox extent (lo, up-str, str); + alloutputs[c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p].allocate (extent, hh->processors[rl][c]); + } } } @@ -221,115 +234,139 @@ namespace CarpetInterp { // // Do the local interpolation // - BEGIN_LOCAL_COMPONENT_LOOP(cgh) { - - // Find out about the local geometry - const ivect lbnd (cgh->cctk_lbnd); - const ivect lsh (cgh->cctk_lsh ); - - const rvect coord_delta = delta * (maxreflevelfact / reflevelfact); - const rvect coord_origin = lower + rvect(lbnd) * coord_delta; - - - - // Find out about the grid functions - vector input_array_type_codes(N_input_arrays); - vector input_arrays(N_input_arrays); - for (int n=0; n=0 && vi=0 && gi=minrl && reflevelcctk_lsh[d]; + coord_origin[d] = cgh->cctk_origin_space[d]; + coord_delta[d] = cgh->cctk_delta_space[d] / cgh->cctk_levfac[d]; + } + + + + // Find out about the grid functions + vector input_array_type_codes(N_input_arrays); + vector input_arrays(N_input_arrays); + for (int n=0; n=0 && vi=0 && gi tmp_interp_coords (dim); + for (int d=0; d tmp_output_arrays (N_output_arrays); + for (int m=0; m tmp_interp_coords (dim); - for (int d=0; d tmp_output_arrays (N_output_arrays); - for (int m=0; mcomponents(rl); ++c) { + alloutputs[c + (rl-minrl)*maxncomps + (maxrl-minrl)*maxncomps*p].change_processor (p); + } } } // Read out local output patches { - vector tmpcnts (ncomps); + vector tmpcnts ((maxrl-minrl) * maxncomps); for (int n=0; ncomponents(rl); ++c) { + assert (tmpcnts[c + (rl-minrl)*maxncomps] == homecnts[c + (rl-minrl)*maxncomps]); + } } } -- cgit v1.2.3