aboutsummaryrefslogtreecommitdiff
path: root/Carpet
diff options
context:
space:
mode:
authoreschnett <>2001-03-14 10:00:00 +0000
committereschnett <>2001-03-14 10:00:00 +0000
commitdd35eeaa5a9962db0bec5c378ba0345038b02cfb (patch)
treec51274e67aa92dc4f00b7f37c1983126e739c257 /Carpet
parent1df10e07ab253a3ff3cb0f1683eb93182ca3dcab (diff)
Made two refinement levels work on two processors. Lessons learnt: A
Made two refinement levels work on two processors. Lessons learnt: A storage contained might well contain zero elements, and Don't return references to temporary objects. darcs-hash:20010314100017-f6438-29ce1a19a498067588eaf0f027a00000abe40d8d.gz
Diffstat (limited to 'Carpet')
-rw-r--r--Carpet/Carpet/src/carpet.cc8
-rw-r--r--Carpet/CarpetLib/src/bbox.hh9
-rw-r--r--Carpet/CarpetLib/src/data.cc74
-rw-r--r--Carpet/CarpetLib/src/gdata.hh10
-rw-r--r--Carpet/CarpetLib/src/ggf.cc7
5 files changed, 55 insertions, 53 deletions
diff --git a/Carpet/Carpet/src/carpet.cc b/Carpet/Carpet/src/carpet.cc
index 1ebb4a70d..e1fee926c 100644
--- a/Carpet/Carpet/src/carpet.cc
+++ b/Carpet/Carpet/src/carpet.cc
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.9 2001/03/13 17:40:30 eschnett Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.10 2001/03/14 11:00:17 eschnett Exp $
/* It is assumed that the number of components of all arrays is equal
to the number of components of the grid functions, and that their
@@ -32,7 +32,7 @@
#include "carpet.hh"
-static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.9 2001/03/13 17:40:30 eschnett Exp $";
+static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/Carpet/src/Attic/carpet.cc,v 1.10 2001/03/14 11:00:17 eschnett Exp $";
@@ -931,8 +931,8 @@ namespace Carpet {
abort();
}
- // The return value seems to be 1 (success) no matter whether
- // storage has actually been disabled.
+ // The return values seems to be whether storage was enabled
+ // previously, and not whether storage is enabled now.
return retval;
}
diff --git a/Carpet/CarpetLib/src/bbox.hh b/Carpet/CarpetLib/src/bbox.hh
index 14aeb7895..db43519b4 100644
--- a/Carpet/CarpetLib/src/bbox.hh
+++ b/Carpet/CarpetLib/src/bbox.hh
@@ -5,7 +5,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/bbox.hh,v 1.5 2001/03/12 16:54:25 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/bbox.hh,v 1.6 2001/03/14 11:00:26 eschnett Exp $
***************************************************************************/
@@ -54,9 +54,10 @@ public:
const vect<T,D>& stride);
// Accessors
- const vect<T,D>& lower () const { return _lower; }
- const vect<T,D>& upper () const { return _upper; }
- const vect<T,D>& stride () const { return _stride; }
+ // (Don't return references; *this might be a temporary)
+ vect<T,D> lower () const { return _lower; }
+ vect<T,D> upper () const { return _upper; }
+ vect<T,D> stride () const { return _stride; }
vect<T,D> shape () const { return _upper - _lower + _stride; }
bool empty() const {
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc
index b2c190865..683139ebe 100644
--- a/Carpet/CarpetLib/src/data.cc
+++ b/Carpet/CarpetLib/src/data.cc
@@ -5,7 +5,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.4 2001/03/10 20:55:06 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.5 2001/03/14 11:00:26 eschnett Exp $
***************************************************************************/
@@ -60,6 +60,8 @@ data<T,D>* data<T,D>::make_typed () const {
return new data();
}
+
+
// Storage management
template<class T, int D>
void data<T,D>::allocate (const ibbox& extent, const int proc,
@@ -68,7 +70,7 @@ void data<T,D>::allocate (const ibbox& extent, const int proc,
_has_storage = true;
// data
_extent = extent;
- _shape = _extent.shape() / _extent.stride();
+ _shape = max(ivect(0), _extent.shape() / _extent.stride());
_size = 1;
for (int d=0; d<D; ++d) {
_stride[d] = _size;
@@ -79,7 +81,7 @@ void data<T,D>::allocate (const ibbox& extent, const int proc,
MPI_Comm_rank (dist::comm, &rank);
if (rank==_proc) {
_owns_storage = !mem;
- if (!mem) {
+ if (_owns_storage) {
_storage = new T[_size];
} else {
_storage = (T*)mem;
@@ -104,8 +106,9 @@ void data<T,D>::transfer_from (generic_data<D>* gsrc) {
*src = data();
}
-// Processor management
+
+// Processor management
template<class T, int D>
void data<T,D>::change_processor (const int newproc, void* const mem=0) {
if (newproc == _proc) {
@@ -121,7 +124,7 @@ void data<T,D>::change_processor (const int newproc, void* const mem=0) {
assert (!_storage);
_owns_storage = !mem;
- if (!mem) {
+ if (_owns_storage) {
_storage = new T[_size];
} else {
_storage = (T*)mem;
@@ -155,11 +158,13 @@ void data<T,D>::change_processor (const int newproc, void* const mem=0) {
_proc = newproc;
}
+
+
// Data manipulators
template<class T, int D>
void data<T,D>::copy_from (const generic_data<D>* gsrc, const ibbox& box) {
const data* src = (const data*)gsrc;
- assert (_has_storage && src->_has_storage);
+ assert (has_storage() && src->has_storage());
assert (all(box.lower()>=extent().lower()
&& box.lower()>=src->extent().lower()));
assert (all(box.upper()<=extent().upper()
@@ -168,14 +173,14 @@ void data<T,D>::copy_from (const generic_data<D>* gsrc, const ibbox& box) {
&& box.stride()==src->extent().stride()));
assert (all((box.lower()-extent().lower())%box.stride() == 0
&& (box.lower()-src->extent().lower())%box.stride() == 0));
-
- if (_proc == src->_proc) {
+
+ if (proc() == src->proc()) {
// copy on same processor
-
+
int rank;
MPI_Comm_rank (dist::comm, &rank);
- if (rank == _proc) {
-
+ if (rank == proc()) {
+
for (ibbox::iterator it=box.begin(); it!=box.end(); ++it) {
const ivect index = *it;
(*this)[index] = (*src)[index];
@@ -186,7 +191,7 @@ void data<T,D>::copy_from (const generic_data<D>* gsrc, const ibbox& box) {
} else {
// copy to different processor
- data* const tmp = new data(box, src->_proc);
+ data* const tmp = new data(box, src->proc());
tmp->copy_from (src, box);
tmp->change_processor (_proc);
copy_from (tmp, box);
@@ -200,7 +205,7 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
const ibbox& box)
{
const data* src = (const data*)gsrc;
- assert (_has_storage && src->_has_storage);
+ assert (has_storage() && src->has_storage());
assert (all(box.lower()>=extent().lower()
&& box.upper()<=extent().upper()));
assert (all(box.lower()>=extent().lower()
@@ -211,14 +216,14 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
/* && box.stride()<=src->extent().stride() */ ));
assert (all((box.lower()-extent().lower())%box.stride() == 0
/* && (box.lower()-src->extent().lower())%box.stride() == 0 */ ));
-
- if (_proc == src->_proc) {
+
+ if (proc() == src->proc()) {
// interpolate on same processor
int rank;
MPI_Comm_rank (dist::comm, &rank);
- if (rank == _proc) {
-
+ if (rank == proc()) {
+
for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
const ivect& pos = *posi;
@@ -248,9 +253,9 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
} else {
// interpolate from other processor
- data* const tmp = new data(box, src->_proc);
+ data* const tmp = new data(box, src->proc());
tmp->interpolate_from (src, box);
- tmp->change_processor (_proc);
+ tmp->change_processor (proc());
copy_from (tmp, box);
delete tmp;
@@ -266,7 +271,7 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
{
const data* src = (const data*)gsrc;
const data* trc = (const data*)gtrc;
- assert (_has_storage && src->_has_storage && trc->_has_storage);
+ assert (has_storage() && src->has_storage() && trc->has_storage());
assert (all(box.lower()>=extent().lower()
&& box.upper()<=extent().upper()));
assert (all(box.lower()>=extent().lower()
@@ -281,21 +286,22 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
assert (all((box.lower()-extent().lower())%box.stride() == 0
&& (box.lower()-src->extent().lower())%box.stride() == 0
&& (box.lower()-trc->extent().lower())%box.stride() == 0));
-
- if (_proc == src->_proc && _proc == trc->_proc) {
+ assert (src->proc() == trc->proc());
+
+ if (proc() == src->proc()) {
// interpolate on same processor
int rank;
MPI_Comm_rank (dist::comm, &rank);
- if (rank == _proc) {
-
+ if (rank == proc()) {
+
for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
const ivect& pos = *posi;
-
+
// get box around current position
const ibbox frombox
= ibbox(pos,pos,extent().stride()).expanded_for(src->extent());
-
+
// interpolate from box to position
T src_sum = 0;
T trc_sum = 0;
@@ -314,18 +320,16 @@ void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
(*this)[pos] = (T)sfact * src_sum + (T)tfact * trc_sum;
} // for pos
-
+
}
} else {
- // interpolate from other processors
-
- data* const smp = new data(box, src->_proc);
- smp->copy_from (src, box);
- data* const tmp = new data(box, trc->_proc);
- tmp->copy_from (trc, box);
- interpolate_from (smp, sfact, tmp, tfact, box);
- delete smp;
+ // interpolate from other processor
+
+ data* const tmp = new data(box, src->proc());
+ tmp->interpolate_from (src, sfact, trc, tfact, box);
+ tmp->change_processor (proc());
+ copy_from (tmp, box);
delete tmp;
}
diff --git a/Carpet/CarpetLib/src/gdata.hh b/Carpet/CarpetLib/src/gdata.hh
index 4e77071d1..e765cc7c6 100644
--- a/Carpet/CarpetLib/src/gdata.hh
+++ b/Carpet/CarpetLib/src/gdata.hh
@@ -5,7 +5,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.hh,v 1.3 2001/03/10 20:55:06 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.hh,v 1.4 2001/03/14 11:00:26 eschnett Exp $
***************************************************************************/
@@ -96,12 +96,12 @@ public:
virtual void* storage () = 0;
- ivect shape () const {
+ const ivect& shape () const {
assert (_has_storage);
return _shape;
}
- ivect stride () const {
+ const ivect& stride () const {
assert (_has_storage);
return _stride;
}
@@ -116,7 +116,7 @@ public:
return _proc;
}
- ibbox extent () const {
+ const ibbox& extent () const {
assert (_has_storage);
return _extent;
}
@@ -138,7 +138,7 @@ public:
virtual void interpolate_from (const generic_data* src, const double sfact,
const generic_data* trc, const double tfact,
const ibbox& box) = 0;
-
+
// Output
template<int DD>
void write_ascii (const string name, const int time,
diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc
index b8948dc3f..1d0371ac4 100644
--- a/Carpet/CarpetLib/src/ggf.cc
+++ b/Carpet/CarpetLib/src/ggf.cc
@@ -6,7 +6,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.3 2001/03/12 16:54:25 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.4 2001/03/14 11:00:26 eschnett Exp $
***************************************************************************/
@@ -165,9 +165,6 @@ void generic_gf<D>::copycat (int tl1, int rl1, int c1, int ml1,
assert (rl1>=0 && rl1<h.reflevels());
assert (c1>=0 && c1<h.components(rl1));
assert (ml1>=0 && ml1<h.mglevels(rl1,c1));
-#if 0
- cout << "copycat tmin " << tmin << " tmax " << tmax << endl;
-#endif
assert (tl2>=tmin && tl2<=tmax);
assert (rl2>=0 && rl2<h.reflevels());
const int c2=c1;
@@ -358,7 +355,7 @@ void generic_gf<D>::ref_bnd_prolongate (int tl, int rl, int c, int ml) {
assert (rl>=1);
double time =
(t.time(tl,rl,ml) - t.get_time(rl-1,ml)) / (double)t.get_delta(rl-1, ml);
- const int tl2 = (int)floor(time);
+ const int tl2 = (int)floor(time + 1e-6);
assert (tl2>=tmin && tl2<=tmax);
if (time==tl2) {
copycat (tl ,rl ,c,ml, &dh<D>::dboxes::recv_ref_bnd_coarse,