star-uvm

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

commit da4b64dc969778124ad10baf3b08b060f0038032
parent 9eeb638438df54945bcf6eb8105e611e7c61a2f5
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 15 Dec 2020 11:52:24 +0100

Test the suvm_primitive_setup_polyhedron function

Diffstat:
Msrc/test_suvm_volume.c | 72+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)

diff --git a/src/test_suvm_volume.c b/src/test_suvm_volume.c @@ -19,6 +19,7 @@ #include <rsys/dynamic_array.h> #include <rsys/double3.h> +#include <rsys/float3.h> #define DARRAY_NAME prim #define DARRAY_DATA struct suvm_primitive @@ -138,12 +139,74 @@ cmp_prim(const void* a, const void* b) } static void +check_volume_polyhedra(const struct suvm_volume* vol, struct mesh* msh) +{ + size_t iprim; + size_t nprims; + + CHK(suvm_volume_get_primitives_count(vol, &nprims) == RES_OK); + CHK(nprims == msh->ntetrahedra); + + FOR_EACH(iprim, 0, nprims) { + struct suvm_primitive prim = SUVM_PRIMITIVE_NULL; + struct suvm_polyhedron poly; + double v[4][3]; + double E0[3]; + double E1[3]; + double N[3]; + size_t ids[4]; + float f[3]; + CHK(suvm_volume_get_primitive(vol, iprim, &prim) == RES_OK); + CHK(!SUVM_PRIMITIVE_NONE(&prim)); + CHK(prim.iprim == iprim); + CHK(prim.nvertices == 4); + CHK(suvm_primitive_setup_polyhedron(&prim, &poly) == RES_OK); + + get_indices(iprim, ids, msh); + get_position(ids[0], v[0], msh); + get_position(ids[1], v[1], msh); + get_position(ids[2], v[2], msh); + get_position(ids[3], v[3], msh); + + CHK(f3_eq(poly.v[0], f3_set_d3(f, v[0]))); + CHK(f3_eq(poly.v[1], f3_set_d3(f, v[1]))); + CHK(f3_eq(poly.v[2], f3_set_d3(f, v[2]))); + CHK(f3_eq(poly.v[3], f3_set_d3(f, v[3]))); + + d3_sub(E0, v[1], v[0]); + d3_sub(E1, v[2], v[0]); + d3_cross(N, E0, E1); + f3_normalize(f, f3_set_d3(f, N)); + CHK(f3_eq_eps(poly.N[0], f, 1.e-4f)); + + d3_sub(E0, v[3], v[0]); + d3_sub(E1, v[1], v[0]); + d3_cross(N, E0, E1); + f3_normalize(f, f3_set_d3(f, N)); + CHK(f3_eq_eps(poly.N[1], f, 1.e-4f)); + + d3_sub(E0, v[3], v[1]); + d3_sub(E1, v[2], v[1]); + d3_cross(N, E0, E1); + f3_normalize(f, f3_set_d3(f, N)); + CHK(f3_eq_eps(poly.N[2], f, 1.e-4f)); + + d3_sub(E0, v[3], v[2]); + d3_sub(E1, v[0], v[2]); + d3_cross(N, E0, E1); + f3_normalize(f, f3_set_d3(f, N)); + CHK(f3_eq_eps(poly.N[3], f, 1.e-4f)); + } +} + +static void test_tetrahedral_mesh_creation(struct suvm_device* dev) { struct mesh msh = MESH_NULL; struct suvm_tetrahedral_mesh_args args = SUVM_TETRAHEDRAL_MESH_ARGS_NULL; struct suvm_volume* vol = NULL; struct suvm_primitive prim = SUVM_PRIMITIVE_NULL; + struct suvm_polyhedron poly; size_t nprims; args.ntetrahedra = box_ntetras; @@ -233,7 +296,12 @@ test_tetrahedral_mesh_creation(struct suvm_device* dev) CHK(suvm_volume_get_primitive(vol, nprims, &prim) == RES_BAD_ARG); CHK(suvm_volume_get_primitive(vol, 0, NULL) == RES_BAD_ARG); CHK(suvm_volume_get_primitive(vol, 0, &prim) == RES_OK); - CHK(!SUVM_PRIMITIVE_NONE(&prim)); + + CHK(suvm_primitive_setup_polyhedron(NULL, &poly) == RES_BAD_ARG); + CHK(suvm_primitive_setup_polyhedron(&prim, NULL) == RES_BAD_ARG); + CHK(suvm_primitive_setup_polyhedron(&prim, &poly) == RES_OK); + + check_volume_polyhedra(vol, &msh); CHK(suvm_volume_ref_put(vol) == RES_OK); } @@ -630,6 +698,8 @@ test_volume_at_ball(struct suvm_device* dev) CHK(suvm_tetrahedral_mesh_create(dev, &args, &vol) == RES_OK); + check_volume_polyhedra(vol, &msh); + /* Check volume AABB */ CHK(suvm_volume_get_aabb(vol, low, upp) == RES_OK); CHK(d3_eq_eps(aabb_low, low, aabb_sz*1.e-6));