stardis-solver

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

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:
Msrc/sdis.h | 2+-
Msrc/sdis_solve.c | 29++++++++++++++++++-----------
Msrc/test_sdis_solve_camera.c | 53++++++++++++++++++++++++++++++++---------------------
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 */