commit b65a01e95075b19298e4a4baa530a3d7db77556e
parent 55a94556c18f50c9c1649938fe3d7d410f925e60
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 11 Apr 2017 11:08:39 +0200
Change cylinders to use new solver's analytic cylinders.
Add the nstacks parameter.
Diffstat:
6 files changed, 48 insertions(+), 23 deletions(-)
diff --git a/doc/input b/doc/input
@@ -145,6 +145,7 @@
height: REAL # in ]0, INF)
radius: REAL # in ]0, INF)
[ slices: INTEGER ] # in [4, 4096]. Default 16
+[ stacks: INTEGER ] # in [1, 4096]. Default 1
<obj> ::=
obj:
diff --git a/src/parser/solparser_geometry.c b/src/parser/solparser_geometry.c
@@ -305,7 +305,7 @@ parse_cylinder
const yaml_node_t* cylinder,
struct solparser_shape_cylinder_id* out_ishape)
{
- enum { HEIGHT, RADIUS, SLICES };
+ enum { HEIGHT, RADIUS, SLICES, STACKS };
struct solparser_shape_cylinder* shape = NULL;
size_t ishape = SIZE_MAX;
intptr_t i, n;
@@ -330,6 +330,7 @@ parse_cylinder
n = cylinder->data.mapping.pairs.top - cylinder->data.mapping.pairs.start;
shape->nslices = 16; /* default value */
+ shape->nstacks = 1; /* default value */
FOR_EACH(i, 0, n) {
yaml_node_t* key;
yaml_node_t* val;
@@ -359,6 +360,10 @@ parse_cylinder
} else if(!strcmp((char*)key->data.scalar.value, "slices")) {
SETUP_MASK(SLICES, "slices");
res = parse_integer(parser, val, 4, 4096, &shape->nslices);
+ }
+ else if(!strcmp((char*)key->data.scalar.value, "stacks")) {
+ SETUP_MASK(STACKS, "stacks");
+ res = parse_integer(parser, val, 1, 4096, &shape->nstacks);
} else {
log_err(parser, key, "unknown cylinder parameter `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/solparser_shape.h b/src/parser/solparser_shape.h
@@ -365,6 +365,7 @@ struct solparser_shape_cylinder {
double height;
double radius;
long nslices;
+ long nstacks;
};
struct solparser_shape_sphere {
diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml
@@ -496,6 +496,7 @@
# height: REAL # in ]0, INF)
# radius: REAL # in ]0, INF)
# [ slices: INTEGER ] # in [4, 4096]. Default 16
+# [ stacks: INTEGER ] # in [1, 4096]. Default 1
#
# missing cylinder definition
@@ -525,6 +526,9 @@
# slices should be a number
- geometry: [ { cylinder: { slices: "dummy" } } ]
---
+# stacks
+- geometry: [ { cylinder: { stacks: "dummy" } } ]
+---
# -1 invalid
- geometry: [ { cylinder: { radius: -1 } } ]
---
@@ -546,15 +550,27 @@
# 2x slices
- geometry: [ { cylinder: { slices: 10, slices: 10 } } ]
---
+# stacks
+- geometry: [ { cylinder: { stacks: 10, stacks: 10 } } ]
+---
# 1 invalid
- geometry: [ { cylinder: { height: 1, radius: 1, slices: 1 } } ]
---
# 4097 invalid
- geometry: [ { cylinder: { height: 1, radius: 1, slices: 4097 } } ]
---
+# 0 invalid
+- geometry: [ { cylinder: { height: 1, radius: 1, stacks: 0 } } ]
+---
+# 4097 invalid
+- geometry: [ { cylinder: { height: 1, radius: 1, stacks: 4097 } } ]
+---
# 12.5 invalid
- geometry: [ { cylinder: { height: 1, radius: 1, slices: 12.5 } } ]
---
+# 12.5 invalid
+- geometry: [ { cylinder: { height: 1, radius: 1, stacks: 12.5 } } ]
+---
#
# <obj> ::=
diff --git a/src/solstice_object.c b/src/solstice_object.c
@@ -198,25 +198,36 @@ create_cylinder
struct ssol_shape** out_ssol_shape)
{
const struct solparser_shape_cylinder* cylinder;
- struct s3dut_mesh* mesh = NULL;
struct ssol_shape* ssol_shape = NULL;
+ struct ssol_analytic_surface analytic = SSOL_ANALYTIC_SURFACE_NULL__;
res_T res = RES_OK;
- ASSERT(solstice && out_ssol_shape);
+ ASSERT(solstice);
cylinder = solparser_get_shape_cylinder(solstice->parser, cylinder_id);
+
+ analytic.type = SSOL_ANALYTIC_CYLINDER;
+ analytic.data.cylinder.radius = cylinder->radius;
+ analytic.data.cylinder.height = cylinder->height;
+ d33_set(analytic.transform, transform);
+ d3_set(analytic.transform + 9, transform + 9);
ASSERT(cylinder->nslices > 0 && cylinder->nslices < UINT_MAX);
- res = s3dut_create_cylinder(solstice->allocator, cylinder->radius,
- cylinder->height, (unsigned)cylinder->nslices, 1, &mesh);
- if(res != RES_OK) {
- fprintf(stderr, "Could not create the cylinder 3D data.\n");
+ ASSERT(cylinder->nstacks > 0 && cylinder->nstacks < UINT_MAX);
+ analytic.data.cylinder.nslices = (unsigned)cylinder->nslices;
+ analytic.data.cylinder.nstacks = (unsigned)cylinder->nstacks;
+
+ res = ssol_shape_create_analytic_surface(solstice->ssol, &ssol_shape);
+ if (res != RES_OK) {
+ fprintf(stderr, "Could not create a Solstice Solver analytic surface.\n");
goto error;
}
- res = create_ssol_shape_mesh(solstice, transform, mesh, &ssol_shape);
- if(res != RES_OK) goto error;
+ res = ssol_analytic_surface_setup(ssol_shape, &analytic);
+ if(res != RES_OK) {
+ fprintf(stderr, "Could not setup the Solstice Solver analytic surface.\n");
+ goto error;
+ }
exit:
- if(mesh) S3DUT(mesh_ref_put(mesh));
*out_ssol_shape = ssol_shape;
return res;
error:
@@ -432,7 +443,6 @@ create_parabolic_cylinder
return create_ssol_shape_punched_surface
(solstice, ¶boloid->polyclips, &quadric, out_ssol_shape);
-
}
static res_T
diff --git a/src/solstice_solve.c b/src/solstice_solve.c
@@ -33,14 +33,6 @@ write_mc_global(struct solstice* solstice, struct ssol_estimator* estimator)
double area, potential, irradiance_factor;
ASSERT(solstice && estimator);
- #define MC_RCV_NONE { \
- { -1, -1, -1 }, /* Integrated irradiance */ \
- { -1, -1, -1 }, /* Absorptivity loss */ \
- { -1, -1, -1 }, /* Reflectivity loss */ \
- { -1, -1, -1 }, /* Cos loss */ \
- 0, NULL, NULL \
- }
-
/* get global information */
SSOL(estimator_get_mc_global(estimator, &mc_global));
SSOL(estimator_get_realisation_count(estimator, &nexperiments));
@@ -82,8 +74,8 @@ write_mc_global(struct solstice* solstice, struct ssol_estimator* estimator)
const struct str* name = htable_receiver_iterator_key_get(&r_it);
struct solstice_receiver* rcv = htable_receiver_iterator_data_get(&r_it);
struct ssol_instance* inst = rcv->node->instance;
- struct ssol_mc_receiver front = MC_RCV_NONE;
- struct ssol_mc_receiver back = MC_RCV_NONE;
+ struct ssol_mc_receiver front = MC_RCV_NONE__;
+ struct ssol_mc_receiver back = MC_RCV_NONE__;
double f_eff_E = -1, f_eff_SE = -1; /* Front efficiency */
double b_eff_E = -1, b_eff_SE = -1; /* Back efficiency */
uint32_t id;
@@ -165,8 +157,8 @@ write_mc_global(struct solstice* solstice, struct ssol_estimator* estimator)
while (!htable_primary_iterator_eq(&p_it, &p_end)) {
struct solstice_primary* prim = htable_primary_iterator_data_get(&p_it);
struct ssol_instance* prim_inst = prim->node->instance;
- struct ssol_mc_receiver front = MC_RCV_NONE;
- struct ssol_mc_receiver back = MC_RCV_NONE;
+ struct ssol_mc_receiver front = MC_RCV_NONE__;
+ struct ssol_mc_receiver back = MC_RCV_NONE__;
SSOL(instance_get_id(prim_inst, &prim_id));
switch (rcv->side) {