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:
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);