aboutsummaryrefslogtreecommitdiff
path: root/Carpet
diff options
context:
space:
mode:
authorcott <schnetter@cct.lsu.edu>2006-02-22 14:48:00 +0000
committercott <schnetter@cct.lsu.edu>2006-02-22 14:48:00 +0000
commit0e0d0a99b6966b6ff900d754eea6a43af36ffe24 (patch)
tree1ae019ea2d483b78417c673ef09dc219df6c111b /Carpet
parent4840ad77a4530f6c10f7bb3d46c68ad35d48b804 (diff)
CarpetRegrid: Added support for BH Tracking
Two new parameters: bool tracking, default: no bool merge_overlapping_components, default: no tracking: Allow dynamic regridding using grid component coordinate offset steered by an external tracker thorn. merge_overlapping_components: Merges components once they touch. - Christian darcs-hash:20060222144838-34d71-3ee8ae0bad17aa08d270d5856cd7a0fccb4a0754.gz
Diffstat (limited to 'Carpet')
-rw-r--r--Carpet/CarpetRegrid/param.ccl9
-rw-r--r--Carpet/CarpetRegrid/src/manualcoordinatelist.cc67
2 files changed, 74 insertions, 2 deletions
diff --git a/Carpet/CarpetRegrid/param.ccl b/Carpet/CarpetRegrid/param.ccl
index 278b9abce..63d4f2c60 100644
--- a/Carpet/CarpetRegrid/param.ccl
+++ b/Carpet/CarpetRegrid/param.ccl
@@ -69,6 +69,15 @@ BOOLEAN smart_outer_boundaries "Use the CoordBase interface for outer boundaries
{
} no
+BOOLEAN merge_overlapping_components "Merge overlapping components" STEERABLE=always
+{
+} no
+
+BOOLEAN tracking "Enable tracking" STEERABLE=always
+{
+} no
+
+
# Region specifications for centre refinement
diff --git a/Carpet/CarpetRegrid/src/manualcoordinatelist.cc b/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
index e2c3b946c..f6c5950f8 100644
--- a/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
+++ b/Carpet/CarpetRegrid/src/manualcoordinatelist.cc
@@ -33,7 +33,7 @@ namespace CarpetRegrid {
assert (refinement_levels >= 1);
// do nothing if the levels already exist
- if (reflevel == refinement_levels) return 0;
+ if (reflevel == refinement_levels && !tracking) return 0;
assert (bbsss.size() >= 1);
vector<vector<ibbox> > bbss = bbsss.at(0);
@@ -177,12 +177,75 @@ namespace CarpetRegrid {
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<bbs.size();i++) {
+ merged_component[i] = 0;
+ }
+
+ // loop over all components, starting at c=1
+ for (size_t c=1; c<bbs.size(); ++c) {
+
+ ibset fun = bbs.at(c);
+ ibbox morefun = bbs.at(c);
+
+ // loop over all components with index < c
+ for(size_t sc=0; sc<c; ++sc) {
+
+ // calculate overlap of this and the previous component
+ fun &= bbs.at(sc);
+
+ // do we overlap ?
+ if(fun.size() > 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<ibbox> mergedbbs;
+ for (size_t c=0;c<bbs.size(); ++c) {
+
+ if(merged_component[c] == 0) {
+ mergedbbs.push_back (bbs.at(c));
+ }
+
+ }
+
+
+ bbs = mergedbbs;
+
+ // cout << "merged components: " << bbs << endl;
+
+ free(merged_component);
+
+ } // if (merge_overlapping_components && ...)
+
// make multiprocessor aware
gh::cprocs ps;
SplitRegions (cctkGH, bbs, obs, ps);