solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 12b8c7329e89f5d0d0c61780f7298d5edc4894e3
parent 4a4f136c620e500add4de047afc2c9d1233ceecb
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu,  2 Feb 2017 09:42:43 +0100

Merge remote-tracking branch 'origin/master'

Diffstat:
Mdoc/input | 21+++++++++------------
Msrc/parser/solparser.c | 234+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/parser/solparser.h | 12++++++------
Msrc/parser/solparser_entity.h | 8++++----
Msrc/parser/solparser_pivot.h | 35+++++++++++++++++------------------
Msrc/parser/test_solparser3.c | 50+++++++++++++++++++++++++++++++-------------------
Msrc/parser/test_solparser5.c | 18++++++++----------
Msrc/solstice_args.c | 4++--
Msrc/solstice_entity.c | 45+++++++++++++++++++++++----------------------
9 files changed, 234 insertions(+), 193 deletions(-)

diff --git a/doc/input b/doc/input @@ -60,9 +60,7 @@ children: - name: "child 1" transform: { rotation: [0, 0, 0] } - pivot: - point: [0, 0, 0] - normal: [0, 1, 0] + x_pivot: target: { position: [0, 0, 0] } - entity: name: "entity2" @@ -107,16 +105,15 @@ # <material> # [ <transform> ] # -# <pivot> ::= -# pivot: -# point: <real3> -# normal: <real3> +# <x_pivot> ::= +# x_pivot: +# [ ref_point: <real3>. Default 0,0,0 ] # <target> # -# <pivot2> ::= -# pivot2: -# spacing: REAL # in [0, INF) -# ref_point: <real3> +# <zx_pivot> ::= +# zx_pivot: +# [ spacing: REAL # in [0, INF). Default 0 ] +# [ ref_point: <real3>. Default 0,0,0 ] # <target> # # <target> ::= @@ -223,7 +220,7 @@ # # <entity-data> ::= # name: STRING -# [ <geometry-data> | <pivot> | <pivot2> ] +# [ <geometry-data> | <x_pivot> | <zx_pivot> ] # [ <anchors> ] # [ <transform> ] # [ <children> ] diff --git a/src/parser/solparser.c b/src/parser/solparser.c @@ -145,16 +145,16 @@ struct target_alias { #define DARRAY_FUNCTOR_COPY_AND_RELEASE solparser_anchor_copy_and_release #include <rsys/dynamic_array.h> -/* Declare the array of pivots */ -#define DARRAY_NAME pivot -#define DARRAY_DATA struct solparser_pivot -#define DARRAY_FUNCTOR_INIT solparser_pivot_init +/* Declare the array of x_pivots */ +#define DARRAY_NAME x_pivot +#define DARRAY_DATA struct solparser_x_pivot +#define DARRAY_FUNCTOR_INIT solparser_x_pivot_init #include <rsys/dynamic_array.h> -/* Declare the array of pivot2s */ -#define DARRAY_NAME pivot2 -#define DARRAY_DATA struct solparser_pivot2 -#define DARRAY_FUNCTOR_INIT solparser_pivot2_init +/* Declare the array of xz_pivots */ +#define DARRAY_NAME xz_pivot +#define DARRAY_DATA struct solparser_xz_pivot +#define DARRAY_FUNCTOR_INIT solparser_xz_pivot_init #include <rsys/dynamic_array.h> /* Declare the hash table that maps the address of a YAML node to the id of its @@ -206,8 +206,8 @@ struct solparser { /* Miscellaneous */ struct darray_anchor anchors; - struct darray_pivot pivots; - struct darray_pivot2 pivot2s; + struct darray_x_pivot x_pivots; + struct darray_xz_pivot xz_pivots; ref_T ref; struct mem_allocator* allocator; @@ -229,17 +229,17 @@ parse_geometry struct solparser_geometry_id* solgeom); static res_T -parse_pivot +parse_x_pivot (struct solparser* parser, yaml_document_t* doc, - const yaml_node_t* pivot, + const yaml_node_t* x_pivot, struct solparser_pivot_id* out_isolpivot); static res_T -parse_pivot2 +parse_xz_pivot (struct solparser* parser, yaml_document_t* doc, - const yaml_node_t* pivot2, + const yaml_node_t* xz_pivot, struct solparser_pivot_id* out_isolpivot); static res_T @@ -314,7 +314,7 @@ flush_deferred_target_aliases n = darray_tgtalias_size_get(&parser->tgtaliases); FOR_EACH(i, 0, n) { const struct solparser_anchor* anchor; - struct solparser_pivot* pivot; + struct solparser_x_pivot* x_pivot; const struct target_alias* tgt; size_t ianchor; size_t len; @@ -344,11 +344,11 @@ flush_deferred_target_aliases } /* Define the targeted anchor of the pivot */ - pivot = darray_pivot_data_get(&parser->pivots) + tgt->pivot.i; - ASSERT(pivot->target.type == SOLPARSER_TARGET_ANCHOR); + x_pivot = darray_x_pivot_data_get(&parser->x_pivots) + tgt->pivot.i; + ASSERT(x_pivot->target.type == SOLPARSER_TARGET_ANCHOR); ianchor = (size_t)(anchor - darray_anchor_cdata_get(&parser->anchors)); ASSERT(ianchor < darray_anchor_size_get(&parser->anchors)); - pivot->target.data.anchor.i = ianchor; + x_pivot->target.data.anchor.i = ianchor; } darray_tgtalias_clear(&parser->tgtaliases); @@ -403,8 +403,8 @@ parser_clear(struct solparser* parser) /* Miscellaneous */ darray_anchor_clear(&parser->anchors); - darray_pivot_clear(&parser->pivots); - darray_pivot2_clear(&parser->pivot2s); + darray_x_pivot_clear(&parser->x_pivots); + darray_xz_pivot_clear(&parser->xz_pivots); } static void @@ -453,8 +453,8 @@ parser_release(ref_T* ref) /* Miscellaneous */ darray_anchor_release(&parser->anchors); - darray_pivot_release(&parser->pivots); - darray_pivot2_release(&parser->pivot2s); + darray_x_pivot_release(&parser->x_pivots); + darray_xz_pivot_release(&parser->xz_pivots); MEM_RM(parser->allocator, parser); } @@ -1602,6 +1602,13 @@ parse_cylinder CHECK_PARAM(RADIUS, "radius"); #undef CHECK_PARAM + #define DEFAULT_PARAM(Flag, Ptr, Value) \ + if(!(mask & BIT(Flag))) { \ + *(Ptr) = Value; \ + } (void)0 + DEFAULT_PARAM(SLICES, &shape->nslices, 16); + #undef DEFAULT_PARAM + exit: out_ishape->i = ishape; return res; @@ -1955,11 +1962,22 @@ parse_sphere #undef SETUP_MASK } - if(!(mask & BIT(RADIUS))) { - log_err(parser, sphere, "the sphere radius is missing.\n"); - res = RES_BAD_ARG; - goto error; - } + #define CHECK_PARAM(Flag, Name) \ + if(!(mask & BIT(Flag))) { \ + log_err(parser, sphere, \ + "the sphere parameter `"Name"' is missing.\n"); \ + res = RES_BAD_ARG; \ + goto error; \ + } (void)0 + CHECK_PARAM(RADIUS, "radius"); + #undef CHECK_PARAM + + #define DEFAULT_PARAM(Flag, Ptr, Value) \ + if(!(mask & BIT(Flag))) { \ + *(Ptr) = Value; \ + } (void)0 + DEFAULT_PARAM(SLICES, &shape->nslices, 16); + #undef DEFAULT_PARAM exit: out_ishape->i = ishape; @@ -2539,14 +2557,14 @@ parse_entity } else if(!strcmp((char*)key->data.scalar.value, "name")) { SETUP_MASK(NAME, "name"); res = parse_identifier_string(parser, val, &solent.name); - } else if(!strcmp((char*)key->data.scalar.value, "pivot")) { + } else if(!strcmp((char*)key->data.scalar.value, "x_pivot")) { SETUP_MASK(DATA, "data"); - solent.type = SOLPARSER_ENTITY_PIVOT; - res = parse_pivot(parser, doc, val, &solent.data.pivot); - } else if(!strcmp((char*) key->data.scalar.value, "pivot2")) { + solent.type = SOLPARSER_ENTITY_X_PIVOT; + res = parse_x_pivot(parser, doc, val, &solent.data.x_pivot); + } else if(!strcmp((char*) key->data.scalar.value, "xz_pivot")) { SETUP_MASK(DATA, "data"); - solent.type = SOLPARSER_ENTITY_PIVOT2; - res = parse_pivot2(parser, doc, val, &solent.data.pivot2); + solent.type = SOLPARSER_ENTITY_XZ_PIVOT; + res = parse_xz_pivot(parser, doc, val, &solent.data.xz_pivot); } else if(!strcmp((char*)key->data.scalar.value, "transform")) { SETUP_MASK(TRANSFORM, "transform"); res = parse_transform @@ -2761,70 +2779,67 @@ error: } static res_T -parse_pivot +parse_x_pivot (struct solparser* parser, yaml_document_t* doc, - const yaml_node_t* pivot, + const yaml_node_t* x_pivot, struct solparser_pivot_id* out_isolpivot) { - enum { NORMAL, POINT, TARGET }; - struct solparser_pivot* solpivot = NULL; + enum { REF_POINT, TARGET }; + struct solparser_x_pivot* solxpivot = NULL; size_t isolpivot = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ intptr_t i, n; res_T res = RES_OK; - ASSERT(doc && pivot && out_isolpivot); + ASSERT(doc && x_pivot && out_isolpivot); - if(pivot->type != YAML_MAPPING_NODE) { - log_err(parser, pivot, "expect a pivot definition.\n"); + if(x_pivot->type != YAML_MAPPING_NODE) { + log_err(parser, x_pivot, "expect a x_pivot definition.\n"); res = RES_BAD_ARG; goto error; } /* Allocate the solstice pivot */ - isolpivot = darray_pivot_size_get(&parser->pivots); - res = darray_pivot_resize(&parser->pivots, isolpivot + 1); + isolpivot = darray_x_pivot_size_get(&parser->x_pivots); + res = darray_x_pivot_resize(&parser->x_pivots, isolpivot + 1); if(res != RES_OK) { - log_err(parser, pivot, "could not allocate the pivot.\n"); + log_err(parser, x_pivot, "could not allocate the x_pivot.\n"); res = RES_BAD_ARG; goto error; } - solpivot = darray_pivot_data_get(&parser->pivots) + isolpivot; + solxpivot = darray_x_pivot_data_get(&parser->x_pivots) + isolpivot; - n = pivot->data.mapping.pairs.top - pivot->data.mapping.pairs.start; + n = x_pivot->data.mapping.pairs.top - x_pivot->data.mapping.pairs.start; FOR_EACH(i, 0, n) { yaml_node_t* key; yaml_node_t* val; - key = yaml_document_get_node(doc, pivot->data.mapping.pairs.start[i].key); - val = yaml_document_get_node(doc, pivot->data.mapping.pairs.start[i].value); + key = yaml_document_get_node(doc, x_pivot->data.mapping.pairs.start[i].key); + val = yaml_document_get_node(doc, x_pivot->data.mapping.pairs.start[i].value); if(key->type != YAML_SCALAR_NODE) { - log_err(parser, key, "expect pivot parameters.\n"); + log_err(parser, key, "expect x_pivot parameters.\n"); res = RES_BAD_ARG; goto error; } #define SETUP_MASK(Flag, Name) { \ if(mask & BIT(Flag)) { \ log_err(parser, key, \ - "the pivot parameter `"Name"' is already defined.\n"); \ + "the x_pivot parameter `"Name"' is already defined.\n"); \ res = RES_BAD_ARG; \ goto error; \ } \ mask |= BIT(Flag); \ } (void)0 - if(!strcmp((char*)key->data.scalar.value, "point")) { - SETUP_MASK(POINT, "point"); - res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot->point); - } else if(!strcmp((char*)key->data.scalar.value, "normal")) { - SETUP_MASK(NORMAL, "normal"); - res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot->normal); + if(!strcmp((char*)key->data.scalar.value, "ref_point")) { + SETUP_MASK(REF_POINT, "point"); + res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solxpivot->ref_point); } else if(!strcmp((char*)key->data.scalar.value, "target")) { struct solparser_pivot_id pivot_id; - pivot_id.i = (size_t) (solpivot - darray_pivot_cdata_get(&parser->pivots)); + pivot_id.i = (size_t) (solxpivot - darray_x_pivot_cdata_get(&parser->x_pivots)); SETUP_MASK(TARGET, "target"); - res = parse_target(parser, doc, val, &solpivot->target, pivot_id); + res = parse_target(parser, doc, val, &solxpivot->target, pivot_id); } else { - log_err(parser, key, "unknown pivot parameter `%s'.\n", + log_err(parser, key, "unknown x_pivot parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; goto error; @@ -2837,73 +2852,81 @@ parse_pivot } #define CHECK_PARAM(Flag, Name) \ if(!(mask & BIT(Flag))) { \ - log_err(parser, pivot, "the pivot parameter `"Name"' is missing.\n"); \ + log_err(parser, x_pivot, "the x_pivot parameter `"Name"' is missing.\n");\ res = RES_BAD_ARG; \ goto error; \ } (void)0 - CHECK_PARAM(POINT, "point"); - CHECK_PARAM(NORMAL, "normal"); CHECK_PARAM(TARGET, "target"); #undef CHECK_PARAM + #define DEFAULT_PARAM(Flag, Ptr, Value) \ + if(!(mask & BIT(Flag))) { \ + *(Ptr) = Value; \ + } (void)0 + DEFAULT_PARAM(REF_POINT, solxpivot->ref_point, 0); + DEFAULT_PARAM(REF_POINT, solxpivot->ref_point+1, 0); + DEFAULT_PARAM(REF_POINT, solxpivot->ref_point+2, 0); + #undef DEFAULT_PARAM + exit: out_isolpivot->i = isolpivot; return res; error: - if(solpivot) { - darray_pivot_pop_back(&parser->pivots); + if(solxpivot) { + darray_x_pivot_pop_back(&parser->x_pivots); isolpivot = SIZE_MAX; } goto exit; } static res_T -parse_pivot2 +parse_xz_pivot (struct solparser* parser, yaml_document_t* doc, - const yaml_node_t* pivot2, + const yaml_node_t* xz_pivot, struct solparser_pivot_id* out_isolpivot) { enum { SPACING, REF_POINT, TARGET }; - struct solparser_pivot2* solpivot2 = NULL; + struct solparser_xz_pivot* solxzpivot = NULL; size_t isolpivot = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ intptr_t i, n; res_T res = RES_OK; - ASSERT(doc && pivot2 && out_isolpivot); + ASSERT(doc && xz_pivot && out_isolpivot); - if(pivot2->type != YAML_MAPPING_NODE) { - log_err(parser, pivot2, "expect a pivot2 definition.\n"); + if(xz_pivot->type != YAML_MAPPING_NODE) { + log_err(parser, xz_pivot, "expect a xz_pivot definition.\n"); res = RES_BAD_ARG; goto error; } /* Allocate the solstice pivot */ - isolpivot = darray_pivot2_size_get(&parser->pivot2s); - res = darray_pivot2_resize(&parser->pivot2s, isolpivot + 1); + isolpivot = darray_xz_pivot_size_get(&parser->xz_pivots); + res = darray_xz_pivot_resize(&parser->xz_pivots, isolpivot + 1); if(res != RES_OK) { - log_err(parser, pivot2, "could not allocate the pivot2.\n"); + log_err(parser, xz_pivot, "could not allocate the xz_pivot.\n"); res = RES_BAD_ARG; goto error; } - solpivot2 = darray_pivot2_data_get(&parser->pivot2s) + isolpivot; + solxzpivot = darray_xz_pivot_data_get(&parser->xz_pivots) + isolpivot; - n = pivot2->data.mapping.pairs.top - pivot2->data.mapping.pairs.start; + n = xz_pivot->data.mapping.pairs.top - xz_pivot->data.mapping.pairs.start; FOR_EACH(i, 0, n) { yaml_node_t* key; yaml_node_t* val; - key = yaml_document_get_node(doc, pivot2->data.mapping.pairs.start[i].key); - val = yaml_document_get_node(doc, pivot2->data.mapping.pairs.start[i].value); + key = yaml_document_get_node(doc, xz_pivot->data.mapping.pairs.start[i].key); + val = yaml_document_get_node( + doc, xz_pivot->data.mapping.pairs.start[i].value); if(key->type != YAML_SCALAR_NODE) { - log_err(parser, key, "expect pivot2 parameters.\n"); + log_err(parser, key, "expect xz_pivot parameters.\n"); res = RES_BAD_ARG; goto error; } #define SETUP_MASK(Flag, Name) { \ if(mask & BIT(Flag)) { \ log_err(parser, key, \ - "the pivot2 parameter `"Name"' is already defined.\n"); \ + "the xz_pivot parameter `"Name"' is already defined.\n"); \ res = RES_BAD_ARG; \ goto error; \ } \ @@ -2911,17 +2934,19 @@ parse_pivot2 } (void)0 if(!strcmp((char*) key->data.scalar.value, "spacing")) { SETUP_MASK(SPACING, "spacing"); - res = parse_real(parser, val, 0, DBL_MAX, &solpivot2->spacing); + res = parse_real(parser, val, 0, DBL_MAX, &solxzpivot->spacing); } else if(!strcmp((char*) key->data.scalar.value, "ref_point")) { SETUP_MASK(REF_POINT, "ref_point"); - res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot2->ref_point); + res = parse_real3( + parser, doc, val, -DBL_MAX, DBL_MAX, solxzpivot->ref_point); } else if(!strcmp((char*) key->data.scalar.value, "target")) { struct solparser_pivot_id pivot_id; - pivot_id.i = (size_t) (solpivot2 - darray_pivot2_cdata_get(&parser->pivot2s)); + pivot_id.i = + (size_t) (solxzpivot - darray_xz_pivot_cdata_get(&parser->xz_pivots)); SETUP_MASK(TARGET, "target"); - res = parse_target(parser, doc, val, &solpivot2->target, pivot_id); + res = parse_target(parser, doc, val, &solxzpivot->target, pivot_id); } else { - log_err(parser, key, "unknown pivot2 parameter `%s'.\n", + log_err(parser, key, "unknown xz_pivot parameter `%s'.\n", key->data.scalar.value); res = RES_BAD_ARG; goto error; @@ -2934,21 +2959,30 @@ parse_pivot2 } #define CHECK_PARAM(Flag, Name) \ if(!(mask & BIT(Flag))) { \ - log_err(parser, pivot2, "the pivot2 parameter `"Name"' is missing.\n"); \ + log_err(parser, xz_pivot, \ + "the xz_pivot parameter `"Name"' is missing.\n"); \ res = RES_BAD_ARG; \ goto error; \ } (void)0 - CHECK_PARAM(SPACING, "spacing"); - CHECK_PARAM(REF_POINT, "ref_point"); CHECK_PARAM(TARGET, "target"); #undef CHECK_PARAM + #define DEFAULT_PARAM(Flag, Ptr, Value) \ + if(!(mask & BIT(Flag))) { \ + *(Ptr) = Value; \ + } (void)0 + DEFAULT_PARAM(SPACING, &solxzpivot->spacing, 0); + DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point, 0); + DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point+1, 0); + DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point+2, 0); + #undef DEFAULT_PARAM + exit: out_isolpivot->i = isolpivot; return res; error: - if(solpivot2) { - darray_pivot2_pop_back(&parser->pivot2s); + if(solxzpivot) { + darray_xz_pivot_pop_back(&parser->xz_pivots); isolpivot = SIZE_MAX; } goto exit; @@ -3324,8 +3358,8 @@ solparser_create /* Anchors and pivot(2)s */ darray_anchor_init(mem_allocator, &parser->anchors); - darray_pivot_init(mem_allocator, &parser->pivots); - darray_pivot2_init(mem_allocator, &parser->pivot2s); + darray_x_pivot_init(mem_allocator, &parser->x_pivots); + darray_xz_pivot_init(mem_allocator, &parser->xz_pivots); exit: *out_parser = parser; @@ -3655,22 +3689,22 @@ solparser_get_object return darray_object_cdata_get(&parser->objects) + obj.i; } -const struct solparser_pivot* -solparser_get_pivot +const struct solparser_x_pivot* +solparser_get_x_pivot (const struct solparser* parser, - const struct solparser_pivot_id pivot) + const struct solparser_pivot_id x_pivot) { - ASSERT(parser && pivot.i < darray_pivot_size_get(&parser->pivots)); - return darray_pivot_cdata_get(&parser->pivots) + pivot.i; + ASSERT(parser && x_pivot.i < darray_x_pivot_size_get(&parser->x_pivots)); + return darray_x_pivot_cdata_get(&parser->x_pivots) + x_pivot.i; } -const struct solparser_pivot2* -solparser_get_pivot2 +const struct solparser_xz_pivot* +solparser_get_xz_pivot (const struct solparser* parser, - const struct solparser_pivot_id pivot2) + const struct solparser_pivot_id xz_pivot) { - ASSERT(parser && pivot2.i < darray_pivot2_size_get(&parser->pivot2s)); - return darray_pivot2_cdata_get(&parser->pivot2s) + pivot2.i; + ASSERT(parser && xz_pivot.i < darray_xz_pivot_size_get(&parser->xz_pivots)); + return darray_xz_pivot_cdata_get(&parser->xz_pivots) + xz_pivot.i; } const struct solparser_shape* diff --git a/src/parser/solparser.h b/src/parser/solparser.h @@ -117,15 +117,15 @@ solparser_get_object (const struct solparser* parser, const struct solparser_object_id obj); -extern LOCAL_SYM const struct solparser_pivot* -solparser_get_pivot +extern LOCAL_SYM const struct solparser_x_pivot* +solparser_get_x_pivot (const struct solparser* parser, - const struct solparser_pivot_id pivot); + const struct solparser_pivot_id x_pivot); -extern LOCAL_SYM const struct solparser_pivot2* -solparser_get_pivot2 +extern LOCAL_SYM const struct solparser_xz_pivot* +solparser_get_xz_pivot (const struct solparser* parser, - const struct solparser_pivot_id pivot2); + const struct solparser_pivot_id xz_pivot); extern LOCAL_SYM const struct solparser_shape* solparser_get_shape diff --git a/src/parser/solparser_entity.h b/src/parser/solparser_entity.h @@ -29,8 +29,8 @@ enum solparser_entity_type { SOLPARSER_ENTITY_EMPTY, SOLPARSER_ENTITY_GEOMETRY, - SOLPARSER_ENTITY_PIVOT, - SOLPARSER_ENTITY_PIVOT2 + SOLPARSER_ENTITY_X_PIVOT, + SOLPARSER_ENTITY_XZ_PIVOT }; struct solparser_entity_id { size_t i; }; @@ -67,8 +67,8 @@ struct solparser_entity { enum solparser_entity_type type; union { struct solparser_geometry_id geometry; - struct solparser_pivot_id pivot; - struct solparser_pivot_id pivot2; + struct solparser_pivot_id x_pivot; + struct solparser_pivot_id xz_pivot; } data; /* Internal data. Should not be acceded directly. */ diff --git a/src/parser/solparser_pivot.h b/src/parser/solparser_pivot.h @@ -81,41 +81,40 @@ static const struct solparser_target SOLPARSER_TARGET_NULL = struct solparser_pivot_id { size_t i; }; -struct solparser_pivot { - double point[3]; - double normal[3]; +struct solparser_x_pivot { + double ref_point[3]; struct solparser_target target; }; -#define SOLPARSER_PIVOT_NULL__ { {0,0,0}, {0,0,0}, SOLPARSER_TARGET_NULL__ } -static const struct solparser_pivot SOLPARSER_PIVOT_NULL = - SOLPARSER_PIVOT_NULL__; +#define SOLPARSER_X_PIVOT_NULL__ { {0,0,0}, SOLPARSER_TARGET_NULL__ } +static const struct solparser_x_pivot SOLPARSER_X_PIVOT_NULL = + SOLPARSER_X_PIVOT_NULL__; static INLINE void -solparser_pivot_init -(struct mem_allocator* allocator, struct solparser_pivot* pivot) +solparser_x_pivot_init +(struct mem_allocator* allocator, struct solparser_x_pivot* x_pivot) { (void) allocator; - ASSERT(pivot); - *pivot = SOLPARSER_PIVOT_NULL; + ASSERT(x_pivot); + *x_pivot = SOLPARSER_X_PIVOT_NULL; } -struct solparser_pivot2 { +struct solparser_xz_pivot { double spacing; double ref_point[3]; struct solparser_target target; }; -#define SOLPARSER_PIVOT2_NULL__ { 0, {0,0,0}, SOLPARSER_TARGET_NULL__ } -static const struct solparser_pivot2 SOLPARSER_PIVOT2_NULL = - SOLPARSER_PIVOT2_NULL__; +#define SOLPARSER_XZ_PIVOT_NULL__ { 0, {0,0,0}, SOLPARSER_TARGET_NULL__ } +static const struct solparser_xz_pivot SOLPARSER_XZ_PIVOT_NULL = + SOLPARSER_XZ_PIVOT_NULL__; static INLINE void -solparser_pivot2_init - (struct mem_allocator* allocator, struct solparser_pivot2* pivot2) +solparser_xz_pivot_init + (struct mem_allocator* allocator, struct solparser_xz_pivot* xz_pivot) { (void) allocator; - ASSERT(pivot2); - *pivot2 = SOLPARSER_PIVOT2_NULL; + ASSERT(xz_pivot); + *xz_pivot = SOLPARSER_XZ_PIVOT_NULL; } #endif /* SOLPARSER_PIVOT_H */ diff --git a/src/parser/test_solparser3.c b/src/parser/test_solparser3.c @@ -22,6 +22,9 @@ static const char* input[] = { "- geometry: &cylinder\n", " - cylinder: { radius: 1, height: 10, slices: 128 }\n", " material: *lambertian\n", + "- geometry: &cylinder2\n", + " - cylinder: { radius: 1, height: 10 }\n", + " material: *lambertian\n", "- sun: \n", " dni: 1\n", " spectrum: [{wavelength: 1, data: 1}]\n", @@ -37,7 +40,7 @@ static const char* input[] = { " children:\n", " - name: entity0a\n", " primary: 1\n", - " geometry: *cylinder\n", + " geometry: *cylinder2\n", " - name: entity0b\n", " primary: 1\n", " geometry: *cylinder\n", @@ -48,13 +51,12 @@ static const char* input[] = { " position: [7, 8, 9]\n", "- entity:\n", " name: entity1\n", - " pivot:\n", - " point: [1, 2, 3]\n", - " normal: [4, 5, 6]\n", + " x_pivot:\n", + " ref_point: [1, 2, 3]\n", " target: { anchor: \"entity0.entity0b.anchor0\" }\n", "- entity:\n", " name: entity2\n", - " pivot2:\n", + " xz_pivot:\n", " spacing: 1\n", " ref_point: [1, 2, 3]\n", " target: { anchor: \"entity0.entity0b.anchor0\" }\n", @@ -66,8 +68,8 @@ const struct solparser_anchor* entity0_anchor1; const struct solparser_anchor* entity0_entity0b_anchor0; const struct solparser_anchor* entity0_entity0b_entity0b; const struct solparser_geometry* geom; -const struct solparser_pivot* pivot; -const struct solparser_pivot2* pivot2; +const struct solparser_x_pivot* x_pivot; +const struct solparser_xz_pivot* xz_pivot; static void check_entity0 @@ -135,10 +137,21 @@ check_entity0 entity0a = solparser_get_entity(parser, entity_id); CHECK(strcmp(str_cget(&entity0a->name), "entity0a"), 0); CHECK(entity0a->type, SOLPARSER_ENTITY_GEOMETRY); - CHECK(entity0->data.geometry.i, entity0a->data.geometry.i); + NCHECK(entity0->data.geometry.i, entity0a->data.geometry.i); CHECK(solparser_entity_get_anchors_count(entity0a), 0); CHECK(solparser_entity_get_children_count(entity0a), 0); + geom = solparser_get_geometry(parser, entity0a->data.geometry); + CHECK(solparser_geometry_get_objects_count(geom), 1); + obj_id = solparser_geometry_get_object(geom, 0); + obj = solparser_get_object(parser, obj_id); + shape = solparser_get_shape(parser, obj->shape); + CHECK(shape->type, SOLPARSER_SHAPE_CYLINDER); + cylinder = solparser_get_shape_cylinder(parser, shape->data.cylinder); + CHECK(cylinder->height, 10); + CHECK(cylinder->radius, 1); + CHECK(cylinder->nslices, 16); + entity_id = solparser_entity_get_child(entity0, 1); entity0b = solparser_get_entity(parser, entity_id); CHECK(strcmp(str_cget(&entity0b->name), "entity0b"), 0); @@ -168,14 +181,13 @@ check_entity1 NCHECK(entity1, NULL); CHECK(strcmp(str_cget(&entity1->name), "entity1"), 0); - CHECK(entity1->type, SOLPARSER_ENTITY_PIVOT); + CHECK(entity1->type, SOLPARSER_ENTITY_X_PIVOT); CHECK(solparser_entity_get_anchors_count(entity1), 0); CHECK(solparser_entity_get_children_count(entity1), 0); - pivot = solparser_get_pivot(parser, entity1->data.pivot); - CHECK(d3_eq(pivot->point, d3(tmp, 1, 2, 3)), 1); - CHECK(d3_eq(pivot->normal, d3(tmp, 4, 5, 6)), 1); - CHECK(pivot->target.type, SOLPARSER_TARGET_ANCHOR); + x_pivot = solparser_get_x_pivot(parser, entity1->data.x_pivot); + CHECK(d3_eq(x_pivot->ref_point, d3(tmp, 1, 2, 3)), 1); + CHECK(x_pivot->target.type, SOLPARSER_TARGET_ANCHOR); } static void @@ -188,14 +200,14 @@ check_entity2 NCHECK(entity2, NULL); CHECK(strcmp(str_cget(&entity2->name), "entity2"), 0); - CHECK(entity2->type, SOLPARSER_ENTITY_PIVOT2); + CHECK(entity2->type, SOLPARSER_ENTITY_XZ_PIVOT); CHECK(solparser_entity_get_anchors_count(entity2), 0); CHECK(solparser_entity_get_children_count(entity2), 0); - pivot2 = solparser_get_pivot2(parser, entity2->data.pivot2); - CHECK(pivot2->spacing, 1); - CHECK(d3_eq(pivot2->ref_point, d3(tmp, 1, 2, 3)), 1); - CHECK(pivot2->target.type, SOLPARSER_TARGET_ANCHOR); + xz_pivot = solparser_get_xz_pivot(parser, entity2->data.xz_pivot); + CHECK(xz_pivot->spacing, 1); + CHECK(d3_eq(xz_pivot->ref_point, d3(tmp, 1, 2, 3)), 1); + CHECK(xz_pivot->target.type, SOLPARSER_TARGET_ANCHOR); } int @@ -251,7 +263,7 @@ main(int argc, char** argv) solparser_entity_iterator_next(&it); } - anchor = solparser_get_anchor(parser, pivot->target.data.anchor); + anchor = solparser_get_anchor(parser, x_pivot->target.data.anchor); CHECK(anchor, entity0_entity0b_anchor0); anchor = solparser_find_anchor(parser, "entity0"); diff --git a/src/parser/test_solparser5.c b/src/parser/test_solparser5.c @@ -33,9 +33,8 @@ static const char* input[] = { " position: [1, 2, 3]\n", " children:\n", " - name: lvl2\n", - " pivot:\n", - " point: [1, 2, 3]\n", - " normal: [4, 5, 6]\n", + " x_pivot:\n", + " ref_point: [1, 2, 3]\n", " target: { anchor: self.lvl1.anchor0 }\n", "- entity:\n", " name: entity0\n", @@ -50,7 +49,7 @@ static void check_entity(struct solparser* parser, const struct solparser_entity* entity) { const struct solparser_anchor* anchor; - const struct solparser_pivot* pivot; + const struct solparser_x_pivot* x_pivot; struct solparser_entity_id entity_id; double tmp[3]; @@ -66,14 +65,13 @@ check_entity(struct solparser* parser, const struct solparser_entity* entity) entity_id = solparser_entity_get_child(entity, 0); entity = solparser_get_entity(parser, entity_id); CHECK(strcmp(str_cget(&entity->name), "lvl2"), 0); - CHECK(entity->type, SOLPARSER_ENTITY_PIVOT); + CHECK(entity->type, SOLPARSER_ENTITY_X_PIVOT); - pivot = solparser_get_pivot(parser, entity->data.pivot); - CHECK(d3_eq(pivot->point, d3(tmp, 1, 2, 3)), 1); - CHECK(d3_eq(pivot->normal, d3(tmp, 4, 5, 6)), 1); - CHECK(pivot->target.type, SOLPARSER_TARGET_ANCHOR); + x_pivot = solparser_get_x_pivot(parser, entity->data.x_pivot); + CHECK(d3_eq(x_pivot->ref_point, d3(tmp, 1, 2, 3)), 1); + CHECK(x_pivot->target.type, SOLPARSER_TARGET_ANCHOR); - anchor = solparser_get_anchor(parser, pivot->target.data.anchor); + anchor = solparser_get_anchor(parser, x_pivot->target.data.anchor); CHECK(strcmp(str_cget(&anchor->name), "anchor0"), 0); CHECK(d3_eq(anchor->position, d3(tmp, 1, 2, 3)), 1); } diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -44,14 +44,14 @@ print_help(const char* program) printf( " -D <dirs> list of sun directions.\n"); printf( -" -H output the per receiver hit data.\n"); +" -H output hit-on-receiver data (binary format).\n"); printf( " -h display this help and exit.\n"); printf( " -n REALISATIONS number of realisations. Default is %lu.\n", SOLSTICE_ARGS_DEFAULT.nrealisations); printf( -" -o write results to OUTPUT. If not define, write results to\n" +" -o OUTPUT write results to OUTPUT. If not defined, write results to\n" " standard output.\n"); printf( " -q do not print the helper message when no FILE is submitted.\n"); diff --git a/src/solstice_entity.c b/src/solstice_entity.c @@ -98,39 +98,40 @@ error: } static struct solstice_node* -create_pivot_node +create_x_pivot_node (struct solstice* solstice, const struct solparser_entity* entity) { + double n[3]; struct solstice_node* node = NULL; struct solstice_node* target = NULL; - const struct solparser_pivot* parser_pivot = NULL; + const struct solparser_x_pivot* parser_x_pivot = NULL; struct sanim_pivot anim_pivot = SANIM_PIVOT_NULL; struct sanim_tracking anim_tracking = SANIM_TRACKING_NULL; res_T res = RES_OK; ASSERT(solstice && entity); - parser_pivot = solparser_get_pivot(solstice->parser, entity->data.pivot); + parser_x_pivot = solparser_get_x_pivot(solstice->parser, entity->data.x_pivot); anim_pivot.type = PIVOT_SINGLE_AXIS; - d3_set(anim_pivot.data.pivot1.ref_normal, parser_pivot->normal); - d3_set(anim_pivot.data.pivot1.ref_point, parser_pivot->point); + d3_set(anim_pivot.data.pivot1.ref_normal, d3(n, 0, 0, 1)); + d3_set(anim_pivot.data.pivot1.ref_point, parser_x_pivot->ref_point); /* Setup the tracking descriptor */ - switch (parser_pivot->target.type) { + switch (parser_x_pivot->target.type) { case SOLPARSER_TARGET_ANCHOR: anim_tracking.policy = TRACKING_NODE_TARGET; target = *htable_anchor_find - (&solstice->anchors, &parser_pivot->target.data.anchor.i); + (&solstice->anchors, &parser_x_pivot->target.data.anchor.i); solstice_node_target_get_tracking(target, &anim_tracking); break; case SOLPARSER_TARGET_DIRECTION: anim_tracking.policy = TRACKING_OUT_DIR; - d3_set(anim_tracking.data.out_dir.u, parser_pivot->target.data.direction); + d3_set(anim_tracking.data.out_dir.u, parser_x_pivot->target.data.direction); break; case SOLPARSER_TARGET_POSITION: anim_tracking.policy = TRACKING_POINT; - d3_set(anim_tracking.data.point.target, parser_pivot->target.data.position); + d3_set(anim_tracking.data.point.target, parser_x_pivot->target.data.position); anim_tracking.data.point.target_is_local = 0; /* TODO */ break; case SOLPARSER_TARGET_SUN: @@ -157,39 +158,39 @@ error: } static struct solstice_node* -create_pivot2_node +create_xz_pivot_node (struct solstice* solstice, const struct solparser_entity* entity) { struct solstice_node* node = NULL; struct solstice_node* target = NULL; - const struct solparser_pivot2* parser_pivot2 = NULL; + const struct solparser_xz_pivot* parser_xz_pivot = NULL; struct sanim_pivot anim_pivot = SANIM_PIVOT_NULL; struct sanim_tracking anim_tracking = SANIM_TRACKING_NULL; res_T res = RES_OK; ASSERT(solstice && entity); - parser_pivot2 = solparser_get_pivot2(solstice->parser, entity->data.pivot2); + parser_xz_pivot = solparser_get_xz_pivot(solstice->parser, entity->data.xz_pivot); anim_pivot.type = PIVOT_TWO_AXIS; - anim_pivot.data.pivot2.spacing = parser_pivot2->spacing; - d3_set(anim_pivot.data.pivot2.ref_point, parser_pivot2->ref_point); + anim_pivot.data.pivot2.spacing = parser_xz_pivot->spacing; + d3_set(anim_pivot.data.pivot2.ref_point, parser_xz_pivot->ref_point); /* Setup the tracking descriptor */ - switch (parser_pivot2->target.type) { + switch (parser_xz_pivot->target.type) { case SOLPARSER_TARGET_ANCHOR: anim_tracking.policy = TRACKING_NODE_TARGET; target = *htable_anchor_find - (&solstice->anchors, &parser_pivot2->target.data.anchor.i); + (&solstice->anchors, &parser_xz_pivot->target.data.anchor.i); solstice_node_target_get_tracking(target, &anim_tracking); break; case SOLPARSER_TARGET_DIRECTION: anim_tracking.policy = TRACKING_OUT_DIR; - d3_set(anim_tracking.data.out_dir.u, parser_pivot2->target.data.direction); + d3_set(anim_tracking.data.out_dir.u, parser_xz_pivot->target.data.direction); break; case SOLPARSER_TARGET_POSITION: anim_tracking.policy = TRACKING_POINT; - d3_set(anim_tracking.data.point.target, parser_pivot2->target.data.position); + d3_set(anim_tracking.data.point.target, parser_xz_pivot->target.data.position); anim_tracking.data.point.target_is_local = 0; /* TODO */ break; case SOLPARSER_TARGET_SUN: @@ -235,11 +236,11 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity) case SOLPARSER_ENTITY_GEOMETRY: node = create_geometry_node(solstice, entity); break; - case SOLPARSER_ENTITY_PIVOT: - node = create_pivot_node(solstice, entity); + case SOLPARSER_ENTITY_X_PIVOT: + node = create_x_pivot_node(solstice, entity); break; - case SOLPARSER_ENTITY_PIVOT2: - node = create_pivot2_node(solstice, entity); + case SOLPARSER_ENTITY_XZ_PIVOT: + node = create_xz_pivot_node(solstice, entity); break; default: FATAL("Unreachable code.\n"); break; }