commit 554134654ba0c98402492fe1bad6144024d1010e
parent 83af9caaea454c554f23d165bfe578950364ec84
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 26 Jul 2017 16:43:27 +0200
Handle multiple sun directions in solvtk
Diffstat:
3 files changed, 160 insertions(+), 130 deletions(-)
diff --git a/src/Makefile b/src/Makefile
@@ -16,7 +16,7 @@
STAR_ENGINE=/home/moi/code/star-engine-solstice/local
NEXPERIMENTS=1000000
NPATHS=1000
-SUN_DIRS=290,30
+SUN_DIRS=270,45:290,30:160,60
RCV_FILE=themis-rcv.yaml
CFLAGS = -O2 -std=c99 -pedantic -Wall
diff --git a/src/solpp.h b/src/solpp.h
@@ -29,6 +29,7 @@ struct mc {
double E; /* Expected value */
double SE; /* Standard Error */
};
+static struct mc MC_ZERO = {0,0};
#define DARRAY_NAME mc
#define DARRAY_DATA struct mc
@@ -229,6 +230,7 @@ simul_init(struct mem_allocator* allocator, struct simul* simul)
darray_rcvXprim_init(allocator, &simul->rcvXprims);
simul->azimuth = -1;
simul->elevation = -1;
+ simul->nsamps = 0;
}
static INLINE void
@@ -242,25 +244,59 @@ simul_release(struct simul* simul)
static INLINE res_T
simul_copy(struct simul* dst, const struct simul* src)
{
+ dst->potential_irradiance = src->potential_irradiance;
+ dst->absorbed_irradiance = src->absorbed_irradiance;
+ dst->cos_factor = src->cos_factor;
+ dst->shadow_loss = src->shadow_loss;
+ dst->missing_loss = src->missing_loss;
+ dst->reflectivity_loss = src->reflectivity_loss;
+ dst->absorptivity_loss = src->absorptivity_loss;
CHECK(darray_rcv_copy(&dst->rcvs, &src->rcvs), RES_OK);
CHECK(darray_prim_copy(&dst->prims, &src->prims), RES_OK);
CHECK(darray_rcvXprim_copy(&dst->rcvXprims, &src->rcvXprims), RES_OK);
dst->azimuth = src->azimuth;
dst->elevation = src->elevation;
+ dst->nsamps = src->nsamps;
return RES_OK;
}
static INLINE res_T
simul_copy_and_release(struct simul* dst, struct simul* src)
{
+ dst->potential_irradiance = src->potential_irradiance;
+ dst->absorbed_irradiance = src->absorbed_irradiance;
+ dst->cos_factor = src->cos_factor;
+ dst->shadow_loss = src->shadow_loss;
+ dst->missing_loss = src->missing_loss;
+ dst->reflectivity_loss = src->reflectivity_loss;
+ dst->absorptivity_loss = src->absorptivity_loss;
CHECK(darray_rcv_copy_and_release(&dst->rcvs, &src->rcvs), RES_OK);
CHECK(darray_prim_copy_and_release(&dst->prims, &src->prims), RES_OK);
CHECK(darray_rcvXprim_copy_and_release(&dst->rcvXprims, &src->rcvXprims), RES_OK);
dst->azimuth = src->azimuth;
dst->elevation = src->elevation;
+ dst->nsamps = src->nsamps;
return RES_OK;
}
+static INLINE void
+simul_clear(struct simul* simul)
+{
+ simul->potential_irradiance = MC_ZERO;
+ simul->absorbed_irradiance = MC_ZERO;
+ simul->cos_factor = MC_ZERO;
+ simul->shadow_loss = MC_ZERO;
+ simul->missing_loss = MC_ZERO;
+ simul->reflectivity_loss = MC_ZERO;
+ simul->absorptivity_loss = MC_ZERO;
+ darray_rcv_clear(&simul->rcvs);
+ darray_prim_clear(&simul->prims);
+ darray_rcvXprim_clear(&simul->rcvXprims);
+ simul->azimuth = -1;
+ simul->elevation = -1;
+ simul->nsamps = 0;
+}
+
#define DARRAY_NAME simul
#define DARRAY_DATA struct simul
#define DARRAY_FUNCTOR_INIT simul_init
diff --git a/src/solvtk.c b/src/solvtk.c
@@ -25,7 +25,6 @@ struct mesh {
size_t* entities;
size_t* ncells;
size_t voffset;
- size_t off;
};
static const struct mesh MESH_NULL = {NULL, NULL, NULL, NULL, 0};
@@ -36,7 +35,7 @@ mesh_release(struct mesh* msh)
sa_release(msh->ids);
sa_release(msh->entities);
sa_release(msh->ncells);
- msh->voffset = 0;
+ memset(msh, 0, sizeof(struct mesh));
}
static void
@@ -197,156 +196,151 @@ mesh_write_rcv_data_vtk
int
main(int argc, char** argv)
{
+ char* buf = NULL;
+ char* line = NULL;
+ char* str = NULL;
+
struct simul simul;
struct str name;
FILE* input;
+ FILE* geom;
FILE* output;
- struct mesh msh_rcv = MESH_NULL;
- struct mesh msh_prim = MESH_NULL;
- struct mesh msh_misc = MESH_NULL;
-
- const struct rcv* rcv = NULL;
- const struct prim* prim = NULL;
-
- char filename[128];
- char prefix[64];
- char* line = NULL;
- char* buf = NULL;
- char* str = NULL;
- size_t ntris_grp = 0, nverts_grp = 0;
- size_t nverts_obj = 0, off_obj = 0, off_grp = 0;
- float azim, elev;
- int err = 0;
-
simul_init(NULL, &simul);
str_init(NULL, &name);
if(argc < 3) {
fprintf(stderr, "Usage: %s solstice-geometry solstice-simulation\n", argv[0]);
- goto error;
+ return 1;
}
+ NCHECK(geom = fopen(argv[1], "r"), NULL);
NCHECK(input = fopen(argv[2], "r"), NULL);
- NCHECK(line = read_line(&buf, input), NULL);
- CHECK(strncmp(line, "#--- Sun direction:", 19), 0);
- CHECK(sscanf(line+19, "%lf %lf (%*f %*f %*f)", &simul.azimuth, &simul.elevation), 2);
- CHECK(snprintf(prefix, sizeof(prefix), "%g-%g-",
- simul.azimuth, simul.elevation) < sizeof(prefix), 1);
- read_simulation(&simul, input);
- fclose(input);
- NCHECK(input = fopen(argv[1], "r"), NULL);
- while((line = read_line(&buf, input))) {
- if(!strcmp(line, "#--- No Sun direction")) {
- FATAL("Unexpected geometry file with no sun direction\n");
- } else if(!strncmp(line, "#--- Sun direction:", 19)) {
- CHECK(sscanf(line+19, "%f %f (%*f %*f %*f)", &azim, &elev), 2);
- if(azim != simul.azimuth || elev != simul.elevation) {
- FATAL("The geometry is not consistent with the the simulation.\n");
- }
+ NCHECK(read_line(&buf, geom), NULL); /* Skip the sun direction of the geometry */
- } else if(!strncmp(line, "g ", 2)) {
- CHECK(str_set(&name, line+2), RES_OK);
- if(prim) {
- sa_push(msh_prim.ncells, ntris_grp);
- msh_prim.voffset += nverts_grp;
- msh_prim.off = 0;
- }
- if(rcv) {
- sa_push(msh_rcv.ncells, ntris_grp);
- msh_rcv.voffset += nverts_grp;
- }
- if(!prim && !rcv) msh_misc.voffset += nverts_grp;
- prim = find_primary(&simul, line+2);
- rcv = find_receiver(&simul, line+2);
- if(prim) sa_push(msh_prim.entities, prim->id);
- if(rcv) sa_push(msh_rcv.entities, rcv->id);
- ntris_grp = 0;
- nverts_grp = 0;
- off_grp = 0;
- off_obj = nverts_obj;
-
- } else if(!strncmp(line, "v ", 2)) {
- double pos[3];
- CHECK(sscanf(line+2, "%lf %lf %lf", pos+0, pos+1, pos+2), 3);
- if(prim) {
- sa_push(msh_prim.coords, pos[0]);
- sa_push(msh_prim.coords, pos[1]);
- sa_push(msh_prim.coords, pos[2]);
- }
- if(rcv) {
- sa_push(msh_rcv.coords, pos[0]);
- sa_push(msh_rcv.coords, pos[1]);
- sa_push(msh_rcv.coords, pos[2]);
- }
- if(!prim && !rcv) {
- sa_push(msh_misc.coords, pos[0]);
- sa_push(msh_misc.coords, pos[1]);
- sa_push(msh_misc.coords, pos[2]);
- }
- ++nverts_grp;
- ++nverts_obj;
- } else if(!strncmp(line, "f ", 2)) {
- size_t tri[3];
- CHECK(sscanf(line+2, "%zu %zu %zu", tri+0, tri+1, tri+2), 3);
- if(prim) {
- sa_push(msh_prim.ids, tri[0]-1 + msh_prim.voffset + off_grp - off_obj);
- sa_push(msh_prim.ids, tri[1]-1 + msh_prim.voffset + off_grp - off_obj);
- sa_push(msh_prim.ids, tri[2]-1 + msh_prim.voffset + off_grp - off_obj);
- }
- if(rcv) {
- sa_push(msh_rcv.ids, tri[0]-1 + msh_rcv.voffset + off_grp - off_obj);
- sa_push(msh_rcv.ids, tri[1]-1 + msh_rcv.voffset + off_grp - off_obj);
- sa_push(msh_rcv.ids, tri[2]-1 + msh_rcv.voffset + off_grp - off_obj);
- }
- if(!prim && !rcv) {
- sa_push(msh_misc.ids, tri[0]-1 + msh_misc.voffset + off_grp - off_obj);
- sa_push(msh_misc.ids, tri[1]-1 + msh_misc.voffset + off_grp - off_obj);
- sa_push(msh_misc.ids, tri[2]-1 + msh_misc.voffset + off_grp - off_obj);
+ while((line = read_line(&buf, input))) {
+ const struct rcv* rcv = NULL;
+ const struct prim* prim = NULL;
+
+ struct mesh msh_rcv = MESH_NULL;
+ struct mesh msh_prim = MESH_NULL;
+ struct mesh msh_misc = MESH_NULL;
+
+ char filename[128];
+ char prefix[64];
+ size_t ntris_grp = 0, nverts_grp = 0;
+ size_t nverts_obj = 0, off_obj = 0, off_grp = 0;
+
+ simul_clear(&simul);
+
+ CHECK(strncmp(line, "#--- Sun direction:", 19), 0);
+ CHECK(sscanf(line+19, "%lf %lf (%*f %*f %*f)", &simul.azimuth, &simul.elevation), 2);
+ CHECK(snprintf(prefix, sizeof(prefix), "%g-%g-",
+ simul.azimuth, simul.elevation) < sizeof(prefix), 1);
+ read_simulation(&simul, input);
+
+ while((line = read_line(&buf, geom)) && strncmp(line, "#--- Sun", 8)) {
+ if(!strncmp(line, "g ", 2)) {
+ CHECK(str_set(&name, line+2), RES_OK);
+ if(prim) {
+ sa_push(msh_prim.ncells, ntris_grp);
+ msh_prim.voffset += nverts_grp;
+ }
+ if(rcv) {
+ sa_push(msh_rcv.ncells, ntris_grp);
+ msh_rcv.voffset += nverts_grp;
+ }
+ if(!prim && !rcv) msh_misc.voffset += nverts_grp;
+ prim = find_primary(&simul, line+2);
+ rcv = find_receiver(&simul, line+2);
+ if(prim) sa_push(msh_prim.entities, prim->id);
+ if(rcv) sa_push(msh_rcv.entities, rcv->id);
+ ntris_grp = 0;
+ nverts_grp = 0;
+ off_grp = 0;
+ off_obj = nverts_obj;
+
+ } else if(!strncmp(line, "v ", 2)) {
+ double pos[3];
+ CHECK(sscanf(line+2, "%lf %lf %lf", pos+0, pos+1, pos+2), 3);
+ if(prim) {
+ sa_push(msh_prim.coords, pos[0]);
+ sa_push(msh_prim.coords, pos[1]);
+ sa_push(msh_prim.coords, pos[2]);
+ }
+ if(rcv) {
+ sa_push(msh_rcv.coords, pos[0]);
+ sa_push(msh_rcv.coords, pos[1]);
+ sa_push(msh_rcv.coords, pos[2]);
+ }
+ if(!prim && !rcv) {
+ sa_push(msh_misc.coords, pos[0]);
+ sa_push(msh_misc.coords, pos[1]);
+ sa_push(msh_misc.coords, pos[2]);
+ }
+ ++nverts_grp;
+ ++nverts_obj;
+ } else if(!strncmp(line, "f ", 2)) {
+ size_t tri[3];
+ CHECK(sscanf(line+2, "%zu %zu %zu", tri+0, tri+1, tri+2), 3);
+ if(prim) {
+ sa_push(msh_prim.ids, tri[0]-1 + msh_prim.voffset + off_grp - off_obj);
+ sa_push(msh_prim.ids, tri[1]-1 + msh_prim.voffset + off_grp - off_obj);
+ sa_push(msh_prim.ids, tri[2]-1 + msh_prim.voffset + off_grp - off_obj);
+ }
+ if(rcv) {
+ sa_push(msh_rcv.ids, tri[0]-1 + msh_rcv.voffset + off_grp - off_obj);
+ sa_push(msh_rcv.ids, tri[1]-1 + msh_rcv.voffset + off_grp - off_obj);
+ sa_push(msh_rcv.ids, tri[2]-1 + msh_rcv.voffset + off_grp - off_obj);
+ }
+ if(!prim && !rcv) {
+ sa_push(msh_misc.ids, tri[0]-1 + msh_misc.voffset + off_grp - off_obj);
+ sa_push(msh_misc.ids, tri[1]-1 + msh_misc.voffset + off_grp - off_obj);
+ sa_push(msh_misc.ids, tri[2]-1 + msh_misc.voffset + off_grp - off_obj);
+ }
+ ++ntris_grp;
+ } else if(!strcmp(line, "---")) {
+ nverts_obj = 0;
+ off_obj = 0;
+ off_grp = nverts_grp;
}
- ++ntris_grp;
- } else if(!strcmp(line, "---")) {
- nverts_obj = 0;
- off_obj = 0;
- off_grp = nverts_grp;
}
+ if(prim) sa_push(msh_prim.ncells, ntris_grp);
+ if(rcv) sa_push(msh_rcv.ncells, ntris_grp);
+
+ CHECK(snprintf(filename, sizeof(filename),
+ "%sprimaries.vtk", prefix) < sizeof(prefix), 1);
+ NCHECK(output = fopen(filename, "w"), NULL);
+ mesh_write_vtk(output, &msh_prim);
+ mesh_write_prim_data_vtk(output, &msh_prim, &simul);
+ fclose(output);
+
+ CHECK(snprintf(filename, sizeof(filename),
+ "%sreceivers.vtk", prefix) < sizeof(prefix), 1);
+ NCHECK(output = fopen(filename, "w"), NULL);
+ mesh_write_vtk(output, &msh_rcv);
+ mesh_write_rcv_data_vtk(output, &msh_rcv, &simul);
+ fclose(output);
+
+ CHECK(snprintf(filename, sizeof(filename),
+ "%smiscellaneous.obj", prefix) < sizeof(prefix), 1);
+ NCHECK(output = fopen(filename, "w"), NULL);
+ mesh_write_obj(output, &msh_misc);
+ fclose(output);
+
+ mesh_release(&msh_prim);
+ mesh_release(&msh_rcv);
+ mesh_release(&msh_misc);
}
- if(prim) sa_push(msh_prim.ncells, ntris_grp);
- if(rcv) sa_push(msh_rcv.ncells, ntris_grp);
- fclose(input);
- CHECK(snprintf(filename, sizeof(filename),
- "%sprimaries.vtk", prefix) < sizeof(prefix), 1);
- NCHECK(output = fopen(filename, "w"), NULL);
- mesh_write_vtk(output, &msh_prim);
- mesh_write_prim_data_vtk(output, &msh_prim, &simul);
- fclose(output);
-
- CHECK(snprintf(filename, sizeof(filename),
- "%sreceivers.vtk", prefix) < sizeof(prefix), 1);
- NCHECK(output = fopen(filename, "w"), NULL);
- mesh_write_vtk(output, &msh_rcv);
- mesh_write_rcv_data_vtk(output, &msh_rcv, &simul);
- fclose(output);
-
- CHECK(snprintf(filename, sizeof(filename),
- "%smiscellaneous.obj", prefix) < sizeof(prefix), 1);
- NCHECK(output = fopen(filename, "w"), NULL);
- mesh_write_obj(output, &msh_misc);
- fclose(output);
-
-exit:
- mesh_release(&msh_prim);
- mesh_release(&msh_rcv);
- mesh_release(&msh_misc);
+ fclose(geom);
+ fclose(input);
sa_release(buf);
sa_release(str);
simul_release(&simul);
str_release(&name);
- return err;
-error:
- goto exit;
+ return 0;
}