diff options
author | schnetter <> | 2004-03-23 11:40:00 +0000 |
---|---|---|
committer | schnetter <> | 2004-03-23 11:40:00 +0000 |
commit | 14cb6d98f2a1aa53d455f560b7b76134459b5b49 (patch) | |
tree | 2b9c5892a7dbba675fc014c88575403d470d17ec /Carpet/CarpetLib/src | |
parent | b6ae9419e78279c0d766b3bb95cbc52e1456cdb9 (diff) |
Implement vector groups correctly
darcs-hash:20040323114027-07bb3-1ac44b7b144e8936307942bc999d54ecb579719f.gz
Diffstat (limited to 'Carpet/CarpetLib/src')
-rw-r--r-- | Carpet/CarpetLib/src/data.cc | 51 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/data.hh | 16 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/gf.cc | 11 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/ggf.cc | 16 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/ggf.hh | 19 |
5 files changed, 85 insertions, 28 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 diff --git a/Carpet/CarpetLib/src/data.hh b/Carpet/CarpetLib/src/data.hh index a6658e23e..85e8a28fe 100644 --- a/Carpet/CarpetLib/src/data.hh +++ b/Carpet/CarpetLib/src/data.hh @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.17 2004/03/23 12:14:29 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.hh,v 1.18 2004/03/23 12:40:27 schnetter Exp $ #ifndef DATA_HH #define DATA_HH @@ -30,13 +30,21 @@ class data: public gdata<D> { // Fields T* _storage; // the data (if located on this processor) + + int vectorlength; + int vectorindex; + data* vectorleader; public: // Constructors data (const int varindex = -1, - const operator_type transport_operator = op_error); + const operator_type transport_operator = op_error, + const int vectorlength = 1, const int vectorindex = 0, + data* const vectorleader = NULL); data (const int varindex, const operator_type transport_operator, + const int vectorlength, const int vectorindex, + data* const vectorleader, const ibbox& extent, const int proc); // Destructors @@ -52,6 +60,10 @@ public: virtual void free (); virtual void transfer_from (gdata<D>* gsrc); +private: + T* vectordata (const int vectorindex) const; +public: + // Processor management virtual void change_processor (comm_state<D>& state, const int newproc, void* const mem=0); diff --git a/Carpet/CarpetLib/src/gf.cc b/Carpet/CarpetLib/src/gf.cc index 2fcec0d2f..b2b5198d4 100644 --- a/Carpet/CarpetLib/src/gf.cc +++ b/Carpet/CarpetLib/src/gf.cc @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gf.cc,v 1.15 2004/01/25 14:57:30 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gf.cc,v 1.16 2004/03/23 12:40:27 schnetter Exp $ #include <assert.h> @@ -13,15 +13,16 @@ using namespace std; // Constructors -// VGF template<class T,int D> gf<T,D>::gf (const int varindex, const operator_type transport_operator, th<D>& t, dh<D>& d, - const int tmin, const int tmax, const int prolongation_order_time) + const int tmin, const int tmax, const int prolongation_order_time, + const int vectorlength, const int vectorindex, + gf* const vectorleader) : ggf<D>(varindex, transport_operator, - t, d, tmin, tmax, prolongation_order_time) + t, d, tmin, tmax, prolongation_order_time, + vectorlength, vectorindex, vectorleader) { - // VGF this->recompose (0, true); } diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc index a1da9d3d6..877308389 100644 --- a/Carpet/CarpetLib/src/ggf.cc +++ b/Carpet/CarpetLib/src/ggf.cc @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.34 2004/03/23 09:26:49 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.cc,v 1.35 2004/03/23 12:40:27 schnetter Exp $ #include <assert.h> #include <stdlib.h> @@ -23,12 +23,16 @@ template<int D> ggf<D>::ggf (const int varindex, const operator_type transport_operator, th<D>& t, dh<D>& d, const int tmin, const int tmax, - const int prolongation_order_time) + const int prolongation_order_time, + const int vectorlength, const int vectorindex, + ggf* const vectorleader) : varindex(varindex), transport_operator(transport_operator), t(t), tmin(tmin), tmax(tmax), prolongation_order_time(prolongation_order_time), h(d.h), d(d), - storage(tmax-tmin+1) + storage(tmax-tmin+1), + vectorlength(vectorlength), vectorindex(vectorindex), + vectorleader(vectorleader) { assert (&t.h == &d.h); @@ -50,7 +54,6 @@ bool ggf<D>::operator== (const ggf<D>& f) const { // Modifiers -// VGF template<int D> void ggf<D>::recompose (const int initialise_from, const bool do_prolongate) { @@ -68,7 +71,7 @@ void ggf<D>::recompose (const int initialise_from, const bool do_prolongate) { for (int c=0; c<h.components(rl); ++c) { storage[tl-tmin][rl][c].resize(h.mglevels(rl,c)); for (int ml=0; ml<h.mglevels(rl,c); ++ml) { - storage[tl-tmin][rl][c][ml] = 0; + storage[tl-tmin][rl][c][ml] = NULL; } // for ml } // for c } // for rl @@ -80,10 +83,9 @@ void ggf<D>::recompose (const int initialise_from, const bool do_prolongate) { for (int c=0; c<h.components(rl); ++c) { for (int ml=0; ml<h.mglevels(rl,c); ++ml) { - storage[tl-tmin][rl][c][ml] = typed_data(); + storage[tl-tmin][rl][c][ml] = typed_data(tl,rl,c,ml); // Allocate storage - // VGF storage[tl-tmin][rl][c][ml]->allocate (d.boxes[rl][c][ml].exterior, h.proc(rl,c)); diff --git a/Carpet/CarpetLib/src/ggf.hh b/Carpet/CarpetLib/src/ggf.hh index 7b7c5c159..64998c8a2 100644 --- a/Carpet/CarpetLib/src/ggf.hh +++ b/Carpet/CarpetLib/src/ggf.hh @@ -1,4 +1,4 @@ -// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.hh,v 1.19 2004/03/23 09:26:49 schnetter Exp $ +// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/ggf.hh,v 1.20 2004/03/23 12:40:27 schnetter Exp $ #ifndef GGF_HH #define GGF_HH @@ -47,9 +47,9 @@ class ggf { typedef vector<mdata> cdata; // ... for each component typedef vector<cdata> rdata; // ... for each refinement level typedef vector<rdata> fdata; // ... for each time level - + public: // should be readonly - + // Fields int varindex; // Cactus variable index operator_type transport_operator; @@ -63,14 +63,20 @@ public: // should be readonly protected: fdata storage; // storage - + + int vectorlength; // vector length + int vectorindex; // index of *this + ggf* vectorleader; // first vector element + public: // Constructors ggf (const int varindex, const operator_type transport_operator, th<D>& t, dh<D>& d, const int tmin, const int tmax, - const int prolongation_order_time); + const int prolongation_order_time, + const int vectorlength, const int vectorindex, + ggf* const vectorleader); // Destructors virtual ~ggf (); @@ -81,7 +87,6 @@ public: // Modifiers - // VGF void recompose (const int initialise_from, const bool do_prolongate); // Cycle the time levels by rotating the data sets @@ -96,7 +101,7 @@ public: protected: - virtual gdata<D>* typed_data() = 0; + virtual gdata<D>* typed_data (int tl, int rl, int c, int ml) = 0; |