aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/gdata.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/CarpetLib/src/gdata.cc')
-rw-r--r--Carpet/CarpetLib/src/gdata.cc131
1 files changed, 128 insertions, 3 deletions
diff --git a/Carpet/CarpetLib/src/gdata.cc b/Carpet/CarpetLib/src/gdata.cc
index eb19701ce..5418db23a 100644
--- a/Carpet/CarpetLib/src/gdata.cc
+++ b/Carpet/CarpetLib/src/gdata.cc
@@ -5,7 +5,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.cc,v 1.8 2001/03/19 21:30:19 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/gdata.cc,v 1.9 2001/03/22 18:42:05 eschnett Exp $
***************************************************************************/
@@ -18,7 +18,8 @@
* *
***************************************************************************/
-#include <cassert>
+#include <assert.h>
+
#include <fstream>
#include <iomanip>
@@ -31,6 +32,8 @@
# include "gdata.hh"
#endif
+using namespace std;
+
// Constructors
@@ -45,6 +48,127 @@ generic_data<D>::~generic_data () { }
+// Data manipulators
+template<int D>
+void generic_data<D>::copy_from (const generic_data* src, const ibbox& box)
+{
+ assert (has_storage() && src->has_storage());
+ assert (all(box.lower()>=extent().lower()
+ && box.lower()>=src->extent().lower()));
+ assert (all(box.upper()<=extent().upper()
+ && box.upper()<=src->extent().upper()));
+ assert (all(box.stride()==extent().stride()
+ && box.stride()==src->extent().stride()));
+ assert (all((box.lower()-extent().lower())%box.stride() == 0
+ && (box.lower()-src->extent().lower())%box.stride() == 0));
+
+ if (proc() == src->proc()) {
+ // copy on same processor
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ if (rank == proc()) {
+ copy_from_innerloop (src, box);
+ }
+
+ } else {
+
+ // copy to different processor
+ generic_data* const tmp = make_typed();
+ tmp->allocate (box, src->proc());
+ tmp->copy_from (src, box);
+ tmp->change_processor (proc());
+ copy_from (tmp, box);
+ delete tmp;
+
+ }
+}
+
+
+
+template<int D>
+void generic_data<D>
+::interpolate_from (const generic_data* src, const ibbox& box)
+{
+ assert (has_storage() && src->has_storage());
+ assert (all(box.lower()>=extent().lower()
+ && box.upper()<=extent().upper()));
+ assert (all(box.lower()>=extent().lower()
+ && box.lower()>=src->extent().lower()));
+ assert (all(box.upper()<=extent().upper()
+ && box.upper()<=src->extent().upper()));
+ assert (all(box.stride()==extent().stride()));
+ assert (all((box.lower()-extent().lower())%box.stride() == 0));
+
+ if (proc() == src->proc()) {
+ // interpolate on same processor
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ if (rank == proc()) {
+ interpolate_from_innerloop (src, box);
+ }
+
+ } else {
+ // interpolate from other processor
+
+ generic_data* const tmp = make_typed();
+ tmp->allocate (box, src->proc());
+ tmp->interpolate_from (src, box);
+ tmp->change_processor (proc());
+ copy_from (tmp, box);
+ delete tmp;
+
+ }
+}
+
+
+
+template<int D>
+void generic_data<D>
+::interpolate_from (const generic_data* src1, const int t1,
+ const generic_data* src2, const int t2,
+ const ibbox& box, const int t)
+{
+ assert (has_storage() && src1->has_storage() && src2->has_storage());
+ assert (all(box.lower()>=extent().lower()
+ && box.upper()<=extent().upper()));
+ assert (all(box.lower()>=extent().lower()
+ && box.lower()>=src1->extent().lower()
+ && box.lower()>=src2->extent().lower()));
+ assert (all(box.upper()<=extent().upper()
+ && box.upper()<=src1->extent().upper()
+ && box.upper()<=src2->extent().upper()));
+ assert (all(box.stride()==extent().stride()));
+ assert (all((box.lower()-extent().lower())%box.stride() == 0
+ && (box.lower()-src1->extent().lower())%box.stride() == 0
+ && (box.lower()-src2->extent().lower())%box.stride() == 0));
+ assert (src1->proc() == src2->proc());
+
+ if (proc() == src1->proc()) {
+ // interpolate on same processor
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ if (rank == proc()) {
+ interpolate_from_innerloop (src1, t1, src2, t2, box, t);
+ }
+
+ } else {
+ // interpolate from other processor
+
+ generic_data* const tmp = make_typed();
+ tmp->allocate (box, src1->proc());
+ tmp->interpolate_from (src1, t1, src2, t2, box, t);
+ tmp->change_processor (proc());
+ copy_from (tmp, box);
+ delete tmp;
+
+ }
+}
+
+
+
// Output
template<int D>
template<int DD>
@@ -75,7 +199,8 @@ void generic_data<D>::write_ascii (const string name, const int time,
<< " component " << c << " multigrid level " << ml << endl
<< "# column format: it tl rl c ml";
assert (D>=1 && D<=3);
- for (int d=0; d<D; ++d) file << " " << "xyz"[d];
+ const char* const coords = "xyz";
+ for (int d=0; d<D; ++d) file << " " << coords[d];
file << " data" << endl;
const vect<int,DD> lo = extent().lower()[dirs];