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