aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/gdata.hh
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/CarpetLib/src/gdata.hh')
-rw-r--r--Carpet/CarpetLib/src/gdata.hh219
1 files changed, 219 insertions, 0 deletions
diff --git a/Carpet/CarpetLib/src/gdata.hh b/Carpet/CarpetLib/src/gdata.hh
new file mode 100644
index 000000000..9355238dd
--- /dev/null
+++ b/Carpet/CarpetLib/src/gdata.hh
@@ -0,0 +1,219 @@
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.hh,v 1.24 2004/04/19 07:56:35 schnetter Exp $
+
+#ifndef GDATA_HH
+#define GDATA_HH
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "cctk.h"
+
+#include "defs.hh"
+#include "dist.hh"
+#include "bbox.hh"
+#include "operators.hh"
+#include "vect.hh"
+
+using namespace std;
+
+
+
+
+template<int D>
+class gdata;
+
+
+
+// State information for communications
+enum astate { state_recv, state_send, state_wait, state_done };
+
+template<int D>
+struct comm_state {
+ astate thestate;
+ comm_state ();
+ void step ();
+ bool done ();
+ ~comm_state ();
+
+ vector<gdata<D>*> tmps;
+ size_t current;
+};
+
+
+
+// A generic data storage without type information
+template<int D>
+class gdata {
+
+ // Types
+ typedef vect<int,D> ivect;
+ typedef bbox<int,D> ibbox;
+
+protected: // should be readonly
+
+ // Fields
+ int varindex; // Cactus variable index, or -1
+ operator_type transport_operator;
+
+ double wtime_isend, wtime_isendwait;
+ double wtime_irecv, wtime_irecvwait;
+
+ bool _has_storage; // has storage associated (on some processor)
+ bool _owns_storage; // owns the storage
+ // (only valid if there is storage on this processor; it means that
+ // the memory is allocated and freed by this class)
+ int _size; // size
+
+ int _proc; // stored on processor
+
+ ivect _shape, _stride; // shape and index order
+
+ ibbox _extent; // bbox for all data
+
+ bool comm_active;
+ MPI_Request request;
+
+ int tag; // MPI tag for this object
+
+public:
+
+ // Constructors
+ gdata (const int varindex,
+ const operator_type transport_operator = op_error);
+
+ // Destructors
+ virtual ~gdata ();
+
+ // Pseudo constructors
+ virtual gdata<D>*
+ make_typed (const int varindex,
+ const operator_type transport_operator = op_error) const = 0;
+
+ // Processor management
+ virtual void change_processor (comm_state<D>& state,
+ const int newproc, void* const mem=0) = 0;
+ protected:
+ virtual void change_processor_recv (const int newproc, void* const mem=0) = 0;
+ virtual void change_processor_send (const int newproc, void* const mem=0) = 0;
+ virtual void change_processor_wait (const int newproc, void* const mem=0) = 0;
+ public:
+
+ // Storage management
+ virtual void transfer_from (gdata<D>* src) = 0;
+
+ virtual void allocate (const ibbox& extent, const int proc,
+ void* const mem=0) = 0;
+ virtual void free () = 0;
+
+ // Accessors
+
+ bool has_storage () const {
+ return _has_storage;
+ }
+ bool owns_storage () const {
+ assert (_has_storage);
+ return _owns_storage;
+ }
+
+ virtual const void* storage () const = 0;
+
+ virtual void* storage () = 0;
+
+ int size () const {
+ assert (_has_storage);
+ return _size;
+ }
+
+ int proc () const {
+ assert (_has_storage);
+ return _proc;
+ }
+
+ const ivect& shape () const {
+ assert (_has_storage);
+ return _shape;
+ }
+
+ const ivect& stride () const {
+ assert (_has_storage);
+ return _stride;
+ }
+
+ const ibbox& extent () const {
+ assert (_has_storage);
+ return _extent;
+ }
+
+ // Data accessors
+ int offset (const ivect& index) const {
+ assert (_has_storage);
+ assert (all((index-extent().lower()) % extent().stride() == 0));
+ ivect ind = (index-extent().lower()) / extent().stride();
+ assert (all(ind>=0 && ind<=shape()));
+ return dot(ind, stride());
+ }
+
+ // Data manipulators
+ public:
+ void copy_from (comm_state<D>& state,
+ const gdata* src, const ibbox& box);
+ private:
+ void copy_from_nocomm (const gdata* src, const ibbox& box);
+ void copy_from_recv (comm_state<D>& state,
+ const gdata* src, const ibbox& box);
+ void copy_from_send (comm_state<D>& state,
+ const gdata* src, const ibbox& box);
+ void copy_from_wait (comm_state<D>& state,
+ const gdata* src, const ibbox& box);
+ public:
+ void interpolate_from (comm_state<D>& state,
+ const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time);
+ private:
+ void interpolate_from_nocomm (const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time);
+ void interpolate_from_recv (comm_state<D>& state,
+ const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time);
+ void interpolate_from_send (comm_state<D>& state,
+ const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time);
+ void interpolate_from_wait (comm_state<D>& state,
+ const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time);
+ public:
+
+protected:
+ virtual void
+ copy_from_innerloop (const gdata* src, const ibbox& box) = 0;
+ virtual void
+ interpolate_from_innerloop (const vector<const gdata*> srcs,
+ const vector<CCTK_REAL> times,
+ const ibbox& box, const CCTK_REAL time,
+ const int order_space,
+ const int order_time) = 0;
+
+};
+
+
+
+#endif // GDATA_HH