diff options
Diffstat (limited to 'Carpet/CarpetLib/src/gdata.cc')
-rw-r--r-- | Carpet/CarpetLib/src/gdata.cc | 131 |
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]; |