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.cc51
1 files changed, 44 insertions, 7 deletions
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc
index 4c30b44cf..ec6c87858 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.46 2004/03/23 12:14:29 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.47 2004/03/23 12:40:27 schnetter Exp $
#include <assert.h>
#include <limits.h>
@@ -28,17 +28,34 @@ using namespace std;
// Constructors
template<class T, int D>
-data<T,D>::data (const int varindex_, const operator_type transport_operator_)
+data<T,D>::data (const int varindex_, const operator_type transport_operator_,
+ const int vectorlength, const int vectorindex,
+ data* const vectorleader)
: gdata<D>(varindex_, transport_operator_),
- _storage(0)
-{ }
+ _storage(0),
+ vectorlength(vectorlength), vectorindex(vectorindex),
+ vectorleader(vectorleader)
+{
+ assert (vectorlength>=1);
+ assert (vectorindex>=0 && vectorindex<vectorlength);
+ assert ((vectorindex==0 && !vectorleader)
+ || (vectorindex!=0 && vectorleader));
+}
template<class T, int D>
data<T,D>::data (const int varindex_, const operator_type transport_operator_,
+ const int vectorlength, const int vectorindex,
+ data* const vectorleader,
const ibbox& extent_, const int proc_)
: gdata<D>(varindex_, transport_operator_),
- _storage(0)
+ _storage(0),
+ vectorlength(vectorlength), vectorindex(vectorindex),
+ vectorleader(vectorleader)
{
+ assert (vectorlength>=1);
+ assert (vectorindex>=0 && vectorindex<vectorlength);
+ assert ((vectorindex==0 && !vectorleader)
+ || (vectorindex!=0 && vectorleader));
allocate(extent_, proc_);
}
@@ -80,7 +97,13 @@ void data<T,D>::allocate (const ibbox& extent_, const int proc_,
if (rank==this->_proc) {
this->_owns_storage = !mem;
if (this->_owns_storage) {
- this->_storage = new T[this->_size];
+ if (this->vectorindex == 0) {
+ assert (! this->vectorleader);
+ this->_storage = new T[this->vectorlength * this->_size];
+ } else {
+ assert (this->vectorleader);
+ this->_storage = this->vectorleader->vectordata (this->vectorindex);
+ }
} else {
this->_storage = (T*)mem;
}
@@ -91,19 +114,33 @@ void data<T,D>::allocate (const ibbox& extent_, const int proc_,
template<class T, int D>
void data<T,D>::free () {
- if (this->_storage && this->_owns_storage) delete [] _storage;
+ if (this->_storage && this->_owns_storage && this->vectorindex==0) {
+ delete [] _storage;
+ }
_storage = 0;
this->_has_storage = false;
}
template<class T, int D>
void data<T,D>::transfer_from (gdata<D>* gsrc) {
+ assert (this->vectorlength==1);
data* src = (data*)gsrc;
+ assert (src->vectorlength==1);
assert (!_storage);
*this = *src;
*src = data(this->varindex, this->transport_operator);
}
+template<class T, int D>
+T* data<T,D>::vectordata (const int vectorindex) const
+{
+ assert (this->vectorindex==0);
+ assert (! this->vectorleader);
+ assert (vectorindex>=0 && vectorindex<this->vectorlength);
+ assert (this->_storage && this->_owns_storage);
+ return this->_storage + vectorindex * this->_size;
+}
+
// Processor management