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:
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));