commit 0e02fd25ee1af4ca480892785355ae2ccbcf02e0
parent 4941494975c3e111a251ab94284976f867aaf38b
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 3 Sep 2020 16:19:27 +0200
Fix the green serialisation
Diffstat:
2 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/src/sdis.h b/src/sdis.h
@@ -510,7 +510,7 @@ struct sdis_compute_power_args {
double fp_to_meter; /* Scale from floating point units to meters */
struct ssp_rng* rng_state; /* Initial RNG state. May be NULL */
};
-#define SDIS_COMPUTE_POWER_ARGS_DEFAULT__ { \
+#define SDIS_COMPUTE_POWER_ARGS_DEFAULT__ { \
10000, /* #realisations */ \
NULL, /* Medium */ \
{DBL_MAX,DBL_MAX}, /* Time range */ \
diff --git a/src/sdis_green.c b/src/sdis_green.c
@@ -297,6 +297,38 @@ struct sdis_green_function {
/*******************************************************************************
* Helper functions
******************************************************************************/
+enum rng_type {
+ RNG_KISS,
+ RNG_MT_19937_64,
+ RNG_RANLUX48,
+ RNG_THREEFRY,
+ RNG_UNKNOWN
+};
+
+static INLINE enum rng_type
+get_rng_type_enum(const struct ssp_rng_type* type)
+{
+ ASSERT(type);
+ if(ssp_rng_type_eq(type, &ssp_rng_kiss)) return RNG_KISS;
+ if(ssp_rng_type_eq(type, &ssp_rng_mt19937_64)) return RNG_MT_19937_64;
+ if(ssp_rng_type_eq(type, &ssp_rng_ranlux48)) return RNG_RANLUX48;
+ if(ssp_rng_type_eq(type, &ssp_rng_threefry)) return RNG_THREEFRY;
+ return RNG_UNKNOWN;
+}
+
+static INLINE void
+get_rng_type_ssp(const enum rng_type type, struct ssp_rng_type* ssp_type)
+{
+ switch(type) {
+ case RNG_KISS: *ssp_type = ssp_rng_kiss; break;
+ case RNG_MT_19937_64: *ssp_type = ssp_rng_mt19937_64; break;
+ case RNG_RANLUX48: *ssp_type = ssp_rng_ranlux48; break;
+ case RNG_THREEFRY: *ssp_type = ssp_rng_threefry; break;
+ case RNG_UNKNOWN: memset(ssp_type, 0, sizeof(*ssp_type)); break;
+ default: FATAL("Unreachable code.\n"); break;
+ }
+}
+
static res_T
ensure_medium_registration
(struct sdis_green_function* green,
@@ -877,6 +909,7 @@ res_T
sdis_green_function_write(struct sdis_green_function* green, FILE* stream)
{
struct ssp_rng* rng = NULL;
+ enum rng_type rng_type = RNG_UNKNOWN;
res_T res = RES_OK;
if(!green || !stream) {
@@ -891,6 +924,15 @@ sdis_green_function_write(struct sdis_green_function* green, FILE* stream)
} \
} (void)0
+ rng_type = get_rng_type_enum(&green->rng_type);
+ if(rng_type == RNG_UNKNOWN) {
+ log_err(green->dev,
+ "%s: could not function a green function with an unknown RNG type.\n",
+ FUNC_NAME);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
WRITE(&SDIS_GREEN_FUNCTION_VERSION);
res = write_media(green, stream);
@@ -903,7 +945,7 @@ sdis_green_function_write(struct sdis_green_function* green, FILE* stream)
WRITE(&green->npaths_valid);
WRITE(&green->npaths_invalid);
WRITE(&green->realisation_time);
- WRITE(&green->rng_type);
+ WRITE(&rng_type);
#undef WRITE
/* Create a temporary RNG used to serialise the RNG state */
@@ -930,6 +972,7 @@ sdis_green_function_create_from_stream
{
struct sdis_green_function* green = NULL;
struct ssp_rng* rng = NULL;
+ enum rng_type rng_type = RNG_UNKNOWN;
int version = 0;
res_T res = RES_OK;
@@ -957,7 +1000,7 @@ sdis_green_function_create_from_stream
READ(&version);
if(version != SDIS_GREEN_FUNCTION_VERSION) {
log_err(green->dev, "%s: unexpected green function version %d. Expecting a "
- "green function in version %d.\n",
+ "green function in version %d.\n",
FUNC_NAME, version, SDIS_GREEN_FUNCTION_VERSION);
res = RES_BAD_ARG;
goto error;
@@ -973,9 +1016,11 @@ sdis_green_function_create_from_stream
READ(&green->npaths_valid);
READ(&green->npaths_invalid);
READ(&green->realisation_time);
- READ(&green->rng_type);
+ READ(&rng_type);
#undef READ
+ get_rng_type_ssp(rng_type, &green->rng_type);
+
/* Create a temporary RNG used to deserialise the RNG state */
res = ssp_rng_create(green->dev->allocator, &green->rng_type, &rng);
if(res != RES_OK) goto error;