diff options
author | schnetter <> | 2004-04-22 12:17:00 +0000 |
---|---|---|
committer | schnetter <> | 2004-04-22 12:17:00 +0000 |
commit | 507cea5ca644ec8bc02839708215bbdce7cd6ff7 (patch) | |
tree | 489b93ebe0102249e12f9598188fe3cf06706044 | |
parent | 0268d4628c658ee228d70bdf07bc057b163f0135 (diff) |
Ensure that vector leaders are handled consistently
darcs-hash:20040422121713-07bb3-1ef5a3ac1752f5f05d3e010bf9390bc6cff7ea79.gz
-rw-r--r-- | Carpet/CarpetLib/src/data.cc | 35 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/data.hh | 20 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/dh.cc | 4 |
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()) { |