commit 4df491f5c3fe088f5dfd92e281d0698182b70c39
parent 6c067e20b5eda4531d2b9a1d9e1d4adf12fd71f0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 5 Mar 2026 16:42:13 +0100
Add the sln_node_get_desc function
It returns node data such as the number of lines it has partitioned and
the number of mesh vertices used to represent them at the node's
hierarchical level.
Diffstat:
3 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/src/sln.h b/src/sln.h
@@ -167,6 +167,13 @@ struct sln_tree_desc {
}
static const struct sln_tree_desc SLN_TREE_DESC_NULL = SLN_TREE_DESC_NULL__;
+struct sln_node_desc {
+ size_t nlines;
+ size_t nvertices;
+};
+#define SLN_NODE_DESC_NULL__ {0,0}
+static const struct sln_node_desc SLN_NODE_DESC_NULL = SLN_NODE_DESC_NULL__;
+
struct sln_vertex { /* 8 Bytes */
float wavenumber; /* in cm^-1 */
float ka;
@@ -315,6 +322,11 @@ sln_node_eval
const struct sln_node* node,
const double wavenumber); /* In cm^-1 */
+SLN_API res_T
+sln_node_get_desc
+ (const struct sln_node* node,
+ struct sln_node_desc* desc);
+
SLN_API double
sln_mesh_eval
(const struct sln_mesh* mesh,
diff --git a/src/sln_tree.c b/src/sln_tree.c
@@ -624,6 +624,16 @@ sln_node_eval
return ka;
}
+res_T
+sln_node_get_desc(const struct sln_node* node, struct sln_node_desc* desc)
+{
+ if(!node || !desc) return RES_BAD_ARG;
+ desc->nlines = node->range[1] - node->range[0];
+ desc->nlines += 1/*boundaries are inclusives*/;
+ desc->nvertices = node->nvertices;
+ return RES_OK;
+}
+
double
sln_mesh_eval(const struct sln_mesh* mesh, const double wavenumber)
{
diff --git a/src/test_sln_tree.c b/src/test_sln_tree.c
@@ -152,6 +152,7 @@ test_tree
{
struct sln_tree_create_args tree_args = SLN_TREE_CREATE_ARGS_DEFAULT;
struct sln_tree_desc desc = SLN_TREE_DESC_NULL;
+ struct sln_node_desc node_desc = SLN_NODE_DESC_NULL;
struct sln_mesh mesh = SLN_MESH_NULL;
struct sln_tree* tree = NULL;
const struct sln_node* node = NULL;
@@ -182,8 +183,25 @@ test_tree
CHK(desc.depth == (unsigned)log2i((int)round_up_pow2(desc.nlines)));
CHK(node = sln_tree_get_root(tree));
+ CHK(node != NULL);
+
+ CHK(sln_node_get_desc(NULL, &node_desc) == RES_BAD_ARG);
+ CHK(sln_node_get_desc(node, NULL) == RES_BAD_ARG);
+ CHK(sln_node_get_desc(node, &node_desc) == RES_OK);
+ CHK(node_desc.nlines = desc.nlines);
+ CHK(node_desc.nvertices >= 1 && node_desc.nvertices < desc.nvertices);
+
while(!sln_node_is_leaf(node)) {
+ struct sln_node_desc node_desc_next = SLN_NODE_DESC_NULL;
node = sln_node_get_child(node, 0);
+
+ CHK(sln_node_get_desc(node, &node_desc_next) == RES_OK);
+ CHK(node_desc_next.nlines >= 1);
+ CHK(node_desc_next.nlines < node_desc.nlines);
+ CHK(node_desc_next.nvertices >= 1);
+ CHK(node_desc_next.nlines < node_desc.nvertices);
+
+ node_desc = node_desc_next;
}
CHK(sln_node_get_lines_count(node) <= desc.max_nlines_per_leaf);