stardis-solver

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

commit 91ba833642c3740636c3f718d539ba19099801f6
parent f27244413cf7ae61bfb42223e772740f80cb54d6
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 25 Jun 2020 15:53:52 +0200

Update the API of sdis_solve_medium[_green_function]

Diffstat:
Msrc/sdis.h | 37+++++++++++++++++++++++++------------
Msrc/sdis_solve.c | 26++++++--------------------
Msrc/sdis_solve_medium_Xd.h | 44++++++++++++++++++++++++++------------------
Msrc/test_sdis_solid_random_walk_robustness.c | 16++++++----------
Msrc/test_sdis_solve_boundary.c | 2++
Msrc/test_sdis_solve_medium.c | 77++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/test_sdis_solve_medium_2d.c | 34++++++++++++++++++++--------------
Msrc/test_sdis_solve_probe.c | 7+++++++
8 files changed, 142 insertions(+), 101 deletions(-)

diff --git a/src/sdis.h b/src/sdis.h @@ -407,6 +407,29 @@ struct sdis_solve_boundary_args { static const struct sdis_solve_boundary_args SDIS_SOLVE_BOUNDARY_ARGS_DEFAULT = SDIS_SOLVE_BOUNDARY_ARGS_DEFAULT__; +struct sdis_solve_medium_args { + size_t nrealisations; /* #realisations */ + struct sdis_medium* medium; /* Medium to solve */ + double time_range[2]; /* Observation time */ + double fp_to_meter; /* Scale from floating point units to meters */ + double ambient_radiative_temperature; /* In Kelvin */ + double reference_temperature; /* In Kelvin */ + int register_paths; /* Combination of enum sdis_heat_path_flag */ + struct ssp_rng* rng_state; /* Initial RNG state. May be NULL */ +}; +#define SDIS_SOLVE_MEDIUM_ARGS_DEFAULT__ { \ + 10000, /* #realisations */ \ + NULL, /* Medium */ \ + {DBL_MAX,DBL_MAX}, /* Time range */ \ + 1, /* FP to meter */ \ + -1, /* Ambient radiative temperature */ \ + -1, /* Refernce temperature */ \ + SDIS_HEAT_PATH_NONE, \ + NULL /* RNG state */ \ +} +static const struct sdis_solve_medium_args SDIS_SOLVE_MEDIUM_ARGS_DEFAULT = + SDIS_SOLVE_MEDIUM_ARGS_DEFAULT__; + BEGIN_DECLS /******************************************************************************* @@ -999,13 +1022,7 @@ sdis_solve_camera SDIS_API res_T sdis_solve_medium (struct sdis_scene* scn, - const size_t nrealisations, /* #realisations */ - struct sdis_medium* medium, /* Medium to solve */ - const double time_range[2], /* Observation time */ - const double fp_to_meter, /* Scale from floating point units to meters */ - const double ambient_radiative_temperature, /* In Kelvin */ - const double reference_temperature, /* In Kelvin */ - const int register_paths, /* Combination of enum sdis_heat_path_flag */ + const struct sdis_solve_medium_args* args, struct sdis_estimator** estimator); /******************************************************************************* @@ -1050,11 +1067,7 @@ sdis_solve_boundary_green_function SDIS_API res_T sdis_solve_medium_green_function (struct sdis_scene* scn, - const size_t nrealisations, /* #realisations */ - struct sdis_medium* medium, /* Medium to solve */ - const double fp_to_meter, /* Scale from floating point units to meters */ - const double ambient_radiative_temperature, /* In Kelvin */ - const double reference_temperature, /* In Kelvin */ + const struct sdis_solve_medium_args* args, struct sdis_green_function** green); END_DECLS diff --git a/src/sdis_solve.c b/src/sdis_solve.c @@ -522,42 +522,28 @@ error: res_T sdis_solve_medium (struct sdis_scene* scn, - const size_t nrealisations, /* #realisations */ - struct sdis_medium* medium, /* Medium to solve */ - const double time_range[2], /* Observation time */ - const double fp_to_meter, /* Scale from floating point units to meters */ - const double Tarad, /* In Kelvin */ - const double Tref, /* In Kelvin */ - const int register_paths, /* Combination of enum sdis_heat_path_flag */ + const struct sdis_solve_medium_args* args, struct sdis_estimator** estimator) { if(!scn) return RES_BAD_ARG; if(scene_is_2d(scn)) { - return solve_medium_2d(scn, nrealisations, medium, time_range, fp_to_meter, - Tarad, Tref, register_paths, NULL, estimator); + return solve_medium_2d(scn, args, NULL, estimator); } else { - return solve_medium_3d(scn, nrealisations, medium, time_range, fp_to_meter, - Tarad, Tref, register_paths, NULL, estimator); + return solve_medium_3d(scn, args, NULL, estimator); } } res_T sdis_solve_medium_green_function (struct sdis_scene* scn, - const size_t nrealisations, /* #realisations */ - struct sdis_medium* medium, /* Medium to solve */ - const double fp_to_meter, /* Scale from floating point units to meters */ - const double Tarad, /* In Kelvin */ - const double Tref, /* In Kelvin */ + const struct sdis_solve_medium_args* args, struct sdis_green_function** green) { if(!scn) return RES_BAD_ARG; if(scene_is_2d(scn)) { - return solve_medium_2d(scn, nrealisations, medium, NULL, fp_to_meter, Tarad, - Tref, SDIS_HEAT_PATH_NONE, green, NULL); + return solve_medium_2d(scn, args, green, NULL); } else { - return solve_medium_3d(scn, nrealisations, medium, NULL, fp_to_meter, Tarad, - Tref, SDIS_HEAT_PATH_NONE, green, NULL); + return solve_medium_3d(scn, args, green, NULL); } } diff --git a/src/sdis_solve_medium_Xd.h b/src/sdis_solve_medium_Xd.h @@ -200,13 +200,7 @@ error: static res_T XD(solve_medium) (struct sdis_scene* scn, - const size_t nrealisations, - struct sdis_medium* mdm, - const double time_range[2], - const double fp_to_meter,/* Scale factor from floating point unit to meter */ - const double Tarad, /* Ambient radiative temperature */ - const double Tref, /* Reference temperature */ - const int register_paths, /* Combination of enum sdis_heat_path_flag */ + const struct sdis_solve_medium_args* args, struct sdis_green_function** out_green, /* May be NULL <=> No green func */ struct sdis_estimator** out_estimator) /* May be NULL <=> No estimator */ { @@ -218,15 +212,17 @@ XD(solve_medium) struct sdis_estimator* estimator = NULL; struct accum* acc_temps = NULL; struct accum* acc_times = NULL; + size_t nrealisations = 0; int64_t irealisation; int cumul_is_init = 0; size_t i; int progress = 0; + int register_paths = SDIS_HEAT_PATH_NONE; ATOMIC nsolved_realisations = 0; ATOMIC res = RES_OK; - if(!scn || !mdm || !nrealisations || nrealisations > INT64_MAX - || fp_to_meter <= 0) { + if(!scn || !args || !args->medium || !args->nrealisations + || args->nrealisations > INT64_MAX || args->fp_to_meter <= 0) { res = RES_BAD_ARG; goto error; } @@ -235,8 +231,10 @@ XD(solve_medium) goto error; } if(out_estimator) { - if(!time_range || time_range[0] < 0 || time_range[0] > time_range[1] - || (time_range[1] > DBL_MAX && time_range[0] != time_range[1])) { + if(args->time_range[0] < 0 + || args->time_range[0] > args->time_range[1] + || ( args->time_range[1] > DBL_MAX + && args->time_range[0] != args->time_range[1])) { res = RES_BAD_ARG; goto error; } @@ -249,9 +247,15 @@ XD(solve_medium) #endif /* Create the proxy RNG */ - res = ssp_rng_proxy_create(scn->dev->allocator, &ssp_rng_mt19937_64, - scn->dev->nthreads, &rng_proxy); - if(res != RES_OK) goto error; + if(args->rng_state) { + res = ssp_rng_proxy_create_from_rng(scn->dev->allocator, args->rng_state, + scn->dev->nthreads, &rng_proxy); + if(res != RES_OK) goto error; + } else { + res = ssp_rng_proxy_create(scn->dev->allocator, &ssp_rng_mt19937_64, + scn->dev->nthreads, &rng_proxy); + if(res != RES_OK) goto error; + } /* Create the per thread RNG */ rngs = MEM_CALLOC(scn->dev->allocator, scn->dev->nthreads, sizeof(*rngs)); @@ -272,7 +276,7 @@ XD(solve_medium) /* Compute the enclosure cumulative */ darray_enclosure_cumul_init(scn->dev->allocator, &cumul); cumul_is_init = 1; - res = compute_medium_enclosure_cumulative(scn, mdm, &cumul); + res = compute_medium_enclosure_cumulative(scn, args->medium, &cumul); if(res != RES_OK) goto error; if(out_green) { @@ -291,6 +295,8 @@ XD(solve_medium) if(res != RES_OK) goto error; } + nrealisations = args->nrealisations; + register_paths = out_estimator ? args->register_paths : SDIS_HEAT_PATH_NONE; omp_set_num_threads((int)scn->dev->nthreads); #pragma omp parallel for schedule(static) for(irealisation = 0; irealisation < (int64_t)nrealisations; ++irealisation) { @@ -318,7 +324,7 @@ XD(solve_medium) if(!out_green) { /* Sample the time */ - time = sample_time(rng, time_range); + time = sample_time(rng, args->time_range); /* Prepare path registration if necessary */ if(register_paths) { @@ -346,8 +352,10 @@ XD(solve_medium) } /* Run a probe realisation */ - res_simul = XD(probe_realisation)((size_t)irealisation, scn, rng, mdm, pos, - time, fp_to_meter, Tarad, Tref, pgreen_path, pheat_path, &weight); + res_simul = XD(probe_realisation)((size_t)irealisation, scn, rng, + args->medium, pos, time, args->fp_to_meter, + args->ambient_radiative_temperature, args->reference_temperature, + pgreen_path, pheat_path, &weight); if(res_simul != RES_OK && res_simul != RES_BAD_OP) { ATOMIC_SET(&res, res_simul); diff --git a/src/test_sdis_solid_random_walk_robustness.c b/src/test_sdis_solid_random_walk_robustness.c @@ -274,6 +274,7 @@ main(int argc, char** argv) struct sdis_solid_shader solid_shader = SDIS_SOLID_SHADER_NULL; struct sdis_interface_shader interf_shader = SDIS_INTERFACE_SHADER_NULL; struct sdis_solve_probe_args solve_args = SDIS_SOLVE_PROBE_ARGS_DEFAULT; + struct sdis_solve_medium_args solve_mdm_args = SDIS_SOLVE_MEDIUM_ARGS_DEFAULT; struct interf* interf_param = NULL; struct solid* solid_param = NULL; struct context ctx; @@ -372,16 +373,11 @@ main(int argc, char** argv) /* Launch medium integration */ interf_param->profile = PROFILE_UNKNOWN; - OK(sdis_solve_medium - (scn, - solve_args.nrealisations, - solid, - solve_args.time_range, - solve_args.fp_to_meter, - solve_args.ambient_radiative_temperature, - solve_args.reference_temperature, - solve_args.register_paths, - &estimator)); + solve_mdm_args.nrealisations = Nreals; + solve_mdm_args.medium = solid; + solve_mdm_args.time_range[0] = INF; + solve_mdm_args.time_range[1] = INF; + OK(sdis_solve_medium(scn, &solve_mdm_args, &estimator)); print_estimation_result(estimator, Tfluid); /*dump_heat_paths(stdout, estimator);*/ diff --git a/src/test_sdis_solve_boundary.c b/src/test_sdis_solve_boundary.c @@ -482,6 +482,8 @@ main(int argc, char** argv) /* Check simulation error handling when paths are registered */ fluid_param->temperature = UNKNOWN_TEMPERATURE; BA(SOLVE(box_scn, &bound_args, &estimator)); + + /* Dump path */ fluid_param->temperature = Tf; OK(SOLVE(box_scn, &bound_args, &estimator)); dump_heat_paths(fp, estimator); diff --git a/src/test_sdis_solve_medium.c b/src/test_sdis_solve_medium.c @@ -223,8 +223,8 @@ main(int argc, char** argv) struct sdis_fluid_shader fluid_shader = DUMMY_FLUID_SHADER; struct sdis_solid_shader solid_shader = DUMMY_SOLID_SHADER; struct sdis_interface_shader interface_shader = SDIS_INTERFACE_SHADER_NULL; + struct sdis_solve_medium_args solve_args = SDIS_SOLVE_MEDIUM_ARGS_DEFAULT; struct context ctx; - const double trange[2] = {INF, INF}; double ref; double v, v0, v1; size_t nreals; @@ -352,13 +352,31 @@ main(int argc, char** argv) OK(sdis_scene_get_medium_spread(scn, fluid1, &v)); CHK(v == 0); - BA(sdis_solve_medium(NULL, N, solid0, trange, 1.f, -1, 0, 0, &estimator)); - BA(sdis_solve_medium(scn, 0, solid0, trange, 1.f, -1, 0, 0, &estimator)); - BA(sdis_solve_medium(scn, N, NULL, trange, 1.f, -1, 0, 0, &estimator)); - BA(sdis_solve_medium(scn, N, solid0, NULL, 1.f, -1, 0, 0, &estimator)); - BA(sdis_solve_medium(scn, N, solid0, trange, 0.f, -1, 0, 0, &estimator)); - BA(sdis_solve_medium(scn, N, solid0, trange, 1.f, -1, 0, 0, NULL)); - OK(sdis_solve_medium(scn, N, solid0, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.nrealisations = N; + solve_args.medium = solid0; + solve_args.time_range[0] = INF; + solve_args.time_range[1] = INF; + + BA(sdis_solve_medium(NULL, &solve_args, &estimator)); + BA(sdis_solve_medium(scn, NULL, &estimator)); + BA(sdis_solve_medium(scn, &solve_args, NULL)); + solve_args.nrealisations = 0; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.nrealisations = N; + solve_args.medium = NULL; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.medium = solid0; + solve_args.fp_to_meter = 0; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.fp_to_meter = 1; + solve_args.time_range[0] = solve_args.time_range[1] = -1; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.time_range[0] = 1; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.time_range[1] = 0; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.time_range[0] = solve_args.time_range[1] = INF; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); OK(sdis_estimator_get_failure_count(estimator, &nfails)); @@ -371,7 +389,8 @@ main(int argc, char** argv) CHK(nreals + nfails == N); OK(sdis_estimator_ref_put(estimator)); - OK(sdis_solve_medium(scn, N, solid1, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.medium = solid1; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); OK(sdis_estimator_get_failure_count(estimator, &nfails)); OK(sdis_estimator_get_temperature(estimator, &T)); @@ -383,13 +402,6 @@ main(int argc, char** argv) CHK(nreals + nfails == N); OK(sdis_estimator_ref_put(estimator)); -#if 0 - OK(sdis_solve_medium(scn, 1, solid1, trange, 1.f, -1, 0, - SDIS_HEAT_PATH_ALL, &estimator)); - dump_heat_paths(stderr, estimator); - OK(sdis_estimator_ref_put(estimator)); -#endif - /* Create a new scene with the same medium in the 2 super shapes */ OK(sdis_scene_ref_put(scn)); ctx.interf0 = solid0_fluid0; @@ -400,8 +412,11 @@ main(int argc, char** argv) OK(sdis_scene_get_medium_spread(scn, solid0, &v)); CHK(eq_eps(v, v0+v1, 1.e-6)); - BA(sdis_solve_medium(scn, N, solid1, trange, 1.f, -1, 0, 0, &estimator)); - OK(sdis_solve_medium(scn, Np, solid0, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.medium = solid1; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.medium = solid0; + solve_args.nrealisations = Np; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_temperature(estimator, &T)); OK(sdis_estimator_get_realisation_time(estimator, &time)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); @@ -413,15 +428,23 @@ main(int argc, char** argv) CHK(eq_eps(T.E, ref, T.SE*3)); /* Solve green */ - BA(sdis_solve_medium_green_function(NULL, Np, solid0, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, 0, solid0, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, NULL, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, solid0, 0.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, solid0, 1.0, 0, 0, NULL)); - BA(sdis_solve_medium_green_function(scn, Np, solid1, 1.0, 0, 0, &green)); - OK(sdis_solve_medium_green_function(scn, Np, solid0, 1.0, 0, 0, &green)); - - OK(sdis_green_function_solve(green, trange, &estimator2)); + BA(sdis_solve_medium_green_function(NULL, &solve_args, &green)); + BA(sdis_solve_medium_green_function(scn, NULL, &green)); + BA(sdis_solve_medium_green_function(scn, &solve_args, NULL)); + solve_args.nrealisations = 0; + BA(sdis_solve_medium_green_function(scn, &solve_args, &green)); + solve_args.nrealisations = Np; + solve_args.medium = NULL; + BA(sdis_solve_medium_green_function(scn, &solve_args, &green)); + solve_args.medium = solid1; + BA(sdis_solve_medium_green_function(scn, &solve_args, &green)); + solve_args.medium = solid0; + solve_args.fp_to_meter = 0; + BA(sdis_solve_medium_green_function(scn, &solve_args, &green)); + solve_args.fp_to_meter = 1; + OK(sdis_solve_medium_green_function(scn, &solve_args, &green)); + + OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2)); check_green_function(green); check_estimator_eq(estimator, estimator2); diff --git a/src/test_sdis_solve_medium_2d.c b/src/test_sdis_solve_medium_2d.c @@ -208,8 +208,8 @@ main(int argc, char** argv) struct sdis_fluid_shader fluid_shader = DUMMY_FLUID_SHADER; struct sdis_solid_shader solid_shader = DUMMY_SOLID_SHADER; struct sdis_interface_shader interface_shader = SDIS_INTERFACE_SHADER_NULL; + struct sdis_solve_medium_args solve_args = SDIS_SOLVE_MEDIUM_ARGS_DEFAULT; struct context ctx; - const double trange[2] = {INF, INF}; double a, a0, a1; double ref; double* positions = NULL; @@ -334,8 +334,13 @@ main(int argc, char** argv) /* Rough estimation since the disk is coarsely discretized */ CHK(eq_eps(a1, PI, 1.e-1)); + solve_args.nrealisations = N; + solve_args.time_range[0] = INF; + solve_args.time_range[1] = INF; + /* Estimate the temperature of the square */ - OK(sdis_solve_medium(scn, N, solid0, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.medium = solid0; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_temperature(estimator, &T)); OK(sdis_estimator_get_realisation_time(estimator, &time)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); @@ -348,7 +353,8 @@ main(int argc, char** argv) OK(sdis_estimator_ref_put(estimator)); /* Estimate the temperature of the disk */ - OK(sdis_solve_medium(scn, N, solid1, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.medium = solid1; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_temperature(estimator, &T)); OK(sdis_estimator_get_realisation_time(estimator, &time)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); @@ -371,8 +377,11 @@ main(int argc, char** argv) CHK(eq_eps(a, a0+a1, 1.e-6)); /* Estimate the temperature of the square and disk shapes */ - BA(sdis_solve_medium(scn, N, solid1, trange, 1.f, -1, 0, 0, &estimator)); - OK(sdis_solve_medium(scn, Np, solid0, trange, 1.f, -1, 0, 0, &estimator)); + solve_args.medium = solid1; + solve_args.nrealisations = Np; + BA(sdis_solve_medium(scn, &solve_args, &estimator)); + solve_args.medium = solid0; + OK(sdis_solve_medium(scn, &solve_args, &estimator)); OK(sdis_estimator_get_temperature(estimator, &T)); OK(sdis_estimator_get_realisation_time(estimator, &time)); OK(sdis_estimator_get_realisation_count(estimator, &nreals)); @@ -385,15 +394,12 @@ main(int argc, char** argv) CHK(nreals + nfails == Np); /* Solve green */ - BA(sdis_solve_medium_green_function(NULL, Np, solid0, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, 0, solid0, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, NULL, 1.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, solid0, 0.0, 0, 0, &green)); - BA(sdis_solve_medium_green_function(scn, Np, solid0, 1.0, 0, 0, NULL)); - BA(sdis_solve_medium_green_function(scn, Np, solid1, 1.0, 0, 0, &green)); - OK(sdis_solve_medium_green_function(scn, Np, solid0, 1.0, 0, 0, &green)); - - OK(sdis_green_function_solve(green, trange, &estimator2)); + BA(sdis_solve_medium_green_function(NULL, &solve_args, &green)); + BA(sdis_solve_medium_green_function(scn, NULL, &green)); + BA(sdis_solve_medium_green_function(scn, &solve_args, NULL)); + OK(sdis_solve_medium_green_function(scn, &solve_args, &green)); + + OK(sdis_green_function_solve(green, solve_args.time_range, &estimator2)); check_green_function(green); check_estimator_eq(estimator, estimator2); diff --git a/src/test_sdis_solve_probe.c b/src/test_sdis_solve_probe.c @@ -355,6 +355,13 @@ main(int argc, char** argv) solve_args.fp_to_meter = 0; BA(sdis_solve_probe(scn, &solve_args, &estimator)); solve_args.fp_to_meter = 1; + solve_args.time_range[0] = solve_args.time_range[1] = -1; + BA(sdis_solve_probe(scn, &solve_args, &estimator)); + solve_args.time_range[0] = 1; + BA(sdis_solve_probe(scn, &solve_args, &estimator)); + solve_args.time_range[1] = 0; + BA(sdis_solve_probe(scn, &solve_args, &estimator)); + solve_args.time_range[0] = solve_args.time_range[1] = INF; OK(sdis_solve_probe(scn, &solve_args, &estimator)); BA(sdis_estimator_get_type(estimator, NULL));