diff options
Diffstat (limited to 'src/driver/io.cc')
-rw-r--r-- | src/driver/io.cc | 249 |
1 files changed, 147 insertions, 102 deletions
diff --git a/src/driver/io.cc b/src/driver/io.cc index e7ea3e7..6202eaa 100644 --- a/src/driver/io.cc +++ b/src/driver/io.cc @@ -9,8 +9,8 @@ // output_gridfn - write an angular grid function to an output file // output_Jacobians - write a Jacobian matrix or matrices to an output file // -/// io_file_name - compute file name for angular-gridfn I/O file -/// OpenDX_control_file_name - compute file name for OpenDX control file +/// io_ASCII_file_name - compute file name for angular-gridfn I/O file +/// io_HDF5_file_name - compute file name for angular-gridfn I/O file // #include <stdio.h> @@ -21,6 +21,7 @@ #include "util_Table.h" #include "cctk.h" #include "cctk_Arguments.h" +#include "cctk_Parameters.h" #include "config.h" #include "stdc.h" @@ -28,6 +29,7 @@ #include "../jtutil/array.hh" #include "../jtutil/cpm_map.hh" #include "../jtutil/linear_map.hh" +using jtutil::error_exit; #include "../patch/coords.hh" #include "../patch/grid.hh" @@ -50,7 +52,6 @@ // all the code in this file is inside this namespace namespace AHFinderDirect { -using jtutil::error_exit; //****************************************************************************** //****************************************************************************** @@ -64,13 +65,15 @@ namespace { void output_OpenDX_control_file(const patch_system& ps, const struct IO_info& IO_info, int hn); - -const char* io_file_name(const struct IO_info& IO_info, - const char base_file_name[], - int hn, int AHF_iteration = 0); -const char* OpenDX_control_file_name(const struct IO_info& IO_info, - const char base_file_name[], - int hn); +const char* io_ASCII_file_name(const struct IO_info& IO_info, + const char base_file_name[], + int min_digits, + int hn, int AHF_iteration = 0); +const char* io_HDF5_file_name(const struct IO_info& IO_info, + const char base_file_name[], + int min_digits, + int hn, int AHF_iteration = 0); +void create_h_directory(const struct IO_info& IO_info); } //****************************************************************************** @@ -86,10 +89,11 @@ const char* OpenDX_control_file_name(const struct IO_info& IO_info, // void input_gridfn(patch_system& ps, int unknown_gfn, const struct IO_info& IO_info, const char base_file_name[], + int min_digits, int hn, bool print_msg_flag, int AHF_iteration /* = 0 */) { -const char* file_name = io_file_name(IO_info, base_file_name, - hn, AHF_iteration); +const char* file_name = io_ASCII_file_name(IO_info, base_file_name, min_digits, + hn, AHF_iteration); input_gridfn__explicit_name(ps, unknown_gfn, IO_info, base_file_name, print_msg_flag); @@ -115,27 +119,25 @@ if (print_msg_flag) " reading initial guess from \"%s\"", file_name); } -switch (IO_info.horizon_file_format) - { -case horizon_file_format__ASCII_gnuplot: +if (IO_info.output_ASCII_files) + then { ps.read_ghosted_gridfn(unknown_gfn, file_name, false); // no ghost zones in data file - break; + } -case horizon_file_format__HDF5: +else if (IO_info.output_HDF5_files) + then { CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"input_gridfn__explicit_name(): HDF5 data files not implemented yet!"); - /*NOTREACHED*/ +"input_gridfn__explicit_name(): reading from HDF5 data files not implemented yet!"); + } -default: +else + { CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, "\n" " input_gridfn__explicit_name():\n" -" unknown IO_info.horizon_file_format=(int)%d!\n" -" (this should never happen!)" - , - int(IO_info.horizon_file_format)); /*NOTREACHED*/ +" (this should never happen!)"); /*NOTREACHED*/ } } @@ -151,6 +153,19 @@ default: void setup_h_files(patch_system& ps, const struct IO_info& IO_info, int hn) { // create the output directory (if it doesn't already exist) +create_h_directory(IO_info); +output_OpenDX_control_file(ps, IO_info, hn); +} + +//****************************************************************************** + +// +// This function creates the h ooutput directory if it does not exist +// +namespace { +void create_h_directory(const struct IO_info& IO_info) +{ +// create the output directory (if it doesn't already exist) const int status = CCTK_CreateDirectory(IO_info.default_directory_permission, IO_info.h_directory); if (status < 0) @@ -162,9 +177,8 @@ if (status < 0) , status, IO_info.h_directory); /*NOTREACHED*/ - -output_OpenDX_control_file(ps, IO_info, hn); } + } //****************************************************************************** @@ -178,14 +192,18 @@ void output_OpenDX_control_file(const patch_system& ps, const struct IO_info& IO_info, int hn) { -const char* file_name = OpenDX_control_file_name(IO_info, - IO_info.h_base_file_name, - hn); -FILE *fileptr = fopen(file_name, "w"); +if (! IO_info.output_OpenDX_control_files) return; +static char file_name_buffer[IO_info::file_name_buffer_size]; +snprintf(file_name_buffer, IO_info::file_name_buffer_size, + "%s/%s.ah%d.%s", + IO_info.h_directory, IO_info.h_base_file_name, + hn, IO_info.OpenDX_control_file_name_extension); + +FILE *fileptr = fopen(file_name_buffer, "w"); if (fileptr == NULL) then CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, "output_OpenDX_control_file(): can't open output file \"%s\"!", - file_name); /*NOTREACHED*/ + file_name_buffer); /*NOTREACHED*/ fprintf(fileptr, "# list the size of each patch (N_rho x N_sigma)\n"); for (int pn = 0 ; pn < ps.N_patches() ; ++pn) @@ -222,15 +240,20 @@ fclose(fileptr); // FIXME: if the gridfn is not h, we assume that it's nominal-grid. // void output_gridfn(patch_system& ps, int unknown_gfn, + const char gfn_name[], const cGH *cctkGH, const struct IO_info& IO_info, const char base_file_name[], + int min_digits, int hn, bool print_msg_flag, int AHF_iteration /* = 0 */) { -const char* file_name = io_file_name(IO_info, base_file_name, + +if (IO_info.output_ASCII_files) + then { + const char* file_name + = io_ASCII_file_name(IO_info, base_file_name, min_digits, hn, AHF_iteration); + // create the output directory (if it doesn't already exist) + create_h_directory(IO_info); -switch (IO_info.horizon_file_format) - { -case horizon_file_format__ASCII_gnuplot: switch (unknown_gfn) { case gfns::gfn__h: @@ -250,6 +273,12 @@ case horizon_file_format__ASCII_gnuplot: "writing Theta to \"%s\"", file_name); ps.print_gridfn(unknown_gfn, file_name); break; + case gfns::gfn__mean_curvature: + if (print_msg_flag) + then CCTK_VInfo(CCTK_THORNSTRING, + "writing mean curvature to \"%s\"", file_name); + ps.print_gridfn(unknown_gfn, file_name); + break; case gfns::gfn__Delta_h: if (print_msg_flag) then CCTK_VInfo(CCTK_THORNSTRING, @@ -264,19 +293,52 @@ case horizon_file_format__ASCII_gnuplot: ps.print_gridfn(unknown_gfn, file_name); break; } - break; + } -case horizon_file_format__HDF5: - CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"output_gridfn(): HDF5 data files not implemented yet!"); /*NOTREACHED*/ +if (IO_info.output_HDF5_files) + then { + const char* file_name + = io_HDF5_file_name(IO_info, base_file_name, min_digits, + hn, AHF_iteration); + // create the output directory (if it doesn't already exist) + create_h_directory(IO_info); -default: - CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"\n" -" output_gridfn(): unknown IO_info.horizon_file_format=(int)%d!\n" -" (this should never happen!)" - , - int(IO_info.horizon_file_format)); /*NOTREACHED*/ + switch (unknown_gfn) + { + case gfns::gfn__h: + if (print_msg_flag) + then CCTK_VInfo(CCTK_THORNSTRING, + "writing h to \"%s\"", file_name); + ps.output_ghosted_gridfn_with_xyz + (unknown_gfn, gfn_name, cctkGH, + true, gfns::gfn__h, + file_name, + IO_info.output_ghost_zones_for_h); // should we include + // ghost zones? + break; + case gfns::gfn__Theta: + if (print_msg_flag) + then CCTK_VInfo(CCTK_THORNSTRING, + "writing Theta to \"%s\"", file_name); + ps.output_gridfn(unknown_gfn, gfn_name, cctkGH, + file_name); + break; + case gfns::gfn__Delta_h: + if (print_msg_flag) + then CCTK_VInfo(CCTK_THORNSTRING, + "writing Delta_h to \"%s\"", file_name); + ps.output_gridfn(unknown_gfn, gfn_name, cctkGH, + file_name); + break; + default: + if (print_msg_flag) + then CCTK_VInfo(CCTK_THORNSTRING, + "writing gfn=%d to \"%s\"", + unknown_gfn, file_name); + ps.output_gridfn(unknown_gfn, gfn_name, cctkGH, + file_name); + break; + } } } @@ -296,17 +358,21 @@ void output_Jacobians(const patch_system& ps, const Jacobian* Jac_NP_ptr, const Jacobian* Jac_SD_FDdr_ptr, const struct IO_info& IO_info, const char base_file_name[], + int min_digits, int hn, bool print_msg_flag, int AHF_iteration /* = 0 */) { if (Jac_NP_ptr == NULL) then { - CCTK_VWarn(SERIOUS_WARNING, __LINE__, __FILE__, CCTK_THORNSTRING, + CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING, "output_Jacobians(): Jac_NP_ptr == NULL is not (yet) supported!"); return; // *** ERROR RETURN *** } -const char* file_name = io_file_name(IO_info, base_file_name, - hn, AHF_iteration); +const char* file_name = io_ASCII_file_name(IO_info, base_file_name, min_digits, + hn, AHF_iteration); +// create the output directory (if it doesn't already exist) +create_h_directory(IO_info); + if (print_msg_flag) then CCTK_VInfo(CCTK_THORNSTRING, " writing %s to \"%s\"", @@ -427,40 +493,25 @@ fclose(fileptr); // result points into a private static buffer; the usual caveats apply. // namespace { -const char* io_file_name(const struct IO_info& IO_info, - const char base_file_name[], - int hn, int AHF_iteration /* = 0 */) +const char* io_ASCII_file_name(const struct IO_info& IO_info, + const char base_file_name[], int min_digits, + int hn, int AHF_iteration /* = 0 */) { static char file_name_buffer[IO_info::file_name_buffer_size]; -const char* file_name_extension; -switch (IO_info.horizon_file_format) - { -case horizon_file_format__ASCII_gnuplot: - file_name_extension = IO_info.ASCII_gnuplot_file_name_extension; - break; -case horizon_file_format__HDF5: - file_name_extension = IO_info.HDF5_file_name_extension; - break; -default: - CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"\n" -" io_file_name(): unknown IO_info.horizon_file_format=(int)%d!\n" -" (this should never happen!)" - , - int(IO_info.horizon_file_format)); /*NOTREACHED*/ - } +const char* file_name_extension + = IO_info.ASCII_gnuplot_file_name_extension; if (AHF_iteration == 0) then snprintf(file_name_buffer, IO_info::file_name_buffer_size, - "%s/%s.t%d.ah%d.%s", + "%s/%s.t%0*d.ah%d.%s", IO_info.h_directory, base_file_name, - IO_info.time_iteration, hn, + min_digits, IO_info.time_iteration, hn, file_name_extension); else snprintf(file_name_buffer, IO_info::file_name_buffer_size, - "%s/%s.t%d.ah%d.it%d.%s", + "%s/%s.t%0*d.ah%d.it%d.%s", IO_info.h_directory, base_file_name, - IO_info.time_iteration, hn, AHF_iteration, + min_digits, IO_info.time_iteration, hn, AHF_iteration, file_name_extension); return file_name_buffer; @@ -470,48 +521,42 @@ return file_name_buffer; //****************************************************************************** // -// This function encapsulates our file-naming conventions for OpenDX -// control files for our regular angular-gridfn output files. +// This function encapsulates our file-naming conventions for angular-gridfn +// output files (those used for h, H, and other angular grid functions). // // Arguments: // base_file_name[] = from the parameter file // hn = the horizon number +// AHF_iteration = the apparent horizon finder's internal iteration +// number (>= 1) if this is an intermediate iterate, +// or the default (0) if this is a final computed +// horizon position // // Results: // This function returns (a pointer to) the file name. The returned // result points into a private static buffer; the usual caveats apply. // namespace { -const char* OpenDX_control_file_name(const struct IO_info& IO_info, - const char base_file_name[], - int hn) +const char* io_HDF5_file_name(const struct IO_info& IO_info, + const char base_file_name[], int min_digits, + int hn, int AHF_iteration /* = 0 */) { -const char* file_name_extension; +static char file_name_buffer[IO_info::file_name_buffer_size]; -switch (IO_info.horizon_file_format) - { -case horizon_file_format__ASCII_gnuplot: - file_name_extension = IO_info.OpenDX_control_file_name_extension; - break; -case horizon_file_format__HDF5: - CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"\n" -" OpenDX_control_file_name(): don't know how to form OpenDX control file\n" -" name for HDF output files!"); /*NOTREACHED*/ -default: - CCTK_VWarn(FATAL_ERROR, __LINE__, __FILE__, CCTK_THORNSTRING, -"\n" -" OpenDX_control_file_name(): unknown IO_info.horizon_file_format=(int)%d!\n" -" (this should never happen!)" - , - int(IO_info.horizon_file_format)); /*NOTREACHED*/ - } +const char* file_name_extension + = IO_info.HDF5_file_name_extension; -static char file_name_buffer[IO_info::file_name_buffer_size]; -snprintf(file_name_buffer, IO_info::file_name_buffer_size, - "%s/%s.ah%d.%s", - IO_info.h_directory, base_file_name, hn, - file_name_extension); +if (AHF_iteration == 0) + then snprintf(file_name_buffer, IO_info::file_name_buffer_size, + "%s/%s.ah%d.%s", + IO_info.h_directory, base_file_name, + hn, + file_name_extension); + else snprintf(file_name_buffer, IO_info::file_name_buffer_size, + "%s/%s.ah%d.it%d.%s", + IO_info.h_directory, base_file_name, + hn, AHF_iteration, + file_name_extension); return file_name_buffer; } |