[cig-commits] r4213 - mc/3D/CitcomS/trunk/lib

luis at geodynamics.org luis at geodynamics.org
Wed Aug 2 20:05:29 PDT 2006


Author: luis
Date: 2006-08-02 20:05:28 -0700 (Wed, 02 Aug 2006)
New Revision: 4213

Modified:
   mc/3D/CitcomS/trunk/lib/Output_h5.c
Log:
Rewrote h5write_field().


Modified: mc/3D/CitcomS/trunk/lib/Output_h5.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Output_h5.c	2006-08-03 02:31:51 UTC (rev 4212)
+++ mc/3D/CitcomS/trunk/lib/Output_h5.c	2006-08-03 03:05:28 UTC (rev 4213)
@@ -754,145 +754,123 @@
                           hid_t mem_type_id,
                           const void *data,
                           int tdim, int xdim, int ydim, int zdim, int cdim,
-                          int nx, int ny, int nz,
-                          int px, int py, int pz)
+                          struct All_variables *E)
 {
-    int rank;
+    int nsd = 0;
+    int step = 0;
+
+    int rank = 0;
     hsize_t size[5]    = {0,0,0,0,0};
-    //hsize_t memdims[5] = {0,0,0,0,0}; // unnecessary?
     hsize_t offset[5]  = {0,0,0,0,0};
     hsize_t stride[5]  = {1,1,1,1,1};
     hsize_t count[5]   = {1,1,1,1,1};
-    hsize_t block[5]   = {0,0,0,0,0}; // XXX: always equal to memdims[]?
+    hsize_t block[5]   = {0,0,0,0,0};
 
-    int step;
+    int t = -100;
+    int x = -100;
+    int y = -100;
+    int z = -100;
+    int c = -100;
 
-    if (tdim > 0)
-    {
-        /* time-varying dataset */
+    int nx = E->lmesh.nox;
+    int ny = E->lmesh.noy;
+    int nz = E->lmesh.noz;
 
-        step = tdim - 1;
+    int nprocx = E->parallel.nprocx;
+    int nprocy = E->parallel.nprocy;
+    int nprocz = E->parallel.nprocz;
 
-        if ((xdim > 0) && (ydim > 0) && (zdim > 0))
-        {
-            rank = 1 + 3;
+    int px = E->parallel.me_loc[1];
+    int py = E->parallel.me_loc[2];
+    int pz = E->parallel.me_loc[3];
 
-            size[0] = tdim;
-            size[1] = xdim;
-            size[2] = ydim;
-            size[3] = zdim;
 
-            offset[0] = step;
-            offset[1] = px*nx;
-            offset[2] = py*ny;
-            offset[3] = pz*nz;
+    /* Refer to h5create_field() for more detailed comments. */
 
-            block[0] = 1;
-            block[1] = nx;
-            block[2] = ny;
-            block[3] = nz;
-        }
-        else if ((xdim > 0) && (ydim > 0))
-        {
-            rank = 1 + 2;
+    if ((xdim > 0) && (ydim > 0) && (zdim > 0))
+    {
+        nsd = 3;
+        x = 0;
+        y = 1;
+        z = 2;
+    }
+    else if ((xdim > 0) && (ydim > 0))
+    {
+        nsd = 2;
+        x = 0;
+        y = 1;
+    }
+    else if (zdim > 0)
+    {
+        nsd = 1;
+        z = 0;
+    }
 
-            size[0] = tdim;
-            size[1] = xdim;
-            size[2] = ydim;
+    rank += nsd;
 
-            offset[0] = step;
-            offset[1] = px*nx;
-            offset[2] = py*ny;
+    if (tdim > 0)
+    {
+        rank += 1;
+        t  = 0;
+        x += 1;
+        y += 1;
+        z += 1;
+    }
+    
+    if (cdim > 0)
+    {
+        rank += 1;
+        c = rank-1;
+    }
 
-            block[0] = 1;
-            block[1] = nx;
-            block[2] = ny;
-
-        }
-        else if (zdim > 0)
+    if (nsd > 0)
+    {
+        if (t >= 0)
         {
-            rank = 1 + 1;
-
-            size[0] = tdim;
-            size[1] = zdim;
-
-            offset[0] = step;
-            offset[1] = pz*nz;
-
-            block[0] = 1;
-            block[1] = nz;
+            size[t]   = tdim;
+            offset[t] = tdim-1;
+            block[t]  = 1;
         }
 
-        /* if field has components, update last dimension */
-        if (cdim > 0)
+        if (x >= 0)
         {
-            rank += 1;
-            size[rank-1] = cdim;
-            offset[rank-1] = 0;
-            block[rank-1] = cdim;
+            size[x]   = xdim;
+            offset[x] = px*(nx-1);
+            block[x]  = (px == nprocx-1) ? nx : nx-1;
         }
-        
-        h5write_dataset(dset_id, mem_type_id, data,
-                        rank, size, block,
-                        offset, stride, count, block);
-    }
-    else
-    {
 
-        /* fixed dataset */
-
-        if ((xdim > 0) && (ydim > 0) && (zdim > 0))
+        if (y >= 0)
         {
-            rank = 3;
-
-            size[0] = xdim;
-            size[1] = ydim;
-            size[2] = zdim;
-
-            offset[0] = px*nx;
-            offset[1] = py*ny;
-            offset[2] = pz*nz;
-
-            block[0] = nx;
-            block[1] = ny;
-            block[2] = nz;
+            size[y]   = ydim;
+            offset[y] = py*(ny-1);
+            block[y]  = (py == nprocy-1) ? ny : ny-1;
         }
-        else if ((xdim > 0) && (ydim > 0))
-        {
-            rank = 2;
 
-            size[0] = xdim;
-            size[1] = ydim;
-
-            offset[0] = px*nx;
-            offset[1] = py*ny;
-
-            block[0] = nx;
-            block[1] = ny;
-        }
-        else if (zdim > 0)
+        if (z >= 0)
         {
-            rank = 1;
-
-            size[0] = zdim;
-            offset[0] = pz*nz;
-            block[0] = nz;
+            size[z]   = zdim;
+            offset[z] = pz*(nz-1);
+            block[z]  = (pz == nprocz-1) ? nz : nz-1;
         }
 
-        /* if field has components, update last dimension */
-        if (cdim > 0)
+        if (c >= 0)
         {
-            rank += 1;
-            size[rank-1] = cdim;
-            offset[rank-1] = 0;
-            block[rank-1] = cdim;
+            size[c]   = cdim;
+            offset[c] = 0;
+            block[c]  = cdim;
         }
 
-        h5write_dataset(dset_id, mem_type_id, data,
-                        rank, NULL, block,
-                        offset, stride, count, block);
+        if (tdim > 0)
+            h5write_dataset(dset_id, mem_type_id, data,
+                            rank, size, block,
+                            offset, stride, count, block);
+        else
+            h5write_dataset(dset_id, mem_type_id, data,
+                            rank, NULL, block,
+                            offset, stride, count, block);
     }
 
+    return;
 }
 
 static void h5create_coord(hid_t loc_id, hid_t type_id, int nodex, int nodey, int nodez)
@@ -995,7 +973,7 @@
     dataset = H5Dopen(cap_group, "coord");
     h5write_field(dataset, E->hdf5.type_id, E->hdf5.vector3d,
                   0, E->mesh.nox, E->mesh.noy, E->mesh.noz, 3,
-                  nx, ny, nz, px, py, pz);
+                  E);
 
     /* release resources */
     status = H5Dclose(dataset);
@@ -1043,7 +1021,7 @@
     dataset = H5Dopen(cap, "velocity");
     h5write_field(dataset, E->hdf5.type_id, E->hdf5.vector3d,
                   cycles+1, E->mesh.nox, E->mesh.noy, E->mesh.noz, 3,
-                  nx, ny, nz, px, py, pz);
+                  E);
 
     /* release resources */
     status = H5Dclose(dataset);
@@ -1088,7 +1066,7 @@
     dataset = H5Dopen(cap, "temperature");
     h5write_field(dataset, E->hdf5.type_id, E->hdf5.scalar3d,
                   cycles+1, E->mesh.nox, E->mesh.noy, E->mesh.noz, 0,
-                  nx, ny, nz, px, py, pz);
+                  E);
 
     /* release resources */
     status = H5Dclose(dataset);



More information about the cig-commits mailing list