aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
diff options
context:
space:
mode:
authoreschnett <>2001-03-01 11:40:00 +0000
committereschnett <>2001-03-01 11:40:00 +0000
commit310f0ea48d18866b773136aed11200b6eda6378b (patch)
tree445d3e34ce8b89812994b6614f7bc9f4acbc7fe2 /Carpet/CarpetRegrid/src/manualcoordinatelist.cc
Initial revision
darcs-hash:20010301114010-f6438-12fb8a9ffcc80e86c0a97e37b5b0dae0dbc59b79.gz
Diffstat (limited to 'Carpet/CarpetRegrid/src/manualcoordinatelist.cc')
-rw-r--r--Carpet/CarpetRegrid/src/manualcoordinatelist.cc185
1 files changed, 185 insertions, 0 deletions
diff --git a/Carpet/CarpetRegrid/src/manualcoordinatelist.cc b/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
new file mode 100644
index 000000000..10e40ecbd
--- /dev/null
+++ b/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
@@ -0,0 +1,185 @@
+#include <cassert>
+#include <cmath>
+#include <cstring>
+#include <sstream>
+#include <vector>
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+
+#include "gh.hh"
+
+#include "carpet.hh"
+#include "regrid.hh"
+
+extern "C" {
+ static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetRegrid/src/manualcoordinatelist.cc,v 1.12 2004/08/14 07:42:00 schnetter Exp $";
+ CCTK_FILEVERSION(Carpet_CarpetRegrid_manualcoordinatelist_cc);
+}
+
+
+
+namespace CarpetRegrid {
+
+ using namespace std;
+ using namespace Carpet;
+
+
+
+ int ManualCoordinateList (cGH const * const cctkGH,
+ gh<dim> const & hh,
+ gh<dim>::rexts & bbsss,
+ gh<dim>::rbnds & obss,
+ gh<dim>::rprocs & pss)
+ {
+ DECLARE_CCTK_PARAMETERS;
+ int ierr;
+
+ assert (refinement_levels >= 1);
+
+ // do nothing if the levels already exist
+ if (reflevel == refinement_levels) return 0;
+
+ assert (bbsss.size() >= 1);
+
+ 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);
+
+ bbsss.resize (refinement_levels);
+ obss.resize (refinement_levels);
+ pss.resize (refinement_levels);
+
+ vector<vector<rbbox> > newbbss;
+ if (strcmp(coordinates, "") != 0) {
+ istringstream gp_str(coordinates);
+ try {
+ gp_str >> newbbss;
+ } catch (input_error) {
+ CCTK_WARN (0, "Could not parse parameter \"coordinates\"");
+ }
+ }
+
+ vector<vector<bbvect> > newobss;
+ if (smart_outer_boundaries) {
+ // TODO:
+ // assert (domain_from_coordbase);
+
+ newobss.resize(newbbss.size());
+ for (size_t rl=0; rl<newobss.size(); ++rl) {
+ newobss.at(rl).resize(newbbss.at(rl).size());
+ for (size_t c=0; c<newobss.at(rl).size(); ++c) {
+ for (int d=0; d<dim; ++d) {
+ assert (mglevel==0);
+ rvect const spacing = base_spacing * pow(CCTK_REAL(mgfact), basemglevel) / ipow(reffact, rl+1);
+ ierr = ConvertFromPhysicalBoundary
+ (dim, &physical_min[0], &physical_max[0],
+ &interior_min[0], &interior_max[0],
+ &exterior_min[0], &exterior_max[0], &spacing[0]);
+ assert (!ierr);
+ newobss.at(rl).at(c)[d][0] = abs(newbbss.at(rl).at(c).lower()[d] - physical_min[d]) < 1.0e-6 * spacing[d];
+ if (newobss.at(rl).at(c)[d][0]) {
+ rvect lo = newbbss.at(rl).at(c).lower();
+ rvect up = newbbss.at(rl).at(c).upper();
+ rvect str = newbbss.at(rl).at(c).stride();
+ lo[d] = exterior_min[d];
+ newbbss.at(rl).at(c) = rbbox(lo, up, str);
+ }
+ newobss.at(rl).at(c)[d][1] = abs(newbbss.at(rl).at(c).upper()[d] - physical_max[d]) < 1.0e-6 * base_spacing[d] / ipow(reffact, rl);
+ if (newobss.at(rl).at(c)[d][1]) {
+ rvect lo = newbbss.at(rl).at(c).lower();
+ rvect up = newbbss.at(rl).at(c).upper();
+ rvect str = newbbss.at(rl).at(c).stride();
+ up[d] = exterior_max[d];
+ newbbss.at(rl).at(c) = rbbox(lo, up, str);
+ }
+ }
+ }
+ }
+
+ } else { // if ! smart_outer_boundaries
+
+ if (strcmp(outerbounds, "") !=0 ) {
+ istringstream ob_str (outerbounds);
+ try {
+ ob_str >> newobss;
+ } catch (input_error) {
+ CCTK_WARN (0, "Could not parse parameter \"outerbounds\"");
+ }
+ bool good = newobss.size() == newbbss.size();
+ if (good) {
+ for (size_t rl=0; rl<newobss.size(); ++rl) {
+ good = good && newobss.at(rl).size() == newbbss.at(rl).size();
+ }
+ }
+ if (! good) {
+ cout << "coordinates: " << newbbss << endl;
+ cout << "outerbounds: " << newobss << endl;
+ CCTK_WARN (0, "The parameters \"outerbounds\" and \"coordinates\" must have the same structure");
+ }
+ } else {
+ newobss.resize(newbbss.size());
+ for (size_t rl=0; rl<newobss.size(); ++rl) {
+ newobss.at(rl).resize(newbbss.at(rl).size());
+ for (size_t c=0; c<newobss.at(rl).size(); ++c) {
+ newobss.at(rl).at(c) = bbvect(false);
+ }
+ }
+ }
+
+ } // if ! smart_outer_boundaries
+
+ if (newbbss.size() < refinement_levels-1) {
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The parameter \"coordinates\" must contain at least \"refinement_levels-1\" (here: %d) levels", int(refinement_levels-1));
+ }
+
+ for (size_t rl=1; rl<refinement_levels; ++rl) {
+
+ vector<ibbox> bbs;
+ gh<dim>::cbnds obs;
+
+ bbs.reserve (newbbss.at(rl-1).size());
+ obs.reserve (newbbss.at(rl-1).size());
+
+ for (size_t c=0; c<newbbss.at(rl-1).size(); ++c) {
+ rbbox const & ext = newbbss.at(rl-1).at(c);
+ bbvect const & ob = newobss.at(rl-1).at(c);
+ // TODO:
+ // assert (domain_from_coordbase);
+ rvect const spacing = base_spacing * pow(CCTK_REAL(mgfact), basemglevel) / ipow(reffact, rl);
+ assert (all(abs(ext.stride() - spacing) < spacing * 1.0e-10));
+ ManualCoordinates_OneLevel
+ (cctkGH, hh, rl, refinement_levels,
+ ext.lower(), ext.upper(), ob, bbs, obs);
+ }
+
+ // make multiprocessor aware
+ gh<dim>::cprocs ps;
+ SplitRegions (cctkGH, bbs, obs, ps);
+
+ // make multigrid aware
+ vector<vector<ibbox> > bbss;
+ MakeMultigridBoxes (cctkGH, bbs, obs, bbss);
+
+ bbsss.at(rl) = bbss;
+ obss.at(rl) = obs;
+ pss.at(rl) = ps;
+
+ } // for rl
+
+ return 1;
+ }
+
+} // namespace CarpetRegrid