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 288740d34ef6ae423beca6fdde8bc060e242eca8
parent de5e84bde83cd7f27183410d8ddc75a0a2e62850
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 22 Mar 2017 18:00:56 +0100

Handle dielectric material

Diffstat:
Msrc/solstice_material.c | 113++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 106 insertions(+), 7 deletions(-)

diff --git a/src/solstice_material.c b/src/solstice_material.c @@ -18,15 +18,20 @@ #include <solstice/ssol.h> -struct mirror_param { - double reflectivity; - double roughness; +struct dielectric_param { + double eta_i; + double eta_t; }; struct matte_param { double reflectivity; }; +struct mirror_param { + double reflectivity; + double roughness; +}; + struct thin_dielectric_param { double absorption; double thickness; @@ -55,6 +60,40 @@ mtl_get_normal } static void +dielectric_get_eta_i + (struct ssol_device* dev, + struct ssol_param_buffer* buf, + const double wavelength, + const double P[3], + const double Ng[3], + const double Ns[3], + const double uv[2], + const double w[3], + double* val) +{ + const struct dielectric_param* param = ssol_param_buffer_get(buf); + (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void)w; + *val = param->eta_i; +} + +static void +dielectric_get_eta_t + (struct ssol_device* dev, + struct ssol_param_buffer* buf, + const double wavelength, + const double P[3], + const double Ng[3], + const double Ns[3], + const double uv[2], + const double w[3], + double* val) +{ + const struct dielectric_param* param = ssol_param_buffer_get(buf); + (void)dev, (void)wavelength, (void)P, (void)Ng, (void)Ns, (void)uv, (void)w; + *val = param->eta_t; +} + +static void matte_get_reflectivity (struct ssol_device* dev, struct ssol_param_buffer* buf, @@ -156,6 +195,58 @@ thin_dielectric_get_refractive_index *val = param->refractive_index; } +static res_T +create_material_dielectric + (struct solstice* solstice, + const struct solparser_material_dielectric* dielectric, + struct ssol_material** out_mtl) +{ + struct ssol_dielectric_shader shader = SSOL_DIELECTRIC_SHADER_NULL; + struct ssol_material* mtl = NULL; + struct ssol_param_buffer* pbuf = NULL; + struct dielectric_param* param; + res_T res = RES_OK; + ASSERT(solstice && dielectric && out_mtl); + + res = ssol_material_create_dielectric(solstice->ssol, &mtl); + if(res != RES_OK) { + fprintf(stderr, + "Could not allocate the Solstice Solver dielectric material.\n"); + goto error; + } + + res = ssol_param_buffer_create + (solstice->ssol, sizeof(struct dielectric_param), &pbuf); + if(res != RES_OK) { + fprintf(stderr, "Could not create the Solstice Solver parameter buffer.\n"); + goto error; + } + + param = ssol_param_buffer_allocate(pbuf, sizeof(struct dielectric_param), + ALIGNOF(struct dielectric_param)); + if(!param) { + fprintf(stderr, "Could not allocate the dielectric parameters.\n"); + res = RES_MEM_ERR; + goto error; + } + + param->eta_i = dielectric->eta_i; + param->eta_t = dielectric->eta_t; + + shader.normal = mtl_get_normal; + shader.eta_i = dielectric_get_eta_i; + shader.eta_t = dielectric_get_eta_t; + SSOL(dielectric_set_shader(mtl, &shader)); + SSOL(material_set_param_buffer(mtl, pbuf)); + +exit: + if(pbuf) SSOL(param_buffer_ref_put(pbuf)); + *out_mtl = mtl; + return res; +error: + if(mtl) SSOL(material_ref_put(mtl)), mtl = NULL; + goto exit; +} static res_T create_material_matte @@ -339,19 +430,27 @@ solstice_create_ssol_material if(pssol_mtl) { ssol_mtl = *pssol_mtl; } else { + const struct solparser_material_dielectric* dielectric; const struct solparser_material_matte* matte; const struct solparser_material_mirror* mirror; const struct solparser_material_thin_dielectric* thin_dielectric; switch(mtl->type) { - case SOLPARSER_MATERIAL_MIRROR: - mirror = solparser_get_material_mirror(solstice->parser, mtl->data.mirror); - res = create_material_mirror(solstice, mirror, &ssol_mtl); + case SOLPARSER_MATERIAL_DIELECTRIC: + dielectric = solparser_get_material_dielectric + (solstice->parser, mtl->data.dielectric); + res = create_material_dielectric(solstice, dielectric, &ssol_mtl); break; case SOLPARSER_MATERIAL_MATTE: - matte = solparser_get_material_matte(solstice->parser, mtl->data.matte); + matte = solparser_get_material_matte + (solstice->parser, mtl->data.matte); res = create_material_matte(solstice, matte, &ssol_mtl); break; + case SOLPARSER_MATERIAL_MIRROR: + mirror = solparser_get_material_mirror + (solstice->parser, mtl->data.mirror); + res = create_material_mirror(solstice, mirror, &ssol_mtl); + break; case SOLPARSER_MATERIAL_THIN_DIELECTRIC: thin_dielectric = solparser_get_material_thin_dielectric (solstice->parser, mtl->data.thin_dielectric);