[cig-commits] r4383 - in mc/3D/CitcomS/trunk: CitcomS/Solver bin lib module

tan2 at geodynamics.org tan2 at geodynamics.org
Thu Aug 17 21:59:26 PDT 2006


Author: tan2
Date: 2006-08-17 21:59:26 -0700 (Thu, 17 Aug 2006)
New Revision: 4383

Modified:
   mc/3D/CitcomS/trunk/CitcomS/Solver/Solver.py
   mc/3D/CitcomS/trunk/bin/Citcom.c
   mc/3D/CitcomS/trunk/lib/Instructions.c
   mc/3D/CitcomS/trunk/lib/Output.c
   mc/3D/CitcomS/trunk/lib/Output_h5.c
   mc/3D/CitcomS/trunk/lib/global_defs.h
   mc/3D/CitcomS/trunk/module/outputs.cc
   mc/3D/CitcomS/trunk/module/setProperties.cc
Log:
* Closed E->fp_out properly
* Fixed a bug when output_format is illegal
* Added new input parameter "output_optional", which is a comma seperated list of fields to output. Currently, supported outputs are "pressure",  "stress", "surf", "botm", and "average".
* Changed the format of stress output to be consistent with other output


Modified: mc/3D/CitcomS/trunk/CitcomS/Solver/Solver.py
===================================================================
--- mc/3D/CitcomS/trunk/CitcomS/Solver/Solver.py	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/CitcomS/Solver/Solver.py	2006-08-18 04:59:26 UTC (rev 4383)
@@ -328,6 +328,8 @@
 
         output_format = pyre.inventory.str("output_format", default="ascii",
                             validator=pyre.inventory.choice(["ascii", "hdf5"]))
+        output_optional = pyre.inventory.str("output_optional", default="")
+
         verbose = pyre.inventory.bool("verbose", default=False)
         see_convergence = pyre.inventory.bool("see_convergence", default=True)
 

Modified: mc/3D/CitcomS/trunk/bin/Citcom.c
===================================================================
--- mc/3D/CitcomS/trunk/bin/Citcom.c	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/bin/Citcom.c	2006-08-18 04:59:26 UTC (rev 4383)
@@ -114,7 +114,7 @@
 	    output_pseudo_surf(E, E->monitor.solution_cycles);
   }
   else
-    (E->output)(E, E->monitor.solution_cycles);
+    (E->problem_output)(E, E->monitor.solution_cycles);
 
   /* information about simulation time and wall clock time */
   output_time(E, E->monitor.solution_cycles);
@@ -163,7 +163,7 @@
 	  output_pseudo_surf(E, E->monitor.solution_cycles);
       }
       else
-	(E->output)(E, E->monitor.solution_cycles);
+	(E->problem_output)(E, E->monitor.solution_cycles);
     }
 
     /* information about simulation time and wall clock time */

Modified: mc/3D/CitcomS/trunk/lib/Instructions.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Instructions.c	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/lib/Instructions.c	2006-08-18 04:59:26 UTC (rev 4383)
@@ -270,7 +270,8 @@
   input_string("datafile",E->control.data_file,"initialize",m);
   input_string("datafile_old",E->control.old_P_file,"initialize",m);
 
-  input_string("output_format",E->control.output_format,"ascii",m);
+  input_string("output_format",E->output.format,"ascii",m);
+  input_string("output_optional",E->output.optional,"",m);
 
   input_int("mgunitx",&(E->mesh.mgunitx),"1",m);
   input_int("mgunitz",&(E->mesh.mgunitz),"1",m);
