diff options
author | tradke <tradke@94b1c47f-dcfd-45ef-a468-0854c0e9e350> | 2001-12-28 21:28:37 +0000 |
---|---|---|
committer | tradke <tradke@94b1c47f-dcfd-45ef-a468-0854c0e9e350> | 2001-12-28 21:28:37 +0000 |
commit | 2031746c9010e039c08e8b943e3b7038ed389cdf (patch) | |
tree | 4d3b3610eae587739bdcecadd3491f3c137a2f9f /src | |
parent | 76fbba7e6738c8fddaa2cbf53f7efc4145ea418c (diff) |
Fixed filename construction for 1D output of 1D and 1D variables.
This closes PR CactusBase-871.
Write both imaginary and real part of complex variables into a single file
for "gnuplot" output styles.
This closes PR CactusBase-870.
git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/IOASCII/trunk@94 94b1c47f-dcfd-45ef-a468-0854c0e9e350
Diffstat (limited to 'src')
-rw-r--r-- | src/Write1D.c | 219 | ||||
-rw-r--r-- | src/Write2D.c | 23 | ||||
-rw-r--r-- | src/Write3D.c | 25 |
3 files changed, 167 insertions, 100 deletions
diff --git a/src/Write1D.c b/src/Write1D.c index 2ba8fe8..9a68a31 100644 --- a/src/Write1D.c +++ b/src/Write1D.c @@ -37,8 +37,7 @@ CCTK_FILEVERSION(CactusBase_IOASCII_Write1D_c) /* macro to output a 1D line (with coordinates for GFs) as typed data */ #define OUTPUT_TYPED_DATA(grouptype, hsize, coord_data, stagger_offset, \ - cctk_type, cctk_extract_fn, c_type, data, \ - format, file) \ + cctk_type, c_type, h0, stride, data, format, file) \ { \ int h; \ cctk_type *typed_data = (cctk_type *) data; \ @@ -46,20 +45,28 @@ CCTK_FILEVERSION(CactusBase_IOASCII_Write1D_c) \ if (grouptype == CCTK_GF) \ { \ - for (h = 0; h < hsize; h++) \ + for (h = h0; h < stride * hsize; h += stride) \ { \ fprintf (file, format, \ (double) (coord_data[h] + stagger_offset), \ - (c_type) cctk_extract_fn (typed_data[h])); \ + (c_type) typed_data[h]); \ + if (stride == 1) \ + { \ + fprintf (file, out_real_format, (c_type) typed_data[h + 1]);\ + } \ + fputc ('\n', file); \ } \ } \ else \ { \ - for (h = 0; h < hsize; h++) \ + for (h = h0; h < stride * hsize; h += stride) \ { \ - fprintf (file, format, \ - (double) h, \ - (c_type) cctk_extract_fn (typed_data[h])); \ + fprintf (file, format, (double) h, (c_type) typed_data[h]); \ + if (stride == 1) \ + { \ + fprintf (file, out_real_format, (c_type) typed_data[h + 1]);\ + } \ + fputc ('\n', file); \ } \ } \ } @@ -100,10 +107,15 @@ CCTK_FILEVERSION(CactusBase_IOASCII_Write1D_c) @vtype const char * @vio in @endvar + + @returntype int + @returndesc + 0 for success, or<BR> + -1 if variable has no storage assigned + @endreturndesc @@*/ -void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) +int IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) { - DECLARE_CCTK_PARAMETERS asciiioGH *myGH; /* IOASCII extension handle */ int Do_it[4]; /* flags indicating actual work */ int coord_index[3]; /* x,y,z coordinate variable indices */ @@ -116,23 +128,25 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) cGroup group_static_data; /* variable's group static data */ cGroupDynamicData group_dynamic_data;/* variable's group dynamic data */ char *fullname; /* variable's full name */ - char header_fmt[18]; /* header format string */ - char ylabel1_fmt[13]; /* y-label format string */ - char ylabel2_fmt[13]; /* y-label format string */ - char time_fmt[30]; /* time format string */ - char data_fmt_int[30]; /* data format string for int types */ - char data_fmt_real[30]; /* data format string for float types */ + char header_fmt_string[18]; /* header format string */ + char ylabel1_fmt_string[13]; /* y-label format string */ + char ylabel2_fmt_string[13]; /* y-label format string */ + char time_fmt_string[30]; /* time format string */ + char data_fmt_string_int[30]; /* data format string for int types */ + char data_fmt_string_real[30]; /* data format string for float types */ + char out_real_format[30]; /* data format string for a real type */ const char *file_extension; /* filename extension */ char comment_char; /* character starting a comment */ FILE *file[8]; /* fds for x,y,z,d output (also COMPLEX)*/ CCTK_REAL coord_lower[3], offset; - int num_files; + int stride, num_files; int upper, lower; struct stat fileinfo; const char *openmode; static char *extensions[] = {"xl", "yl", "zl", "dl"}; char *filename, *type_extension, buffer[128]; ioAdvertisedFileDesc advertised_file; + DECLARE_CCTK_PARAMETERS /* get the variable's group index and its full name */ @@ -146,7 +160,7 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) "IOASCII_Write1D: No IOASCII_1D output for '%s' (no storage)", fullname); free (fullname); - return; + return (-1); } /* get the handle for IOASCII extensions */ @@ -176,7 +190,7 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) if (! (Do_it[0] || Do_it[1] || Do_it[2] || Do_it[3])) { free (fullname); - return; + return (0); } /* DEPRICATED IN BETA12 */ @@ -207,28 +221,29 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) { comment_char = '"'; file_extension = ".xg"; - sprintf (header_fmt, "\n\n%cTime = %%%s\n", comment_char, out_format); + sprintf (header_fmt_string, "\n\n%cTime = %%%s\n", comment_char,out_format); } else { comment_char = '#'; file_extension = ".asc"; - sprintf (header_fmt, "\n%cTime = %%%s\n", comment_char, out_format); + sprintf (header_fmt_string, "\n%cTime = %%%s\n", comment_char, out_format); } - sprintf (ylabel1_fmt, " (%%c = %%%s", out_format); - sprintf (ylabel2_fmt, ", %%c = %%%s", out_format); + sprintf (ylabel1_fmt_string, " (%%c = %%%s", out_format); + sprintf (ylabel2_fmt_string, ", %%c = %%%s", out_format); + sprintf (out_real_format, "\t\t%%%s", out_format); /* check whether to include physical time as separate column in the output */ i = 0; if (CCTK_Equals (out1D_style, "gnuplot f(t,x)")) { - sprintf (time_fmt, "%%%s\t\t", out_format); - sprintf (data_fmt_int, time_fmt, (double) GH->cctk_time); - sprintf (data_fmt_real, time_fmt, (double) GH->cctk_time); - i = strlen (data_fmt_int); + sprintf (time_fmt_string, "%%%s\t\t", out_format); + sprintf (data_fmt_string_int, time_fmt_string, (double) GH->cctk_time); + sprintf (data_fmt_string_real, time_fmt_string, (double) GH->cctk_time); + i = strlen (data_fmt_string_int); } - sprintf (data_fmt_int + i, "%%%s\t\t%%d\n", out_format); - sprintf (data_fmt_real + i, "%%%s\t\t%%%s\n", out_format,out_format); + sprintf (data_fmt_string_int + i, "%%%s\t\t%%d", out_format); + sprintf (data_fmt_string_real + i, "%%%s\t\t%%%s", out_format, out_format); #ifdef DEBUG_IOASCII printf ("\nIn IOASCII Write1D\n------------------\n"); @@ -265,6 +280,11 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) /* What processor are we on? */ myproc = CCTK_MyProc (GH); + /* get the stride into the data and the (maximum) number of files to write */ + stride = group_static_data.vartype == CCTK_VARIABLE_COMPLEX && + CCTK_Equals (out1D_style, "xgraph") ? 2 : 1; + num_files = stride * 4; + /* Processor 0 opens the files with the appropriate name */ if (myproc == 0) { @@ -273,8 +293,6 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) filename = (char *) malloc (strlen (myGH->outdir1D) + strlen (alias) + sizeof (slicename) + 20); - num_files = group_static_data.vartype == CCTK_VARIABLE_COMPLEX ? 8 : 4; - for (i = 0; i < num_files; i++) { dir = i % 4; @@ -285,8 +303,8 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) continue; } - /* add suffix for complex type variables */ - if (group_static_data.vartype == CCTK_VARIABLE_COMPLEX) + /* add suffix for complex type variables in xgraph output */ + if (group_static_data.vartype == CCTK_VARIABLE_COMPLEX && num_files == 8) { if (new_filename_scheme) { @@ -316,10 +334,23 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) { if ((i + 1) % 4) { - /* give the slice origin as range [1 .. n] */ - sprintf (slicename, "%s%c_[%d][%d]", type_extension, 'x' + dir, - myGH->spxyz[group_static_data.dim-1][dir][lower], - myGH->spxyz[group_static_data.dim-1][dir][upper]); + if (group_static_data.dim == 1) + { + sprintf (slicename, "%s1D", type_extension); + } + else if (group_static_data.dim == 2) + { + /* give the slice origin as range [1 .. n] */ + sprintf (slicename, "%s%c_[%d]", type_extension, 'x' + dir, + myGH->spxyz[group_static_data.dim-1][dir][lower]); + } + else + { + /* give the slice origin as range [1 .. n] */ + sprintf (slicename, "%s%c_[%d][%d]", type_extension, 'x' + dir, + myGH->spxyz[group_static_data.dim-1][dir][lower], + myGH->spxyz[group_static_data.dim-1][dir][upper]); + } } else { @@ -429,12 +460,12 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) /* output the physical coordinates of the 1D line */ if (have_coords) { - fprintf (file[i], ylabel1_fmt, 'x' + lower, + fprintf (file[i], ylabel1_fmt_string, 'x' + lower, coord_lower[lower] + GH->cctk_delta_space[lower] * myGH->spxyz[group_static_data.dim-1][dir][lower]); if (group_static_data.dim > 2) { - fprintf (file[i], ylabel2_fmt, 'x' + upper, + fprintf (file[i], ylabel2_fmt_string, 'x' + upper, coord_lower[upper] + GH->cctk_delta_space[upper] * myGH->spxyz[group_static_data.dim-1][dir][upper]); } @@ -610,118 +641,130 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) } /* print out header */ - fprintf (file[dir], header_fmt, GH->cctk_time); + fprintf (file[dir], header_fmt_string, GH->cctk_time); /* and then loop through the line points */ switch (group_static_data.vartype) { case CCTK_VARIABLE_CHAR: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_BYTE, NOTHING, int, data, - data_fmt_int, file[dir]); + offset, CCTK_BYTE, int, 0, 1, data, + data_fmt_string_int, file[dir]); break; case CCTK_VARIABLE_INT: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_INT, NOTHING, int, data, - data_fmt_int, file[dir]); + offset, CCTK_INT, int, 0, 1, data, + data_fmt_string_int, file[dir]); break; case CCTK_VARIABLE_REAL: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_REAL, NOTHING, double, data, - data_fmt_real, file[dir]); + offset, CCTK_REAL, double, 0, 1, data, + data_fmt_string_real, file[dir]); break; case CCTK_VARIABLE_COMPLEX: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX, CCTK_CmplxReal, double, data, - data_fmt_real, file[dir]); - /* print out header */ - fprintf (file[dir + 4], header_fmt, GH->cctk_time); - OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX, CCTK_CmplxImag, double, data, - data_fmt_real, file[dir + 4]); + offset, CCTK_REAL, double, 0, stride, data, + data_fmt_string_real, file[dir]); + if (stride == 2) + { + /* print out header */ + fprintf (file[dir + 4], header_fmt_string, GH->cctk_time); + OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, + offset, CCTK_REAL, double, 1, stride, data, + data_fmt_string_real, file[dir + 4]); + } break; #ifdef CCTK_INT2 case CCTK_VARIABLE_INT2: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_INT2, NOTHING, int, data, - data_fmt_int, file[dir]); + offset, CCTK_INT2, int, 0, 1, data, + data_fmt_string_int, file[dir]); break; #endif #ifdef CCTK_INT4 case CCTK_VARIABLE_INT4: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_INT4, NOTHING, int, data, - data_fmt_int, file[dir]); + offset, CCTK_INT4, int, 0, 1, data, + data_fmt_string_int, file[dir]); break; #endif #ifdef CCTK_INT8 case CCTK_VARIABLE_INT8: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_INT8, NOTHING, int, data, - data_fmt_int, file[dir]); + offset, CCTK_INT8, int, 0, 1, data, + data_fmt_string_int, file[dir]); break; #endif #ifdef CCTK_REAL4 case CCTK_VARIABLE_REAL4: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_REAL4, NOTHING, double, data, - data_fmt_real, file[dir]); + offset, CCTK_REAL4, double, 0, 1, data, + data_fmt_string_real, file[dir]); break; case CCTK_VARIABLE_COMPLEX8: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX8, CCTK_Cmplx8Real, - double, data, data_fmt_real, file[dir]); - /* print out header */ - fprintf (file[dir + 4], header_fmt, GH->cctk_time); - OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX8, CCTK_Cmplx8Imag, - double, data, data_fmt_real, file[dir + 4]); + offset, CCTK_REAL4, double, 0, stride, data, + data_fmt_string_real, file[dir]); + if (stride == 2) + { + /* print out header */ + fprintf (file[dir + 4], header_fmt_string, GH->cctk_time); + OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, + offset, CCTK_REAL4, double, 1, stride, data, + data_fmt_string_real, file[dir + 4]); + } break; #endif #ifdef CCTK_REAL8 case CCTK_VARIABLE_REAL8: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_REAL8, NOTHING, double, data, - data_fmt_real, file[dir]); + offset, CCTK_REAL8, double, 0, 1, data, + data_fmt_string_real, file[dir]); break; case CCTK_VARIABLE_COMPLEX16: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX16, CCTK_Cmplx16Real, - double, data, data_fmt_real, file[dir]); - /* print out header */ - fprintf (file[dir + 4], header_fmt, GH->cctk_time); - OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX16, CCTK_Cmplx16Imag, - double, data, data_fmt_real, file[dir + 4]); + offset, CCTK_REAL8, double, 0, stride, data, + data_fmt_string_real, file[dir]); + if (stride == 2) + { + /* print out header */ + fprintf (file[dir + 4], header_fmt_string, GH->cctk_time); + OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, + offset, CCTK_REAL8, double, 1, stride, data, + data_fmt_string_real, file[dir + 4]); + } break; #endif #ifdef CCTK_REAL16 case CCTK_VARIABLE_REAL16: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_REAL16, NOTHING, double, data, - data_fmt_real, file[dir]); + offset, CCTK_REAL16, double, 0, 1, data, + data_fmt_string_real, file[dir]); break; case CCTK_VARIABLE_COMPLEX32: OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX32, CCTK_Cmplx32Real, - double, data, data_fmt_real, file[dir]); - /* print out header */ - fprintf (file[dir + 4], header_fmt, GH->cctk_time); - OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, - offset, CCTK_COMPLEX32, CCTK_Cmplx32Imag, - double, data, data_fmt_real, file[dir + 4]); + offset, CCTK_REAL16, double, 0, stride, data, + data_fmt_string_real, file[dir]); + if (stride == 2) + { + /* print out header */ + fprintf (file[dir + 4], header_fmt_string, GH->cctk_time); + OUTPUT_TYPED_DATA (group_static_data.grouptype, hsize, coord_data, + offset, CCTK_REAL16, double, 1, stride, data, + data_fmt_string_real, file[dir + 4]); + } break; #endif @@ -732,7 +775,7 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) /* close the output file(s) */ fclose (file[dir]); - if (group_static_data.vartype == CCTK_VARIABLE_COMPLEX) + if (num_files == 8) { fclose (file[dir + 4]); } @@ -749,4 +792,6 @@ void IOASCII_Write1D (const cGH *GH, int vindex, const char *alias) /* free allocated resources */ free (fullname); + + return (0); } diff --git a/src/Write2D.c b/src/Write2D.c index e3e9847..65fdebb 100644 --- a/src/Write2D.c +++ b/src/Write2D.c @@ -108,8 +108,17 @@ CCTK_FILEVERSION(CactusBase_IOASCII_Write2D_c) @vtype const char * @vio in @endvar + + @returntype int + @returndesc + 0 for success, or<BR> + -1 if variable has no storage assigned<BR> + -2 if output file couldn't be opened<BR> + -3 if hyperslab for coordinates and/or variable couldn't be + extracted + @endreturndesc @@*/ -void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) +int IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) { DECLARE_CCTK_PARAMETERS int myproc; @@ -152,7 +161,7 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING, "No IOASCII 2D output for '%s' (no storage)", fullname); free (fullname); - return; + return (-1); } /* Get the handle for IOASCII extensions */ @@ -294,7 +303,7 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot open 2D output file '%s'", filename); - return; + return (-2); } /* advertise the file for downloading and write file info */ @@ -398,7 +407,7 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Failed to extract 2D hyperslab for %c-coordinate", 'x' + dir_i); - return; + return (-3); } /* get the j-coordinate slice */ @@ -410,7 +419,7 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) "Failed to extract 2D hyperslab for %c-coordinate", 'x' + dir_j); free (coord_data_i); - return; + return (-3); } } else @@ -436,7 +445,7 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) { free (coord_data_j); } - return; + return (-3); } /* proc 0 writes */ @@ -552,4 +561,6 @@ void IOASCII_Write2D (const cGH *GH, int vindex, const char *alias) } /* end of outputting the data by processor 0 */ } /* end of looping through xyz directions */ + + return (0); } diff --git a/src/Write3D.c b/src/Write3D.c index c092535..e5c477b 100644 --- a/src/Write3D.c +++ b/src/Write3D.c @@ -115,8 +115,17 @@ CCTK_FILEVERSION(CactusBase_IOASCII_Write3D_c) @vtype const char * @vio in @endvar + + @returntype int + @returndesc + 0 for success, or<BR> + -1 if variable has no storage assigned<BR> + -2 if output file couldn't be opened<BR> + -3 if hyperslab for coordinates and/or variable couldn't be + extracted + @endreturndesc @@*/ -void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) +int IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) { DECLARE_CCTK_PARAMETERS int myproc, groupindex, dir, have_coords; @@ -159,7 +168,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING, "No IOASCII 3D output for '%s' (no storage)", fullname); free (fullname); - return; + return (-1); } /* Get the handle for IOASCII extensions */ @@ -248,7 +257,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Cannot open 3D IOASCII output file '%s'", filename); - return; + return (-2); } /* advertise the file for downloading and write file info */ @@ -302,7 +311,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) { CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Failed to extract 3D hyperslab for x-coordinate"); - return; + return (-3); } /* get the j-coordinate volume */ @@ -313,7 +322,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING, "Failed to extract 3D hyperslab for y-coordinate"); free (coord_data[0]); - return; + return (-3); } /* get the k-coordinate volume */ @@ -325,7 +334,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) "Failed to extract 3D hyperslab for z-coordinate"); free (coord_data[1]); free (coord_data[0]); - return; + return (-3); } } else @@ -349,7 +358,7 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) free (coord_data[dir]); } } - return; + return (-3); } /* proc 0 writes */ @@ -456,4 +465,6 @@ void IOASCII_Write3D (const cGH *GH, int vindex, const char *alias) } /* end of outputting the data by processor 0 */ + + return (0); } |