solstice-pp

Post-processing utilities for the solstice app
git clone git://git.meso-star.com/solstice-pp.git
Log | Files | Refs | README | LICENSE

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:
Msrc/Makefile | 2+-
Msrc/solpp.h | 36++++++++++++++++++++++++++++++++++++
Msrc/solvtk.c | 252+++++++++++++++++++++++++++++++++++++++----------------------------------------
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; }