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 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:
Mdoc/input | 1+
Msrc/parser/solparser_geometry.c | 7++++++-
Msrc/parser/solparser_shape.h | 1+
Msrc/parser/yaml/test_ko_0.yaml | 16++++++++++++++++
Msrc/solstice_object.c | 30++++++++++++++++++++----------
Msrc/solstice_solve.c | 16++++------------
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, &paraboloid->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) {