commit 267793ef65cfbc627c56e5f4b986dc834be91c27
parent b42b3747d155954a32888a81bc7b2b14209363ad
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 20 May 2019 12:25:43 +0200
Add support of time integration to the camera solver
Diffstat:
3 files changed, 51 insertions(+), 33 deletions(-)
diff --git a/src/sdis.h b/src/sdis.h
@@ -919,7 +919,7 @@ SDIS_API res_T
sdis_solve_camera
(struct sdis_scene* scn,
const struct sdis_camera* cam, /* Point of view */
- const double time, /* Observation time */
+ 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 */
diff --git a/src/sdis_solve.c b/src/sdis_solve.c
@@ -66,7 +66,7 @@ solve_pixel
struct ssp_rng* rng,
struct sdis_medium* mdm,
const struct sdis_camera* cam,
- const double time, /* Observation time */
+ 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 */
@@ -86,7 +86,7 @@ solve_pixel
res_T res = RES_OK;
ASSERT(scn && mdm && rng && cam && ipix && nrealisations && Tref >= 0);
ASSERT(pix_sz && pix_sz[0] > 0 && pix_sz[1] > 0);
- ASSERT(acc_time && acc_temp && accum && estimator);
+ ASSERT(acc_time && acc_temp && accum && estimator && time_range);
FOR_EACH(irealisation, 0, nrealisations) {
struct time t0, t1;
@@ -96,11 +96,13 @@ solve_pixel
double w = 0;
struct sdis_heat_path* pheat_path = NULL;
struct sdis_heat_path heat_path;
+ double time;
res_T res_simul = RES_OK;
/* Begin time registration */
time_current(&t0);
+ time = sample_time(rng, time_range);
if(register_paths) {
heat_path_init(scn->dev->allocator, &heat_path);
pheat_path = &heat_path;
@@ -172,7 +174,7 @@ solve_tile
struct ssp_rng* rng,
struct sdis_medium* mdm,
const struct sdis_camera* cam,
- const double time,
+ const double time_range[2],
const double fp_to_meter,
const double Tarad,
const double Tref,
@@ -191,7 +193,7 @@ solve_tile
res_T res = RES_OK;
ASSERT(scn && rng && mdm && cam && spp && origin && accums && Tref >= 0);
ASSERT(size &&size[0] && size[1] && acc_temp && acc_time && estimator);
- ASSERT(pix_sz && pix_sz[0] > 0 && pix_sz[1] > 0);
+ ASSERT(pix_sz && pix_sz[0] > 0 && pix_sz[1] > 0 && time_range);
/* Adjust the #pixels to process them wrt a morton order */
npixels = round_up_pow2(MMAX(size[0], size[1]));
@@ -210,8 +212,8 @@ solve_tile
ipix[0] = ipix[0] + origin[0];
ipix[1] = ipix[1] + origin[1];
- res = solve_pixel(scn, rng, mdm, cam, time, fp_to_meter, Tarad, Tref, ipix,
- spp, register_paths, pix_sz, acc_temp, acc_time, accum, estimator);
+ res = solve_pixel(scn, rng, mdm, cam, time_range, fp_to_meter, Tarad, Tref,
+ ipix, spp, register_paths, pix_sz, acc_temp, acc_time, accum, estimator);
if(res != RES_OK) goto error;
}
@@ -408,7 +410,7 @@ res_T
sdis_solve_camera
(struct sdis_scene* scn,
const struct sdis_camera* cam,
- const double time,
+ const double time_range[2],
const double fp_to_meter, /* Scale from floating point units to meters */
const double Tarad, /* In Kelvin */
const double Tref, /* In Kelvin */
@@ -436,7 +438,7 @@ sdis_solve_camera
size_t i;
ATOMIC res = RES_OK;
- if(!scn || !cam || time < 0 || fp_to_meter <= 0 || Tref < 0 || !width
+ if(!scn || !cam || fp_to_meter <= 0 || Tref < 0 || !width
|| !height || !spp || !writer || !out_estimator) {
res = RES_BAD_ARG;
goto error;
@@ -445,6 +447,11 @@ sdis_solve_camera
log_err(scn->dev, "%s: 2D scene are not supported.\n", FUNC_NAME);
goto error;
}
+ if(!time_range || time_range[0] < 0 || time_range[1] < time_range[0]
+ || (time_range[1] > DBL_MAX && time_range[0] != time_range[1])) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
/* Retrieve the medium in which the submitted position lies */
res = scene_get_medium(scn, cam->position, NULL, &medium);
@@ -532,9 +539,9 @@ sdis_solve_camera
accums = darray_accum_data_get(tiles+ithread);
/* Draw the tile */
- res_local = solve_tile(scn, rng, medium, cam, time, fp_to_meter, Tarad,
- Tref, tile_org, tile_sz, spp, register_paths, pix_sz, acc_temp, acc_time,
- accums, estimator);
+ res_local = solve_tile(scn, rng, medium, cam, time_range, fp_to_meter,
+ Tarad, Tref, tile_org, tile_sz, spp, register_paths, pix_sz, acc_temp,
+ acc_time, accums, estimator);
if(res_local != RES_OK) {
ATOMIC_SET(&res, res_local);
continue;
diff --git a/src/test_sdis_solve_camera.c b/src/test_sdis_solve_camera.c
@@ -529,6 +529,7 @@ main(int argc, char** argv)
double pos[3];
double tgt[3];
double up[3];
+ double trange[2] = {INF, INF};
(void)argc, (void)argv;
OK(mem_init_proxy_allocator(&allocator, &mem_default_allocator));
@@ -610,28 +611,38 @@ main(int argc, char** argv)
dump_mesh(stdout, geom.positions, npos, geom.indices, ntris);
exit(0);
#endif
- BA(sdis_solve_camera(NULL, cam, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, NULL, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 0, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, -1, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, 300, 0, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, 300, IMG_WIDTH, 0, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, 0,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, NULL, buf, &estimator));
- BA(sdis_solve_camera(scn, cam, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, NULL));
+ BA(sdis_solve_camera(NULL, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, NULL, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, NULL, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 0, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, -1, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, 0, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, 0,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ 0, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, NULL, buf, &estimator));
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, NULL));
+
+ trange[0] = -1;
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ trange[0] = 10; trange[1] = 1;
+ BA(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ trange[0] = trange[1] = INF;
/* Launch the simulation */
- OK(sdis_solve_camera(scn, cam, INF, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT, SPP,
- SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
+ OK(sdis_solve_camera(scn, cam, trange, 1, 300, 300, IMG_WIDTH, IMG_HEIGHT,
+ SPP, SDIS_HEAT_PATH_NONE, sdis_accum_buffer_write, buf, &estimator));
OK(sdis_estimator_get_realisation_count(estimator, &nreals));
OK(sdis_estimator_get_failure_count(estimator, &nfails));
@@ -642,7 +653,7 @@ main(int argc, char** argv)
fprintf(stderr, "Overall temperature ~ %g +/- %g\n", T.E, T.SE);
fprintf(stderr, "Time per realisation (in usec) ~ %g +/- %g\n", time.E, time.SE);
- fprintf(stderr, "#failures = %lu/%lu\n",
+ fprintf(stderr, "#failures = %lu/%lu\n",
(unsigned long)nfails, (unsigned long)(IMG_WIDTH*IMG_HEIGHT*SPP));
/* Write the image */