@@ -927,6 +928,7 @@
 {
   char logfile[255];
 
+  E->fp = NULL;
   sprintf(logfile,"%s.log",E->control.data_file);
   E->fp = output_open(logfile);
 
@@ -938,12 +940,11 @@
 {
   char timeoutput[255];
 
+  E->fptime = NULL;
   if (E->parallel.me == 0) {
     sprintf(timeoutput,"%s.time",E->control.data_file);
     E->fptime = output_open(timeoutput);
   }
-  else
-    E->fptime = NULL;
 
   return;
 }
@@ -953,34 +954,90 @@
 {
   char output_file[255];
 
-  sprintf(output_file,"%s.info.%d",E->control.data_file,E->parallel.me);
-  E->fp_out = output_open(output_file);
+  E->fp_out = NULL;
+  if (E->control.verbose) {
+    sprintf(output_file,"%s.info.%d",E->control.data_file,E->parallel.me);
+    E->fp_out = output_open(output_file);
+  }
 
   return;
 }
 
 
+void output_parse_optional(struct  All_variables *E)
+{
+    char* strip(char*);
+
+    int pos, len;
+    char *prev, *next;
+
+    len = strlen(E->output.optional);
+    /* fprintf(stderr, "### length of optional is %d\n", len); */
+    pos = 0;
+    next = E->output.optional;
+
+    E->output.stress = 0;
+    E->output.pressure = 0;
+    E->output.surf = 0;
+    E->output.botm = 0;
+    E->output.average = 0;
+
+    while(1) {
+	/* get next field */
+	prev = strsep(&next, ",");
+
+	/* break if no more field */
+	if(prev == NULL) break;
+
+	/* strip off leading and trailing whitespaces */
+	prev = strip(prev);
+
+	/* skip empty field */
+	if (strlen(prev) == 0) continue;
+
+	/* fprintf(stderr, "### %s: %s\n", prev, next); */
+	if(strcmp(prev, "stress")==0)
+	    E->output.stress = 1;
+	else if(strcmp(prev, "pressure")==0)
+	    E->output.pressure = 1;
+	else if(strcmp(prev, "surf")==0)
+	    E->output.surf = 1;
+	else if(strcmp(prev, "botm")==0)
+	    E->output.botm = 1;
+	else if(strcmp(prev, "average")==0)
+	    E->output.average = 1;
+	else
+	    if(E->parallel.me == 0)
+		fprintf(stderr, "Warning: unknown field for output_optional: %s\n", prev);
+
+    }
+
+    return;
+}
+
+
 void output_init(struct  All_variables *E)
 {
   open_log(E);
   open_time(E);
-  if (E->control.verbose)
-    open_info(E);
+  open_info(E);
 
+  output_parse_optional(E);
+
   //DEBUG
-  //strcpy(E->control.output_format, "hdf5");
-  //fprintf(stderr, "output format is %s\n", E->control.output_format);
-  if (strcmp(E->control.output_format, "ascii") == 0)
-    E->output = output;
-  else if (strcmp(E->control.output_format, "hdf5") == 0)
-    E->output = h5output;
+  //strcpy(E->output.format, "hdf5");
+  //fprintf(stderr, "output format is %s\n", E->output.format);
+  if (strcmp(E->output.format, "ascii") == 0)
+    E->problem_output = output;
+  else if (strcmp(E->output.format, "hdf5") == 0)
+    E->problem_output = h5output;
   else {
     // indicate error here
     if (E->parallel.me == 0) {
-      fprintf(stderr, "wrong output_format, must be either 'ascii' or 'hdf5'\n");
-      fprintf(E->fp, "wrong output_format, must be either 'ascii' or 'hdf5'\n");
-      parallel_process_termination(E);
+        fprintf(stderr, "wrong output_format, must be either 'ascii' or 'hdf5'\n");
+        fprintf(E->fp, "wrong output_format, must be either 'ascii' or 'hdf5'\n");
     }
+    parallel_process_termination(E);
   }
 }
 
@@ -990,13 +1047,40 @@
 {
   void h5output_close(struct  All_variables *E);
 
-  fclose(E->fp);
+  if (E->fp)
+    fclose(E->fp);
 
   if (E->fptime)
     fclose(E->fptime);
 
+  if (E->fp_out)
+    fclose(E->fp_out);
+
   // close HDF5 output
-  if (strcmp(E->control.output_format, "hdf5") == 0)
+  if (strcmp(E->output.format, "hdf5") == 0)
     h5output_close(E);
 
 }
+
+
+char* strip(char *input)
+{
+    int end;
+    char *str;
+    end = strlen(input) - 1;
+    str = input;
+
+    /* trim trailing whitespace */
+    while (isspace(str[end]))
+        end--;
+
+    str[++end] = 0;
+
+    // trim leading whitespace
+    while(isspace(*str))
+        str++;
+
+    return str;
+}
+
+

Modified: mc/3D/CitcomS/trunk/lib/Output.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Output.c	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/lib/Output.c	2006-08-18 04:59:26 UTC (rev 4383)
@@ -43,8 +43,9 @@
 void output_surf_botm(struct All_variables *, int);
 void output_surf_botm_pseudo_surf(struct All_variables *, int);
 void output_stress(struct All_variables *, int);
-void output_ave_r(struct All_variables *, int);
+void output_average(struct All_variables *, int);
 void output_tracer(struct All_variables *, int);
+void output_pressure(struct All_variables *, int);
 
 extern void parallel_process_termination();
 extern void heat_flux(struct All_variables *);
@@ -70,17 +71,22 @@
        output_surf_botm_pseudo_surf(E, cycles);
   }
   else
