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.cc470
1 files changed, 342 insertions, 128 deletions
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc
index 932b692e6..23cd28b57 100644
--- a/Carpet/CarpetLib/src/data.cc
+++ b/Carpet/CarpetLib/src/data.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/data.cc,v 1.7 2001/03/19 21:30:19 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/data.cc,v 1.8 2001/03/22 18:42:05 eschnett Exp $
***************************************************************************/
@@ -18,12 +18,15 @@
* *
***************************************************************************/
-#include <cassert>
+#include <assert.h>
+
#include <fstream>
#include <string>
#include <mpi.h>
+#include "cctk.h"
+
#include "bbox.hh"
#include "defs.hh"
#include "dist.hh"
@@ -33,6 +36,8 @@
# include "data.hh"
#endif
+using namespace std;
+
// Constructors
@@ -65,7 +70,7 @@ data<T,D>* data<T,D>::make_typed () const {
// Storage management
template<class T, int D>
void data<T,D>::allocate (const ibbox& extent, const int proc,
- void* const mem=0) {
+ void* const mem) {
assert (!_has_storage);
_has_storage = true;
// data
@@ -110,7 +115,7 @@ void data<T,D>::transfer_from (generic_data<D>* gsrc) {
// Processor management
template<class T, int D>
-void data<T,D>::change_processor (const int newproc, void* const mem=0) {
+void data<T,D>::change_processor (const int newproc, void* const mem) {
if (newproc == _proc) {
assert (!mem);
return;
@@ -162,7 +167,9 @@ void data<T,D>::change_processor (const int newproc, void* const mem=0) {
// Data manipulators
template<class T, int D>
-void data<T,D>::copy_from (const generic_data<D>* gsrc, const ibbox& box) {
+void data<T,D>
+::copy_from_innerloop (const generic_data<D>* gsrc, const ibbox& box)
+{
const data* src = (const data*)gsrc;
assert (has_storage() && src->has_storage());
assert (all(box.lower()>=extent().lower()
@@ -174,164 +181,371 @@ void data<T,D>::copy_from (const generic_data<D>* gsrc, const ibbox& box) {
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
+ assert (proc() == src->proc());
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ for (ibbox::iterator it=box.begin(); it!=box.end(); ++it) {
+ const ivect index = *it;
+ (*this)[index] = (*src)[index];
+ }
+
+}
+
+
+
+template<class T, int D>
+void data<T,D>
+::interpolate_from_innerloop (const generic_data<D>* gsrc, const ibbox& box)
+{
+ const data* src = (const data*)gsrc;
+ 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));
+
+ assert (proc() == src->proc());
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
+ const ivect& pos = *posi;
- int rank;
- MPI_Comm_rank (dist::comm, &rank);
- if (rank == proc()) {
-
- for (ibbox::iterator it=box.begin(); it!=box.end(); ++it) {
- const ivect index = *it;
- (*this)[index] = (*src)[index];
+ // get box around current position
+ const ibbox frombox
+ = ibbox(pos,pos,extent().stride()).expanded_for(src->extent());
+
+ // interpolate from box to position
+ T sum = 0;
+ for (ibbox::iterator fromposi=frombox.begin();
+ fromposi!=frombox.end(); ++fromposi)
+ {
+ const ivect& frompos = *fromposi;
+
+ // interpolation weight
+ const ivect str = src->extent().stride();
+ const T f = prod(vect<T,D>(str - abs(pos - frompos))
+ / vect<T,D>(str));
+ sum += f * (*src)[frompos];
}
-
- }
+ (*this)[pos] = sum;
- } else {
+ } // for pos
+
+}
+
+
+
+template<class T, int D>
+void data<T,D>
+::interpolate_from_innerloop (const generic_data<D>* gsrc1, const int t1,
+ const generic_data<D>* gsrc2, const int t2,
+ const ibbox& box, const int t)
+{
+ const data* src1 = (const data*)gsrc1;
+ const data* src2 = (const data*)gsrc2;
+ 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());
+
+ assert (proc() == src1->proc());
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ const T one = 1;
+ const T src1_fac = (T)((t - t2) * one / (t1 - t2));
+ const T src2_fac = (T)((t - t1) * one / (t2 - t1));
+
+ for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
+ const ivect& pos = *posi;
- // copy to different processor
- data* const tmp = new data(box, src->proc());
- tmp->copy_from (src, box);
- tmp->change_processor (proc());
- copy_from (tmp, box);
- delete tmp;
+ // get box around current position
+ const ibbox frombox
+ = ibbox(pos,pos,extent().stride()).expanded_for(src1->extent());
- }
+ // interpolate from box to position
+ T src1_sum = 0;
+ T src2_sum = 0;
+ for (ibbox::iterator fromposi=frombox.begin();
+ fromposi!=frombox.end(); ++fromposi)
+ {
+ const ivect& frompos = *fromposi;
+
+ // interpolation weight
+ const ivect str = src1->extent().stride();
+ const T f = prod(vect<T,D>(str - abs(pos - frompos))
+ / vect<T,D>(str));
+ src1_sum += f * (*src1)[frompos];
+ src2_sum += f * (*src2)[frompos];
+ }
+ (*this)[pos] = src1_fac * src1_sum + src2_fac * src2_sum;
+
+ } // for pos
+
}
-template<class T, int D>
-void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
- const ibbox& box)
+
+
+extern "C" {
+ void CCTK_FCALL CCTK_FNAME(copy_3d_real8)
+ (const CCTK_REAL8* src,
+ const int& srciext, const int& srcjext, const int& srckext,
+ CCTK_REAL8* dst,
+ const int& dstiext, const int& dstjext, const int& dstkext,
+ const int srcbbox[3][3],
+ const int dstbbox[3][3],
+ const int regbbox[3][3]);
+}
+
+template<>
+void data<CCTK_REAL8,3>
+::copy_from_innerloop (const generic_data<3>* gsrc, const ibbox& box)
{
const data* src = (const data*)gsrc;
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()
- /* && box.stride()<=src->extent().stride() */ ));
+ && box.stride()==src->extent().stride()));
assert (all((box.lower()-extent().lower())%box.stride() == 0
- /* && (box.lower()-src->extent().lower())%box.stride() == 0 */ ));
+ && (box.lower()-src->extent().lower())%box.stride() == 0));
+
+ assert (proc() == src->proc());
- if (proc() == src->proc()) {
- // interpolate on same processor
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ const ibbox& sext = src->extent();
+ const ibbox& dext = extent();
+
+ int srcshp[3], dstshp[3];
+ int srcbbox[3][3], dstbbox[3][3], regbbox[3][3];
+
+ for (int d=0; d<3; ++d) {
+ srcshp[d] = (sext.shape() / sext.stride())[d];
+ dstshp[d] = (dext.shape() / dext.stride())[d];
- int rank;
- MPI_Comm_rank (dist::comm, &rank);
- if (rank == proc()) {
-
- for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
- const ivect& pos = *posi;
-
- // get box around current position
- const ibbox frombox
- = ibbox(pos,pos,extent().stride()).expanded_for(src->extent());
-
- // interpolate from box to position
- T sum = 0;
- for (ibbox::iterator fromposi=frombox.begin();
- fromposi!=frombox.end(); ++fromposi)
- {
- const ivect& frompos = *fromposi;
-
- // interpolation weight
- const ivect str = src->extent().stride();
- const T f = prod(vect<T,D>(str - abs(pos - frompos))
- / vect<T,D>(str));
- sum += f * (*src)[frompos];
- }
- (*this)[pos] = sum;
-
- } // for pos
-
- }
+ srcbbox[0][d] = sext.lower()[d];
+ srcbbox[1][d] = sext.upper()[d];
+ srcbbox[2][d] = sext.stride()[d];
- } else {
- // interpolate from other processor
+ dstbbox[0][d] = dext.lower()[d];
+ dstbbox[1][d] = dext.upper()[d];
+ dstbbox[2][d] = dext.stride()[d];
- data* const tmp = new data(box, src->proc());
- tmp->interpolate_from (src, box);
- tmp->change_processor (proc());
- copy_from (tmp, box);
- delete tmp;
+ regbbox[0][d] = box.lower()[d];
+ regbbox[1][d] = box.upper()[d];
+ regbbox[2][d] = box.stride()[d];
+ }
+
+ assert (all(dext.stride() == box.stride()));
+ if (all(sext.stride() == dext.stride())) {
+ CCTK_FNAME(copy_3d_real8) ((const CCTK_REAL8*)src->storage(),
+ srcshp[0], srcshp[1], srcshp[2],
+ (CCTK_REAL8*)storage(),
+ dstshp[0], dstshp[1], dstshp[2],
+ srcbbox,
+ dstbbox,
+ regbbox);
+ } else {
+ abort();
}
}
-template<class T, int D>
-void data<T,D>::interpolate_from (const generic_data<D>* gsrc,
- const double sfact,
- const generic_data<D>* gtrc,
- const double tfact,
- const ibbox& box)
+
+
+extern "C" {
+ void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8)
+ (const CCTK_REAL8* src,
+ const int& srciext, const int& srcjext, const int& srckext,
+ CCTK_REAL8* dst,
+ const int& dstiext, const int& dstjext, const int& dstkext,
+ const int srcbbox[3][3],
+ const int dstbbox[3][3],
+ const int regbbox[3][3]);
+ void CCTK_FCALL CCTK_FNAME(restrict_3d_real8)
+ (const CCTK_REAL8* src,
+ const int& srciext, const int& srcjext, const int& srckext,
+ CCTK_REAL8* dst,
+ const int& dstiext, const int& dstjext, const int& dstkext,
+ const int srcbbox[3][3],
+ const int dstbbox[3][3],
+ const int regbbox[3][3]);
+}
+
+template<>
+void data<CCTK_REAL8,3>
+::interpolate_from_innerloop (const generic_data<3>* gsrc, const ibbox& box)
{
const data* src = (const data*)gsrc;
- const data* trc = (const data*)gtrc;
- assert (has_storage() && src->has_storage() && trc->has_storage());
+ 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()
- && box.lower()>=trc->extent().lower()));
+ && box.lower()>=src->extent().lower()));
assert (all(box.upper()<=extent().upper()
- && box.upper()<=src->extent().upper()
- && box.upper()<=trc->extent().upper()));
- assert (all(box.stride()==extent().stride()
- /* && box.stride()<=src->extent().stride() */
- /* && trc->extent().stride()==src->extent().stride() */ ));
- assert (all((box.lower()-extent().lower())%box.stride() == 0
- && (box.lower()-src->extent().lower())%box.stride() == 0
- && (box.lower()-trc->extent().lower())%box.stride() == 0));
- assert (src->proc() == trc->proc());
+ && 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
+ assert (proc() == src->proc());
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ const ibbox& sext = src->extent();
+ const ibbox& dext = extent();
+
+ int srcshp[3], dstshp[3];
+ int srcbbox[3][3], dstbbox[3][3], regbbox[3][3];
+
+ for (int d=0; d<3; ++d) {
+ srcshp[d] = (sext.shape() / sext.stride())[d];
+ dstshp[d] = (dext.shape() / dext.stride())[d];
- int rank;
- MPI_Comm_rank (dist::comm, &rank);
- if (rank == proc()) {
-
- for (ibbox::iterator posi=box.begin(); posi!=box.end(); ++posi) {
- const ivect& pos = *posi;
-
- // get box around current position
- const ibbox frombox
- = ibbox(pos,pos,extent().stride()).expanded_for(src->extent());
-
- // interpolate from box to position
- T src_sum = 0;
- T trc_sum = 0;
- for (ibbox::iterator fromposi=frombox.begin();
- fromposi!=frombox.end(); ++fromposi)
- {
- const ivect& frompos = *fromposi;
-
- // interpolation weight
- const ivect str = src->extent().stride();
- const T f = prod(vect<T,D>(str - abs(pos - frompos))
- / vect<T,D>(str));
- src_sum += f * (*src)[frompos];
- trc_sum += f * (*trc)[frompos];
- }
- (*this)[pos] = (T)sfact * src_sum + (T)tfact * trc_sum;
-
- } // for pos
-
- }
+ srcbbox[0][d] = sext.lower()[d];
+ srcbbox[1][d] = sext.upper()[d];
+ srcbbox[2][d] = sext.stride()[d];
+
+ dstbbox[0][d] = dext.lower()[d];
+ dstbbox[1][d] = dext.upper()[d];
+ dstbbox[2][d] = dext.stride()[d];
+ regbbox[0][d] = box.lower()[d];
+ regbbox[1][d] = box.upper()[d];
+ regbbox[2][d] = box.stride()[d];
+ }
+
+ assert (all(dext.stride() == box.stride()));
+ if (all(sext.stride() > dext.stride())) {
+ CCTK_FNAME(prolongate_3d_real8) ((const CCTK_REAL8*)src->storage(),
+ srcshp[0], srcshp[1], srcshp[2],
+ (CCTK_REAL8*)storage(),
+ dstshp[0], dstshp[1], dstshp[2],
+ srcbbox,
+ dstbbox,
+ regbbox);
+ } else if (all(sext.stride() < dext.stride())) {
+ CCTK_FNAME(restrict_3d_real8) ((const CCTK_REAL8*)src->storage(),
+ srcshp[0], srcshp[1], srcshp[2],
+ (CCTK_REAL8*)storage(),
+ dstshp[0], dstshp[1], dstshp[2],
+ srcbbox,
+ dstbbox,
+ regbbox);
} else {
- // interpolate from other processor
+ abort();
+ }
+}
+
+
+
+extern "C" {
+ void CCTK_FCALL CCTK_FNAME(prolongate_3d_real8_2tl)
+ (const CCTK_REAL8* src1, const int& t1,
+ const CCTK_REAL8* src2, const int& t2,
+ const int& srciext, const int& srcjext, const int& srckext,
+ CCTK_REAL8* dst, const int& t,
+ const int& dstiext, const int& dstjext, const int& dstkext,
+ const int srcbbox[3][3],
+ const int dstbbox[3][3],
+ const int regbbox[3][3]);
+}
+
+template<>
+void data<CCTK_REAL8,3>
+::interpolate_from_innerloop (const generic_data<3>* gsrc1, const int t1,
+ const generic_data<3>* gsrc2, const int t2,
+ const ibbox& box, const int t)
+{
+ const data* src1 = (const data*)gsrc1;
+ const data* src2 = (const data*)gsrc2;
+ 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());
+
+ assert (proc() == src1->proc());
+
+ int rank;
+ MPI_Comm_rank (dist::comm, &rank);
+ assert (rank == proc());
+
+ assert (src1->extent() == src2->extent());
+
+ const ibbox& sext = src1->extent();
+ const ibbox& dext = extent();
+
+ int srcshp[3], dstshp[3];
+ int srcbbox[3][3], dstbbox[3][3], regbbox[3][3];
+
+ for (int d=0; d<3; ++d) {
+ srcshp[d] = (sext.shape() / sext.stride())[d];
+ dstshp[d] = (dext.shape() / dext.stride())[d];
- data* const tmp = new data(box, src->proc());
- tmp->interpolate_from (src, sfact, trc, tfact, box);
- tmp->change_processor (proc());
- copy_from (tmp, box);
- delete tmp;
+ srcbbox[0][d] = sext.lower()[d];
+ srcbbox[1][d] = sext.upper()[d];
+ srcbbox[2][d] = sext.stride()[d];
+ dstbbox[0][d] = dext.lower()[d];
+ dstbbox[1][d] = dext.upper()[d];
+ dstbbox[2][d] = dext.stride()[d];
+
+ regbbox[0][d] = box.lower()[d];
+ regbbox[1][d] = box.upper()[d];
+ regbbox[2][d] = box.stride()[d];
+ }
+
+ assert (all(dext.stride() == box.stride()));
+ if (all(sext.stride() > dext.stride())) {
+ CCTK_FNAME(prolongate_3d_real8_2tl)
+ ((const CCTK_REAL8*)src1->storage(), t1,
+ (const CCTK_REAL8*)src2->storage(), t2,
+ srcshp[0], srcshp[1], srcshp[2],
+ (CCTK_REAL8*)storage(), t,
+ dstshp[0], dstshp[1], dstshp[2],
+ srcbbox,
+ dstbbox,
+ regbbox);
+ } else {
+ abort();
}
}
@@ -361,7 +575,7 @@ ostream& data<T,D>::out (ostream& os) const {
#if defined(TMPL_EXPLICIT)
#define INSTANTIATE(T) \
-template data<T,3>;
+template class data<T,3>;
#include "instantiate"