aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/data.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/CarpetLib/src/data.cc')
-rw-r--r--Carpet/CarpetLib/src/data.cc74
1 files changed, 39 insertions, 35 deletions
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;
}