aboutsummaryrefslogtreecommitdiff
path: root/CarpetDev/CarpetIOF5/src/IOF5.cc
diff options
context:
space:
mode:
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/IOF5.cc')
-rw-r--r--CarpetDev/CarpetIOF5/src/IOF5.cc116
1 files changed, 106 insertions, 10 deletions
diff --git a/CarpetDev/CarpetIOF5/src/IOF5.cc b/CarpetDev/CarpetIOF5/src/IOF5.cc
index c21332adb..94e1089f3 100644
--- a/CarpetDev/CarpetIOF5/src/IOF5.cc
+++ b/CarpetDev/CarpetIOF5/src/IOF5.cc
@@ -1,5 +1,6 @@
#include <algorithm>
#include <cassert>
+#include <cctype>
#include <cmath>
#include <cstdlib>
#include <cstring>
@@ -84,6 +85,12 @@ namespace CarpetIOF5 {
+ static string
+ generate_filename (cGH const * cctkGH,
+ int variable);
+
+
+
int
CarpetIOF5_Startup ()
{
@@ -316,17 +323,17 @@ namespace CarpetIOF5 {
assert (cctkGH != 0);
assert (variable >= 0 and variable < CCTK_NumVars());
+ char * const fullname = CCTK_FullName (variable);
+ assert (fullname);
+
if (verbose)
{
- char * const fullname = CCTK_FullName(variable);
CCTK_VInfo (CCTK_THORNSTRING, "TriggerOutput \"%s\"", fullname);
- free (fullname);
}
- char * fullname = CCTK_FullName (variable);
- assert (fullname);
+ string const alias = generate_filename (cctkGH, variable);
- int const ierr = OutputVarAs (cctkGH, fullname, out_filename);
+ int const ierr = OutputVarAs (cctkGH, fullname, alias.c_str());
free (fullname);
@@ -369,18 +376,34 @@ namespace CarpetIOF5 {
extending_t extending (cctkGH);
- bool const use_IO_out_dir = std::strcmp (out_dir, "") == 0;
+ bool const use_IO_out_dir = strcmp (out_dir, "") == 0;
string const basename
= (use_IO_out_dir ? IO_out_dir : out_dir) + string ("/") + alias;
- bool const want_metafile = CCTK_MyProc (cctkGH) == 0;
bool const did_truncate = extending.get_did_truncate (basename);
bool const do_truncate
= not did_truncate and IO_TruncateOutputFiles (cctkGH);
extending.set_did_truncate (basename);
- F5::file_t file (cctkGH, basename, string (out_extension),
- want_metafile, do_truncate);
+ F5::file_t file (cctkGH, basename, string (out_extension), do_truncate);
+
+ if (do_truncate)
+ {
+ // Output parameters once after the output file has been created
+ if (CCTK_EQUALS (out_save_parameters, "all") or
+ CCTK_EQUALS (out_save_parameters, "only set"))
+ {
+ WriteParameters (file);
+ }
+ else if (CCTK_EQUALS (out_save_parameters, "no"))
+ {
+ // do nothing
+ }
+ else
+ {
+ assert (0);
+ }
+ }
writer_t writer (cctkGH, variable);
writer.write (file);
@@ -393,8 +416,12 @@ namespace CarpetIOF5 {
void
WriteParameters (F5::file_t & file)
{
+ bool const use_metafile = file.get_have_metafile();
+ hid_t const hdf5_file
+ = use_metafile ? file.get_hdf5_metafile() : file.get_hdf5_file();
+
hid_t const parameter_group
- = F5::open_or_create_group (file.get_hdf5_file(), "Cactus parameters");
+ = F5::open_or_create_group (hdf5_file, "Cactus parameters");
int first = 1;
for (;;)
@@ -456,4 +483,73 @@ namespace CarpetIOF5 {
assert (not herr);
}
+
+
+ string
+ generate_filename (cGH const * const cctkGH,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ assert (variable >= 0);
+
+ ostringstream filename_buf;
+
+ if (CCTK_EQUALS (file_content, "variable"))
+ {
+ char * const varname = CCTK_FullName (variable);
+ assert (varname);
+ for (char * p = varname; * p; ++ p)
+ {
+ *p = tolower (* p);
+ }
+ filename_buf << varname;
+ free (varname);
+ }
+ else if (CCTK_EQUALS (file_content, "group"))
+ {
+ char * const groupname = CCTK_GroupNameFromVarI (variable);
+ assert (groupname);
+ for (char * p = groupname; * p; ++ p)
+ {
+ *p = tolower (* p);
+ }
+ filename_buf << groupname;
+ free (groupname);
+ }
+ else if (CCTK_EQUALS (file_content, "thorn"))
+ {
+ char const * const impname = CCTK_ImpFromVarI (variable);
+ char * const thornname = strdup (impname);
+ assert (thornname);
+ char * const colon = strchr (thornname, ':');
+ assert (colon);
+ * colon = '\0';
+ for (char * p = thornname; * p; ++ p)
+ {
+ *p = tolower (* p);
+ }
+ filename_buf << thornname;
+ free (thornname);
+ }
+ else if (CCTK_EQUALS (file_content, "everything"))
+ {
+ filename_buf << out_filename;
+ }
+ else
+ {
+ assert (0);
+ }
+
+ if (out_timesteps_per_file > 0)
+ {
+ int const iteration = (cctkGH->cctk_iteration
+ / out_timesteps_per_file * out_timesteps_per_file);
+ filename_buf << ".it"
+ << setw (iteration_digits) << setfill ('0') << iteration;
+ }
+
+ return filename_buf.str();
+ }
+
} // namespace CarpetIOF5