Added MBLK_Get_nodelocs, to get the node locations;
authorOrion Lawlor <olawlor@acm.org>
Tue, 29 Apr 2003 23:26:29 +0000 (23:26 +0000)
committerOrion Lawlor <olawlor@acm.org>
Tue, 29 Apr 2003 23:26:29 +0000 (23:26 +0000)
and changed .mblk to be a portable ASCII file.

src/libs/ck-libs/mblock/mblock.C
src/libs/ck-libs/mblock/mblock.h
src/libs/ck-libs/mblock/mblockf.h
src/libs/ck-libs/mblock/patch.C

index a5c24659b71f237f78ae6e9be0583e552abf1aa9..c3993d92e5a27e32899ecc58fec9712b6efb5f28 100644 (file)
@@ -572,6 +572,34 @@ MBLK_Get_blocksize(int *dim)
   return MBLK_SUCCESS;
 }
 
+CDECL int 
+MBLK_Get_nodelocs(const int *nodedim,double *nodeloc) {
+  MBLOCKAPI("MBLK_Get_nodelocs");
+  if(TCharm::getState() != inDriver) {
+    CkError("MBLK_Get_nodelocs  called from outside driver\n");
+    return MBLK_FAILURE;
+  }
+  block *b=getCurMBlockChunk()->b;
+  blockDim d = b->getDim();
+  for (int i=0;i<3;i++)
+    if (nodedim[i]!=d[i]) {
+      CkError("MBLK_Get_nodelocs: your nodedim is %d; mine is %d!\n",
+       nodedim[i],d[i]);
+      return MBLK_FAILURE;
+    }
+  
+  blockLoc i;
+  BLOCKSPAN_FOR(i,blockSpan(blockLoc(0,0,0),d)) {
+     int idx=d[i];
+     vector3d v=b->getLoc(i);
+     nodeloc[3*idx+0]=v.x;
+     nodeloc[3*idx+1]=v.y;
+     nodeloc[3*idx+2]=v.z;
+  }
+  
+  return MBLK_SUCCESS;
+}
+
 CDECL double 
 MBLK_Timer(void)
 {
@@ -798,6 +826,12 @@ FDECL void FTN_NAME(MBLK_GET_BLOCKSIZE, mblk_get_blocksize)
   *ret = MBLK_Get_blocksize(dims);
 }
 
+FDECL void FTN_NAME(MBLK_GET_NODELOCS,mblk_get_nodelocs)
+  (const int *nodedim,double *nodeloc,int *ret) 
+{
+  *ret = MBLK_Get_nodelocs(nodedim,nodeloc);
+}
+
 FDECL double FTN_NAME(MBLK_TIMER, mblk_timer)
   (void)
 {
index 6626e6d7bc23c336dc0c147ce640b9b3bf28bf55..7c1d3fc78c53a6ac8c1e46024346a8ee3f46df5a 100644 (file)
@@ -36,6 +36,7 @@ extern "C" {
   int MBLK_Get_nblocks(int *n);
   int MBLK_Get_myblock(int *m);
   int MBLK_Get_blocksize(int *dims); /*Fetch interior dimensions, in voxels*/
+  int MBLK_Get_nodelocs(const int *nodedim,double *nodeloc); 
   double MBLK_Timer(void);
   void MBLK_Print(const char *str);
   void MBLK_Print_block(void);
index 56211eb1a757707faed148b11ab2733fe291a172..215eada0ee2c93e778c08ed219aa3018a3191629 100644 (file)
@@ -23,6 +23,7 @@
        external :: MBLK_Get_nblocks
        external :: MBLK_Get_myblock
        external :: MBLK_Get_blocksize
+       external :: MBLK_Get_nodelocs
        external :: MBLK_Get_extent
        real*8, external :: MBLK_Timer
        external :: MBLK_Print
index 201a65ee3363b0ac8cd1f07ebc780dbc6787741b..5fcfa88654e25691af35be55e2a184e2c9afeb60 100644 (file)
@@ -133,9 +133,17 @@ block::block(const char *filePrefix,int blockNo)
   
   //Read the mesh locations themselves
   sprintf(fName,"%s%05d.mblk",filePrefix,blockNo);
-  FILE *fm=fopen(fName,"rb");
+  FILE *fm=fopen(fName,"r");
+  if (fm==NULL) abort("Can't open .mblk file!");
+  int sizes;
+  if (3!=fscanf(fm,"%d%d%d",&sizes,&sizes,&sizes)) abort("Can't parse .mblk file's header");
   locs=new vector3d[dim.getSize()];
-  fread(&locs[0],sizeof(vector3d),dim.getSize(),fm);
+  blockLoc i;
+  BLOCKSPAN_FOR(i,blockSpan(blockLoc(0,0,0),dim)) {
+    double x,y,z;
+    if (3!=fscanf(fm,"%lf%lf%lf",&x,&y,&z)) abort("Can't parse .mblk file's location");
+    locs[dim[i]]=vector3d(x,y,z);
+  }
   fclose(fm);
 }