00001
00002
00003
00004
00005
00006
00007 #ifndef __CSAR_PATCH_H
00008 #define __CSAR_PATCH_H
00009
00010 #include <charm++.h>
00011 #include "gridutil.h"
00012
00013
00014 class extrudeMethod {
00015 public:
00016 int toWidth;
00017 CmiBool withCorners;
00018 extrudeMethod(int ghostWidth) {
00019 if (ghostWidth>=0) {
00020 toWidth=ghostWidth; withCorners=false;
00021 } else {
00022 toWidth=-ghostWidth; withCorners=true;
00023 }
00024 }
00025 extrudeMethod(int w,bool c) :toWidth(w),withCorners(c) { }
00026 extrudeMethod(void) { }
00027 void pup(PUP::er &p) {
00028 p(toWidth);
00029 p(withCorners);
00030 }
00031 };
00032
00033
00034 class patch {
00035 protected:
00036
00037 blockSpan span;
00038
00039 int flatAxis;
00040 CmiBool isLow;
00041 public:
00042 enum {ext=0,internal=1} type;
00043
00044
00045 blockSpan getExtents(const extrudeMethod &m,bool forVoxel,int dir=1);
00046
00047 virtual void print(void) = 0;
00048 void pup(PUP::er &p)
00049 {
00050 span.pup(p);
00051 p((int&)type);
00052 p(flatAxis);
00053 p(isLow);
00054 }
00055
00056 patch(void) { }
00057 protected:
00058 patch(const blockSpan &span_);
00059 };
00060
00061
00062
00063 class externalBCpatch : public patch {
00064 public:
00065
00066 int bcNo;
00067 externalBCpatch(void) {}
00068 externalBCpatch(
00069 const blockSpan &srcSpan_,
00070 int bcNo_)
00071 : patch(srcSpan_), bcNo(bcNo_) { type=ext; }
00072 void pup(PUP::er &p)
00073 {
00074 patch::pup(p);
00075 p(bcNo);
00076 }
00077 void print(void)
00078 {
00079 CkPrintf("Type=external, bc#=%d, ",bcNo); span.print();
00080 CkPrintf("\n");
00081 }
00082 };
00083
00084
00085
00086
00087 class orientation {
00088 int s2d[3];
00089 int flip[3];
00090 public:
00091 orientation(void) {}
00092 orientation(const int *codedOrient);
00093 int operator[](int sAxis) const {return s2d[sAxis];}
00094 int dIsFlipped(int sAxis) const {return flip[sAxis];}
00095
00096
00097 int dToS(int dAxis)
00098 {
00099 for(int sAxis=0;sAxis<3;sAxis++)
00100 if(dAxis == s2d[sAxis])
00101 return sAxis;
00102
00103 return -1;
00104 }
00105
00106
00107
00108 blockLoc destAxis(int dAxis) {
00109 int sAxis=dToS(dAxis);
00110 blockLoc ret(0,0,0);
00111 if (dIsFlipped(sAxis))
00112 ret[sAxis]=-1;
00113 else
00114 ret[sAxis]=1;
00115 return ret;
00116 }
00117 void pup(PUP::er &p)
00118 {
00119 p(s2d,3);
00120 p(flip,3);
00121 }
00122 void print(void)
00123 {
00124 CkPrintf(" s2d=%d,%d,%d flip=%d,%d,%d\n",
00125 s2d[0],s2d[1],s2d[2],flip[0],flip[1],flip[2]);
00126 }
00127 };
00128
00129
00130 class internalBCpatch : public patch {
00131 public:
00132 int dest;
00133 int destPatch;
00134 orientation orient;
00135
00136 internalBCpatch(void) {}
00137 internalBCpatch(int dest_,int destPatch_,const int *codedOrient,
00138 const blockSpan &span_)
00139 : patch(span_),
00140 dest(dest_),destPatch(destPatch_),
00141 orient(codedOrient) { type=internal; }
00142 void pup(PUP::er &p)
00143 {
00144 patch::pup(p);
00145 p(dest);
00146 p(destPatch);
00147 orient.pup(p);
00148 }
00149 void print(void)
00150 {
00151 CkPrintf("Type=internal (%d:%d) ",dest,destPatch);
00152 span.print();
00153 orient.print();
00154 CkPrintf("\n");
00155 }
00156 };
00157
00158
00159
00160 class block {
00161 blockDim dim;
00162 vector3d *locs;
00163 int nPatches;
00164 patch **patches;
00165 public:
00166 block(const char *filePrefix,int blockNo);
00167 block(void) {};
00168 ~block();
00169
00170 const blockDim &getDim(void) const {return dim;}
00171 vector3d &getLoc(const blockLoc &i) {return locs[dim[i]];}
00172 const vector3d &getLoc(const blockLoc &i) const
00173 {return locs[dim[i]];}
00174
00175 int getPatches(void) const {return nPatches;}
00176 patch *getPatch(int i) const {return patches[i];}
00177 void print(void)
00178 {
00179 CkPrintf("dimensions: %d, %d, %d\n", dim[0], dim[1], dim[2]);
00180 CkPrintf("nPatches=%d\n", nPatches);
00181 for(int i=0;i<nPatches;i++) {
00182 CkPrintf("----patch %d----\n", i);
00183 patches[i]->print();
00184 }
00185 }
00186 void pup(PUP::er &p)
00187 {
00188 dim.pup(p);
00189 int n = dim.getSize();
00190 p(n);
00191 if(p.isUnpacking())
00192 locs = new vector3d[n];
00193 p((char*)locs, n*sizeof(vector3d));
00194 p(nPatches);
00195 if(p.isUnpacking())
00196 patches = new patch*[nPatches];
00197 for(int i=0;i<nPatches;i++) {
00198 if(p.isUnpacking()) {
00199 int type;
00200 p(type);
00201 if(type==patch::ext) {
00202 patches[i] = new externalBCpatch();
00203 ((externalBCpatch*)(patches[i]))->pup(p);
00204 } else {
00205 patches[i] = new internalBCpatch();
00206 ((internalBCpatch*)(patches[i]))->pup(p);
00207 }
00208 } else {
00209 int type = (int) patches[i]->type;
00210 p(type);
00211 if(type==patch::ext)
00212 ((externalBCpatch*)(patches[i]))->pup(p);
00213 else
00214 ((internalBCpatch*)(patches[i]))->pup(p);
00215 }
00216 }
00217 if (p.isPacking())
00218 delete this;
00219 }
00220 };
00221
00222
00223 #endif
00224
00225
00226
00227
00228
00229
00230