[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