From 60fbf5a676d539b19a41fdcae2dad0a1ec0386af Mon Sep 17 00:00:00 2001 From: tradke Date: Fri, 4 Feb 2005 18:09:36 +0000 Subject: 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 --- src/Utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/ioutil_Utils.h | 3 +++ 2 files changed, 49 insertions(+) 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; -- cgit v1.2.3