star-uvm

Spatial structuring of unstructured volumetric meshes
git clone git://git.meso-star.fr/star-uvm.git
Log | Files | Refs | README | LICENSE

commit beabe73d18f2a371d5fb492b05bd27468ebf6f4a
parent 6150aac6e30cd6d456cb5ee8bd8f6b7b2cd0ca64
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 25 Sep 2020 10:04:26 +0200

Test further the creation of a tetrahedral mesh

Test the setup of per tetrahedra/per vertex data.

Diffstat:
Msrc/suvm_device.c | 2+-
Msrc/suvm_volume.c | 15+++++++++------
Msrc/test_suvm_volume.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/src/suvm_device.c b/src/suvm_device.c @@ -93,7 +93,7 @@ suvm_device_create dev->rtc = rtcNewDevice(embree_opts); if(dev->rtc == NULL) { const enum RTCError err = rtcGetDeviceError(NULL); - log_err(dev, "Could not create the emree device -- %s.\n", + log_err(dev, "Could not create the Embree device -- %s.\n", rtc_error_string(err)); res = rtc_error_to_res_T(err); goto error; diff --git a/src/suvm_volume.c b/src/suvm_volume.c @@ -104,7 +104,8 @@ buffer_init_from_data (struct mem_allocator* mem_allocator, /* May be NULL */ struct buffer* buf, const struct suvm_data* data, - const size_t ndata) + const size_t ndata, + void* context) { struct mem_allocator* allocator = NULL; size_t idata; @@ -135,7 +136,7 @@ buffer_init_from_data /* Fill the buffer with the submitted data */ FOR_EACH(idata, 0, ndata) { void* elmt = (char*)buf->mem + idata*buf->elmt_stride; - data->get(idata, 0, elmt); + data->get(idata, elmt, context); } exit: @@ -165,7 +166,8 @@ setup_tetrahedral_mesh res = darray_size_t_resize (&vol->indices, args->ntetrahedras*4/*#vertices per tetra*/); if(res != RES_OK) { - log_err(vol->dev, "Could not allocate list of tetrahedra indices -- %s.\n", + log_err(vol->dev, + "Could not allocate the list of tetrahedra indices -- %s.\n", res_to_cstr(res)); goto error; } @@ -178,7 +180,8 @@ setup_tetrahedral_mesh res = darray_double_resize (&vol->positions, args->nvertices*3/*#coords per vertex*/); if(res != RES_OK) { - log_err(vol->dev, "Could not allocate the list tetrahedra vertices -- %s.\n", + log_err(vol->dev, + "Could not allocate the list of tetrahedra vertices -- %s.\n", res_to_cstr(res)); goto error; } @@ -190,7 +193,7 @@ setup_tetrahedral_mesh /* Store the per tetrahedral data */ if(args->tetrahedra_data.get) { res = buffer_init_from_data(vol->dev->allocator, &vol->prim_data, - &args->tetrahedra_data, args->ntetrahedras); + &args->tetrahedra_data, args->ntetrahedras, args->context); if(res != RES_OK) { log_err(vol->dev, "Could not setup the per volumetric primitive data -- %s.\n", @@ -202,7 +205,7 @@ setup_tetrahedral_mesh /* Store the per vertex data */ if(args->vertex_data.get) { res = buffer_init_from_data(vol->dev->allocator, &vol->vert_data, - &args->vertex_data, args->nvertices); + &args->vertex_data, args->nvertices, args->context); if(res != RES_OK) { log_err(vol->dev, "Could not setup the per vertex data -- %s.\n", res_to_cstr(res)); diff --git a/src/test_suvm_volume.c b/src/test_suvm_volume.c @@ -74,6 +74,35 @@ get_position(const size_t ivert, double pos[3], void* ctx) pos[2] = box_vertices[ivert*3+2]; } +/* Use tetra indices as tetra data */ +static void +get_tetra_data(const size_t itetra, void* data, void* ctx) +{ + size_t* ids = data; + (void)ctx; + CHK(itetra < box_ntetras); + CHK(data != NULL); + CHK(IS_ALIGNED(data, 64)); + ids[0] = box_indices[itetra*4+0]; + ids[1] = box_indices[itetra*4+1]; + ids[2] = box_indices[itetra*4+2]; + ids[3] = box_indices[itetra*4+3]; +} + +/* Use vertex position as vertex data */ +static void +get_vert_data(const size_t ivert, void* data, void* ctx) +{ + double* pos = data; + (void)ctx; + CHK(ivert < box_nverts); + CHK(data != NULL); + CHK(IS_ALIGNED(data, 32)); + pos[0] = box_vertices[ivert*3+0]; + pos[1] = box_vertices[ivert*3+1]; + pos[2] = box_vertices[ivert*3+2]; +} + /******************************************************************************* * Main function ******************************************************************************/ @@ -119,8 +148,36 @@ main(int argc, char** argv) CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); args.get_position = get_position;; CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_OK); + CHK(suvm_volume_ref_put(vol) == RES_OK); + args.tetrahedra_data.get = get_tetra_data; + args.tetrahedra_data.size = sizeof(size_t[4]); + args.tetrahedra_data.alignment = 64; + args.vertex_data.get = get_vert_data; + args.vertex_data.size = sizeof(double[3]); + args.vertex_data.alignment = 32; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_OK); CHK(suvm_volume_ref_put(vol) == RES_OK); + + args.tetrahedra_data.size = 0; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.tetrahedra_data.size = sizeof(size_t[4]); + args.tetrahedra_data.alignment = 0; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.tetrahedra_data.alignment = 3; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.tetrahedra_data.alignment = 64; + args.vertex_data.size = 0; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.vertex_data.size = sizeof(double[3]); + args.vertex_data.alignment = 5; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.vertex_data.alignment = 0; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_BAD_ARG); + args.vertex_data.alignment = 32; + CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_OK); + CHK(suvm_volume_ref_put(vol) == RES_OK); + CHK(suvm_device_ref_put(dev) == RES_OK); check_memory_allocator(&mem_default_allocator);