commit f64caf42c080429a897bd09a03dcfbb008d712f1
parent 47cf9235fadf1d3f656996597beb61d4ce6d8df1
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 28 Aug 2020 14:56:32 +0200
Test the [de]serialization of the green function
Diffstat:
19 files changed, 197 insertions(+), 36 deletions(-)
diff --git a/src/sdis_estimator.c b/src/sdis_estimator.c
@@ -98,7 +98,10 @@ res_T
sdis_estimator_get_temperature
(const struct sdis_estimator* estimator, struct sdis_mc* mc)
{
- if(!estimator || !mc) return RES_BAD_ARG;
+ if(!estimator || !mc
+ || ( estimator->type != SDIS_ESTIMATOR_TEMPERATURE
+ && estimator->type != SDIS_ESTIMATOR_FLUX))
+ return RES_BAD_ARG;
SETUP_MC(mc, &estimator->temperature);
return RES_OK;
}
@@ -116,7 +119,7 @@ res_T
sdis_estimator_get_convective_flux
(const struct sdis_estimator* estimator, struct sdis_mc* flux)
{
- if(!estimator || !flux ||estimator->type != SDIS_ESTIMATOR_FLUX)
+ if(!estimator || !flux || estimator->type != SDIS_ESTIMATOR_FLUX)
return RES_BAD_ARG;
SETUP_MC(flux, &estimator->fluxes[FLUX_CONVECTIVE]);
return RES_OK;
diff --git a/src/sdis_green.c b/src/sdis_green.c
@@ -99,6 +99,7 @@ green_path_init(struct mem_allocator* allocator, struct green_path* path)
darray_flux_term_init(allocator, &path->flux_terms);
darray_power_term_init(allocator, &path->power_terms);
path->limit.vertex = SDIS_RWALK_VERTEX_NULL;
+ path->limit.fragment = SDIS_INTERFACE_FRAGMENT_NULL;
path->limit_id = UINT_MAX;
path->limit_type = SDIS_POINT_NONE;
path->ilast_medium = UINT16_MAX;
@@ -191,6 +192,7 @@ green_path_write(const struct green_path* path, FILE* stream)
/* Write the limit point */
WRITE(&path->limit, 1);
+ WRITE(&path->limit_id, 1);
WRITE(&path->limit_type, 1);
/* Write miscellaneous data */
@@ -239,6 +241,7 @@ green_path_read(struct green_path* path, FILE* stream)
/* Read the limit point */
READ(&path->limit, 1);
+ READ(&path->limit_id, 1);
READ(&path->limit_type, 1);
/* Read the miscellaneous data */
@@ -881,6 +884,15 @@ sdis_green_function_write(struct sdis_green_function* green, FILE* stream)
goto error;
}
+ #define WRITE(Var) { \
+ if(fwrite((Var), sizeof(*(Var)), 1, stream) != 1) { \
+ res = RES_IO_ERR; \
+ goto error; \
+ } \
+ } (void)0
+
+ WRITE(&SDIS_GREEN_FUNCTION_VERSION);
+
res = write_media(green, stream);
if(res != RES_OK) goto error;
res = write_interfaces(green, stream);
@@ -888,12 +900,6 @@ sdis_green_function_write(struct sdis_green_function* green, FILE* stream)
res = write_paths_list(green, stream);
if(res != RES_OK) goto error;
- #define WRITE(Var) { \
- if(fwrite((Var), sizeof(*(Var)), 1, stream) != 1) { \
- res = RES_IO_ERR; \
- goto error; \
- } \
- } (void)0
WRITE(&green->npaths_valid);
WRITE(&green->npaths_invalid);
WRITE(&green->realisation_time);
@@ -924,6 +930,7 @@ sdis_green_function_create_from_stream
{
struct sdis_green_function* green = NULL;
struct ssp_rng* rng = NULL;
+ int version = 0;
res_T res = RES_OK;
if(!scn || !stream || !out_green) {
@@ -934,13 +941,6 @@ sdis_green_function_create_from_stream
res = green_function_create(scn->dev, &green);
if(res != RES_OK) goto error;
- res = read_media(green, stream);
- if(res != RES_OK) goto error;
- res = read_interfaces(green, stream);
- if(res != RES_OK) goto error;
- res = read_paths_list(green, stream);
- if(res != RES_OK) goto error;
-
#define READ(Var) { \
if(fread((Var), sizeof(*(Var)), 1, stream) != 1) { \
if(feof(stream)) { \
@@ -953,6 +953,23 @@ sdis_green_function_create_from_stream
goto error; \
} \
} (void)0
+
+ 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",
+ FUNC_NAME, version, SDIS_GREEN_FUNCTION_VERSION);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ res = read_media(green, stream);
+ if(res != RES_OK) goto error;
+ res = read_interfaces(green, stream);
+ if(res != RES_OK) goto error;
+ res = read_paths_list(green, stream);
+ if(res != RES_OK) goto error;
+
READ(&green->npaths_valid);
READ(&green->npaths_invalid);
READ(&green->realisation_time);
diff --git a/src/sdis_green.h b/src/sdis_green.h
@@ -18,6 +18,11 @@
#include <rsys/rsys.h>
+/* Current version the green function data structure. One should increment it
+ * and perform a version management onto serialized data when the gren function
+ * data structure is updated. */
+static const int SDIS_GREEN_FUNCTION_VERSION = 0;
+
/* Forward declaration */
struct accum;
struct sdis_green_function;
diff --git a/src/test_sdis_conducto_radiative.c b/src/test_sdis_conducto_radiative.c
@@ -424,6 +424,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));
diff --git a/src/test_sdis_conducto_radiative_2d.c b/src/test_sdis_conducto_radiative_2d.c
@@ -429,6 +429,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));
diff --git a/src/test_sdis_convection.c b/src/test_sdis_convection.c
@@ -300,6 +300,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, box_scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator2));
OK(sdis_green_function_ref_put(green));
}
@@ -341,6 +342,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, square_scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator2));
OK(sdis_green_function_ref_put(green));
}
diff --git a/src/test_sdis_convection_non_uniform.c b/src/test_sdis_convection_non_uniform.c
@@ -316,6 +316,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, box_scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator2));
OK(sdis_green_function_ref_put(green));
}
@@ -356,6 +357,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, square_scn, solve_args.time_range);
OK(sdis_estimator_ref_put(estimator2));
OK(sdis_green_function_ref_put(green));
}
diff --git a/src/test_sdis_flux.c b/src/test_sdis_flux.c
@@ -215,6 +215,7 @@ solve(struct sdis_scene* scn, const double pos[])
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, time_range);
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));
diff --git a/src/test_sdis_solve_boundary.c b/src/test_sdis_solve_boundary.c
@@ -348,6 +348,7 @@ main(int argc, char** argv)
check_green_function(green);
OK(sdis_green_function_solve(green, probe_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, box_scn, probe_args.time_range);
OK(sdis_green_function_ref_put(green));
OK(sdis_estimator_ref_put(estimator));
@@ -378,6 +379,7 @@ main(int argc, char** argv)
check_green_function(green);
OK(sdis_green_function_solve(green, probe_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, square_scn, probe_args.time_range);
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));
@@ -465,11 +467,11 @@ main(int argc, char** argv)
BA(GREEN(box_scn, &bound_args, &green));
sides[0] = SDIS_FRONT;
-
OK(GREEN(box_scn, &bound_args, &green));
check_green_function(green);
OK(sdis_green_function_solve(green, bound_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, box_scn, bound_args.time_range);
OK(sdis_green_function_ref_put(green));
OK(sdis_estimator_ref_put(estimator));
@@ -506,6 +508,7 @@ main(int argc, char** argv)
check_green_function(green);
OK(sdis_green_function_solve(green, bound_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, square_scn, bound_args.time_range);
OK(sdis_green_function_ref_put(green));
OK(sdis_estimator_ref_put(estimator));
@@ -538,6 +541,7 @@ main(int argc, char** argv)
check_green_function(green);
OK(sdis_green_function_solve(green, bound_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, box_scn, bound_args.time_range);
OK(sdis_green_function_ref_put(green));
OK(sdis_estimator_ref_put(estimator));
@@ -555,6 +559,7 @@ main(int argc, char** argv)
check_green_function(green);
OK(sdis_green_function_solve(green, bound_args.time_range, &estimator2));
check_estimator(estimator2, N, ref);
+ check_green_serialization(green, square_scn, bound_args.time_range);
OK(sdis_green_function_ref_put(green));
OK(sdis_estimator_ref_put(estimator));
diff --git a/src/test_sdis_solve_medium.c b/src/test_sdis_solve_medium.c
@@ -459,6 +459,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
OK(sdis_green_function_ref_put(green));
diff --git a/src/test_sdis_solve_medium_2d.c b/src/test_sdis_solve_medium_2d.c
@@ -402,6 +402,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
OK(sdis_green_function_ref_put(green));
diff --git a/src/test_sdis_solve_probe.c b/src/test_sdis_solve_probe.c
@@ -259,6 +259,7 @@ main(int argc, char** argv)
struct sdis_data* data = NULL;
struct sdis_estimator* estimator = NULL;
struct sdis_estimator* estimator2 = NULL;
+ struct sdis_estimator* estimator3 = NULL;
struct sdis_green_function* green = NULL;
const struct sdis_heat_path* path = NULL;
struct sdis_fluid_shader fluid_shader = DUMMY_FLUID_SHADER;
@@ -272,6 +273,7 @@ main(int argc, char** argv)
struct interf* interface_param;
struct ssp_rng* rng_state = NULL;
enum sdis_estimator_type type;
+ FILE* stream = NULL;
double ref;
const size_t N = 1000;
const size_t N_dump = 10;
@@ -444,14 +446,34 @@ main(int argc, char** argv)
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ CHK(stream = tmpfile());
+ BA(sdis_green_function_write(NULL, stream));
+ BA(sdis_green_function_write(green, NULL));
+ OK(sdis_green_function_write(green, stream));
+
BA(sdis_green_function_ref_get(NULL));
OK(sdis_green_function_ref_get(green));
BA(sdis_green_function_ref_put(NULL));
OK(sdis_green_function_ref_put(green));
OK(sdis_green_function_ref_put(green));
+ rewind(stream);
+ BA(sdis_green_function_create_from_stream(NULL, stream, &green));
+ BA(sdis_green_function_create_from_stream(scn, NULL, &green));
+ BA(sdis_green_function_create_from_stream(scn, stream, NULL));
+ OK(sdis_green_function_create_from_stream(scn, stream, &green));
+ CHK(!fclose(stream));
+
+ OK(sdis_green_function_solve(green, solve_args.time_range, &estimator3));
+
+ check_green_function(green);
+ check_estimator_eq_strict(estimator2, estimator3);
+
+ OK(sdis_green_function_ref_put(green));
+
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));
+ OK(sdis_estimator_ref_put(estimator3));
OK(sdis_solve_probe(scn, &solve_args, &estimator));
BA(sdis_estimator_get_paths_count(NULL, &n));
diff --git a/src/test_sdis_solve_probe2.c b/src/test_sdis_solve_probe2.c
@@ -268,6 +268,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
/* Release data */
OK(sdis_estimator_ref_put(estimator));
diff --git a/src/test_sdis_solve_probe2_2d.c b/src/test_sdis_solve_probe2_2d.c
@@ -267,6 +267,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
/* Release data */
OK(sdis_estimator_ref_put(estimator));
@@ -280,3 +281,4 @@ main(int argc, char** argv)
CHK(mem_allocated_size() == 0);
return 0;
}
+
diff --git a/src/test_sdis_solve_probe3.c b/src/test_sdis_solve_probe3.c
@@ -324,6 +324,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
/* Release data */
OK(sdis_estimator_ref_put(estimator));
diff --git a/src/test_sdis_solve_probe3_2d.c b/src/test_sdis_solve_probe3_2d.c
@@ -316,6 +316,7 @@ main(int argc, char** argv)
OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2));
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, solve_args.time_range);
/* Release data */
OK(sdis_estimator_ref_put(estimator));
diff --git a/src/test_sdis_utils.c b/src/test_sdis_utils.c
@@ -363,3 +363,35 @@ dump_heat_paths(FILE* stream, const struct sdis_estimator* estimator)
fprintf(stream, "0.0 0.0 1.0 1.0\n"); /* 0.0 = Blue: success */
fprintf(stream, "1.0 0.0 0.0 1.0\n"); /* 1.0 = Red: failure */
}
+
+void
+check_green_serialization
+ (struct sdis_green_function* green,
+ struct sdis_scene* scn,
+ const double time_range[2])
+{
+ FILE* stream = NULL;
+ struct sdis_estimator *e1 = NULL;
+ struct sdis_estimator *e2 = NULL;
+ struct sdis_green_function* green2 = NULL;
+
+ CHK(green && time_range);
+ CHK(stream = tmpfile());
+
+ OK(sdis_green_function_write(green, stream));
+
+ rewind(stream);
+ OK(sdis_green_function_create_from_stream(scn, stream, &green2));
+ CHK(!fclose(stream));
+ check_green_function(green2);
+
+ OK(sdis_green_function_solve(green, time_range, &e1));
+ OK(sdis_green_function_solve(green2, time_range, &e2));
+ check_estimator_eq_strict(e1, e2);
+
+ OK(sdis_estimator_ref_put(e1));
+ OK(sdis_estimator_ref_put(e2));
+ OK(sdis_green_function_ref_put(green2));
+}
+
+
diff --git a/src/test_sdis_utils.h b/src/test_sdis_utils.h
@@ -252,26 +252,82 @@ check_estimator_eq
OK(sdis_estimator_get_type(e2, &type2));
CHK(type1 == type2);
- OK(sdis_estimator_get_temperature(e1, &mc1));
- OK(sdis_estimator_get_temperature(e2, &mc2));
- CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
- CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
-
- if(type1 == SDIS_ESTIMATOR_FLUX) {
- OK(sdis_estimator_get_convective_flux(e1, &mc1));
- OK(sdis_estimator_get_convective_flux(e2, &mc2));
- CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
- CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
-
- OK(sdis_estimator_get_radiative_flux(e1, &mc1));
- OK(sdis_estimator_get_radiative_flux(e2, &mc2));
- CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
- CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
-
- OK(sdis_estimator_get_total_flux(e1, &mc1));
- OK(sdis_estimator_get_total_flux(e2, &mc2));
- CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
- CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+ switch(type1) {
+ case SDIS_ESTIMATOR_TEMPERATURE:
+ OK(sdis_estimator_get_temperature(e1, &mc1));
+ OK(sdis_estimator_get_temperature(e2, &mc2));
+ CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
+ CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+ break;
+
+ case SDIS_ESTIMATOR_FLUX:
+ OK(sdis_estimator_get_convective_flux(e1, &mc1));
+ OK(sdis_estimator_get_convective_flux(e2, &mc2));
+ CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
+ CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+
+ OK(sdis_estimator_get_radiative_flux(e1, &mc1));
+ OK(sdis_estimator_get_radiative_flux(e2, &mc2));
+ CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
+ CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+
+ OK(sdis_estimator_get_total_flux(e1, &mc1));
+ OK(sdis_estimator_get_total_flux(e2, &mc2));
+ CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
+ CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+ break;
+
+ case SDIS_ESTIMATOR_MEAN_POWER:
+ OK(sdis_estimator_get_mean_power(e1, &mc1));
+ OK(sdis_estimator_get_mean_power(e2, &mc2));
+ CHK(mc1.E + 3*mc1.SE >= mc2.E - 3*mc2.SE);
+ CHK(mc1.E - 3*mc1.SE <= mc2.E + 3*mc2.SE);
+ break;
+
+ default: FATAL("Unreachable code.\n"); break;
+ }
+}
+
+static INLINE void
+check_estimator_eq_strict
+ (const struct sdis_estimator* e1, const struct sdis_estimator* e2)
+{
+ struct sdis_mc mc1, mc2;
+ enum sdis_estimator_type type1, type2;
+ ASSERT(e1 && e2);
+
+ OK(sdis_estimator_get_type(e1, &type1));
+ OK(sdis_estimator_get_type(e2, &type2));
+ CHK(type1 == type2);
+
+ switch(type1) {
+ case SDIS_ESTIMATOR_TEMPERATURE:
+ OK(sdis_estimator_get_temperature(e1, &mc1));
+ OK(sdis_estimator_get_temperature(e2, &mc2));
+ CHK(mc1.E == mc2.E && mc1.V == mc2.V && mc1.SE == mc2.SE);
+ break;
+
+ case SDIS_ESTIMATOR_FLUX:
+ OK(sdis_estimator_get_convective_flux(e1, &mc1));
+ OK(sdis_estimator_get_convective_flux(e2, &mc2));
+ CHK(mc1.E == mc2.E && mc1.V == mc2.V && mc1.SE == mc2.SE);
+
+ OK(sdis_estimator_get_radiative_flux(e1, &mc1));
+ OK(sdis_estimator_get_radiative_flux(e2, &mc2));
+ CHK(mc1.E == mc2.E && mc1.V == mc2.V && mc1.SE == mc2.SE);
+
+ OK(sdis_estimator_get_total_flux(e1, &mc1));
+ OK(sdis_estimator_get_total_flux(e2, &mc2));
+ CHK(mc1.E == mc2.E && mc1.V == mc2.V && mc1.SE == mc2.SE);
+ break;
+
+ case SDIS_ESTIMATOR_MEAN_POWER:
+ OK(sdis_estimator_get_mean_power(e1, &mc1));
+ OK(sdis_estimator_get_mean_power(e2, &mc2));
+ CHK(mc1.E == mc2.E && mc1.V == mc2.V && mc1.SE == mc2.SE);
+ break;
+
+ default: FATAL("Unreachable code.\n"); break;
}
}
@@ -295,5 +351,11 @@ dump_heat_paths
(FILE* stream,
const struct sdis_estimator* estimator);
+extern LOCAL_SYM void
+check_green_serialization
+ (struct sdis_green_function* green,
+ struct sdis_scene* scn,
+ const double time_range[2]);
+
#endif /* TEST_SDIS_UTILS_H */
diff --git a/src/test_sdis_volumic_power.c b/src/test_sdis_volumic_power.c
@@ -236,6 +236,7 @@ solve(struct sdis_scene* scn, const double pos[])
check_green_function(green);
check_estimator_eq(estimator, estimator2);
+ check_green_serialization(green, scn, time_range);
OK(sdis_estimator_ref_put(estimator));
OK(sdis_estimator_ref_put(estimator2));