-    output_surf_botm(E, cycles);
+      output_surf_botm(E, cycles);
 
+  /* output tracer location if using tracer */
   if(E->control.tracer==1)
     output_tracer(E, cycles);
 
-  //output_stress(E, cycles);
-  //output_pressure(E, cycles);
+  /* optiotnal output below */
+  if (E->output.stress == 1)
+    output_stress(E, cycles);
 
-  /* disable horizontal average output   by Tan2 */
-  /* output_ave_r(E, cycles); */
+  if (E->output.pressure == 1)
+    output_pressure(E, cycles);
 
+  if (E->output.average == 1)
+      output_average(E, cycles);
+
   return;
 }
 
@@ -207,7 +213,7 @@
   heat_flux(E);
   get_STD_topo(E,E->slice.tpg,E->slice.tpgb,E->slice.divg,E->slice.vort,cycles);
 
-  if (E->parallel.me_loc[3]==E->parallel.nprocz-1) {
+  if (E->output.surf && (E->parallel.me_loc[3]==E->parallel.nprocz-1)) {
     sprintf(output_file,"%s.surf.%d.%d",E->control.data_file,E->parallel.me,cycles);
     fp2 = output_open(output_file);
 
@@ -222,7 +228,7 @@
   }
 
 
-  if (E->parallel.me_loc[3]==0)      {
+  if (E->output.botm && (E->parallel.me_loc[3]==0)) {
     sprintf(output_file,"%s.botm.%d.%d",E->control.data_file,E->parallel.me,cycles);
     fp2 = output_open(output_file);
 
@@ -296,7 +302,7 @@
   for(m=1;m<=E->sphere.caps_per_proc;m++) {
     fprintf(fp1,"%3d %7d\n",m,E->lmesh.nno);
     for (node=1;node<=E->lmesh.nno;node++)
-      fprintf(fp1, "%d %e %e %e %e %e %e\n", node,
+      fprintf(fp1, "%.4e %.4e %.4e %.4e %.4e %.4e\n",
 	      E->gstress[m][(node-1)*6+1],
 	      E->gstress[m][(node-1)*6+2],
 	      E->gstress[m][(node-1)*6+3],
@@ -308,7 +314,7 @@
 }
 
 
-void output_avg_r(struct All_variables *E, int cycles)
+void output_average(struct All_variables *E, int cycles)
 {
   /* horizontal average output of temperature and rms velocity*/
   void return_horiz_ave_f();
@@ -353,7 +359,7 @@
   // only the first nprocz processors need to output
 
   if (E->parallel.me<E->parallel.nprocz)  {
-    sprintf(output_file,"%s.ave_r.%d.%d",E->control.data_file,E->parallel.me,cycles);
+    sprintf(output_file,"%s.average.%d.%d",E->control.data_file,E->parallel.me,cycles);
     fp1=fopen(output_file,"w");
     for(j=1;j<=E->lmesh.noz;j++)  {
         fprintf(fp1,"%.4e %.4e %.4e %.4e\n",E->sx[1][3][j],E->Have.T[j],E->Have.V[1][j],E->Have.V[2][j]);

Modified: mc/3D/CitcomS/trunk/lib/Output_h5.c
===================================================================
--- mc/3D/CitcomS/trunk/lib/Output_h5.c	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/lib/Output_h5.c	2006-08-18 04:59:26 UTC (rev 4383)
@@ -63,7 +63,7 @@
 void h5output_tracer(struct All_variables *, int);
 void h5output_surf_botm(struct All_variables *, int);
 void h5output_surf_botm_pseudo_surf(struct All_variables *, int);
-void h5output_ave_r(struct All_variables *, int);
+void h5output_average(struct All_variables *, int);
 void h5output_time(struct All_variables *, int);
 
 /* for creation of HDF5 objects (wrapped for PyTables compatibility) */
@@ -134,19 +134,20 @@
     else
         h5output_surf_botm(E, cycles);
 
+    /* output tracer location if using tracer */
     if(E->control.tracer == 1)
         h5output_tracer(E, cycles);
 
-    if(E->control.stress == 1)
+    /* optiotnal output below */
+    if(E->output.stress == 1)
         h5output_stress(E, cycles);
 
-    if(E->control.pressure == 1)
+    if(E->output.pressure == 1)
         h5output_pressure(E, cycles);
 
-    /* disable horizontal average h5output   by Tan2 */
-    /* h5output_ave_r(E, cycles); */
+    if (E->output.average == 1)
+	h5output_average(E, cycles);
 
-
     /* Call this last (for timing information) */
     h5output_time(E, cycles);
 
@@ -301,25 +302,29 @@
         h5create_velocity(cap_group, E->hdf5.vector3d);
         h5create_temperature(cap_group, E->hdf5.scalar3d);
         h5create_viscosity(cap_group, E->hdf5.scalar3d);
-        //h5create_pressure(cap_group, E->hdf5.scalar3d);
-        //h5create_stress(cap_group, E->hdf5.tensor3d);
 
+	if(E->output.pressure == 1)
+	    h5create_pressure(cap_group, E->hdf5.scalar3d);
+
+	if(E->output.stress == 1)
+	    h5create_stress(cap_group, E->hdf5.tensor3d);
+
         /********************************************************************
          * Create /cap/surf/ group                                          *
          ********************************************************************/
-
+	if(E->output.surf == 1) {
         //surf_group = h5create_group(cap_group, "surf", (size_t)0);
 
         //h5create_surf_coord(surf_group, E->hdf5.const_vector2d);
         //h5create_surf_velocity(surf_group, E->hdf5.vector2d);
         //h5create_surf_heatflux(surf_group, E->hdf5.scalar2d);
         //h5create_surf_topography(surf_group, E->hdf5.scalar2d);
+	}
 
-
         /********************************************************************
          * Create /cap/botm/ group                                          *
          ********************************************************************/
-
+	if(E->output.botm == 1) {
         //botm_group = h5create_group(cap_group, "botm", (size_t)0);
 
         //h5create_surf_coord(botm_group, E->hdf5.const_vector2d);
@@ -327,12 +332,16 @@
         //h5create_surf_heatflux(botm_group, E->hdf5.scalar2d);
         //h5create_surf_topography(botm_group, E->hdf5.scalar2d);
         //status = H5Gclose(botm_group);
+	}
 
+	if(E->output.average == 1) {
+	}
+
         /* save references to caps */
         E->hdf5.cap_groups[cap] = cap_group;
         //E->hdf5.cap_surf_groups[cap] = surf_group;
         //E->hdf5.cap_botm_groups[cap] = botm_group;
-        
+
     }
     //status = H5Fclose(file_id);
 
@@ -369,8 +378,14 @@
     for (i = 0; i < E->sphere.caps; i++)
     {
         status = H5Gclose(E->hdf5.cap_groups[i]);
-        //status = H5Gclose(E->hdf5.cap_surf_groups[i]);
-        //status = H5Gclose(E->hdf5.cap_botm_groups[i]);
+	if(E->output.surf == 1) {
+	    //status = H5Gclose(E->hdf5.cap_surf_groups[i]);
+	}
+	if(E->output.botm == 1) {
+	    //status = H5Gclose(E->hdf5.cap_botm_groups[i]);
+	}
+	if(E->output.average == 1) {
+	}
     }
 
     /* close file */
@@ -578,7 +593,7 @@
 
     int nx, ny, nz;
     int nodex, nodey, nodez;
-    
+
     /* coordinates of current process in cap */
     px = E->parallel.me_loc[1];
     py = E->parallel.me_loc[2];
@@ -725,7 +740,7 @@
             (*field)->count[z]  = 1;
             (*field)->block[z]  = (pz == nprocz-1) ? nz : nz-1;
         }
-        
+
         if (c >= 0)
         {
             /* dataspace parameters */
@@ -1301,13 +1316,17 @@
 
 void h5output_surf_botm(struct All_variables *E, int cycles)
 {
+    if(E->output.surf == 1) {
+    }
+    if(E->output.botm == 1) {
+    }
 }
 
 void h5output_surf_botm_pseudo_surf(struct All_variables *E, int cycles)
 {
 }
 
-void h5output_avg_r(struct All_variables *E, int cycles)
+void h5output_average(struct All_variables *E, int cycles)
 {
 }
 
@@ -1372,7 +1391,7 @@
     if (E->parallel.me == 0)
         status = H5Dwrite(dataset, datatype, dataspace, filespace,
                           dxpl_id, &row);
-    
+
     /* Update NROWS attribute (for PyTables) */
     set_attribute_llong(dataset, "NROWS", E->hdf5.count);
 
@@ -1541,7 +1560,8 @@
 
     status = set_attribute(input, "stokes_flow_only", H5T_NATIVE_INT, &(E->control.stokes));
 
-    status = set_attribute_string(input, "output_format", E->control.output_format);
+    status = set_attribute_string(input, "output_format", E->output.format);
+    status = set_attribute_string(input, "output_optional", E->output.optional);
     status = set_attribute(input, "verbose", H5T_NATIVE_INT, &(E->control.verbose));
     status = set_attribute(input, "see_convergence", H5T_NATIVE_INT, &(E->control.print_convergence));
 

Modified: mc/3D/CitcomS/trunk/lib/global_defs.h
===================================================================
--- mc/3D/CitcomS/trunk/lib/global_defs.h	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/lib/global_defs.h	2006-08-18 04:59:26 UTC (rev 4383)
@@ -621,8 +621,6 @@
     char post_topo_file[100];
     char slabgeoid_file[100];
 
-    char output_format[10];  /* ascii or hdf5 */
-    char which_output[1000]; /* comma-delimited list of objects to output */
     char which_data_files[1000];
     char which_horiz_averages[1000];
     char which_running_data[1000];
@@ -662,11 +660,7 @@
 
     int pseudo_free_surf;
     int tracer;
-    int viscosity;    /* whether to output viscosity */
-    int stress;       /* whether to output stress */
-    int pressure;     /* whether to output pressure */
 
-
     double theta_min, theta_max, fi_min, fi_max;
     float start_age;
     int reset_startage;
@@ -797,6 +791,17 @@
     float   timedir;
 };
 
+struct Output {
+    char format[10];  /* ascii or hdf5 */
+    char optional[1000]; /* comma-delimited list of objects to output */
+    int stress;       /* whether to output stress */
+    int pressure;     /* whether to output pressure */
+    int surf;         /* whether to output surface data */
+    int botm;         /* whether to output bottom data */
+    int average;      /* whether to output horizontal averaged profile */
+};
+
+
 #ifdef USE_HDF5
 #include "hdf5_related.h"
 #endif
@@ -830,6 +835,7 @@
     struct Tracer Tracer;
     struct Bdry boundary;
     struct SBC sbc;
+    struct Output output;
 
     int filed[20];
 
@@ -931,7 +937,7 @@
     float (* node_space_function[3])(void*);
 
     /* function pointer for choosing between various output routines */
-    void (* output)(struct All_variables *, int);
+    void (* problem_output)(struct All_variables *, int);
 
   /* the following function pointers are for exchanger */
   void (* exchange_node_d)(struct All_variables *, double**, int);

Modified: mc/3D/CitcomS/trunk/module/outputs.cc
===================================================================
--- mc/3D/CitcomS/trunk/module/outputs.cc	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/module/outputs.cc	2006-08-18 04:59:26 UTC (rev 4383)
@@ -63,7 +63,7 @@
 	    else
 		    assert(0);
     else
-	    (E->output)(E, cycles);
+	    (E->problem_output)(E, cycles);
 
 
     Py_INCREF(Py_None);

Modified: mc/3D/CitcomS/trunk/module/setProperties.cc
===================================================================
--- mc/3D/CitcomS/trunk/module/setProperties.cc	2006-08-18 00:37:57 UTC (rev 4382)
+++ mc/3D/CitcomS/trunk/module/setProperties.cc	2006-08-18 04:59:26 UTC (rev 4383)
@@ -387,7 +387,9 @@
 
     getScalarProperty(properties, "stokes_flow_only", E->control.stokes, m);
 
-    getStringProperty(properties, "output_format", E->control.output_format, m);
+    getStringProperty(properties, "output_format", E->output.format, m);
+    getStringProperty(properties, "output_optional", E->output.optional, m);
+
     getScalarProperty(properties, "verbose", E->control.verbose, m);
     getScalarProperty(properties, "see_convergence", E->control.print_convergence, m);
 



More information about the cig-commits mailing list