aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschnetter <>2004-04-22 12:17:00 +0000
committerschnetter <>2004-04-22 12:17:00 +0000
commit507cea5ca644ec8bc02839708215bbdce7cd6ff7 (patch)
tree489b93ebe0102249e12f9598188fe3cf06706044
parent0268d4628c658ee228d70bdf07bc057b163f0135 (diff)
Ensure that vector leaders are handled consistently
darcs-hash:20040422121713-07bb3-1ef5a3ac1752f5f05d3e010bf9390bc6cff7ea79.gz
-rw-r--r--Carpet/CarpetLib/src/data.cc35
-rw-r--r--Carpet/CarpetLib/src/data.hh20
-rw-r--r--Carpet/CarpetLib/src/dh.cc4
3 files changed, 49 insertions, 10 deletions
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc
index 3c46856a2..6c258ebc8 100644
--- a/Carpet/CarpetLib/src/data.cc
+++ b/Carpet/CarpetLib/src/data.cc
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.53 2004/04/18 13:04:08 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.54 2004/04/22 14:17:13 schnetter Exp $
#include <assert.h>
#include <limits.h>
@@ -44,6 +44,8 @@ data<T,D>::data (const int varindex_, const operator_type transport_operator_,
assert (vectorindex>=0 && vectorindex<vectorlength);
assert ((vectorindex==0 && !vectorleader)
|| (vectorindex!=0 && vectorleader));
+ if (vectorindex==0) vectorclients.resize (vectorlength);
+ if (vectorleader) vectorleader->register_client (vectorindex);
}
template<class T, int D>
@@ -60,6 +62,8 @@ data<T,D>::data (const int varindex_, const operator_type transport_operator_,
assert (vectorindex>=0 && vectorindex<vectorlength);
assert ((vectorindex==0 && !vectorleader)
|| (vectorindex!=0 && vectorleader));
+ if (vectorindex==0) vectorclients.resize (vectorlength);
+ if (vectorleader) vectorleader->register_client (vectorindex);
allocate(extent_, proc_);
}
@@ -67,6 +71,8 @@ data<T,D>::data (const int varindex_, const operator_type transport_operator_,
template<class T, int D>
data<T,D>::~data ()
{
+ if (vectorleader) vectorleader->unregister_client (vectorindex);
+ if (vectorindex==0) assert (! has_clients());
free();
}
@@ -81,6 +87,33 @@ data<T,D>* data<T,D>::make_typed (const int varindex_,
+// Vector mamagement
+template<class T, int D>
+void data<T,D>::register_client (const int index)
+{
+ assert (! vectorclients.at(index));
+ vectorclients.at(index) = true;
+}
+
+template<class T, int D>
+void data<T,D>::unregister_client (const int index)
+{
+ assert (vectorclients.at(index));
+ vectorclients.at(index) = false;
+}
+
+template<class T, int D>
+bool data<T,D>::has_clients ()
+{
+ bool retval = false;
+ for (size_t n=0; n<vectorlength; ++n) {
+ retval |= vectorclients.at(n);
+ }
+ return retval;
+}
+
+
+
// Storage management
template<class T, int D>
void data<T,D>::getmem (const size_t nelems)
diff --git a/Carpet/CarpetLib/src/data.hh b/Carpet/CarpetLib/src/data.hh
index 961e9020c..82664d907 100644
--- a/Carpet/CarpetLib/src/data.hh
+++ b/Carpet/CarpetLib/src/data.hh
@@ -1,12 +1,12 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.21 2004/04/13 11:13:48 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.22 2004/04/22 14:17:13 schnetter Exp $
#ifndef DATA_HH
#define DATA_HH
-#include <assert.h>
-
+#include <cassert>
#include <iostream>
#include <string>
+#include <vector>
#include "cctk.h"
@@ -20,7 +20,7 @@ using namespace std;
-// A real data storage
+// A distributed multi-dimensional array
template<class T,int D>
class data: public gdata<D>
{
@@ -33,9 +33,15 @@ class data: public gdata<D>
T* _storage; // the data (if located on this processor)
size_t _allocated_bytes; // number of allocated bytes
- int vectorlength;
- int vectorindex;
- data* vectorleader;
+ // For vector groups with contiguous storage
+ int vectorlength; // number of vector elements
+ int vectorindex; // index of this vector element
+ data* vectorleader; // if index==0: first vector element
+ vector<bool> vectorclients; // if index==0: registered elements
+
+ void register_client (int index);
+ void unregister_client (int index);
+ bool has_clients ();
public:
diff --git a/Carpet/CarpetLib/src/dh.cc b/Carpet/CarpetLib/src/dh.cc
index 91ea92e52..e0f3ba1cc 100644
--- a/Carpet/CarpetLib/src/dh.cc
+++ b/Carpet/CarpetLib/src/dh.cc
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/dh.cc,v 1.52 2004/04/19 21:38:33 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/dh.cc,v 1.53 2004/04/22 14:17:30 schnetter Exp $
#include <assert.h>
@@ -584,7 +584,7 @@ void dh<D>::recompose () {
(*f)->recompose_fill (state, rl);
}
}
- for (typename list<ggf<D>*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
+ for (typename list<ggf<D>*>::reverse_iterator f=gfs.rbegin(); f!=gfs.rend(); ++f) {
(*f)->recompose_free (rl);
}
for (comm_state<D> state; !state.done(); state.step()) {