00001
00002
00003
00004
00005
00006 #ifndef __CSAR_GRIDUTIL_H
00007 #define __CSAR_GRIDUTIL_H
00008
00009 #include <math.h>
00010
00011
00012
00013 typedef double real;
00014
00015 #include <charm++.h>
00016 #include "ckvector3d.h"
00017 typedef CkVector3d vector3d;
00018
00019
00020 class blockDim;
00021 class blockLoc {
00022 protected:
00023 int i,j,k;
00024 public:
00025 blockLoc() { }
00026 blockLoc(int i_,int j_,int k_)
00027 :i(i_), j(j_), k(k_) { }
00028 blockLoc operator+ (const blockLoc &b) const
00029 { return blockLoc(i+b.i,j+b.j,k+b.k); }
00030 blockLoc &operator+= (const blockLoc &b)
00031 { i+=b.i; j+=b.j; k+=b.k; return *this; }
00032 blockDim operator- (const blockLoc &b) const;
00033 friend blockLoc operator*(const blockLoc &a,int k)
00034 { return blockLoc(a.i*k,a.j*k,a.k*k); }
00035 friend blockLoc operator*(int k,const blockLoc &a)
00036 { return a*k; }
00037
00038 bool operator==(const blockLoc &o) const
00039 {return i==o.i && j==o.j && k==o.k; }
00040 bool operator!=(const blockLoc &o) const
00041 {return i!=o.i || j!=o.j || k!=o.k; }
00042
00043
00044 int &operator[](int d) {return (&i)[d];}
00045 int operator[](int d) const {return (&i)[d];}
00046
00047 void getInt3(int *dest,int del=0) const {
00048 dest[0]=i-del; dest[1]=j-del; dest[2]=k-del;
00049 }
00050 void pup(PUP::er &p)
00051 {
00052 p(i);p(j);p(k);
00053 }
00054 void print(void) {
00055 CkPrintf("%d,%d,%d",i,j,k);
00056 }
00057 };
00058
00059
00060 class blockDim : public blockLoc {
00061 public:
00062 blockDim() { }
00063 blockDim(int i_,int j_,int k_)
00064 :blockLoc(i_,j_,k_)
00065 { }
00066 int getSize(void) const
00067 { return i*j*k; }
00068
00069 int c_index(int xi,int xj,int xk) const
00070 { return xi+i*(xj+j*xk); }
00071
00072
00073 inline int operator[](const blockLoc &l) const
00074 { return c_index(l[0],l[1],l[2]); }
00075
00076
00077 int &operator[](int d) {return (&i)[d];}
00078 int operator[](int d) const {return (&i)[d];}
00079 };
00080
00081 inline blockDim blockLoc::operator- (const blockLoc &b) const
00082 { return blockDim(i-b.i,j-b.j,k-b.k); }
00083
00084
00085 class blockSpan {
00086 public:
00087 blockLoc start;
00088 blockLoc end;
00089
00090 blockSpan() { }
00091 blockSpan(const blockLoc &s,const blockLoc &e)
00092 :start(s), end(e) { }
00093
00094 void pup(PUP::er &p) {
00095 start.pup(p);
00096 end.pup(p);
00097 }
00098
00099 blockDim getDim(void) const { return end-start; }
00100 void getInt3(int *start3,int *end3) const {
00101 start.getInt3(start3);
00102 end.getInt3(end3,1);
00103 }
00104
00105
00106 void orient(void) {
00107 for (int axis=0;axis<3;axis++) {
00108 if (start[axis]>=end[axis]) {
00109 end[axis]--;
00110 int tmp=start[axis];
00111 start[axis]=end[axis];
00112 end[axis]=tmp;
00113 end[axis]++;
00114 }
00115 }
00116 }
00117
00118
00119 int getFlatAxis(void) const {
00120 for (int axis=0;axis<3;axis++)
00121 if (start[axis]+1==end[axis])
00122 return axis;
00123 return -1;
00124 }
00125
00126 int getFace(void) const {
00127 int axis=getFlatAxis();
00128 if (axis==-1) return -1;
00129 if (start[axis]==0) return axis;
00130 else return axis+3;
00131 }
00132
00133
00134 bool contains(const blockLoc &l) const
00135 {
00136 for (int axis=0;axis<3;axis++)
00137 if (!(start[axis]<=l[axis] && l[axis]<end[axis]))
00138 return false;
00139 return true;
00140 }
00141
00142
00143 bool hasVolume(void) const {
00144 for (int axis=0;axis<3;axis++)
00145 if (start[axis]==end[axis])
00146 return false;
00147 return true;
00148 }
00149
00150 blockSpan operator+(const blockLoc &l) const
00151 {return blockSpan(start+l,end+l);}
00152 blockSpan operator-(const blockLoc &l) const
00153 {return blockSpan(start-l,end-l);}
00154
00155 bool operator==(const blockSpan &o) const
00156 {return start==o.start && end==o.end;}
00157 bool operator!=(const blockSpan &o) const
00158 {return start!=o.start || end!=o.end;}
00159
00160 void print(void) {
00161 CkPrintf(" start=");start.print();
00162 CkPrintf(" end=");end.print();
00163 }
00164 };
00165
00166 #define BLOCKSPAN_FOR(i,span) \
00167 blockSpan loop_iter=span; \
00168 for (i[2]=loop_iter.start[2];i[2]<loop_iter.end[2];i[2]++) \
00169 for (i[1]=loop_iter.start[1];i[1]<loop_iter.end[1];i[1]++) \
00170 for (i[0]=loop_iter.start[0];i[0]<loop_iter.end[0];i[0]++)
00171
00172 #endif
00173
00174
00175
00176
00177
00178
00179
00180