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