aboutsummaryrefslogtreecommitdiff
path: root/src/driver/io.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/driver/io.cc')
-rw-r--r--src/driver/io.cc249
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;
}