solstice-pp

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

themis.c (44121B)


      1 /* Copyright (C) 2017, 2018, 2025 |Méso|Star>
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #include <float.h>
     17 #include <stdio.h>
     18 #include <math.h>
     19 
     20 /*******************************************************************************
     21  * Data
     22  ******************************************************************************/
     23 static const double solar_spectrum[][2] = { /* Wavelength data */
     24   {2.800000e-01, 1.755832e-22},
     25   {2.850000e-01, 3.294496e-13},
     26   {2.900000e-01, 9.825731e-07},
     27   {2.950000e-01, 4.867814e-03},
     28   {3.000000e-01, 5.930555e-01},
     29   {3.050000e-01, 1.009141e+01},
     30   {3.100000e-01, 3.418097e+01},
     31   {3.150000e-01, 8.042174e+01},
     32   {3.200000e-01, 1.269513e+02},
     33   {3.250000e-01, 1.755832e+02},
     34   {3.300000e-01, 2.802401e+02},
     35   {3.350000e-01, 2.853227e+02},
     36   {3.400000e-01, 3.165119e+02},
     37   {3.450000e-01, 3.021880e+02},
     38   {3.500000e-01, 3.613318e+02},
     39   {3.550000e-01, 4.239411e+02},
     40   {3.600000e-01, 4.052276e+02},
     41   {3.650000e-01, 4.730351e+02},
     42   {3.700000e-01, 5.417667e+02},
     43   {3.750000e-01, 4.694541e+02},
     44   {3.800000e-01, 5.618663e+02},
     45   {3.850000e-01, 5.083828e+02},
     46   {3.900000e-01, 6.487338e+02},
     47   {3.950000e-01, 6.482718e+02},
     48   {4.000000e-01, 9.550803e+02},
     49   {4.050000e-01, 9.825730e+02},
     50   {4.100000e-01, 9.814178e+02},
     51   {4.150000e-01, 1.076949e+03},
     52   {4.200000e-01, 1.098781e+03},
     53   {4.250000e-01, 1.125350e+03},
     54   {4.300000e-01, 8.677508e+02},
     55   {4.350000e-01, 1.148568e+03},
     56   {4.400000e-01, 1.220997e+03},
     57   {4.450000e-01, 1.329581e+03},
     58   {4.500000e-01, 1.492457e+03},
     59   {4.550000e-01, 1.458958e+03},
     60   {4.600000e-01, 1.491302e+03},
     61   {4.650000e-01, 1.502854e+03},
     62   {4.700000e-01, 1.461268e+03},
     63   {4.750000e-01, 1.546750e+03},
     64   {4.800000e-01, 1.581404e+03},
     65   {4.850000e-01, 1.485527e+03},
     66   {4.900000e-01, 1.568698e+03},
     67   {4.950000e-01, 1.591801e+03},
     68   {5.000000e-01, 1.539819e+03},
     69   {5.050000e-01, 1.549060e+03},
     70   {5.100000e-01, 1.569853e+03},
     71   {5.150000e-01, 1.554836e+03},
     72   {5.200000e-01, 1.516716e+03},
     73   {5.250000e-01, 1.613748e+03},
     74   {5.300000e-01, 1.609128e+03},
     75   {5.350000e-01, 1.610283e+03},
     76   {5.400000e-01, 1.515560e+03},
     77   {5.450000e-01, 1.592956e+03},
     78   {5.500000e-01, 1.595266e+03},
     79   {5.550000e-01, 1.618369e+03},
     80   {5.600000e-01, 1.557146e+03},
     81   {5.650000e-01, 1.554836e+03},
     82   {5.700000e-01, 1.515560e+03},
     83   {5.750000e-01, 1.542129e+03},
     84   {5.800000e-01, 1.561767e+03},
     85   {5.850000e-01, 1.582559e+03},
     86   {5.900000e-01, 1.363080e+03},
     87   {5.950000e-01, 1.440476e+03},
     88   {6.000000e-01, 1.523647e+03},
     89   {6.050000e-01, 1.558301e+03},
     90   {6.100000e-01, 1.539819e+03},
     91   {6.150000e-01, 1.543284e+03},
     92   {6.200000e-01, 1.555991e+03},
     93   {6.250000e-01, 1.473975e+03},
     94   {6.300000e-01, 1.460113e+03},
     95   {6.350000e-01, 1.519026e+03},
     96   {6.400000e-01, 1.524802e+03},
     97   {6.450000e-01, 1.524802e+03},
     98   {6.500000e-01, 1.461268e+03},
     99   {6.550000e-01, 1.398890e+03},
    100   {6.600000e-01, 1.465889e+03},
    101   {6.650000e-01, 1.490147e+03},
    102   {6.700000e-01, 1.493613e+03},
    103   {6.750000e-01, 1.482061e+03},
    104   {6.800000e-01, 1.473975e+03},
    105   {6.850000e-01, 1.438165e+03},
    106   {6.900000e-01, 1.227927e+03},
    107   {6.950000e-01, 1.281064e+03},
    108   {7.000000e-01, 1.282220e+03},
    109   {7.050000e-01, 1.331891e+03},
    110   {7.100000e-01, 1.342288e+03},
    111   {7.150000e-01, 1.306478e+03},
    112   {7.200000e-01, 8.671732e+02},
    113   {7.250000e-01, 9.532321e+02},
    114   {7.300000e-01, 1.061239e+03},
    115   {7.350000e-01, 1.217531e+03},
    116   {7.400000e-01, 1.253341e+03},
    117   {7.450000e-01, 1.311098e+03},
    118   {7.500000e-01, 1.303012e+03},
    119   {7.550000e-01, 1.293771e+03},
    120   {7.600000e-01, 2.831280e+02},
    121   {7.650000e-01, 7.233567e+02},
    122   {7.700000e-01, 1.226772e+03},
    123   {7.750000e-01, 1.236014e+03},
    124   {7.800000e-01, 1.237169e+03},
    125   {7.850000e-01, 1.229083e+03},
    126   {7.900000e-01, 1.118765e+03},
    127   {7.950000e-01, 1.164394e+03},
    128   {8.000000e-01, 1.134014e+03},
    129   {8.050000e-01, 1.121307e+03},
    130   {8.100000e-01, 1.091042e+03},
    131   {8.150000e-01, 8.507700e+02},
    132   {8.200000e-01, 8.317100e+02},
    133   {8.250000e-01, 1.000362e+03},
    134   {8.300000e-01, 9.195016e+02},
    135   {8.350000e-01, 1.049456e+03},
    136   {8.400000e-01, 1.061354e+03},
    137   {8.450000e-01, 1.078220e+03},
    138   {8.500000e-01, 1.017921e+03},
    139   {8.550000e-01, 9.829195e+02},
    140   {8.600000e-01, 1.063665e+03},
    141   {8.650000e-01, 1.007640e+03},
    142   {8.700000e-01, 1.043219e+03},
    143   {8.750000e-01, 1.036288e+03},
    144   {8.800000e-01, 1.023003e+03},
    145   {8.850000e-01, 1.012145e+03},
    146   {8.900000e-01, 1.000016e+03},
    147   {8.950000e-01, 8.095311e+02},
    148   {9.000000e-01, 7.268221e+02},
    149   {9.050000e-01, 8.257032e+02},
    150   {9.100000e-01, 5.527406e+02},
    151   {9.150000e-01, 6.158120e+02},
    152   {9.200000e-01, 7.346772e+02},
    153   {9.250000e-01, 6.600543e+02},
    154   {9.300000e-01, 3.049603e+02},
    155   {9.350000e-01, 1.475130e+02},
    156   {9.400000e-01, 3.614473e+02},
    157   {9.450000e-01, 2.581767e+02},
    158   {9.500000e-01, 6.159275e+01},
    159   {9.550000e-01, 2.303375e+02},
    160   {9.600000e-01, 3.137395e+02},
    161   {9.650000e-01, 4.293703e+02},
    162   {9.700000e-01, 5.969830e+02},
    163   {9.750000e-01, 5.647542e+02},
    164   {9.800000e-01, 5.682197e+02},
    165   {9.850000e-01, 6.823488e+02},
    166   {9.900000e-01, 7.674835e+02},
    167   {9.950000e-01, 8.192344e+02},
    168   {1.000000e+00, 8.012140e+02},
    169   {1.005000e+00, 7.822695e+02},
    170   {1.010000e+00, 7.758006e+02},
    171   {1.015000e+00, 7.794971e+02},
    172   {1.020000e+00, 7.657508e+02},
    173   {1.025000e+00, 7.675990e+02},
    174   {1.030000e+00, 7.572027e+02},
    175   {1.035000e+00, 7.464597e+02},
    176   {1.040000e+00, 7.380271e+02},
    177   {1.045000e+00, 7.256670e+02},
    178   {1.050000e+00, 7.190826e+02},
    179   {1.055000e+00, 7.090328e+02},
    180   {1.060000e+00, 6.904348e+02},
    181   {1.065000e+00, 6.854677e+02},
    182   {1.070000e+00, 6.587836e+02},
    183   {1.075000e+00, 6.438822e+02},
    184   {1.080000e+00, 6.396081e+02},
    185   {1.085000e+00, 6.422650e+02},
    186   {1.090000e+00, 5.934020e+02},
    187   {1.095000e+00, 5.304462e+02},
    188   {1.100000e+00, 4.647180e+02},
    189   {1.105000e+00, 4.916330e+02},
    190   {1.110000e+00, 4.297168e+02},
    191   {1.115000e+00, 1.782401e+02},
    192   {1.120000e+00, 6.423805e+01},
    193   {1.125000e+00, 6.967882e+01},
    194   {1.130000e+00, 2.260634e+01},
    195   {1.135000e+00, 4.263669e+00},
    196   {1.140000e+00, 1.699230e+02},
    197   {1.145000e+00, 6.558958e+01},
    198   {1.150000e+00, 6.521993e+01},
    199   {1.155000e+00, 2.327633e+02},
    200   {1.160000e+00, 2.165912e+02},
    201   {1.165000e+00, 3.331461e+02},
    202   {1.170000e+00, 4.473907e+02},
    203   {1.175000e+00, 4.572095e+02},
    204   {1.180000e+00, 4.366478e+02},
    205   {1.185000e+00, 3.854745e+02},
    206   {1.190000e+00, 4.808901e+02},
    207   {1.195000e+00, 4.510872e+02},
    208   {1.200000e+00, 4.587112e+02},
    209   {1.205000e+00, 4.491234e+02},
    210   {1.210000e+00, 4.704937e+02},
    211   {1.215000e+00, 4.268290e+02},
    212   {1.220000e+00, 4.885141e+02},
    213   {1.225000e+00, 4.982174e+02},
    214   {1.230000e+00, 4.974088e+02},
    215   {1.235000e+00, 5.173929e+02},
    216   {1.240000e+00, 5.160068e+02},
    217   {1.245000e+00, 5.130034e+02},
    218   {1.250000e+00, 5.102310e+02},
    219   {1.255000e+00, 5.015674e+02},
    220   {1.260000e+00, 4.792729e+02},
    221   {1.265000e+00, 4.427701e+02},
    222   {1.270000e+00, 4.321427e+02},
    223   {1.275000e+00, 4.596353e+02},
    224   {1.280000e+00, 4.599818e+02},
    225   {1.285000e+00, 4.644869e+02},
    226   {1.290000e+00, 4.539751e+02},
    227   {1.295000e+00, 4.331823e+02},
    228   {1.300000e+00, 3.504734e+02},
    229   {1.305000e+00, 4.007225e+02},
    230   {1.310000e+00, 2.752729e+02},
    231   {1.315000e+00, 2.498596e+02},
    232   {1.320000e+00, 2.327633e+02},
    233   {1.325000e+00, 3.078482e+02},
    234   {1.330000e+00, 1.720023e+02},
    235   {1.335000e+00, 1.822831e+02},
    236   {1.340000e+00, 1.253341e+02},
    237   {1.345000e+00, 5.043397e+01},
    238   {1.350000e+00, 1.852865e+00},
    239   {1.355000e+00, 1.421993e-06},
    240   {1.360000e+00, 4.201291e-07},
    241   {1.365000e+00, 2.019207e-16},
    242   {1.370000e+00, 8.799954e-09},
    243   {1.375000e+00, 7.149241e-04},
    244   {1.380000e+00, 2.424666e-04},
    245   {1.385000e+00, 1.434700e-06},
    246   {1.390000e+00, 1.954519e-03},
    247   {1.395000e+00, 2.606025e-07},
    248   {1.400000e+00, 3.272548e-12},
    249   {1.405000e+00, 6.190464e-08},
    250   {1.410000e+00, 5.661404e-03},
    251   {1.415000e+00, 1.804349e-03},
    252   {1.420000e+00, 7.145775e-01},
    253   {1.425000e+00, 4.718799e+00},
    254   {1.430000e+00, 2.378460e+01},
    255   {1.435000e+00, 3.674541e+00},
    256   {1.440000e+00, 1.269513e+01},
    257   {1.445000e+00, 1.381563e+01},
    258   {1.450000e+00, 7.487701e+00},
    259   {1.455000e+00, 3.016104e+01},
    260   {1.460000e+00, 4.723420e+01},
    261   {1.465000e+00, 5.845073e+01},
    262   {1.470000e+00, 1.375787e+01},
    263   {1.475000e+00, 1.321495e+02},
    264   {1.480000e+00, 2.521699e+01},
    265   {1.485000e+00, 8.132276e+01},
    266   {1.490000e+00, 1.404666e+02},
    267   {1.495000e+00, 1.506319e+02},
    268   {1.500000e+00, 2.457010e+02},
    269   {1.505000e+00, 1.679592e+02},
    270   {1.510000e+00, 2.838210e+02},
    271   {1.515000e+00, 2.803556e+02},
    272   {1.520000e+00, 2.709988e+02},
    273   {1.525000e+00, 2.742333e+02},
    274   {1.530000e+00, 2.812797e+02},
    275   {1.535000e+00, 2.921381e+02},
    276   {1.540000e+00, 3.012639e+02},
    277   {1.545000e+00, 3.099275e+02},
    278   {1.550000e+00, 3.042673e+02},
    279   {1.555000e+00, 3.003397e+02},
    280   {1.560000e+00, 3.006863e+02},
    281   {1.565000e+00, 2.990691e+02},
    282   {1.570000e+00, 2.735402e+02},
    283   {1.575000e+00, 2.793159e+02},
    284   {1.580000e+00, 2.746953e+02},
    285   {1.585000e+00, 2.874020e+02},
    286   {1.590000e+00, 2.694972e+02},
    287   {1.595000e+00, 2.856693e+02},
    288   {1.600000e+00, 2.646455e+02},
    289   {1.605000e+00, 2.668403e+02},
    290   {1.610000e+00, 2.498596e+02},
    291   {1.615000e+00, 2.667248e+02},
    292   {1.620000e+00, 2.664938e+02},
    293   {1.625000e+00, 2.700747e+02},
    294   {1.630000e+00, 2.686885e+02},
    295   {1.635000e+00, 2.596784e+02},
    296   {1.640000e+00, 2.400408e+02},
    297   {1.645000e+00, 2.470872e+02},
    298   {1.650000e+00, 2.502061e+02},
    299   {1.655000e+00, 2.505526e+02},
    300   {1.660000e+00, 2.503216e+02},
    301   {1.665000e+00, 2.378460e+02},
    302   {1.670000e+00, 2.482423e+02},
    303   {1.675000e+00, 2.396942e+02},
    304   {1.680000e+00, 2.306840e+02},
    305   {1.685000e+00, 2.391166e+02},
    306   {1.690000e+00, 2.287203e+02},
    307   {1.695000e+00, 2.350736e+02},
    308   {1.700000e+00, 2.195945e+02},
    309   {1.705000e+00, 2.177463e+02},
    310   {1.710000e+00, 2.065413e+02},
    311   {1.715000e+00, 2.040000e+02},
    312   {1.720000e+00, 2.040000e+02},
    313   {1.725000e+00, 1.882899e+02},
    314   {1.730000e+00, 1.879434e+02},
    315   {1.735000e+00, 1.700385e+02},
    316   {1.740000e+00, 1.747746e+02},
    317   {1.745000e+00, 1.594111e+02},
    318   {1.750000e+00, 1.725798e+02},
    319   {1.755000e+00, 1.523647e+02},
    320   {1.760000e+00, 1.639162e+02},
    321   {1.765000e+00, 1.238324e+02},
    322   {1.770000e+00, 1.276444e+02},
    323   {1.775000e+00, 9.467632e+01},
    324   {1.780000e+00, 7.652887e+01},
    325   {1.785000e+00, 4.875900e+01},
    326   {1.790000e+00, 6.226274e+01},
    327   {1.795000e+00, 1.964915e+01},
    328   {1.800000e+00, 1.596421e+01},
    329   {1.805000e+00, 2.681110e+00},
    330   {1.810000e+00, 1.351529e+00},
    331   {1.815000e+00, 1.782401e-01},
    332   {1.820000e+00, 2.100068e-02},
    333   {1.825000e+00, 2.950260e-02},
    334   {1.830000e+00, 5.069966e-06},
    335   {1.835000e+00, 3.109671e-06},
    336   {1.840000e+00, 1.126390e-08},
    337   {1.845000e+00, 7.945141e-07},
    338   {1.850000e+00, 2.736557e-07},
    339   {1.855000e+00, 5.976761e-08},
    340   {1.860000e+00, 3.084258e-05},
    341   {1.865000e+00, 2.344960e-05},
    342   {1.870000e+00, 4.700317e-13},
    343   {1.875000e+00, 1.053730e-12},
    344   {1.880000e+00, 3.766953e-04},
    345   {1.885000e+00, 1.557146e-04},
    346   {1.890000e+00, 8.908538e-04},
    347   {1.895000e+00, 8.015605e-04},
    348   {1.900000e+00, 3.690713e-07},
    349   {1.905000e+00, 3.564802e-07},
    350   {1.910000e+00, 3.483941e-05},
    351   {1.915000e+00, 8.942038e-05},
    352   {1.920000e+00, 3.726523e-03},
    353   {1.925000e+00, 2.120861e-02},
    354   {1.930000e+00, 1.522491e-02},
    355   {1.935000e+00, 3.087723e-01},
    356   {1.940000e+00, 3.988743e-01},
    357   {1.945000e+00, 2.781608e+00},
    358   {1.950000e+00, 6.680249e+00},
    359   {1.955000e+00, 2.853227e+00},
    360   {1.960000e+00, 1.102131e+01},
    361   {1.965000e+00, 1.737350e+01},
    362   {1.970000e+00, 3.748471e+01},
    363   {1.975000e+00, 5.294065e+01},
    364   {1.980000e+00, 6.599388e+01},
    365   {1.985000e+00, 7.625164e+01},
    366   {1.990000e+00, 7.612457e+01},
    367   {1.995000e+00, 7.584733e+01},
    368   {2.000000e+00, 3.413477e+01},
    369   {2.005000e+00, 1.133320e+01},
    370   {2.010000e+00, 3.980657e+01},
    371   {2.015000e+00, 2.313771e+01},
    372   {2.020000e+00, 4.245187e+01},
    373   {2.025000e+00, 7.589354e+01},
    374   {2.030000e+00, 8.488063e+01},
    375   {2.035000e+00, 1.036519e+02},
    376   {2.040000e+00, 9.467632e+01},
    377   {2.045000e+00, 9.695198e+01},
    378   {2.050000e+00, 7.200067e+01},
    379   {2.055000e+00, 5.648697e+01},
    380   {2.060000e+00, 7.166568e+01},
    381   {2.065000e+00, 6.471166e+01},
    382   {2.070000e+00, 6.833884e+01},
    383   {2.075000e+00, 8.371392e+01},
    384   {2.080000e+00, 9.408720e+01},
    385   {2.085000e+00, 9.265481e+01},
    386   {2.090000e+00, 9.914677e+01},
    387   {2.095000e+00, 9.885798e+01},
    388   {2.100000e+00, 9.155741e+01},
    389   {2.105000e+00, 1.043450e+02},
    390   {2.110000e+00, 9.829195e+01},
    391   {2.115000e+00, 1.024158e+02},
    392   {2.120000e+00, 9.531166e+01},
    393   {2.125000e+00, 9.782989e+01},
    394   {2.130000e+00, 9.974745e+01},
    395   {2.135000e+00, 1.005561e+02},
    396   {2.140000e+00, 1.021848e+02},
    397   {2.145000e+00, 1.008102e+02},
    398   {2.150000e+00, 9.193861e+01},
    399   {2.155000e+00, 9.273567e+01},
    400   {2.160000e+00, 9.260860e+01},
    401   {2.165000e+00, 8.261653e+01},
    402   {2.170000e+00, 9.129173e+01},
    403   {2.175000e+00, 8.697146e+01},
    404   {2.180000e+00, 9.136104e+01},
    405   {2.185000e+00, 7.770713e+01},
    406   {2.190000e+00, 8.627836e+01},
    407   {2.195000e+00, 8.574699e+01},
    408   {2.200000e+00, 7.709490e+01},
    409   {2.205000e+00, 8.019071e+01},
    410   {2.210000e+00, 8.848471e+01},
    411   {2.215000e+00, 8.380634e+01},
    412   {2.220000e+00, 8.744507e+01},
    413   {2.225000e+00, 8.378323e+01},
    414   {2.230000e+00, 8.583941e+01},
    415   {2.235000e+00, 8.345979e+01},
    416   {2.240000e+00, 8.287066e+01},
    417   {2.245000e+00, 7.990192e+01},
    418   {2.250000e+00, 8.172706e+01},
    419   {2.255000e+00, 7.652887e+01},
    420   {2.260000e+00, 7.598595e+01},
    421   {2.265000e+00, 7.731438e+01},
    422   {2.270000e+00, 7.353703e+01},
    423   {2.275000e+00, 7.257825e+01},
    424   {2.280000e+00, 7.551234e+01},
    425   {2.285000e+00, 7.141155e+01},
    426   {2.290000e+00, 7.159637e+01},
    427   {2.295000e+00, 6.921676e+01},
    428   {2.300000e+00, 6.564733e+01},
    429   {2.305000e+00, 6.586681e+01},
    430   {2.310000e+00, 6.974813e+01},
    431   {2.315000e+00, 6.378754e+01},
    432   {2.320000e+00, 5.589784e+01},
    433   {2.325000e+00, 5.843918e+01},
    434   {2.330000e+00, 6.036829e+01},
    435   {2.335000e+00, 6.296738e+01},
    436   {2.340000e+00, 4.414994e+01},
    437   {2.345000e+00, 5.389943e+01},
    438   {2.350000e+00, 4.024552e+01},
    439   {2.355000e+00, 4.850487e+01},
    440   {2.360000e+00, 5.193567e+01},
    441   {2.365000e+00, 4.863193e+01},
    442   {2.370000e+00, 2.624507e+01},
    443   {2.375000e+00, 4.312185e+01},
    444   {2.380000e+00, 3.800453e+01},
    445   {2.385000e+00, 2.428131e+01},
    446   {2.390000e+00, 3.251755e+01},
    447   {2.395000e+00, 3.768108e+01},
    448   {2.400000e+00, 4.099637e+01},
    449   {2.405000e+00, 2.709988e+01},
    450   {2.410000e+00, 2.648765e+01},
    451   {2.415000e+00, 1.916399e+01},
    452   {2.420000e+00, 1.944122e+01},
    453   {2.425000e+00, 2.625662e+01},
    454   {2.430000e+00, 3.942537e+01},
    455   {2.435000e+00, 8.307859e+00},
    456   {2.440000e+00, 3.668765e+01},
    457   {2.445000e+00, 1.312254e+01},
    458   {2.450000e+00, 6.917055e+00},
    459   {2.455000e+00, 1.529422e+01},
    460   {2.460000e+00, 2.475492e+01},
    461   {2.465000e+00, 1.468199e+01},
    462   {2.470000e+00, 7.535062e+00},
    463   {2.475000e+00, 7.232412e+00},
    464   {2.480000e+00, 2.036534e+00},
    465   {2.485000e+00, 1.159773e+00},
    466   {2.490000e+00, 4.409218e-01},
    467   {2.495000e+00, 3.889400e-01},
    468   {2.500000e+00, 1.192118e+00},
    469   {2.505000e+00, 1.178256e-01},
    470   {2.510000e+00, 2.302220e-01},
    471   {2.515000e+00, 2.307995e-02},
    472   {2.520000e+00, 5.186636e-03},
    473   {2.525000e+00, 8.529648e-05},
    474   {2.530000e+00, 5.429218e-08},
    475   {2.535000e+00, 2.571370e-09},
    476   {2.540000e+00, 1.254496e-08},
    477   {2.545000e+00, 7.580113e-14},
    478   {2.550000e+00, 1.089194e-20},
    479   {2.555000e+00, 1.036288e-12},
    480   {2.560000e+00, 6.137327e-14},
    481   {2.565000e+00, 1.341132e-19},
    482   {2.570000e+00, 4.495855e-27},
    483   {2.575000e+00, 2.718519e-43},
    484   {2.580000e+00, 8.278980e-35},
    485   {2.585000e+00, 0.000000e+00},
    486   {2.590000e+00, 0.000000e+00},
    487   {2.595000e+00, 0.000000e+00},
    488   {2.600000e+00, 1.401298e-45},
    489   {2.605000e+00, 0.000000e+00},
    490   {2.610000e+00, 0.000000e+00},
    491   {2.615000e+00, 0.000000e+00},
    492   {2.620000e+00, 6.389921e-43},
    493   {2.625000e+00, 0.000000e+00},
    494   {2.630000e+00, 0.000000e+00},
    495   {2.635000e+00, 8.243170e-23},
    496   {2.640000e+00, 1.977622e-25},
    497   {2.645000e+00, 3.870917e-28},
    498   {2.650000e+00, 5.282514e-31},
    499   {2.655000e+00, 2.101948e-44},
    500   {2.660000e+00, 7.691007e-38},
    501   {2.665000e+00, 0.000000e+00},
    502   {2.670000e+00, 0.000000e+00},
    503   {2.675000e+00, 0.000000e+00},
    504   {2.680000e+00, 0.000000e+00},
    505   {2.685000e+00, 0.000000e+00},
    506   {2.690000e+00, 4.203895e-45},
    507   {2.695000e+00, 0.000000e+00},
    508   {2.700000e+00, 0.000000e+00},
    509   {2.705000e+00, 0.000000e+00},
    510   {2.710000e+00, 0.000000e+00},
    511   {2.715000e+00, 9.111803e-41},
    512   {2.720000e+00, 0.000000e+00},
    513   {2.725000e+00, 1.520181e-30},
    514   {2.730000e+00, 1.561767e-30},
    515   {2.735000e+00, 7.793816e-32},
    516   {2.740000e+00, 3.076172e-38},
    517   {2.745000e+00, 1.721178e-37},
    518   {2.750000e+00, 5.867237e-42},
    519   {2.755000e+00, 0.000000e+00},
    520   {2.760000e+00, 0.000000e+00},
    521   {2.765000e+00, 2.810487e-38},
    522   {2.770000e+00, 6.439977e-34},
    523   {2.775000e+00, 0.000000e+00},
    524   {2.780000e+00, 3.463169e-41},
    525   {2.785000e+00, 1.364235e-36},
    526   {2.790000e+00, 8.396806e-22},
    527   {2.795000e+00, 9.365979e-23},
    528   {2.800000e+00, 1.356149e-14},
    529   {2.805000e+00, 2.779298e-16},
    530   {2.810000e+00, 4.397667e-12},
    531   {2.815000e+00, 3.218256e-12},
    532   {2.820000e+00, 7.425322e-14},
    533   {2.825000e+00, 1.903692e-08},
    534   {2.830000e+00, 3.691868e-06},
    535   {2.835000e+00, 4.135447e-13},
    536   {2.840000e+00, 6.424960e-08},
    537   {2.845000e+00, 2.679955e-04},
    538   {2.850000e+00, 4.470441e-07},
    539   {2.855000e+00, 3.652593e-07},
    540   {2.860000e+00, 2.067724e-04},
    541   {2.865000e+00, 3.345323e-03},
    542   {2.870000e+00, 1.248720e-05},
    543   {2.875000e+00, 1.402356e-02},
    544   {2.880000e+00, 8.862332e-03},
    545   {2.885000e+00, 1.924485e-02},
    546   {2.890000e+00, 7.473839e-03},
    547   {2.895000e+00, 4.261359e-01},
    548   {2.900000e+00, 9.198482e-02},
    549   {2.905000e+00, 2.128947e-03},
    550   {2.910000e+00, 6.100362e-01},
    551   {2.915000e+00, 1.715402e-01},
    552   {2.920000e+00, 6.144258e-01},
    553   {2.925000e+00, 2.073499e-01},
    554   {2.930000e+00, 1.656489e+00},
    555   {2.935000e+00, 2.313771e+00},
    556   {2.940000e+00, 2.400408e-01},
    557   {2.945000e+00, 1.966070e-01},
    558   {2.950000e+00, 1.638007e+00},
    559   {2.955000e+00, 7.849263e-01},
    560   {2.960000e+00, 1.492457e+00},
    561   {2.965000e+00, 3.734609e+00},
    562   {2.970000e+00, 4.676059e-02},
    563   {2.975000e+00, 1.094623e-01},
    564   {2.980000e+00, 2.450079e-01},
    565   {2.985000e+00, 3.056534e+00},
    566   {2.990000e+00, 6.057621e+00},
    567   {2.995000e+00, 1.480906e+00},
    568   {3.000000e+00, 3.981812e+00},
    569   {3.005000e+00, 9.241222e-01},
    570   {3.010000e+00, 3.634111e+00},
    571   {3.015000e+00, 2.126636e+00},
    572   {3.020000e+00, 4.987950e-02},
    573   {3.025000e+00, 3.859366e+00},
    574   {3.030000e+00, 2.861314e+00},
    575   {3.035000e+00, 7.404530e-01},
    576   {3.040000e+00, 5.771143e-01},
    577   {3.045000e+00, 1.351529e+00},
    578   {3.050000e+00, 1.505164e-01},
    579   {3.055000e+00, 2.044620e-02},
    580   {3.060000e+00, 3.115447e+00},
    581   {3.065000e+00, 8.756058e-01},
    582   {3.070000e+00, 3.492027e-01},
    583   {3.075000e+00, 2.830124e+00},
    584   {3.080000e+00, 1.386183e+00},
    585   {3.085000e+00, 3.766953e-01},
    586   {3.090000e+00, 5.635991e-01},
    587   {3.095000e+00, 7.939365e-02},
    588   {3.100000e+00, 1.830917e+00},
    589   {3.105000e+00, 2.093137e-01},
    590   {3.110000e+00, 8.597802e-02},
    591   {3.115000e+00, 5.444235e-01},
    592   {3.120000e+00, 5.816194e+00},
    593   {3.125000e+00, 1.196738e+00},
    594   {3.130000e+00, 3.370736e+00},
    595   {3.135000e+00, 7.649422e+00},
    596   {3.140000e+00, 1.336512e+00},
    597   {3.145000e+00, 1.344598e+00},
    598   {3.150000e+00, 3.883624e+00},
    599   {3.155000e+00, 3.158188e+00},
    600   {3.160000e+00, 6.340634e+00},
    601   {3.165000e+00, 1.286840e+01},
    602   {3.170000e+00, 9.983986e+00},
    603   {3.175000e+00, 7.336376e+00},
    604   {3.180000e+00, 8.348289e+00},
    605   {3.185000e+00, 5.731868e+00},
    606   {3.190000e+00, 2.194790e+00},
    607   {3.195000e+00, 8.751438e-01},
    608   {3.200000e+00, 4.146999e-02},
    609   {3.205000e+00, 2.004190e-02},
    610   {3.210000e+00, 9.394858e-03},
    611   {3.215000e+00, 4.889762e-02},
    612   {3.220000e+00, 4.417304e-01},
    613   {3.225000e+00, 2.447769e-02},
    614   {3.230000e+00, 5.661404e-02},
    615   {3.235000e+00, 4.230170e+00},
    616   {3.240000e+00, 1.881744e+00},
    617   {3.245000e+00, 1.957984e-01},
    618   {3.250000e+00, 1.468199e+00},
    619   {3.255000e+00, 6.918210e+00},
    620   {3.260000e+00, 5.117327e-01},
    621   {3.265000e+00, 7.144620e-01},
    622   {3.270000e+00, 3.461993e-01},
    623   {3.275000e+00, 3.131619e+00},
    624   {3.280000e+00, 1.364235e+00},
    625   {3.285000e+00, 8.155379e+00},
    626   {3.290000e+00, 6.398391e+00},
    627   {3.295000e+00, 3.224031e-01},
    628   {3.300000e+00, 6.914745e-01},
    629   {3.305000e+00, 1.679592e+00},
    630   {3.310000e+00, 2.510147e+00},
    631   {3.315000e+00, 1.062972e-02},
    632   {3.320000e+00, 8.433771e-03},
    633   {3.325000e+00, 2.253703e+00},
    634   {3.330000e+00, 3.401925e+00},
    635   {3.335000e+00, 7.758006e+00},
    636   {3.340000e+00, 1.736195e+00},
    637   {3.345000e+00, 2.252548e+00},
    638   {3.350000e+00, 6.016036e+00},
    639   {3.355000e+00, 2.031914e+00},
    640   {3.360000e+00, 3.474700e+00},
    641   {3.365000e+00, 5.899365e+00},
    642   {3.370000e+00, 2.852072e+00},
    643   {3.375000e+00, 6.880090e+00},
    644   {3.380000e+00, 4.453114e+00},
    645   {3.385000e+00, 6.382219e+00},
    646   {3.390000e+00, 1.068632e+01},
    647   {3.395000e+00, 9.365979e+00},
    648   {3.400000e+00, 1.320340e+01},
    649   {3.405000e+00, 3.969105e+00},
    650   {3.410000e+00, 5.988312e+00},
    651   {3.415000e+00, 7.733748e+00},
    652   {3.420000e+00, 1.455493e+01},
    653   {3.425000e+00, 1.114838e+01},
    654   {3.430000e+00, 1.007986e+01},
    655   {3.435000e+00, 1.171325e+01},
    656   {3.440000e+00, 8.677508e+00},
    657   {3.445000e+00, 1.164394e+01},
    658   {3.450000e+00, 1.297237e+01},
    659   {3.455000e+00, 8.471891e+00},
    660   {3.460000e+00, 1.351529e+01},
    661   {3.465000e+00, 1.125581e+01},
    662   {3.470000e+00, 1.354994e+01},
    663   {3.475000e+00, 1.190963e+01},
    664   {3.480000e+00, 1.279909e+01},
    665   {3.485000e+00, 1.338822e+01},
    666   {3.490000e+00, 1.101785e+01},
    667   {3.495000e+00, 1.378097e+01},
    668   {3.500000e+00, 1.314564e+01},
    669   {3.505000e+00, 1.318029e+01},
    670   {3.510000e+00, 1.311098e+01},
    671   {3.515000e+00, 1.164394e+01},
    672   {3.520000e+00, 1.328426e+01},
    673   {3.525000e+00, 1.208290e+01},
    674   {3.530000e+00, 1.186342e+01},
    675   {3.535000e+00, 9.635130e+00},
    676   {3.540000e+00, 9.058708e+00},
    677   {3.545000e+00, 9.734473e+00},
    678   {3.550000e+00, 1.095316e+01},
    679   {3.555000e+00, 8.415288e+00},
    680   {3.560000e+00, 1.149146e+01},
    681   {3.565000e+00, 1.214066e+01},
    682   {3.570000e+00, 7.699093e+00},
    683   {3.575000e+00, 8.362151e+00},
    684   {3.580000e+00, 1.120383e+01},
    685   {3.585000e+00, 9.255084e+00},
    686   {3.590000e+00, 9.442219e+00},
    687   {3.595000e+00, 9.932004e+00},
    688   {3.600000e+00, 1.093930e+01},
    689   {3.605000e+00, 1.156308e+01},
    690   {3.610000e+00, 9.555424e+00},
    691   {3.615000e+00, 9.627044e+00},
    692   {3.620000e+00, 1.319185e+01},
    693   {3.625000e+00, 1.099243e+01},
    694   {3.630000e+00, 1.045760e+01},
    695   {3.635000e+00, 1.072906e+01},
    696   {3.640000e+00, 1.296081e+01},
    697   {3.645000e+00, 1.189807e+01},
    698   {3.650000e+00, 1.092312e+01},
    699   {3.655000e+00, 1.193273e+01},
    700   {3.660000e+00, 1.182876e+01},
    701   {3.665000e+00, 1.105135e+01},
    702   {3.670000e+00, 7.242808e+00},
    703   {3.675000e+00, 2.920226e+00},
    704   {3.680000e+00, 7.257825e+00},
    705   {3.685000e+00, 9.436443e+00},
    706   {3.690000e+00, 1.000940e+01},
    707   {3.695000e+00, 1.061470e+01},
    708   {3.700000e+00, 1.223307e+01},
    709   {3.705000e+00, 1.205980e+01},
    710   {3.710000e+00, 9.839592e+00},
    711   {3.715000e+00, 9.526545e+00},
    712   {3.720000e+00, 1.134938e+01},
    713   {3.725000e+00, 1.208290e+01},
    714   {3.730000e+00, 9.712525e+00},
    715   {3.735000e+00, 8.408357e+00},
    716   {3.740000e+00, 9.006726e+00},
    717   {3.745000e+00, 1.160929e+01},
    718   {3.750000e+00, 9.896194e+00},
    719   {3.755000e+00, 9.294360e+00},
    720   {3.760000e+00, 8.864643e+00},
    721   {3.765000e+00, 8.670577e+00},
    722   {3.770000e+00, 9.617802e+00},
    723   {3.775000e+00, 9.493046e+00},
    724   {3.780000e+00, 1.045991e+01},
    725   {3.785000e+00, 8.957055e+00},
    726   {3.790000e+00, 7.537372e+00},
    727   {3.795000e+00, 9.389082e+00},
    728   {3.800000e+00, 1.133089e+01},
    729   {3.805000e+00, 1.009604e+01},
    730   {3.810000e+00, 8.170396e+00},
    731   {3.815000e+00, 7.491166e+00},
    732   {3.820000e+00, 1.101207e+01},
    733   {3.825000e+00, 1.056734e+01},
    734   {3.830000e+00, 1.079721e+01},
    735   {3.835000e+00, 7.306342e+00},
    736   {3.840000e+00, 9.927383e+00},
    737   {3.845000e+00, 9.710215e+00},
    738   {3.850000e+00, 9.877712e+00},
    739   {3.855000e+00, 9.170758e+00},
    740   {3.860000e+00, 8.479977e+00},
    741   {3.865000e+00, 9.136104e+00},
    742   {3.870000e+00, 8.273204e+00},
    743   {3.875000e+00, 7.294790e+00},
    744   {3.880000e+00, 7.233567e+00},
    745   {3.885000e+00, 7.671370e+00},
    746   {3.890000e+00, 7.663284e+00},
    747   {3.895000e+00, 8.552751e+00},
    748   {3.900000e+00, 8.527338e+00},
    749   {3.905000e+00, 9.039071e+00},
    750   {3.910000e+00, 8.155379e+00},
    751   {3.915000e+00, 7.950917e+00},
    752   {3.920000e+00, 7.851574e+00},
    753   {3.925000e+00, 7.636715e+00},
    754   {3.930000e+00, 8.031777e+00},
    755   {3.935000e+00, 8.475356e+00},
    756   {3.940000e+00, 8.463805e+00},
    757   {3.945000e+00, 8.571234e+00},
    758   {3.950000e+00, 8.652095e+00},
    759   {3.955000e+00, 8.907383e+00},
    760   {3.960000e+00, 8.891211e+00},
    761   {3.965000e+00, 8.962831e+00},
    762   {3.970000e+00, 8.746817e+00},
    763   {3.975000e+00, 8.585096e+00},
    764   {3.980000e+00, 8.561993e+00},
    765   {3.985000e+00, 8.552751e+00},
    766   {3.990000e+00, 8.494994e+00},
    767   {3.995000e+00, 8.284756e+00},
    768   {4.000000e+00, 8.193499e+00}
    769 };
    770 
    771 static const double ref_mirror[][2] = { /* Wavelength data */
    772   {2.500000e+03, 9.002169e+01},
    773   {2.490000e+03, 8.875519e+01},
    774   {2.480000e+03, 8.935681e+01},
    775   {2.470000e+03, 8.933026e+01},
    776   {2.460000e+03, 8.959640e+01},
    777   {2.450000e+03, 8.948807e+01},
    778   {2.440000e+03, 8.930347e+01},
    779   {2.430000e+03, 8.987267e+01},
    780   {2.420000e+03, 8.969878e+01},
    781   {2.410000e+03, 8.985492e+01},
    782   {2.400000e+03, 8.983934e+01},
    783   {2.390000e+03, 9.015015e+01},
    784   {2.380000e+03, 9.033044e+01},
    785   {2.370000e+03, 9.021459e+01},
    786   {2.360000e+03, 9.036620e+01},
    787   {2.350000e+03, 9.070931e+01},
    788   {2.340000e+03, 9.090450e+01},
    789   {2.330000e+03, 9.102770e+01},
    790   {2.320000e+03, 9.156487e+01},
    791   {2.310000e+03, 9.187077e+01},
    792   {2.300000e+03, 9.185011e+01},
    793   {2.290000e+03, 9.168735e+01},
    794   {2.280000e+03, 9.153958e+01},
    795   {2.270000e+03, 9.148136e+01},
    796   {2.260000e+03, 9.142628e+01},
    797   {2.250000e+03, 9.115726e+01},
    798   {2.240000e+03, 9.120969e+01},
    799   {2.230000e+03, 9.117910e+01},
    800   {2.220000e+03, 9.116260e+01},
    801   {2.210000e+03, 9.127687e+01},
    802   {2.200000e+03, 9.131850e+01},
    803   {2.190000e+03, 9.132679e+01},
    804   {2.180000e+03, 9.134534e+01},
    805   {2.170000e+03, 9.114151e+01},
    806   {2.160000e+03, 9.068787e+01},
    807   {2.150000e+03, 9.051109e+01},
    808   {2.140000e+03, 9.048801e+01},
    809   {2.130000e+03, 9.050297e+01},
    810   {2.120000e+03, 9.101611e+01},
    811   {2.110000e+03, 9.129543e+01},
    812   {2.100000e+03, 9.170773e+01},
    813   {2.090000e+03, 9.191200e+01},
    814   {2.080000e+03, 9.210053e+01},
    815   {2.070000e+03, 9.224890e+01},
    816   {2.060000e+03, 9.238735e+01},
    817   {2.050000e+03, 9.265939e+01},
    818   {2.040000e+03, 9.294904e+01},
    819   {2.030000e+03, 9.320248e+01},
    820   {2.020000e+03, 9.360339e+01},
    821   {2.010000e+03, 9.394395e+01},
    822   {2.000000e+03, 9.445172e+01},
    823   {1.990000e+03, 9.481448e+01},
    824   {1.980000e+03, 9.514061e+01},
    825   {1.970000e+03, 9.537082e+01},
    826   {1.960000e+03, 9.562746e+01},
    827   {1.950000e+03, 9.585700e+01},
    828   {1.940000e+03, 9.592551e+01},
    829   {1.930000e+03, 9.583197e+01},
    830   {1.920000e+03, 9.581526e+01},
    831   {1.910000e+03, 9.551694e+01},
    832   {1.900000e+03, 9.513596e+01},
    833   {1.890000e+03, 9.482872e+01},
    834   {1.880000e+03, 9.450699e+01},
    835   {1.870000e+03, 9.433634e+01},
    836   {1.860000e+03, 9.431637e+01},
    837   {1.850000e+03, 9.432624e+01},
    838   {1.840000e+03, 9.447005e+01},
    839   {1.830000e+03, 9.459088e+01},
    840   {1.820000e+03, 9.478791e+01},
    841   {1.810000e+03, 9.496258e+01},
    842   {1.800000e+03, 9.518331e+01},
    843   {1.790000e+03, 9.525677e+01},
    844   {1.780000e+03, 9.536103e+01},
    845   {1.770000e+03, 9.542614e+01},
    846   {1.760000e+03, 9.543584e+01},
    847   {1.750000e+03, 9.539315e+01},
    848   {1.740000e+03, 9.536543e+01},
    849   {1.730000e+03, 9.531860e+01},
    850   {1.720000e+03, 9.536415e+01},
    851   {1.710000e+03, 9.538762e+01},
    852   {1.700000e+03, 9.532991e+01},
    853   {1.690000e+03, 9.526815e+01},
    854   {1.680000e+03, 9.526891e+01},
    855   {1.670000e+03, 9.535363e+01},
    856   {1.660000e+03, 9.535061e+01},
    857   {1.650000e+03, 9.539629e+01},
    858   {1.640000e+03, 9.543298e+01},
    859   {1.630000e+03, 9.547403e+01},
    860   {1.620000e+03, 9.553451e+01},
    861   {1.610000e+03, 9.546091e+01},
    862   {1.600000e+03, 9.544562e+01},
    863   {1.590000e+03, 9.541650e+01},
    864   {1.580000e+03, 9.536031e+01},
    865   {1.570000e+03, 9.532507e+01},
    866   {1.560000e+03, 9.522473e+01},
    867   {1.550000e+03, 9.511299e+01},
    868   {1.540000e+03, 9.504054e+01},
    869   {1.530000e+03, 9.497032e+01},
    870   {1.520000e+03, 9.484760e+01},
    871   {1.510000e+03, 9.478913e+01},
    872   {1.500000e+03, 9.472796e+01},
    873   {1.490000e+03, 9.467186e+01},
    874   {1.480000e+03, 9.458646e+01},
    875   {1.470000e+03, 9.444527e+01},
    876   {1.460000e+03, 9.425820e+01},
    877   {1.450000e+03, 9.401962e+01},
    878   {1.440000e+03, 9.379675e+01},
    879   {1.430000e+03, 9.353042e+01},
    880   {1.420000e+03, 9.318069e+01},
    881   {1.410000e+03, 9.295930e+01},
    882   {1.400000e+03, 9.276019e+01},
    883   {1.390000e+03, 9.260818e+01},
    884   {1.380000e+03, 9.244196e+01},
    885   {1.370000e+03, 9.226486e+01},
    886   {1.360000e+03, 9.220292e+01},
    887   {1.350000e+03, 9.219144e+01},
    888   {1.340000e+03, 9.213460e+01},
    889   {1.330000e+03, 9.210777e+01},
    890   {1.320000e+03, 9.208756e+01},
    891   {1.310000e+03, 9.196632e+01},
    892   {1.300000e+03, 9.183512e+01},
    893   {1.290000e+03, 9.170703e+01},
    894   {1.280000e+03, 9.168185e+01},
    895   {1.270000e+03, 9.168346e+01},
    896   {1.260000e+03, 9.158861e+01},
    897   {1.250000e+03, 9.150678e+01},
    898   {1.240000e+03, 9.147020e+01},
    899   {1.230000e+03, 9.145164e+01},
    900   {1.220000e+03, 9.144785e+01},
    901   {1.210000e+03, 9.139342e+01},
    902   {1.200000e+03, 9.134400e+01},
    903   {1.190000e+03, 9.130375e+01},
    904   {1.180000e+03, 9.123543e+01},
    905   {1.170000e+03, 9.119971e+01},
    906   {1.160000e+03, 9.117647e+01},
    907   {1.150000e+03, 9.119447e+01},
    908   {1.140000e+03, 9.112846e+01},
    909   {1.130000e+03, 9.102717e+01},
    910   {1.120000e+03, 9.098567e+01},
    911   {1.110000e+03, 9.101431e+01},
    912   {1.100000e+03, 9.103447e+01},
    913   {1.090000e+03, 9.103535e+01},
    914   {1.080000e+03, 9.104751e+01},
    915   {1.070000e+03, 9.104776e+01},
    916   {1.060000e+03, 9.105524e+01},
    917   {1.050000e+03, 9.105882e+01},
    918   {1.040000e+03, 9.100527e+01},
    919   {1.030000e+03, 9.098834e+01},
    920   {1.020000e+03, 9.099553e+01},
    921   {1.010000e+03, 9.097986e+01},
    922   {1.000000e+03, 9.099072e+01},
    923   {9.900000e+02, 9.101458e+01},
    924   {9.800000e+02, 9.102811e+01},
    925   {9.700000e+02, 9.107101e+01},
    926   {9.600000e+02, 9.113153e+01},
    927   {9.500000e+02, 9.115299e+01},
    928   {9.400000e+02, 9.120361e+01},
    929   {9.300000e+02, 9.129536e+01},
    930   {9.200000e+02, 9.134410e+01},
    931   {9.100000e+02, 9.139206e+01},
    932   {9.000000e+02, 9.149245e+01},
    933   {8.900000e+02, 9.162473e+01},
    934   {8.800000e+02, 9.170761e+01},
    935   {8.700000e+02, 9.175441e+01},
    936   {8.600000e+02, 9.183147e+01},
    937   {8.500000e+02, 9.193368e+01},
    938   {8.400000e+02, 9.194690e+01},
    939   {8.300000e+02, 9.171778e+01},
    940   {8.200000e+02, 9.176028e+01},
    941   {8.100000e+02, 9.201883e+01},
    942   {8.000000e+02, 9.219911e+01},
    943   {7.900000e+02, 9.231172e+01},
    944   {7.800000e+02, 9.241025e+01},
    945   {7.700000e+02, 9.257628e+01},
    946   {7.600000e+02, 9.270184e+01},
    947   {7.500000e+02, 9.294644e+01},
    948   {7.400000e+02, 9.311713e+01},
    949   {7.300000e+02, 9.325057e+01},
    950   {7.200000e+02, 9.335799e+01},
    951   {7.100000e+02, 9.342017e+01},
    952   {7.000000e+02, 9.359630e+01},
    953   {6.900000e+02, 9.374759e+01},
    954   {6.800000e+02, 9.377639e+01},
    955   {6.700000e+02, 9.382298e+01},
    956   {6.600000e+02, 9.401642e+01},
    957   {6.500000e+02, 9.414445e+01},
    958   {6.400000e+02, 9.416447e+01},
    959   {6.300000e+02, 9.422827e+01},
    960   {6.200000e+02, 9.429821e+01},
    961   {6.100000e+02, 9.440004e+01},
    962   {6.000000e+02, 9.444127e+01},
    963   {5.900000e+02, 9.435277e+01},
    964   {5.800000e+02, 9.419932e+01},
    965   {5.700000e+02, 9.412157e+01},
    966   {5.600000e+02, 9.399156e+01},
    967   {5.500000e+02, 9.370412e+01},
    968   {5.400000e+02, 9.335538e+01},
    969   {5.300000e+02, 9.332679e+01},
    970   {5.200000e+02, 9.322582e+01},
    971   {5.100000e+02, 9.292740e+01},
    972   {5.000000e+02, 9.256215e+01},
    973   {4.900000e+02, 9.206820e+01},
    974   {4.800000e+02, 9.164663e+01},
    975   {4.700000e+02, 9.113393e+01},
    976   {4.600000e+02, 9.048467e+01},
    977   {4.500000e+02, 8.966771e+01},
    978   {4.400000e+02, 8.882944e+01},
    979   {4.300000e+02, 8.800727e+01},
    980   {4.200000e+02, 8.709829e+01},
    981   {4.100000e+02, 8.630209e+01},
    982   {4.000000e+02, 8.492516e+01},
    983   {3.900000e+02, 8.232475e+01},
    984   {3.800000e+02, 7.954367e+01},
    985   {3.700000e+02, 7.680205e+01},
    986   {3.600000e+02, 7.167577e+01},
    987   {3.500000e+02, 6.186407e+01},
    988   {3.400000e+02, 4.548824e+01},
    989   {3.300000e+02, 2.374455e+01},
    990   {3.200000e+02, 9.198518e+00},
    991   {3.100000e+02, 5.704781e+00},
    992   {3.000000e+02, 5.738476e+00},
    993   {2.900000e+02, 5.864941e+00},
    994   {2.800000e+02, 6.030176e+00},
    995   {2.700000e+02, 6.278084e+00},
    996   {2.600000e+02, 6.773841e+00}
    997 };
    998 
    999 struct nine_mod {
   1000   double position[3];
   1001   double corner[2];
   1002 };
   1003 static const struct nine_mod nine_mods[] = {
   1004   {{-3.454, -1.86, 0.048}, {0.897, 1.81}},
   1005   {{-1.468, -1.86, 0.018}, {0.897, 1.81}},
   1006   {{ 1.468, -1.86, 0.018}, {0.897, 1.81}},
   1007   {{ 3.454, -1.86, 0.048}, {0.897, 1.81}},
   1008   {{-3.454,  1.86, 0.048}, {0.897, 1.81}},
   1009   {{-1.468,  1.86, 0.018}, {0.897, 1.81}},
   1010   {{ 1.468,  1.86, 0.018}, {0.897, 1.81}},
   1011   {{ 3.454,  1.86, 0.048}, {0.897, 1.81}},
   1012   {{ 0.000,  2.39, 0.018}, {0.414, 1.23}}
   1013 };
   1014 
   1015 struct heliostat {
   1016   const char* name;
   1017   double position[3];
   1018   double focal;
   1019 };
   1020 static const struct heliostat heliostats[] = {
   1021   {"B01", {-11.8340, 46.539, 17.84}, 100},
   1022   {"B02", {-0.1490, 48.302, 17.82}, 100},
   1023   {"B03", {11.6700, 47.095, 17.82}, 100},
   1024   {"A01", {-23.6440, 56.246, 20.58}, 100},
   1025   {"B04", {-12.2040, 59.919, 21.07}, 100},
   1026   {"B05", {-0.2320, 60.911, 21.08}, 100},
   1027   {"B06", {11.6830, 59.625, 21.08}, 100},
   1028   {"C01", {23.2590, 56.299, 20.06}, 100},
   1029   {"A02", {-34.9700, 64.211, 21.08}, 100},
   1030   {"A03", {-23.9610, 69.246, 22.08}, 100},
   1031   {"B07", {-12.3260, 72.401, 22.08}, 100},
   1032   {"B08", {-0.2880, 73.22, 22.08}, 100},
   1033   {"B09", {11.7100, 72.156, 22.08}, 100},
   1034   {"C02", {34.5770, 64.338, 20.57}, 100},
   1035   {"C03", {23.3390, 68.96, 21.58}, 100},
   1036   {"A04", {-56.4100, 64.734, 20.57}, 100},
   1037   {"A05", {-46.4600, 71.829, 20.68}, 100},
   1038   {"A06", {-35.6270, 77.407, 21.79}, 100},
   1039   {"A07", {-24.2400, 81.6, 23.58}, 100},
   1040   {"B10", {-12.3970, 84.186, 23.88}, 100},
   1041   {"B11", {-0.3100, 85.049, 23.28}, 100},
   1042   {"B12", {11.7380, 84.168, 23.08}, 100},
   1043   {"C04", {23.4850, 81.342, 22.68}, 100},
   1044   {"C05", {34.8230, 77.083, 22.57}, 100},
   1045   {"C06", {45.7280, 71.581, 21.57}, 100},
   1046   {"A08", {-76.1610, 63.161, 20.97}, 140},
   1047   {"A09", {-67.2300, 71.623, 20.98}, 140},
   1048   {"A10", {-57.5040, 79.046, 21.77}, 140},
   1049   {"A11", {-47.2340, 85.563, 22.17}, 140},
   1050   {"A12", {-36.0550, 90.471, 23.28}, 140},
   1051   {"A13", {-24.4030, 94.008, 24.87}, 140},
   1052   {"B13", {-12.4910, 96.285, 25.17}, 140},
   1053   {"B14", {-0.3820, 96.908, 24.88}, 140},
   1054   {"B15", {11.7240, 96.223, 24.47}, 140},
   1055   {"C07", {23.6220, 93.93, 23.88}, 140},
   1056   {"C08", {35.1820, 90.172, 24.07}, 140},
   1057   {"C09", {46.1050, 84.895, 24.09}, 140},
   1058   {"C10", {56.1270, 78.041, 23.69}, 140},
   1059   {"C11", {66.0610, 70.824, 23.19}, 140},
   1060   {"A14", {-86.4690, 69.749, 22.08}, 140},
   1061   {"A15", {-78.2180, 78.758, 22.59}, 140},
   1062   {"A16", {-68.7400, 86.574, 22.89}, 140},
   1063   {"A17", {-58.6550, 93.434, 23.79}, 140},
   1064   {"A18", {-47.7270, 98.92, 24.59}, 140},
   1065   {"A19", {-36.3690, 103.313, 26.08}, 140},
   1066   {"A20", {-24.6600, 106.615, 26.79}, 140},
   1067   {"B16", {-12.6160, 108.352, 27.29}, 140},
   1068   {"B17", {11.7500, 108.23, 26.38}, 140},
   1069   {"C12", {23.8020, 106.594, 26.08}, 140},
   1070   {"C13", {35.5140, 103.362, 26.08}, 140},
   1071   {"C14", {46.6490, 98.487, 26.08}, 140},
   1072   {"C15", {57.0640, 92.301, 25.17}, 140},
   1073   {"C16", {67.0710, 85.344, 25.18}, 140},
   1074   {"C17", {77.0880, 78.083, 24.58}, 140},
   1075   {"C18", {85.8240, 69.393, 23.29}, 140},
   1076   {"D01", {-98.3820, 79.186, 23.18}, 140},
   1077   {"D02", {-88.9220, 87.315, 24.08}, 140},
   1078   {"D03", {-79.5600, 95.245, 24.58}, 140},
   1079   {"D04", {-69.1900, 101.875, 26.27}, 140},
   1080   {"D05", {-58.1580, 107.337, 27.19}, 140},
   1081   {"D06", {-47.3180, 112.903, 28.36}, 140},
   1082   {"E01", {-36.1280, 117.572, 28.85}, 140},
   1083   {"E02", {-24.5960, 121.288, 28.77}, 140},
   1084   {"E03", {-12.6570, 123.567, 28.46}, 140},
   1085   {"E04", {-0.4750, 123.792, 28.26}, 140},
   1086   {"E05", {11.6570, 123.129, 27.77}, 140},
   1087   {"E06", {23.4160, 120.183, 28.37}, 140},
   1088   {"E07", {35.2270, 117.24, 28.55}, 140},
   1089   {"F01", {46.8990, 113.692, 28.75}, 140},
   1090   {"F02", {57.5370, 107.794, 28.45}, 140},
   1091   {"F03", {67.3980, 100.753, 27.67}, 140},
   1092   {"F04", {77.2170, 93.558, 27.65}, 140},
   1093   {"F05", {87.4920, 86.435, 26.99}, 140},
   1094   {"F06", {95.2200, 77.038, 26.08}, 140},
   1095   {"D07", {-110.017, 89.957, 24.68}, 200},
   1096   {"D08", {-100.877, 98.302, 25.78}, 200},
   1097   {"D09", {-90.1820, 105.059, 26.87}, 200},
   1098   {"D10", {-80.4400, 112.431, 27.86}, 200},
   1099   {"D11", {-69.7650, 118.547, 28.77}, 140},
   1100   {"D12", {-58.7820, 123.826, 29.75}, 140},
   1101   {"D13", {-48.0520, 129.561, 29.98}, 140},
   1102   {"E08", {-36.7080, 133.913, 30.66}, 140},
   1103   {"E09", {-24.8130, 136.403, 30.77}, 140},
   1104   {"E10", {-12.7110, 137.909, 30.85}, 140},
   1105   {"E11", {-0.5520, 138.269, 30.66}, 140},
   1106   {"F07", {47.2000, 129.579, 30.55}, 140},
   1107   {"F08", {58.3950, 124.823, 30.36}, 140},
   1108   {"F09", {68.5430, 118.115, 30.24}, 140},
   1109   {"F10", {77.7420, 110.194, 30.23}, 140},
   1110   {"F11", {87.8490, 103.232, 30.15}, 140},
   1111   {"F12", {97.5330, 95.576, 29.66}, 140},
   1112   {"F13", {104.4740, 85.645, 28.96}, 140},
   1113   {"D14", {-121.779, 102.198, 26.26}, 200},
   1114   {"D15", {-112.519, 110.4, 27.27}, 200},
   1115   {"D16", {-102.334, 117.583, 28.26}, 200},
   1116   {"D17", {-92.7160, 125.102, 29.27}, 200},
   1117   {"D18", {-82.1320, 131.386, 30.17}, 200},
   1118   {"D19", {-71.1180, 136.747, 31.06}, 200},
   1119   {"D20", {-59.9610, 141.661, 32.07}, 200},
   1120   {"D21", {-48.9840, 146.93, 32.66}, 200},
   1121   {"E15", {-37.3880, 150.568, 33.48}, 200},
   1122   {"E16", {-25.0940, 151.617, 33.68}, 200},
   1123   {"E17", {-12.7640, 151.597, 33.76}, 200},
   1124   {"E18", {-0.6340, 152.314, 33.66}, 200},
   1125   {"E19", {11.5570, 152.435, 33.57}, 200},
   1126   {"E20", {23.7670, 151.509, 33.46}, 200},
   1127   {"E21", {35.8480, 149.697, 33.25}, 200},
   1128   {"F14", {47.7370, 146.913, 32.75}, 200},
   1129   {"F15", {59.2600, 142.885, 32.55}, 200},
   1130   {"F16", {70.1740, 137.545, 32.26}, 200},
   1131   {"F17", {80.0350, 130.385, 32.26}, 200},
   1132   {"F18", {89.1590, 122.299, 32.15}, 200},
   1133   {"F19", {98.8470, 114.88, 32.06}, 200},
   1134   {"F20", {107.5660, 106.391, 31.84}, 200},
   1135   {"F21", {114.6430, 96.48, 31.65}, 200}
   1136 };
   1137 
   1138 /*******************************************************************************
   1139  * Helper macros
   1140  ******************************************************************************/
   1141 #define SZ(Array) (sizeof(Array)/sizeof(Array[0]))
   1142 #define SPLIT2(Array) Array[0], Array[1]
   1143 #define SPLIT3(Array) Array[0], Array[1], Array[2]
   1144 
   1145 /*******************************************************************************
   1146  * Helper functions
   1147  ******************************************************************************/
   1148 static void
   1149 print_section(const char* name)
   1150 {
   1151   printf("########################################\n");
   1152   printf("# %s\n", name);
   1153   printf("########################################\n");
   1154 }
   1155 
   1156 static void
   1157 print_spectrum
   1158   (const char* name,
   1159    const double spectrum[][2],
   1160    const size_t ndata,
   1161    const double scale[2])
   1162 {
   1163   size_t i;
   1164   printf("- spectrum: &%s\n", name);
   1165   for(i=0; i<ndata; ++i) {
   1166     printf("  - {wavelength: %e, data: %e}\n",
   1167       spectrum[i][0]*scale[0],
   1168       spectrum[i][1]*scale[1]);
   1169   }
   1170 }
   1171 
   1172 /* Heliostat */
   1173 static void
   1174 print_heliostat
   1175   (const struct heliostat* hstat,
   1176    const double tgt_pt[3],
   1177    const double themis_target[3])
   1178 {
   1179   const double PI = acos(-1.0);
   1180   size_t i;
   1181 
   1182   printf("- entity:\n");
   1183   printf("    name: %s\n", hstat->name);
   1184   printf("    transform: {translation: [%g,%g,%g]}\n", SPLIT3(hstat->position));
   1185   printf("    children:\n");
   1186   printf("    - name: cethel3\n");
   1187   printf("      primary: 0\n");
   1188   printf("      geometry:\n");
   1189   printf("      - material: *occultant\n");
   1190   printf("        transform: {translation: [0, 0, -2.5]}\n");
   1191   printf("        cylinder: {height: 5, radius: 0.3}\n");
   1192   printf("      children:\n");
   1193   printf("      - name: pivot\n");
   1194   printf("        zx_pivot: {target: {position: [%g,%g,%g]}}\n", SPLIT3(tgt_pt));
   1195   printf("        children:\n");
   1196   printf("        - name: nine_mods\n");
   1197   printf("          primary: 1\n");
   1198   printf("          transform: {rotation: [-90, 0, 180]}\n");
   1199   printf("          geometry:\n");
   1200 
   1201   for(i=0; i<SZ(nine_mods); ++i) {
   1202     const double* xyz = nine_mods[i].position;
   1203     const double* corner = nine_mods[i].corner;
   1204     double v[3];
   1205     double rotx, roty, zbar, focal_h, slant_range;
   1206 
   1207     /* compute the rotation of the modules : parabolic structure with focal =
   1208      * slant_range */
   1209     v[0] = themis_target[0] - hstat->position[0];
   1210     v[1] = themis_target[1] - hstat->position[1];
   1211     v[2] = themis_target[2] - hstat->position[2];
   1212     slant_range = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
   1213 
   1214     focal_h = slant_range; /* structure parabolique et module sphérique */
   1215     zbar = 2.0 * focal_h ; /* - 0.25*xyz[1]*xyz[1]/focal_h ;*/
   1216     rotx =  atan(xyz[1]/zbar) * 180.0 / PI;
   1217     roty = -atan(xyz[0]/zbar) * 180.0 / PI;
   1218 
   1219     /* print the module transform and the spherical module surface */
   1220     printf("          - material: *specular\n");
   1221     printf("            transform: {translation: [%g, %g, %g], rotation: [%g, %g, 0]}\n",
   1222       SPLIT3(xyz), rotx, roty); 
   1223     printf("            hemisphere: {\
   1224 radius: %g, slices: 32, \
   1225 clip: [{operation: AND, vertices: [[-%g,-%g],[-%g, %g],[%g,%g],[%g,-%g]]}]}\n",
   1226       hstat->focal * 2, 
   1227       SPLIT2(corner), 
   1228       SPLIT2(corner),
   1229       SPLIT2(corner),
   1230       SPLIT2(corner));
   1231   }
   1232 }
   1233 
   1234 /* Target definition */
   1235 static void
   1236 print_target(const double size, const unsigned slices, const double tgt_pt[3])
   1237 {
   1238   const double hsz = size * 0.5; /* Half size */
   1239   printf("- entity:\n");
   1240   printf("    name: target_e\n");
   1241   printf("    primary: 0\n");
   1242   printf("    transform: {translation: [%g, %g, %g], rotation: [-90, 0, 0]}\n",
   1243     tgt_pt[0], tgt_pt[1]+0.5, tgt_pt[2] - 0.1); /* X rotation -37-90 = -127*/
   1244   printf("    geometry:\n");
   1245   printf("    - material: *occultant\n");
   1246   printf("      plane:\n");
   1247   printf("        slices: %u\n", slices);
   1248   printf("        clip:\n");
   1249   printf("        - operation: AND\n");
   1250   printf("          vertices: [[%g, %g],[%g, %G],[%g, %g],[%g, %g]]\n",
   1251     -hsz, -hsz, -hsz, hsz, hsz, hsz, hsz, -hsz);
   1252 }
   1253 
   1254 
   1255 /*******************************************************************************
   1256  * Main program
   1257  ******************************************************************************/
   1258 int
   1259 main(int argc, char** argv)
   1260 {
   1261   const double one[2] = {1, 1};
   1262   const double scl[2] = {0.001, 0.01};
   1263   const double target_point[3]  = {0, 6.2, 87.15};/* Aiming point for the flux computation */
   1264   const double themis_target[3] = { 0, 6.2, 87.15};/* to compute slant range */
   1265   const double corr = 4. ;/* correction length due to offset of the stl */
   1266   size_t i;
   1267 
   1268   /* Spectra */
   1269   print_section("Spectra");
   1270   print_spectrum("solar_spectrum", solar_spectrum, SZ(solar_spectrum), one);
   1271   printf("\n");
   1272   print_spectrum("ref_mirror", ref_mirror, SZ(ref_mirror), scl);
   1273   printf("\n");
   1274 
   1275   /* Sun & atmosphere */
   1276   print_section("Sun & atmosphere");
   1277   printf("- sun: {dni: 1000, spectrum: *solar_spectrum}\n");
   1278   printf("- atmosphere: {extinction: 0.0001}\n");
   1279   printf("\n");
   1280 
   1281   /* Materials */
   1282   print_section("Materials");
   1283   printf("- material: &occultant {matte: {reflectivity: 0}}\n");
   1284   printf("- material: &specular {mirror: {reflectivity: *ref_mirror, slope_error: 1.e-3}}\n");
   1285   printf("- material: &lambertian\n");
   1286   printf("    front: {matte: {reflectivity: 0.9}}\n");
   1287   printf("    back:  {matte: {reflectivity: 0.0}}\n");
   1288   printf("\n");
   1289 
   1290   /* Themis tower */
   1291   print_section("Tower");
   1292 
   1293   print_target(3, 128, target_point);
   1294 
   1295   printf("- entity:\n");
   1296   printf("    name: tower\n");
   1297   printf("    primary: 0\n");
   1298   printf("    transform: {translation: [0, %g, 0]}\n", -corr);
   1299   printf("    geometry:\n");
   1300   printf("    - {material: *occultant, stl: {path: top_tower.stl}}\n");
   1301   printf("    - {material: *occultant, stl: {path: grd_tower.stl}}\n");
   1302   printf("\n");
   1303 
   1304   printf("- entity:\n");
   1305   printf("    name: nextcsp_rcv\n");
   1306   printf("    primary: 0\n");
   1307   printf("    transform: {translation: [0, %g, %g]}\n", 
   1308     target_point[1], target_point[2] - 2.5);
   1309   printf("    geometry: \n");
   1310   printf("    - {material: *lambertian, stl: {path: disp.stl}}\n");
   1311   printf("    - {material: *lambertian, stl: {path: pnew1.stl}}\n");
   1312   printf("    - {material: *lambertian, stl: {path: pnew2.stl}}\n");
   1313   printf("    - {material: *lambertian, stl: {path: pnup.stl}}\n");
   1314   printf("\n");
   1315 
   1316   /* Templates of the heliostat */
   1317   print_section("Heliostats");
   1318   for(i=0; i<SZ(heliostats); ++i) {
   1319     print_heliostat(&heliostats[i], target_point, themis_target);
   1320     printf("\n");
   1321   }
   1322   return 0;
   1323 }
   1324