solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit f62cee3a23d0af90aa709c448296ec8384411824
parent 3f114e5f32f0e96887f34aadd6a4f53215dd78cc
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 26 Sep 2017 12:32:11 +0200

Merge remote-tracking branch 'origin/feature_pillbox_fix' into develop

Diffstat:
Msrc/ssol.h | 4++--
Msrc/ssol_ranst_sun_dir.c | 25++++++++++++++++---------
Msrc/ssol_ranst_sun_dir.h | 2+-
Msrc/ssol_sun.c | 10+++++-----
Msrc/ssol_sun_c.h | 2+-
Msrc/test_ssol_solver10.c | 2+-
Msrc/test_ssol_sun.c | 26+++++++++++++-------------
7 files changed, 39 insertions(+), 32 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -1040,9 +1040,9 @@ ssol_sun_set_spectrum struct ssol_spectrum* spectrum); SSOL_API res_T -ssol_sun_set_pillbox_aperture +ssol_sun_pillbox_set_theta_max (struct ssol_sun* sun, - const double angle); /* In radian */ + const double theta_max); /* In radian */ SSOL_API res_T ssol_sun_set_buie_param diff --git a/src/ssol_ranst_sun_dir.c b/src/ssol_ranst_sun_dir.c @@ -40,7 +40,7 @@ struct ran_buie_state { }; struct ran_pillbox_state { - double radius; + double sin2_theta_max; double basis[9]; }; @@ -243,10 +243,17 @@ ran_pillbox_get double dir[3]) { double pt[3]; + double phi, sin2_theta, sin_theta, cos_theta; - ASSERT(ran && ran->state.pillbox.radius > 0); - ssp_ran_uniform_disk(rng, ran->state.pillbox.radius, pt); - pt[2] = 1; + ASSERT(ran && 0 <= ran->state.pillbox.sin2_theta_max >= 0 + && ran->state.pillbox.sin2_theta_max <= 1); + sin2_theta = ssp_rng_uniform_double(rng, 0, ran->state.pillbox.sin2_theta_max); + sin_theta = sqrt(sin2_theta); + cos_theta = sqrt(1 - sin2_theta); + phi = ssp_rng_uniform_double(rng, 0, 2 * PI); + pt[0] = cos(phi) * sin_theta; + pt[1] = sin(phi) * sin_theta; + pt[2] = cos_theta; d33_muld3(dir, ran->state.pillbox.basis, pt); d3_normalize(dir, dir); return dir; @@ -337,15 +344,15 @@ ranst_sun_dir_buie_setup res_T ranst_sun_dir_pillbox_setup (struct ranst_sun_dir* ran, - const double aperture, + const double theta_max, const double dir[3]) { - double radius; - if (!ran || !dir || aperture <= 0 || aperture >= PI ) + double s; + if (!ran || !dir || theta_max <= 0 || theta_max > PI ) return RES_BAD_ARG; - radius = tan(0.5 * aperture); ran->get = ran_pillbox_get; - ran->state.pillbox.radius = radius; + s = sin(theta_max); + ran->state.pillbox.sin2_theta_max = s * s; d33_basis(ran->state.pillbox.basis, dir); return RES_OK; } diff --git a/src/ssol_ranst_sun_dir.h b/src/ssol_ranst_sun_dir.h @@ -51,7 +51,7 @@ ranst_sun_dir_buie_setup extern LOCAL_SYM res_T ranst_sun_dir_pillbox_setup (struct ranst_sun_dir* ran, - const double aperture, /* Apparent size in radians */ + const double theta_max, /* In radians */ const double dir[3]); extern LOCAL_SYM res_T diff --git a/src/ssol_sun.c b/src/ssol_sun.c @@ -170,14 +170,14 @@ ssol_sun_set_spectrum(struct ssol_sun* sun, struct ssol_spectrum* spectrum) } res_T -ssol_sun_set_pillbox_aperture(struct ssol_sun* sun, const double angle) +ssol_sun_pillbox_set_theta_max(struct ssol_sun* sun, const double theta_max) { if(!sun - || angle <= 0 - || angle > PI * 0.5 + || theta_max <= 0 + || theta_max > PI || sun->type != SUN_PILLBOX) return RES_BAD_ARG; - sun->data.pillbox.aperture = angle; + sun->data.pillbox.theta_max = theta_max; return RES_OK; } @@ -214,7 +214,7 @@ sun_create_direction_distribution break; case SUN_PILLBOX: res = ranst_sun_dir_pillbox_setup - (ran_dir, sun->data.pillbox.aperture, sun->direction); + (ran_dir, sun->data.pillbox.theta_max, sun->direction); break; case SUN_BUIE: res = ranst_sun_dir_buie_setup diff --git a/src/ssol_sun_c.h b/src/ssol_sun_c.h @@ -31,7 +31,7 @@ enum sun_type { }; struct pillbox { - double aperture; + double theta_max; }; struct buie { diff --git a/src/test_ssol_solver10.c b/src/test_ssol_solver10.c @@ -95,7 +95,7 @@ main(int argc, char** argv) CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK); CHECK(ssol_sun_create_pillbox(dev, &sun), RES_OK); - CHECK(ssol_sun_set_pillbox_aperture(sun, 1), RES_OK); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 1), RES_OK); CHECK(ssol_sun_set_direction(sun, d3(dir, 0, 0, -1)), RES_OK); CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); CHECK(ssol_sun_set_dni(sun, DNI), RES_OK); diff --git a/src/test_ssol_sun.c b/src/test_ssol_sun.c @@ -76,10 +76,10 @@ main(int argc, char** argv) CHECK(ssol_sun_get_dni(sun, &dni), RES_OK); CHECK(dni, 1000); - CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 999), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(NULL, 0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, -0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 999), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, -0.1), RES_BAD_ARG); @@ -125,11 +125,11 @@ main(int argc, char** argv) CHECK(ssol_sun_get_dni(sun, &dni), RES_OK); CHECK(dni, 1000); - CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 999), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_OK); - CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_OK); + CHECK(ssol_sun_pillbox_set_theta_max(NULL, 0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, -0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 999), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 0.1), RES_OK); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 0.1), RES_OK); CHECK(ssol_sun_set_buie_param(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, -0.1), RES_BAD_ARG); @@ -174,10 +174,10 @@ main(int argc, char** argv) CHECK(ssol_sun_get_dni(sun, &dni), RES_OK); CHECK(dni, 1000); - CHECK(ssol_sun_set_pillbox_aperture(NULL, 0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, -0.1), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 999), RES_BAD_ARG); - CHECK(ssol_sun_set_pillbox_aperture(sun, 0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(NULL, 0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, -0.1), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 999), RES_BAD_ARG); + CHECK(ssol_sun_pillbox_set_theta_max(sun, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(NULL, 0.1), RES_BAD_ARG); CHECK(ssol_sun_set_buie_param(sun, -0.1), RES_BAD_ARG);