aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortradke <tradke@b32723a9-ab3a-4a60-88e2-2e5d99d7c17a>2005-02-04 18:09:36 +0000
committertradke <tradke@b32723a9-ab3a-4a60-88e2-2e5d99d7c17a>2005-02-04 18:09:36 +0000
commit60fbf5a676d539b19a41fdcae2dad0a1ec0386af (patch)
tree5f0c6371b5e9ad568546b80373c1e44c8652d6bb
parentc47be354437cdbb969e58bfef1e5d4c35ce95ce8 (diff)
Parse option "refinement_levels" in an I/O parameter option string.
If specified, it must be an array of positive integers selecting individual refinement levels to output. git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/IOUtil/trunk@223 b32723a9-ab3a-4a60-88e2-2e5d99d7c17a
-rw-r--r--src/Utils.c46
-rw-r--r--src/ioutil_Utils.h3
2 files changed, 49 insertions, 0 deletions
diff --git a/src/Utils.c b/src/Utils.c
index 653130e..33f0ec2 100644
--- a/src/Utils.c
+++ b/src/Utils.c
@@ -782,6 +782,7 @@ static void SetOutputVar (int vindex, const char *optstring, void *arg)
int table, iterator;
char key[128];
CCTK_INT type, nelems;
+ CCTK_INT *refinement_levels;
char *fullname;
const info_t *info = arg;
ioRequest *request;
@@ -910,6 +911,50 @@ static void SetOutputVar (int vindex, const char *optstring, void *arg)
Util_TableDeleteKey (table, "downsample");
}
+ /* check for option 'refinement_levels' */
+ if (Util_TableQueryValueInfo (table, &type, &nelems, "refinement_levels") > 0)
+ {
+ request->refinement_levels = 0;
+ if (type == CCTK_VARIABLE_INT && nelems > 0)
+ {
+ refinement_levels = malloc (nelems * sizeof (int));
+ Util_TableGetIntArray (table, nelems, refinement_levels,
+ "refinement_levels");
+ while (--nelems >= 0)
+ {
+ if (refinement_levels[nelems] < 0)
+ {
+ request->refinement_levels = 0;
+ break;
+ }
+ request->refinement_levels |= 1 << refinement_levels[nelems];
+ }
+ free (refinement_levels);
+ }
+ if (request->refinement_levels == 0)
+ {
+ if (CCTK_GroupTypeFromVarI (vindex) == CCTK_GF)
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Invalid value for option 'refinement_levels' in option "
+ "string '%s' in parameter '%s' (must be an array of "
+ "positive integers)", optstring, info->parameter_name);
+ }
+ else
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Meaningless option 'refinement_levels' in option "
+ "string '%s' in parameter '%s' (only makes sense for "
+ "grid functions)", optstring, info->parameter_name);
+ }
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Option 'refinement_levels' will be ignored for %s output "
+ "of variable '%s'", info->method_name, fullname);
+ request->refinement_levels = -1;
+ }
+ Util_TableDeleteKey (table, "refinement_levels");
+ }
+
/* warn about unrecognized options */
iterator = Util_TableItCreate (table);
for (iterator = Util_TableItCreate (table);
@@ -968,6 +1013,7 @@ ioRequest *IOUtil_DefaultIORequest (const cGH *GH, int vindex,
request->check_exist = myGH->recovered;
request->out_every = out_every_default;
request->with_ghostzones = 0;
+ request->refinement_levels = -1;
/* get the I/O request datatype (will be single-precision if requested) */
request->hdatatype = CCTK_VarTypeI (vindex);
diff --git a/src/ioutil_Utils.h b/src/ioutil_Utils.h
index f239c44..32341e3 100644
--- a/src/ioutil_Utils.h
+++ b/src/ioutil_Utils.h
@@ -48,6 +48,9 @@ typedef struct
/* offset and sizes of hyperslab into the variable's dataspace */
CCTK_INT *hoffset, *hsize, *hsize_chunk;
+ /* bitmask for refinement levels to output */
+ CCTK_INT refinement_levels;
+
} ioRequest;