[Commits] [svn:einsteintoolkit] incoming/Outflow/src/ (Rev. 64)
roland.haas at physics.gatech.edu
roland.haas at physics.gatech.edu
Thu May 3 12:48:44 CDT 2012
User: rhaas
Date: 2012/05/03 12:48 PM
Modified:
/Outflow/src/
outflow.c
Log:
Outflow: honor IOUtil's truncate_files parameter for all created files
File Changes:
Directory: /Outflow/src/
========================
File [modified]: outflow.c
Delta lines: +70 -24
===================================================================
--- Outflow/src/outflow.c 2012-05-03 17:45:36 UTC (rev 63)
+++ Outflow/src/outflow.c 2012-05-03 17:48:43 UTC (rev 64)
@@ -47,8 +47,7 @@
/******************************************************
***** records of which files need to be truncated ****
******************************************************/
-static CCTK_INT file_created[MAX_NUMBER_DETECTORS];
-static CCTK_INT fluxdens_file_created[MAX_NUMBER_DETECTORS];
+static CCTK_INT files_created = -1;
/*************************
***** Local routines ****
@@ -83,11 +82,13 @@
static CCTK_INT outflow_get_local_memory(CCTK_INT npoints);
static CCTK_REAL *outflow_allocate_array(CCTK_INT npoints, const char *name);
+/* replace '/' by '\' in file name to have Util_TableSet* accept it as a key */
+static const char *sanitize_filename(const char *fn);
/* write results to disk */
static int Outflow_write_output(CCTK_ARGUMENTS, CCTK_INT det, CCTK_REAL flux,
CCTK_REAL w_lorentz, const CCTK_REAL *threshold_fluxes);
static int Outflow_write_2d_output(CCTK_ARGUMENTS, const char *varname, CCTK_INT
- det, CCTK_INT *file_created_2d, const CCTK_REAL *data_det, const CCTK_REAL *w_det,
+ det, const CCTK_REAL *data_det, const CCTK_REAL *w_det,
const CCTK_REAL *surfaceelement_det,
int num_extras, const CCTK_INT *extras_ind, CCTK_REAL * const extras[]);
@@ -99,8 +100,24 @@
/**********************************************************************/
/*** IO ***/
/**********************************************************************/
+static const char *sanitize_filename(const char *fn)
+{
+ char *sfn = Util_Strdup(fn);
+ if (sfn == NULL) {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Could not allocate memory for sanitized file name");
+ }
+
+ for (char *s = sfn ; *s != '\0' ; s++) {
+ if(*s == '/')
+ *s = '\\';
+ }
+
+ return sfn;
+}
+
static int Outflow_write_2d_output(CCTK_ARGUMENTS, const char *varname, CCTK_INT
- det, CCTK_INT *file_created_2d, const CCTK_REAL *data_det, const CCTK_REAL *w_det,
+ det, const CCTK_REAL *data_det, const CCTK_REAL *w_det,
const CCTK_REAL *surfaceelement_det,
int num_extras, const CCTK_INT *extras_ind, CCTK_REAL * const extras[])
{
@@ -108,7 +125,9 @@
DECLARE_CCTK_ARGUMENTS;
char const *fmode;
- char *filename;
+ int ierr;
+ CCTK_INT file_created;
+ char *filename, *key;
char format_str_fixed[2048];
char format_str_extras[128];
size_t len_written;
@@ -126,25 +145,34 @@
}
assert(surface_index[det] >= 0);
- // file mode: append if already written
- fmode = (*file_created_2d>0) ? "a" : "w";
-
// filename
Util_asprintf (&filename, "%s/outflow_surface_det_%d_%s.asc", out_dir, det, varname);
assert(filename);
+ // file mode: append if already written
+ file_created = 0;
+ key = sanitize_filename(filename);
+ ierr = Util_TableGetInt(files_created, &file_created, key);
+ if (ierr < 0 && ierr != UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Internal error: could not check if file '%s' has already been created: %d",
+ filename, ierr);
+ }
+ fmode = !file_created && IO_TruncateOutputFiles(cctkGH) ? "w" : "a";
+
// open file
file = fopen (filename, fmode);
if (!file) {
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"write_outflow: Could not open scalar output file '%s'",
filename);
+ free(key);
free(filename);
return -1;
}
// write header on startup
- if (*file_created_2d<=0) {
+ if (!file_created) {
const CCTK_INT sn = surface_index[det];
const CCTK_INT ntheta=sf_ntheta[sn]-2*nghoststheta[sn];
const CCTK_INT nphi=sf_nphi[sn]-2*nghostsphi[sn];
@@ -250,8 +278,9 @@
fprintf(file, "\n"); /* create a block for gnuplot */
fclose(file);
+ Util_TableSetInt(files_created, 1, key);
+ free(key);
free(filename);
- *file_created_2d = 1;
return 1;
}
@@ -263,7 +292,9 @@
DECLARE_CCTK_ARGUMENTS;
char const *fmode;
- char *filename;
+ int ierr;
+ CCTK_INT file_created;
+ char *filename, *key;
char varname[1024];
char file_extension[5]=".asc";
char format_str_real[2048];
@@ -274,14 +305,6 @@
CCTK_VInfo(CCTK_THORNSTRING, "writing output");
}
- // file mode: append if already written
- if (det>=MAX_NUMBER_DETECTORS) {
- CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "warn: det=%d, but MAX_NUMBER_DETECTORS=%d, increase",
- det,MAX_NUMBER_DETECTORS);
- }
- fmode = (file_created[det]>0) ? "a" : "w";
-
// filename
sprintf(varname, "outflow_det_%d",det);
@@ -290,18 +313,30 @@
assert(filename);
sprintf (filename, "%s/%s%s", out_dir, varname, file_extension);
+ // file mode: append if already written
+ file_created = 0;
+ key = sanitize_filename(filename);
+ ierr = Util_TableGetInt(files_created, &file_created, key);
+ if (ierr < 0 && ierr != UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Internal error: could not check if file '%s' has already been created: %d",
+ filename, ierr);
+ }
+ fmode = !file_created && IO_TruncateOutputFiles(cctkGH) ? "w" : "a";
+
// open file
file = fopen (filename, fmode);
if (!file) {
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"write_outflow: Could not open scalar output file '%s'",
filename);
+ free(key);
free(filename);
return -1;
}
// write header on startup
- if (file_created[det]<=0) {
+ if (!file_created) {
fprintf(file,"# Outflow\n");
fprintf(file,"# detector no.=%d\n",det);
fprintf(file,"# gnuplot column index:\n");
@@ -327,11 +362,10 @@
fprintf(file,"\n");
fclose(file);
+ Util_TableSetInt(files_created, 1, key);
+ free(key);
free(filename);
- if (file_created[det]==0) {
- file_created[det]=1;
- }
return 1;
}
@@ -1098,7 +1132,7 @@
}
if (output_2d_data) {
ierr=Outflow_write_2d_output(CCTK_PASS_CTOC, "fluxdens", det,
- &fluxdens_file_created[det], fluxdens_det, w_det, surfaceelement_det, num_extras, extras_ind, extras);
+ fluxdens_det, w_det, surfaceelement_det, num_extras, extras_ind, extras);
if (ierr<0) {
CCTK_WARN(1,"writing of fluxdens information to files failed");
}
@@ -1111,3 +1145,15 @@
free(extras[i]);
}
}
+
+int outflow_setup (void)
+{
+ files_created = Util_TableCreate(0);
+ if (files_created < 0) {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Internal error: could not create files_created table: %d",
+ files_created);
+ }
+
+ return 0;
+}
More information about the Commits
mailing list