diff options
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/util.cc')
-rw-r--r-- | CarpetDev/CarpetIOF5/src/util.cc | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/CarpetDev/CarpetIOF5/src/util.cc b/CarpetDev/CarpetIOF5/src/util.cc index 57ccfd6db..15e01fba7 100644 --- a/CarpetDev/CarpetIOF5/src/util.cc +++ b/CarpetDev/CarpetIOF5/src/util.cc @@ -2,7 +2,9 @@ #include <cctk_Arguments.h> #include <cctk_Parameters.h> +#include <algorithm> #include <cassert> +#include <cctype> #include <cstdio> #include <cstdlib> #include <cstring> @@ -95,7 +97,26 @@ namespace CarpetIOF5 { free (thornname); } else if (CCTK_EQUALS (file_content, "everything")) { - filename_buf << out_filename; + if (CCTK_EQUALS(out_filename, "")) { + // Obtain the parameter file name + char buf[10000]; + int const ilen = CCTK_ParameterFilename (sizeof buf, buf); + assert (ilen < int(sizeof buf) - 1); + char* parfilename = buf; + // Remove directory prefix, if any + char* const slash = strrchr(parfilename, '/'); + if (slash) { + parfilename = &slash[1]; + } + // Remove suffix, if it is there + char* const suffix = strrchr(parfilename, '.'); + if (suffix and strcmp(suffix, ".par")==0) { + suffix[0] = '\0'; + } + filename_buf << parfilename; + } else { + filename_buf << out_filename; + } } else { assert (0); @@ -200,7 +221,33 @@ namespace CarpetIOF5 { return p; } - // Generate a good tensor basis name (chart name) + // Generate a good topology name (refinement level name) + string + generate_topologyname (cGH const *const cctkGH, + int const gi, + ivect const& reffact) + { + ostringstream buf; + if (gi == -1) { + // grid function + buf << "VertexLevel_"; + for (int d=0; d<dim; ++d) { + if (d>0) buf << "x"; + buf << reffact[d]; + } + } else { + // grid array + char *const groupname = CCTK_GroupName(gi); + for (char *p=groupname; *p; ++p) { + *p = tolower(*p); + } + buf << "Group_" << groupname; + free (groupname); + } + return buf.str(); + } + + // Generate a good chart name (tensor basis name) string generate_chartname (cGH const *const cctkGH) { @@ -216,38 +263,55 @@ namespace CarpetIOF5 { #endif } - // Generate a good fragment name (map name) + // Generate a good fragment name (map and component name) + // (We assume that fragment names need to be unique only within a + // topology, not across topologies.) string - generate_fragmentname (cGH const *const cctkGH, int const m) + generate_fragmentname (cGH const *const cctkGH, int const m, int const c) { ostringstream buf; - buf << "Map_" << m; + buf << "Map_" << m << "_Component_" << c; return buf.str(); } - int + void interpret_fragmentname (cGH const *const cctkGH, - char const *const fragmentname) + char const *const fragmentname, + int& m, int& c) { - int m = -1; - sscanf (fragmentname, "Map_%d", &m); + m = -1; + c = -1; + sscanf (fragmentname, "Map_%d_Component_%d", &m, &c); assert (m>=0 and m<Carpet::maps); - return m; + assert (c>=0); } - // Generate a good topology name (map and refinement level name) + // Generate a good field name (group or variable name) string - generate_topologyname (cGH const *const cctkGH, - int const m, ivect const& reffact) + generate_fieldname (cGH const *const cctkGH, + int const vi, tensortype_t const tt) { - ostringstream buf; - // buf << "Map_" << m << "_VertexLevel_"; - buf << "VertexLevel_"; - for (int d=0; d<dim; ++d) { - if (d>0) buf << "x"; - buf << reffact[d]; + int const gi = CCTK_GroupIndexFromVarI(vi); + int const numvars = CCTK_NumVarsInGroupI(gi); + string name; + // Use the variable name instead of the group name if we may + // output several variables per group + if (tt == tt_scalar and numvars >1) { + char *const fullname = CCTK_FullName(vi); + name = fullname; + free (fullname); + } else { + char *const groupname = CCTK_GroupName(gi); + name = groupname; + free (groupname); } - return buf.str(); + transform (name.begin(), name.end(), name.begin(), ::tolower); + string const sep = "::"; + size_t const pos = name.find(sep); + if (pos != string::npos) { + name.replace (pos, sep.size(), "."); + } + return name; } |