star-gf

Compute Gebhart factors
git clone git://git.meso-star.fr/star-gf.git
Log | Files | Refs | README | LICENSE

commit 7422dac33428476df21645230bfd54cabd777fba
parent d04b25ded57001414af7eb4a3f863000b8460add
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 25 Sep 2015 11:35:39 +0200

Port the tetrahedron test to the new SGF API

Diffstat:
Mcmake/CMakeLists.txt | 4+++-
Msrc/sgf_device_c.h | 3---
Msrc/test_sgf_tetrahedron.c | 83++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
3 files changed, 54 insertions(+), 36 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -94,11 +94,13 @@ if(NOT NO_TEST) endfunction(new_test) new_test(test_sgf_device) new_test(test_sgf_cube) - # new_test(test_sgf_tetrahedron) + new_test(test_sgf_tetrahedron) set_target_properties(test_sgf_cube PROPERTIES COMPILE_FLAGS ${OpenMP_C_FLAGS}) + set_target_properties(test_sgf_tetrahedron PROPERTIES COMPILE_FLAGS ${OpenMP_C_FLAGS}) if(CMAKE_COMPILER_IS_GNUCC) set_target_properties(test_sgf_cube PROPERTIES LINK_FLAGS ${OpenMP_C_FLAGS}) + set_target_properties(test_sgf_tetrahedron PROPERTIES LINK_FLAGS ${OpenMP_C_FLAGS}) endif() endif() diff --git a/src/sgf_device_c.h b/src/sgf_device_c.h @@ -42,8 +42,5 @@ struct sgf_device { ref_T ref; }; -/* TODO implement a print function that print messages with respect to the - * device verbosity */ - #endif /* SGF_DEVICE_C_H */ diff --git a/src/test_sgf_tetrahedron.c b/src/test_sgf_tetrahedron.c @@ -33,9 +33,11 @@ #include <rsys/stretchy_array.h> #include <star/s3d.h> -#include <star/smc.h> +#include <star/ssp.h> -#define NSTEPS 10000L +#include <omp.h> + +#define NSTEPS 100000L static const float vertices[] = { 0.57735026918962576450f, 0.f, 0.f, @@ -67,19 +69,24 @@ main(int argc, char** argv) struct s3d_vertex_data attribs[2]; struct triangle_mesh mesh; struct material mtr; - struct smc_device* smc; - struct sgf_context ctx = SGF_CONTEXT_NULL; - struct sgf_accum* gfacc = NULL; - size_t iprim; + struct sgf_device* sgf = NULL; + struct sgf_scene_desc desc = SGF_SCENE_DESC_NULL; + struct sgf_status* status = NULL; + struct ssp_rng_proxy* proxy = NULL; + struct ssp_rng** rngs = NULL; + size_t i, iprim; + size_t nbuckets; (void)argc, (void)argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); + nbuckets = (unsigned)omp_get_num_procs(); - CHECK(s3d_device_create(NULL, &allocator, 1, &s3d), RES_OK); + CHECK(s3d_device_create(NULL, &allocator, 0, &s3d), RES_OK); CHECK(s3d_shape_create_mesh(s3d, &shape), RES_OK); CHECK(s3d_scene_create(s3d, &scn), RES_OK); CHECK(s3d_scene_attach_shape(scn, shape), RES_OK); - CHECK(smc_device_create(NULL, NULL, 1, NULL, &smc), RES_OK); + CHECK(ssp_rng_proxy_create(&allocator, &ssp_rng_threefry, nbuckets, &proxy), RES_OK); + CHECK(sgf_device_create(NULL, &allocator, 1, &sgf), RES_OK); attribs[0].type = S3D_FLOAT3; attribs[0].usage = S3D_POSITION; @@ -97,32 +104,44 @@ main(int argc, char** argv) CHECK(s3d_mesh_setup_indexed_vertices(shape, (unsigned)nprims, get_ids, (unsigned)nvertices, attribs, &mesh), RES_OK); - ctx.get_material_property = get_material_property; - ctx.material = &mtr; - ctx.spectral_bands_count = 1; - ctx.scene = scn; - ctx.logger = LOGGER_DEFAULT; - ctx.verbose = 1; + desc.get_material_property = get_material_property; + desc.material = &mtr; + desc.spectral_bands_count = 1; + desc.scene = scn; + + status = sa_add(status, nprims*nprims); + rngs = sa_add(rngs, nbuckets); - gfacc = sa_add(gfacc, nprims*nprims); + FOR_EACH(i, 0, nbuckets) + CHECK(ssp_rng_proxy_create_rng(proxy, i, rngs + i), RES_OK); CHECK(s3d_scene_begin_session(scn, S3D_TRACE|S3D_GET_PRIMITIVE), RES_OK); - FOR_EACH(iprim, 0, nprims) { - struct sgf_accum* row = gfacc + iprim*nprims; - ctx.primitive_id = iprim; - CHECK(sgf_integrate(smc, &ctx, NSTEPS, row), RES_OK); + + /* Gebhart Factor integration */ + #pragma omp parallel for + for(iprim = 0; iprim < nprims; ++iprim) { + struct sgf_status* row = status + iprim*nprims; + struct sgf_estimator* estimator = NULL; + size_t iprim2; + const int ithread = omp_get_thread_num(); + + CHECK(sgf_integrate(sgf, rngs[ithread], iprim, &desc, NSTEPS, &estimator), RES_OK); + FOR_EACH(iprim2, 0, nprims) { + CHECK(sgf_estimator_get_status(estimator, iprim2, 0, row + iprim2), RES_OK); + CHECK(row[iprim2].nsteps, NSTEPS); + } + CHECK(sgf_estimator_ref_put(estimator), RES_OK); } CHECK(s3d_scene_end_session(scn), RES_OK); /* Expected value */ FOR_EACH(iprim, 0, nprims) { - const struct sgf_accum* row = gfacc + iprim * nprims; + const struct sgf_status* row = status + iprim * nprims; unsigned icol; double sum = 0.0; FOR_EACH(icol, 0, nprims) { - const double E = row[icol].radiative_flux / NSTEPS; - sum += E; - printf("%.6f ", E); + sum += row[icol].E; + printf("%.6f ", row[icol].E); } printf("\n"); /* Ensure the energy conservation property */ @@ -132,24 +151,24 @@ main(int argc, char** argv) /* Standard error */ FOR_EACH(iprim, 0, nprims) { - const struct sgf_accum* row = gfacc + iprim * nprims; + const struct sgf_status* row = status + iprim * nprims; unsigned icol; FOR_EACH(icol, 0, nprims) { - const double V = row[icol].sqr_radiative_flux / ((double)NSTEPS) - - (row[icol].radiative_flux*row[icol].radiative_flux) - / (double)(NSTEPS*NSTEPS); - const double SE = sqrt(V / NSTEPS); - printf("%.6f ", SE); + printf("%.6f ", row[icol].SE); } printf("\n"); } - sa_release(gfacc); - CHECK(s3d_shape_ref_put(shape), RES_OK); CHECK(s3d_scene_ref_put(scn), RES_OK); CHECK(s3d_device_ref_put(s3d), RES_OK); - CHECK(smc_device_ref_put(smc), RES_OK); + CHECK(ssp_rng_proxy_ref_put(proxy), RES_OK); + CHECK(sgf_device_ref_put(sgf), RES_OK); + FOR_EACH(i, 0, nbuckets) + CHECK(ssp_rng_ref_put(rngs[i]), RES_OK); + + sa_release(rngs); + sa_release(status); check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator);