aboutsummaryrefslogtreecommitdiff
path: root/src/optics.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/optics.c')
-rw-r--r--src/optics.c134
1 files changed, 116 insertions, 18 deletions
diff --git a/src/optics.c b/src/optics.c
index 7782678..73f884e 100644
--- a/src/optics.c
+++ b/src/optics.c
@@ -33,23 +33,74 @@ char optics_err[256];
static double avg_index_h2o = 0.0, avg_index_d2o = 0.0;
/* Absorption coefficients for H2O, D2O, and acrylic as a function of
- * wavelength from SNOMAN.
- *
- * Note: These numbers come from mcprod/media_qoca_d2o_20060110.cmd. */
-static double absorption_coefficient_d2o_wavelengths[6] = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0};
-static double absorption_coefficient_d2o[6] = {6.057e-05, 2.680e-05, 3.333e-05, 3.006e-05, 2.773e-05, 2.736e-05};
-static double rayleigh_scl_fac_d2o = 1.000;
-static double isothermal_comp_d2o = 4.92e-10;
-
-static double absorption_coefficient_h2o_wavelengths[6] = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0};
-static double absorption_coefficient_h2o[6] = {8.410e-05, 2.880e-06, 1.431e-04, 1.034e-04, 5.239e-04, 2.482e-03};
-static double rayleigh_scl_fac_acrylic = 0.950;
-static double isothermal_comp_acrylic = 3.55e-10;
-
-static double absorption_coefficient_acrylic_wavelengths[6] = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0};
-static double absorption_coefficient_acrylic[6] = {5.610e-02, 2.279e-02, 1.204e-02, 7.587e-03, 7.036e-03, 7.068e-03};
-static double rayleigh_scl_fac_h2o = 0.870;
-static double isothermal_comp_h2o = 4.78e-10;
+ * wavelength from SNOMAN. */
+static double absorption_coefficient_d2o_wavelengths[6];
+static double absorption_coefficient_d2o[6];
+static double rayleigh_scl_fac_d2o;
+static double isothermal_comp_d2o;
+
+static double absorption_coefficient_h2o_wavelengths[6];
+static double absorption_coefficient_h2o[6];
+static double rayleigh_scl_fac_acrylic;
+static double isothermal_comp_acrylic;
+
+static double absorption_coefficient_acrylic_wavelengths[6];
+static double absorption_coefficient_acrylic[6];
+static double rayleigh_scl_fac_h2o;
+static double isothermal_comp_h2o;
+
+typedef struct optics_constants {
+ double absorption_coefficient_d2o_wavelengths[6];
+ double absorption_coefficient_d2o[6];
+ double rayleigh_scl_fac_d2o;
+ double isothermal_comp_d2o;
+
+ double absorption_coefficient_h2o_wavelengths[6];
+ double absorption_coefficient_h2o[6];
+ double rayleigh_scl_fac_acrylic;
+ double isothermal_comp_acrylic;
+
+ double absorption_coefficient_acrylic_wavelengths[6];
+ double absorption_coefficient_acrylic[6];
+ double rayleigh_scl_fac_h2o;
+ double isothermal_comp_h2o;
+} optics_constants;
+
+/* Note: These numbers come from mcprod/media_qoca_d2o_20060110.cmd. */
+optics_constants d2o_constants = {
+ .absorption_coefficient_d2o_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_d2o = {6.057e-05, 2.680e-05, 3.333e-05, 3.006e-05, 2.773e-05, 2.736e-05},
+ .rayleigh_scl_fac_d2o = 1.000,
+ .isothermal_comp_d2o = 4.92e-10,
+
+ .absorption_coefficient_h2o_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_h2o = {8.410e-05, 2.880e-06, 1.431e-04, 1.034e-04, 5.239e-04, 2.482e-03},
+ .rayleigh_scl_fac_acrylic = 0.950,
+ .isothermal_comp_acrylic = 3.55e-10,
+
+ .absorption_coefficient_acrylic_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_acrylic = {5.610e-02, 2.279e-02, 1.204e-02, 7.587e-03, 7.036e-03, 7.068e-03},
+ .rayleigh_scl_fac_h2o = 0.870,
+ .isothermal_comp_h2o = 4.78e-10,
+};
+
+/* Note: These numbers come from mcprod/media_qoca_salt_20060420.cmd. */
+optics_constants salt_constants = {
+ .absorption_coefficient_d2o_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_d2o = {1.024e-04, 8.922e-05, 8.763e-05, 9.653e-05, 1.207e-05, 1.177e-05},
+ .rayleigh_scl_fac_d2o = 1.289,
+ .isothermal_comp_d2o = 4.92e-10,
+
+ .absorption_coefficient_h2o_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_h2o = {1.068e-06, 1.022e-05, 4.123e-05, 2.193e-04, 4.344e-04, 2.498e-03},
+ .rayleigh_scl_fac_h2o = 0.870,
+ .isothermal_comp_h2o = 4.78e-10,
+
+ .absorption_coefficient_acrylic_wavelengths = {337.0, 365.0, 386.0, 420.0, 500.0, 620.0},
+ .absorption_coefficient_acrylic = {5.610e-02, 2.279e-02, 1.204e-02, 7.587e-03, 7.036e-03, 7.068e-03},
+ .rayleigh_scl_fac_acrylic = 0.950,
+ .isothermal_comp_acrylic = 3.55e-10,
+};
static int initialized = 0;
@@ -513,7 +564,7 @@ static double gsl_cerenkov(double wavelength, void *params)
return qe/pow(wavelength,2);
}
-int optics_init(void)
+int optics_init(int run)
{
int i;
double norm;
@@ -523,6 +574,53 @@ int optics_init(void)
gsl_integration_cquad_workspace *w;
gsl_function F;
+ if (run < 19999) {
+ for (i = 0; i < LEN(absorption_coefficient_d2o_wavelengths); i++) {
+ absorption_coefficient_d2o_wavelengths[i] = d2o_constants.absorption_coefficient_d2o_wavelengths[i];
+ absorption_coefficient_d2o[i] = d2o_constants.absorption_coefficient_d2o[i];
+ }
+ rayleigh_scl_fac_d2o = d2o_constants.rayleigh_scl_fac_d2o;
+ isothermal_comp_d2o = d2o_constants.isothermal_comp_d2o;
+
+ for (i = 0; i < LEN(absorption_coefficient_h2o_wavelengths); i++) {
+ absorption_coefficient_h2o_wavelengths[i] = d2o_constants.absorption_coefficient_h2o_wavelengths[i];
+ absorption_coefficient_h2o[i] = d2o_constants.absorption_coefficient_h2o[i];
+ }
+ rayleigh_scl_fac_h2o = d2o_constants.rayleigh_scl_fac_h2o;
+ isothermal_comp_h2o = d2o_constants.isothermal_comp_h2o;
+
+ for (i = 0; i < LEN(absorption_coefficient_acrylic_wavelengths); i++) {
+ absorption_coefficient_acrylic_wavelengths[i] = d2o_constants.absorption_coefficient_acrylic_wavelengths[i];
+ absorption_coefficient_acrylic[i] = d2o_constants.absorption_coefficient_acrylic[i];
+ }
+ rayleigh_scl_fac_acrylic = d2o_constants.rayleigh_scl_fac_acrylic;
+ isothermal_comp_acrylic = d2o_constants.isothermal_comp_acrylic;
+ } else if (run < 33907) {
+ for (i = 0; i < LEN(absorption_coefficient_d2o_wavelengths); i++) {
+ absorption_coefficient_d2o_wavelengths[i] = salt_constants.absorption_coefficient_d2o_wavelengths[i];
+ absorption_coefficient_d2o[i] = salt_constants.absorption_coefficient_d2o[i];
+ }
+ rayleigh_scl_fac_d2o = salt_constants.rayleigh_scl_fac_d2o;
+ isothermal_comp_d2o = salt_constants.isothermal_comp_d2o;
+
+ for (i = 0; i < LEN(absorption_coefficient_h2o_wavelengths); i++) {
+ absorption_coefficient_h2o_wavelengths[i] = salt_constants.absorption_coefficient_h2o_wavelengths[i];
+ absorption_coefficient_h2o[i] = salt_constants.absorption_coefficient_h2o[i];
+ }
+ rayleigh_scl_fac_h2o = salt_constants.rayleigh_scl_fac_h2o;
+ isothermal_comp_h2o = salt_constants.isothermal_comp_h2o;
+
+ for (i = 0; i < LEN(absorption_coefficient_acrylic_wavelengths); i++) {
+ absorption_coefficient_acrylic_wavelengths[i] = salt_constants.absorption_coefficient_acrylic_wavelengths[i];
+ absorption_coefficient_acrylic[i] = salt_constants.absorption_coefficient_acrylic[i];
+ }
+ rayleigh_scl_fac_acrylic = salt_constants.rayleigh_scl_fac_acrylic;
+ isothermal_comp_acrylic = salt_constants.isothermal_comp_acrylic;
+ } else {
+ sprintf(optics_err, "no optics info for ncd or h2o phase!");
+ return -1;
+ }
+
w = gsl_integration_cquad_workspace_alloc(100);
F.function = &gsl_cerenkov;