stardis-solver

Solve coupled heat transfers
git clone git://git.meso-star.fr/stardis-solver.git
Log | Files | Refs | README | LICENSE

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:
Msrc/sdis_estimator.c | 7+++++--
Msrc/sdis_green.c | 43++++++++++++++++++++++++++++++-------------
Msrc/sdis_green.h | 5+++++
Msrc/test_sdis_conducto_radiative.c | 1+
Msrc/test_sdis_conducto_radiative_2d.c | 1+
Msrc/test_sdis_convection.c | 2++
Msrc/test_sdis_convection_non_uniform.c | 2++
Msrc/test_sdis_flux.c | 1+
Msrc/test_sdis_solve_boundary.c | 7++++++-
Msrc/test_sdis_solve_medium.c | 1+
Msrc/test_sdis_solve_medium_2d.c | 1+
Msrc/test_sdis_solve_probe.c | 22++++++++++++++++++++++
Msrc/test_sdis_solve_probe2.c | 1+
Msrc/test_sdis_solve_probe2_2d.c | 2++
Msrc/test_sdis_solve_probe3.c | 1+
Msrc/test_sdis_solve_probe3_2d.c | 1+
Msrc/test_sdis_utils.c | 32++++++++++++++++++++++++++++++++
Msrc/test_sdis_utils.h | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msrc/test_sdis_volumic_power.c | 1+
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));