JURASSIC
Functions
jurassic.c File Reference

JURASSIC library definitions. More...

#include "jurassic.h"

Go to the source code of this file.

Functions

void analyze_avk (ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *avk)
 
void analyze_avk_quantity (gsl_matrix *avk, int iq, int *ipa, size_t *n0, size_t *n1, double *cont, double *res)
 
size_t atm2x (const ctl_t *ctl, const atm_t *atm, gsl_vector *x, int *iqa, int *ipa)
 Convert atmospheric data to state vector elements. More...
 
void atm2x_help (const double value, const int value_iqa, const int value_ip, gsl_vector *x, int *iqa, int *ipa, size_t *n)
 Append a single atmospheric value to the state vector. More...
 
void cart2geo (const double *x, double *z, double *lon, double *lat)
 Converts Cartesian coordinates to geographic coordinates. More...
 
void climatology (const ctl_t *ctl, atm_t *atm)
 Initializes atmospheric climatology profiles. More...
 
double cost_function (gsl_vector *dx, gsl_vector *dy, gsl_matrix *s_a_inv, gsl_vector *sig_eps_inv)
 
double ctmco2 (const double nu, const double p, const double t, const double u)
 Compute carbon dioxide continuum (optical depth). More...
 
double ctmh2o (const double nu, const double p, const double t, const double q, const double u)
 Compute water vapor continuum (optical depth). More...
 
double ctmn2 (const double nu, const double p, const double t)
 Compute N₂ collision-induced absorption coefficient. More...
 
double ctmo2 (const double nu, const double p, const double t)
 Compute O₂ collision-induced absorption coefficient. More...
 
void copy_atm (const ctl_t *ctl, atm_t *atm_dest, const atm_t *atm_src, const int init)
 Copy or initialize atmospheric profile data. More...
 
void copy_obs (const ctl_t *ctl, obs_t *obs_dest, const obs_t *obs_src, const int init)
 Copy or initialize observation geometry and radiance data. More...
 
int find_emitter (const ctl_t *ctl, const char *emitter)
 Find gas species index by name. More...
 
void formod (const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
 Execute the selected forward model. More...
 
void formod_continua (const ctl_t *ctl, const los_t *los, const int ip, double *beta)
 Compute total extinction including gaseous continua. More...
 
void formod_fov (const ctl_t *ctl, obs_t *obs)
 Apply field-of-view (FOV) convolution to modeled radiances. More...
 
void formod_pencil (const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs, const int ir)
 Compute line-of-sight radiances using the pencil-beam forward model. More...
 
void formod_rfm (const ctl_t *ctl, const atm_t *atm, obs_t *obs)
 Interface routine for the Reference Forward Model (RFM). More...
 
void formod_srcfunc (const ctl_t *ctl, const tbl_t *tbl, const double t, double *src)
 Interpolate the source function (Planck radiance) at a given temperature. More...
 
void geo2cart (const double z, const double lon, const double lat, double *x)
 Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates. More...
 
void hydrostatic (const ctl_t *ctl, atm_t *atm)
 Adjust pressure profile using the hydrostatic equation. More...
 
void idx2name (const ctl_t *ctl, const int idx, char *quantity)
 Convert a quantity index to a descriptive name string. More...
 
void init_srcfunc (const ctl_t *ctl, tbl_t *tbl)
 Initialize the source-function (Planck radiance) lookup table. More...
 
void intpol_atm (const ctl_t *ctl, const atm_t *atm, const double z, double *p, double *t, double *q, double *k)
 Interpolate atmospheric state variables at a given altitude. More...
 
void intpol_tbl_cga (const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
 Interpolate emissivities and transmittances using the Curtis–Godson approximation (CGA). More...
 
void intpol_tbl_ega (const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
 Interpolate emissivities and transmittances using the Emissivity Growth Approximation (EGA). More...
 
double intpol_tbl_eps (const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double u)
 Interpolate emissivity from lookup tables as a function of column density. More...
 
double intpol_tbl_u (const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double eps)
 Interpolate column density from lookup tables as a function of emissivity. More...
 
void jsec2time (const double jsec, int *year, int *mon, int *day, int *hour, int *min, int *sec, double *remain)
 Converts Julian seconds to calendar date and time components. More...
 
void kernel (const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs, gsl_matrix *k)
 Compute the Jacobian (kernel) matrix by finite differences. More...
 
int locate_irr (const double *xx, const int n, const double x)
 Locate index for interpolation on an irregular grid. More...
 
int locate_reg (const double *xx, const int n, const double x)
 Locate index for interpolation on a regular (uniform) grid. More...
 
int locate_tbl (const float *xx, const int n, const double x)
 Locate index for interpolation within emissivity table grids. More...
 
void matrix_invert (gsl_matrix *a)
 
void matrix_product (gsl_matrix *a, gsl_vector *b, int transpose, gsl_matrix *c)
 
size_t obs2y (const ctl_t *ctl, const obs_t *obs, gsl_vector *y, int *ida, int *ira)
 Convert observation radiances into a measurement vector. More...
 
void raytrace (const ctl_t *ctl, const atm_t *atm, obs_t *obs, los_t *los, const int ir)
 Perform line-of-sight (LOS) ray tracing through the atmosphere. More...
 
void read_atm (const char *dirname, const char *filename, const ctl_t *ctl, atm_t *atm)
 Read atmospheric profile data from an ASCII file. More...
 
void read_ctl (int argc, char *argv[], ctl_t *ctl)
 Read model control parameters from command-line and configuration input. More...
 
void read_matrix (const char *dirname, const char *filename, gsl_matrix *matrix)
 Read a numerical matrix from an ASCII file. More...
 
void read_obs (const char *dirname, const char *filename, const ctl_t *ctl, obs_t *obs)
 Read observation geometry and radiance data from an ASCII file. More...
 
double read_obs_rfm (const char *basename, const double z, double *nu, double *f, int n)
 Read and spectrally convolve an RFM output spectrum. More...
 
void read_ret (int argc, char *argv[], ctl_t *ctl, ret_t *ret)
 
void read_rfm_spec (const char *filename, double *nu, double *rad, int *npts)
 Read a Reference Forward Model (RFM) ASCII spectrum. More...
 
void read_shape (const char *filename, double *x, double *y, int *n)
 Read a two-column shape function from an ASCII file. More...
 
tbl_tread_tbl (const ctl_t *ctl)
 Read gas emissivity look-up tables for all channels and emitters. More...
 
double scan_ctl (int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
 Scan control file or command-line arguments for a configuration variable. More...
 
double sza (const double sec, const double lon, const double lat)
 Compute the solar zenith angle for a given time and location. More...
 
void set_cov_apr (ret_t *ret, ctl_t *ctl, atm_t *atm, int *iqa, int *ipa, gsl_matrix *s_a)
 
void set_cov_meas (ret_t *ret, ctl_t *ctl, obs_t *obs, gsl_vector *sig_noise, gsl_vector *sig_formod, gsl_vector *sig_eps_inv)
 
void tangent_point (const los_t *los, double *tpz, double *tplon, double *tplat)
 Determine the tangent point along a line of sight (LOS). More...
 
void time2jsec (const int year, const int mon, const int day, const int hour, const int min, const int sec, const double remain, double *jsec)
 Converts time components to seconds since January 1, 2000, 12:00:00 UTC. More...
 
void timer (const char *name, const char *file, const char *func, int line, int mode)
 
void write_atm (const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm)
 
void write_atm_rfm (const char *filename, const ctl_t *ctl, const atm_t *atm)
 
void write_matrix (const char *dirname, const char *filename, const ctl_t *ctl, const gsl_matrix *matrix, const atm_t *atm, const obs_t *obs, const char *rowspace, const char *colspace, const char *sort)
 
void write_obs (const char *dirname, const char *filename, const ctl_t *ctl, const obs_t *obs)
 
void write_shape (const char *filename, const double *x, const double *y, const int n)
 
void write_stddev (const char *quantity, ret_t *ret, ctl_t *ctl, atm_t *atm, gsl_matrix *s)
 
void write_tbl (const ctl_t *ctl, const tbl_t *tbl)
 
void x2atm (const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
 
void x2atm_help (double *value, const gsl_vector *x, size_t *n)
 
void y2obs (const ctl_t *ctl, const gsl_vector *y, obs_t *obs)
 

Detailed Description

JURASSIC library definitions.

Definition in file jurassic.c.

Function Documentation

◆ analyze_avk()

void analyze_avk ( ret_t ret,
ctl_t ctl,
atm_t atm,
int *  iqa,
int *  ipa,
gsl_matrix *  avk 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 29 of file jurassic.c.

35 {
36
37 static atm_t atm_cont, atm_res;
38
39 size_t i, n0[NQ], n1[NQ];
40
41 /* Get sizes... */
42 const size_t n = avk->size1;
43
44 /* Find sub-matrices for different quantities... */
45 for (int iq = 0; iq < NQ; iq++) {
46 n0[iq] = N;
47 for (i = 0; i < n; i++) {
48 if (iqa[i] == iq && n0[iq] == N)
49 n0[iq] = i;
50 if (iqa[i] == iq)
51 n1[iq] = i - n0[iq] + 1;
52 }
53 }
54
55 /* Initialize... */
56 copy_atm(ctl, &atm_cont, atm, 1);
57 copy_atm(ctl, &atm_res, atm, 1);
58
59 /* Analyze quantities... */
60 analyze_avk_quantity(avk, IDXP, ipa, n0, n1, atm_cont.p, atm_res.p);
61 analyze_avk_quantity(avk, IDXT, ipa, n0, n1, atm_cont.t, atm_res.t);
62 for (int ig = 0; ig < ctl->ng; ig++)
63 analyze_avk_quantity(avk, IDXQ(ig), ipa, n0, n1,
64 atm_cont.q[ig], atm_res.q[ig]);
65 for (int iw = 0; iw < ctl->nw; iw++)
66 analyze_avk_quantity(avk, IDXK(iw), ipa, n0, n1,
67 atm_cont.k[iw], atm_res.k[iw]);
68 analyze_avk_quantity(avk, IDXCLZ, ipa, n0, n1, &atm_cont.clz, &atm_res.clz);
69 analyze_avk_quantity(avk, IDXCLDZ, ipa, n0, n1, &atm_cont.cldz,
70 &atm_res.cldz);
71 for (int icl = 0; icl < ctl->ncl; icl++)
72 analyze_avk_quantity(avk, IDXCLK(icl), ipa, n0, n1,
73 &atm_cont.clk[icl], &atm_res.clk[icl]);
74 analyze_avk_quantity(avk, IDXSFT, ipa, n0, n1, &atm_cont.sft, &atm_res.sft);
75 for (int isf = 0; isf < ctl->nsf; isf++)
76 analyze_avk_quantity(avk, IDXSFEPS(isf), ipa, n0, n1,
77 &atm_cont.sfeps[isf], &atm_res.sfeps[isf]);
78
79 /* Write results to disk... */
80 write_atm(ret->dir, "atm_cont.tab", ctl, &atm_cont);
81 write_atm(ret->dir, "atm_res.tab", ctl, &atm_res);
82}
void write_atm(const char *dirname, const char *filename, const ctl_t *ctl, const atm_t *atm)
Definition: jurassic.c:5868
void copy_atm(const ctl_t *ctl, atm_t *atm_dest, const atm_t *atm_src, const int init)
Copy or initialize atmospheric profile data.
Definition: jurassic.c:3217
void analyze_avk_quantity(gsl_matrix *avk, int iq, int *ipa, size_t *n0, size_t *n1, double *cont, double *res)
Definition: jurassic.c:86
#define N
Maximum size of state vector.
Definition: jurassic.h:276
#define IDXCLZ
Index for cloud layer height.
Definition: jurassic.h:341
#define IDXCLDZ
Index for cloud layer depth.
Definition: jurassic.h:344
#define IDXK(iw)
Indices for extinction.
Definition: jurassic.h:338
#define NQ
Maximum number of quantities.
Definition: jurassic.h:281
#define IDXSFT
Index for surface layer temperature.
Definition: jurassic.h:350
#define IDXSFEPS(isf)
Indices for surface layer emissivity.
Definition: jurassic.h:353
#define IDXCLK(icl)
Indices for cloud layer extinction.
Definition: jurassic.h:347
#define IDXP
Index for pressure.
Definition: jurassic.h:329
#define IDXQ(ig)
Indices for volume mixing ratios.
Definition: jurassic.h:335
#define IDXT
Index for temperature.
Definition: jurassic.h:332
Atmospheric profile data.
Definition: jurassic.h:914
double sfeps[NSF]
Surface emissivity.
Definition: jurassic.h:956
double k[NW][NP]
Extinction [km^-1].
Definition: jurassic.h:941
double t[NP]
Temperature [K].
Definition: jurassic.h:935
double clz
Cloud layer height [km].
Definition: jurassic.h:944
double cldz
Cloud layer depth [km].
Definition: jurassic.h:947
double sft
Surface temperature [K].
Definition: jurassic.h:953
double clk[NCL]
Cloud layer extinction [km^-1].
Definition: jurassic.h:950
double q[NG][NP]
Volume mixing ratio [ppv].
Definition: jurassic.h:938
double p[NP]
Pressure [hPa].
Definition: jurassic.h:932
int nw
Number of spectral windows.
Definition: jurassic.h:994
int ng
Number of emitters.
Definition: jurassic.h:970
int ncl
Number of cloud layer spectral grid points.
Definition: jurassic.h:1000
int nsf
Number of surface layer spectral grid points.
Definition: jurassic.h:1006
char dir[LEN]
Working directory.
Definition: jurassic.h:1242
Here is the call graph for this function:

◆ analyze_avk_quantity()

void analyze_avk_quantity ( gsl_matrix *  avk,
int  iq,
int *  ipa,
size_t *  n0,
size_t *  n1,
double *  cont,
double *  res 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 86 of file jurassic.c.

93 {
94
95 /* Loop over state vector elements... */
96 if (n0[iq] < N)
97 for (size_t i = 0; i < n1[iq]; i++) {
98
99 /* Get area of averaging kernel... */
100 for (size_t j = 0; j < n1[iq]; j++)
101 cont[ipa[n0[iq] + i]] += gsl_matrix_get(avk, n0[iq] + i, n0[iq] + j);
102
103 /* Get information density... */
104 res[ipa[n0[iq] + i]] = 1 / gsl_matrix_get(avk, n0[iq] + i, n0[iq] + i);
105 }
106}

◆ atm2x()

size_t atm2x ( const ctl_t ctl,
const atm_t atm,
gsl_vector *  x,
int *  iqa,
int *  ipa 
)

Convert atmospheric data to state vector elements.

Extracts selected quantities from an atmospheric profile (atm_t) according to retrieval settings in ctl_t, and appends them to the state vector x. For each included quantity, the function also stores its quantity index (iqa) and profile index (ipa).

The function respects retrieval altitude limits defined in ctl (e.g., retp_zmin/zmax, rett_zmin/zmax, etc.) and includes only variables flagged for retrieval (e.g., ret_clz, ret_sft, etc.).

Parameters
[in]ctlControl settings defining retrieval configuration and limits.
[in]atmAtmospheric profile data to extract from.
[out]xGSL vector to store state-vector elements.
[out]iqaQuantity index array corresponding to elements in x.
[out]ipaProfile index array corresponding to elements in x.
Returns
Number of elements written to the state vector.
Note
Internally calls atm2x_help() to append individual values.
See also
atm_t, ctl_t, atm2x_help
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 110 of file jurassic.c.

115 {
116
117 size_t n = 0;
118
119 /* Add pressure... */
120 for (int ip = 0; ip < atm->np; ip++)
121 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
122 atm2x_help(atm->p[ip], IDXP, ip, x, iqa, ipa, &n);
123
124 /* Add temperature... */
125 for (int ip = 0; ip < atm->np; ip++)
126 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
127 atm2x_help(atm->t[ip], IDXT, ip, x, iqa, ipa, &n);
128
129 /* Add volume mixing ratios... */
130 for (int ig = 0; ig < ctl->ng; ig++)
131 for (int ip = 0; ip < atm->np; ip++)
132 if (atm->z[ip] >= ctl->retq_zmin[ig]
133 && atm->z[ip] <= ctl->retq_zmax[ig])
134 atm2x_help(atm->q[ig][ip], IDXQ(ig), ip, x, iqa, ipa, &n);
135
136 /* Add extinction... */
137 for (int iw = 0; iw < ctl->nw; iw++)
138 for (int ip = 0; ip < atm->np; ip++)
139 if (atm->z[ip] >= ctl->retk_zmin[iw]
140 && atm->z[ip] <= ctl->retk_zmax[iw])
141 atm2x_help(atm->k[iw][ip], IDXK(iw), ip, x, iqa, ipa, &n);
142
143 /* Add cloud parameters... */
144 if (ctl->ret_clz)
145 atm2x_help(atm->clz, IDXCLZ, 0, x, iqa, ipa, &n);
146 if (ctl->ret_cldz)
147 atm2x_help(atm->cldz, IDXCLDZ, 0, x, iqa, ipa, &n);
148 if (ctl->ret_clk)
149 for (int icl = 0; icl < ctl->ncl; icl++)
150 atm2x_help(atm->clk[icl], IDXCLK(icl), 0, x, iqa, ipa, &n);
151
152 /* Add surface parameters... */
153 if (ctl->ret_sft)
154 atm2x_help(atm->sft, IDXSFT, 0, x, iqa, ipa, &n);
155 if (ctl->ret_sfeps)
156 for (int isf = 0; isf < ctl->nsf; isf++)
157 atm2x_help(atm->sfeps[isf], IDXSFEPS(isf), 0, x, iqa, ipa, &n);
158
159 return n;
160}
void atm2x_help(const double value, const int value_iqa, const int value_ip, gsl_vector *x, int *iqa, int *ipa, size_t *n)
Append a single atmospheric value to the state vector.
Definition: jurassic.c:164
int np
Number of data points.
Definition: jurassic.h:917
double z[NP]
Altitude [km].
Definition: jurassic.h:923
double retp_zmin
Minimum altitude for pressure retrieval [km].
Definition: jurassic.h:1060
double retk_zmax[NW]
Maximum altitude for extinction retrieval [km].
Definition: jurassic.h:1081
double rett_zmax
Maximum altitude for temperature retrieval [km].
Definition: jurassic.h:1069
int ret_sfeps
Retrieve surface layer emissivity (0=no, 1=yes).
Definition: jurassic.h:1096
int ret_sft
Retrieve surface layer temperature (0=no, 1=yes).
Definition: jurassic.h:1093
int ret_clz
Retrieve cloud layer height (0=no, 1=yes).
Definition: jurassic.h:1084
double retq_zmax[NG]
Maximum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1075
double retq_zmin[NG]
Minimum altitude for volume mixing ratio retrieval [km].
Definition: jurassic.h:1072
double rett_zmin
Minimum altitude for temperature retrieval [km].
Definition: jurassic.h:1066
double retk_zmin[NW]
Minimum altitude for extinction retrieval [km].
Definition: jurassic.h:1078
int ret_clk
Retrieve cloud layer extinction (0=no, 1=yes).
Definition: jurassic.h:1090
int ret_cldz
Retrieve cloud layer depth (0=no, 1=yes).
Definition: jurassic.h:1087
double retp_zmax
Maximum altitude for pressure retrieval [km].
Definition: jurassic.h:1063
Here is the call graph for this function:

◆ atm2x_help()

void atm2x_help ( const double  value,
const int  value_iqa,
const int  value_ip,
gsl_vector *  x,
int *  iqa,
int *  ipa,
size_t *  n 
)

Append a single atmospheric value to the state vector.

Helper routine for atm2x(). Inserts one scalar value and its corresponding quantity and profile indices into the state vector and tracking arrays, then increments the element counter.

Parameters
[in]valueValue to add to the state vector.
[in]value_iqaQuantity index (e.g., IDXP, IDXT, etc.).
[in]value_ipProfile index within the atmospheric profile.
[out]xGSL vector containing state-vector elements (may be NULL).
[out]iqaQuantity index array corresponding to x (may be NULL).
[out]ipaProfile index array corresponding to x (may be NULL).
[in,out]nCurrent number of elements in the state vector; incremented on return.
Note
This function performs no range checking and assumes valid array bounds.
See also
atm2x
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 164 of file jurassic.c.

171 {
172
173 /* Add element to state vector... */
174 if (x != NULL)
175 gsl_vector_set(x, *n, value);
176 if (iqa != NULL)
177 iqa[*n] = value_iqa;
178 if (ipa != NULL)
179 ipa[*n] = value_ip;
180 (*n)++;
181}

◆ cart2geo()

void cart2geo ( const double *  x,
double *  z,
double *  lon,
double *  lat 
)

Converts Cartesian coordinates to geographic coordinates.

This function converts a point from Cartesian coordinates (x, y, z) to geographic coordinates (longitude, latitude, and altitude). It uses the spherical Earth approximation for the conversion.

Parameters
xPointer to an array containing the Cartesian coordinates (x, y, z) in kilometers.
zPointer to a double where the computed altitude (above the reference ellipsoid) will be stored, in kilometers.
lonPointer to a double where the computed longitude (in degrees) will be stored.
latPointer to a double where the computed latitude (in degrees) will be stored.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 185 of file jurassic.c.

189 {
190
191 const double radius = NORM(x);
192
193 *lat = RAD2DEG(asin(x[2] / radius));
194 *lon = RAD2DEG(atan2(x[1], x[0]));
195 *z = radius - RE;
196}
#define RE
Mean radius of Earth [km].
Definition: jurassic.h:187
#define NORM(a)
Compute the norm (magnitude) of a 3D vector.
Definition: jurassic.h:636
#define RAD2DEG(rad)
Convert radians to degrees.
Definition: jurassic.h:698

◆ climatology()

void climatology ( const ctl_t ctl,
atm_t atm_mean 
)

Initializes atmospheric climatology profiles.

This function populates the atmospheric state (atm) with standard climatological profiles of pressure, temperature, and trace gas concentrations (e.g., H2O, CH4, CO, O3, etc.) as a function of altitude. The profiles are based on reference climatological datasets and are used for atmospheric modeling and radiative transfer calculations.

Parameters
[in]ctlControl parameters structure.
[out]atmAtmospheric state structure to be populated with climatological data.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 200 of file jurassic.c.

202 {
203
204 static const double z[121] = {
205 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
206 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
207 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
208 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
209 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
210 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
211 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
212 };
213
214 static const double pre[121] = {
215 1017, 901.083, 796.45, 702.227, 617.614, 541.644, 473.437, 412.288,
216 357.603, 308.96, 265.994, 228.348, 195.619, 167.351, 143.039, 122.198,
217 104.369, 89.141, 76.1528, 65.0804, 55.641, 47.591, 40.7233, 34.8637,
218 29.8633, 25.5956, 21.9534, 18.8445, 16.1909, 13.9258, 11.9913,
219 10.34, 8.92988, 7.72454, 6.6924, 5.80701, 5.04654, 4.39238, 3.82902,
220 3.34337, 2.92413, 2.56128, 2.2464, 1.97258, 1.73384, 1.52519, 1.34242,
221 1.18197, 1.04086, 0.916546, 0.806832, 0.709875, 0.624101, 0.548176,
222 0.480974, 0.421507, 0.368904, 0.322408, 0.281386, 0.245249, 0.213465,
223 0.185549, 0.161072, 0.139644, 0.120913, 0.104568, 0.0903249, 0.0779269,
224 0.0671493, 0.0577962, 0.0496902, 0.0426736, 0.0366093, 0.0313743,
225 0.0268598, 0.0229699, 0.0196206, 0.0167399, 0.0142646, 0.0121397,
226 0.0103181, 0.00875775, 0.00742226, 0.00628076, 0.00530519, 0.00447183,
227 0.00376124, 0.00315632, 0.00264248, 0.00220738, 0.00184003, 0.00153095,
228 0.00127204, 0.00105608, 0.000876652, 0.00072798, 0.00060492,
229 0.000503201, 0.000419226, 0.000349896, 0.000292659, 0.000245421,
230 0.000206394, 0.000174125, 0.000147441, 0.000125333, 0.000106985,
231 9.173e-05, 7.90172e-05, 6.84172e-05, 5.95574e-05, 5.21183e-05,
232 4.58348e-05, 4.05127e-05, 3.59987e-05, 3.21583e-05, 2.88718e-05,
233 2.60322e-05, 2.35687e-05, 2.14263e-05, 1.95489e-05
234 };
235
236 static const double tem[121] = {
237 285.14, 279.34, 273.91, 268.3, 263.24, 256.55, 250.2, 242.82, 236.17,
238 229.87, 225.04, 221.19, 218.85, 217.19, 216.2, 215.68, 215.42, 215.55,
239 215.92, 216.4, 216.93, 217.45, 218, 218.68, 219.39, 220.25, 221.3,
240 222.41, 223.88, 225.42, 227.2, 229.52, 231.89, 234.51, 236.85, 239.42,
241 241.94, 244.57, 247.36, 250.32, 253.34, 255.82, 258.27, 260.39,
242 262.03, 263.45, 264.2, 264.78, 264.67, 264.38, 263.24, 262.03, 260.02,
243 258.09, 255.63, 253.28, 250.43, 247.81, 245.26, 242.77, 240.38,
244 237.94, 235.79, 233.53, 231.5, 229.53, 227.6, 225.62, 223.77, 222.06,
245 220.33, 218.69, 217.18, 215.64, 214.13, 212.52, 210.86, 209.25,
246 207.49, 205.81, 204.11, 202.22, 200.32, 198.39, 195.92, 193.46,
247 190.94, 188.31, 185.82, 183.57, 181.43, 179.74, 178.64, 178.1, 178.25,
248 178.7, 179.41, 180.67, 182.31, 184.18, 186.6, 189.53, 192.66, 196.54,
249 201.13, 205.93, 211.73, 217.86, 225, 233.53, 242.57, 252.14, 261.48,
250 272.97, 285.26, 299.12, 312.2, 324.17, 338.34, 352.56, 365.28
251 };
252
253 static const double c2h2[121] = {
254 1.352e-09, 2.83e-10, 1.269e-10, 6.926e-11, 4.346e-11, 2.909e-11,
255 2.014e-11, 1.363e-11, 8.71e-12, 5.237e-12, 2.718e-12, 1.375e-12,
256 5.786e-13, 2.16e-13, 7.317e-14, 2.551e-14, 1.055e-14, 4.758e-15,
257 2.056e-15, 7.703e-16, 2.82e-16, 1.035e-16, 4.382e-17, 1.946e-17,
258 9.638e-18, 5.2e-18, 2.811e-18, 1.494e-18, 7.925e-19, 4.213e-19,
259 1.998e-19, 8.78e-20, 3.877e-20, 1.728e-20, 7.743e-21, 3.536e-21,
260 1.623e-21, 7.508e-22, 3.508e-22, 1.65e-22, 7.837e-23, 3.733e-23,
261 1.808e-23, 8.77e-24, 4.285e-24, 2.095e-24, 1.032e-24, 5.082e-25,
262 2.506e-25, 1.236e-25, 6.088e-26, 2.996e-26, 1.465e-26, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
266 };
267
268 static const double c2h6[121] = {
269 2.667e-09, 2.02e-09, 1.658e-09, 1.404e-09, 1.234e-09, 1.109e-09,
270 1.012e-09, 9.262e-10, 8.472e-10, 7.71e-10, 6.932e-10, 6.216e-10,
271 5.503e-10, 4.87e-10, 4.342e-10, 3.861e-10, 3.347e-10, 2.772e-10,
272 2.209e-10, 1.672e-10, 1.197e-10, 8.536e-11, 5.783e-11, 3.846e-11,
273 2.495e-11, 1.592e-11, 1.017e-11, 6.327e-12, 3.895e-12, 2.403e-12,
274 1.416e-12, 8.101e-13, 4.649e-13, 2.686e-13, 1.557e-13, 9.14e-14,
275 5.386e-14, 3.19e-14, 1.903e-14, 1.14e-14, 6.875e-15, 4.154e-15,
276 2.538e-15, 1.553e-15, 9.548e-16, 5.872e-16, 3.63e-16, 2.244e-16,
277 1.388e-16, 8.587e-17, 5.308e-17, 3.279e-17, 2.017e-17, 1.238e-17,
278 7.542e-18, 4.585e-18, 2.776e-18, 1.671e-18, 9.985e-19, 5.937e-19,
279 3.518e-19, 2.07e-19, 1.215e-19, 7.06e-20, 4.097e-20, 2.37e-20,
280 1.363e-20, 7.802e-21, 4.441e-21, 2.523e-21, 1.424e-21, 8.015e-22,
281 4.497e-22, 2.505e-22, 1.391e-22, 7.691e-23, 4.238e-23, 2.331e-23,
282 1.274e-23, 6.929e-24, 3.752e-24, 2.02e-24, 1.083e-24, 5.774e-25,
283 3.041e-25, 1.593e-25, 8.308e-26, 4.299e-26, 2.195e-26, 1.112e-26,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
285 0, 0, 0, 0, 0, 0, 0, 0, 0
286 };
287
288 static const double ccl4[121] = {
289 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10, 1.075e-10,
290 1.075e-10, 1.075e-10, 1.075e-10, 1.06e-10, 1.024e-10, 9.69e-11,
291 8.93e-11, 8.078e-11, 7.213e-11, 6.307e-11, 5.383e-11, 4.49e-11,
292 3.609e-11, 2.705e-11, 1.935e-11, 1.385e-11, 8.35e-12, 5.485e-12,
293 3.853e-12, 2.22e-12, 5.875e-13, 3.445e-13, 1.015e-13, 6.075e-14,
294 4.383e-14, 2.692e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
295 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
296 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
297 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
298 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
299 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
300 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
301 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
302 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14, 1e-14,
303 1e-14, 1e-14, 1e-14
304 };
305
306 static const double ch3oh[121] = {
307 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10, 5.01099e-10,
308 5.01099e-10, 5.50999e-10, 5.7313e-10, 5.75638e-10, 5.4086e-10,
309 4.77601e-10, 4.12907e-10, 3.6274e-10, 3.26448e-10, 2.9706e-10,
310 2.27698e-10, 1.96999e-10, 1.66212e-10, 1.17941e-10, 1.19844e-10,
311 1.11211e-10, 1.02714e-10, 9.86138e-11, 9.45133e-11, 9.04127e-11,
312 8.05243e-11, 6.3678e-11, 4.68317e-11, 4.00618e-11, 3.95786e-11,
313 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
314 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
315 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
316 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
317 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
318 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
319 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
320 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
321 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
322 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
323 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
324 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
325 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
326 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
327 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
328 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
329 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
330 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11, 3.95786e-11,
331 3.95786e-11
332 };
333
334 static const double ch4[121] = {
335 1.864e-06, 1.835e-06, 1.819e-06, 1.805e-06, 1.796e-06, 1.788e-06,
336 1.782e-06, 1.776e-06, 1.769e-06, 1.761e-06, 1.749e-06, 1.734e-06,
337 1.716e-06, 1.692e-06, 1.654e-06, 1.61e-06, 1.567e-06, 1.502e-06,
338 1.433e-06, 1.371e-06, 1.323e-06, 1.277e-06, 1.232e-06, 1.188e-06,
339 1.147e-06, 1.108e-06, 1.07e-06, 1.027e-06, 9.854e-07, 9.416e-07,
340 8.933e-07, 8.478e-07, 7.988e-07, 7.515e-07, 7.07e-07, 6.64e-07,
341 6.239e-07, 5.864e-07, 5.512e-07, 5.184e-07, 4.87e-07, 4.571e-07,
342 4.296e-07, 4.04e-07, 3.802e-07, 3.578e-07, 3.383e-07, 3.203e-07,
343 3.032e-07, 2.889e-07, 2.76e-07, 2.635e-07, 2.519e-07, 2.409e-07,
344 2.302e-07, 2.219e-07, 2.144e-07, 2.071e-07, 1.999e-07, 1.93e-07,
345 1.862e-07, 1.795e-07, 1.731e-07, 1.668e-07, 1.607e-07, 1.548e-07,
346 1.49e-07, 1.434e-07, 1.38e-07, 1.328e-07, 1.277e-07, 1.227e-07,
347 1.18e-07, 1.134e-07, 1.089e-07, 1.046e-07, 1.004e-07, 9.635e-08,
348 9.245e-08, 8.867e-08, 8.502e-08, 8.15e-08, 7.809e-08, 7.48e-08,
349 7.159e-08, 6.849e-08, 6.55e-08, 6.262e-08, 5.98e-08, 5.708e-08,
350 5.448e-08, 5.194e-08, 4.951e-08, 4.72e-08, 4.5e-08, 4.291e-08,
351 4.093e-08, 3.905e-08, 3.729e-08, 3.563e-08, 3.408e-08, 3.265e-08,
352 3.128e-08, 2.996e-08, 2.87e-08, 2.76e-08, 2.657e-08, 2.558e-08,
353 2.467e-08, 2.385e-08, 2.307e-08, 2.234e-08, 2.168e-08, 2.108e-08,
354 2.05e-08, 1.998e-08, 1.947e-08, 1.902e-08, 1.86e-08, 1.819e-08,
355 1.782e-08
356 };
357
358 static const double clo[121] = {
359 7.419e-15, 1.061e-14, 1.518e-14, 2.195e-14, 3.175e-14, 4.666e-14,
360 6.872e-14, 1.03e-13, 1.553e-13, 2.375e-13, 3.664e-13, 5.684e-13,
361 8.915e-13, 1.402e-12, 2.269e-12, 4.125e-12, 7.501e-12, 1.257e-11,
362 2.048e-11, 3.338e-11, 5.44e-11, 8.846e-11, 1.008e-10, 1.082e-10,
363 1.157e-10, 1.232e-10, 1.312e-10, 1.539e-10, 1.822e-10, 2.118e-10,
364 2.387e-10, 2.687e-10, 2.875e-10, 3.031e-10, 3.23e-10, 3.648e-10,
365 4.117e-10, 4.477e-10, 4.633e-10, 4.794e-10, 4.95e-10, 5.104e-10,
366 5.259e-10, 5.062e-10, 4.742e-10, 4.443e-10, 4.051e-10, 3.659e-10,
367 3.305e-10, 2.911e-10, 2.54e-10, 2.215e-10, 1.927e-10, 1.675e-10,
368 1.452e-10, 1.259e-10, 1.09e-10, 9.416e-11, 8.119e-11, 6.991e-11,
369 6.015e-11, 5.163e-11, 4.43e-11, 3.789e-11, 3.24e-11, 2.769e-11,
370 2.361e-11, 2.011e-11, 1.71e-11, 1.453e-11, 1.233e-11, 1.045e-11,
371 8.851e-12, 7.48e-12, 6.316e-12, 5.326e-12, 4.487e-12, 3.778e-12,
372 3.176e-12, 2.665e-12, 2.234e-12, 1.87e-12, 1.563e-12, 1.304e-12,
373 1.085e-12, 9.007e-13, 7.468e-13, 6.179e-13, 5.092e-13, 4.188e-13,
374 3.442e-13, 2.816e-13, 2.304e-13, 1.885e-13, 1.542e-13, 1.263e-13,
375 1.035e-13, 8.5e-14, 7.004e-14, 5.783e-14, 4.795e-14, 4.007e-14,
376 3.345e-14, 2.792e-14, 2.33e-14, 1.978e-14, 1.686e-14, 1.438e-14,
377 1.234e-14, 1.07e-14, 9.312e-15, 8.131e-15, 7.164e-15, 6.367e-15,
378 5.67e-15, 5.088e-15, 4.565e-15, 4.138e-15, 3.769e-15, 3.432e-15,
379 3.148e-15
380 };
381
382 static const double clono2[121] = {
383 1.011e-13, 1.515e-13, 2.272e-13, 3.446e-13, 5.231e-13, 8.085e-13,
384 1.253e-12, 1.979e-12, 3.149e-12, 5.092e-12, 8.312e-12, 1.366e-11,
385 2.272e-11, 3.791e-11, 6.209e-11, 9.101e-11, 1.334e-10, 1.951e-10,
386 2.853e-10, 3.94e-10, 4.771e-10, 5.771e-10, 6.675e-10, 7.665e-10,
387 8.504e-10, 8.924e-10, 9.363e-10, 8.923e-10, 8.411e-10, 7.646e-10,
388 6.525e-10, 5.576e-10, 4.398e-10, 3.403e-10, 2.612e-10, 1.915e-10,
389 1.407e-10, 1.028e-10, 7.455e-11, 5.42e-11, 3.708e-11, 2.438e-11,
390 1.618e-11, 1.075e-11, 7.17e-12, 4.784e-12, 3.205e-12, 2.147e-12,
391 1.44e-12, 9.654e-13, 6.469e-13, 4.332e-13, 2.891e-13, 1.926e-13,
392 1.274e-13, 8.422e-14, 5.547e-14, 3.636e-14, 2.368e-14, 1.536e-14,
393 9.937e-15, 6.39e-15, 4.101e-15, 2.61e-15, 1.659e-15, 1.052e-15,
394 6.638e-16, 4.172e-16, 2.61e-16, 1.63e-16, 1.013e-16, 6.275e-17,
395 3.879e-17, 2.383e-17, 1.461e-17, 8.918e-18, 5.43e-18, 3.301e-18,
396 1.997e-18, 1.203e-18, 7.216e-19, 4.311e-19, 2.564e-19, 1.519e-19,
397 8.911e-20, 5.203e-20, 3.026e-20, 1.748e-20, 9.99e-21, 5.673e-21,
398 3.215e-21, 1.799e-21, 1.006e-21, 5.628e-22, 3.146e-22, 1.766e-22,
399 9.94e-23, 5.614e-23, 3.206e-23, 1.841e-23, 1.071e-23, 6.366e-24,
400 3.776e-24, 2.238e-24, 1.326e-24, 8.253e-25, 5.201e-25, 3.279e-25,
401 2.108e-25, 1.395e-25, 9.326e-26, 6.299e-26, 4.365e-26, 3.104e-26,
402 2.219e-26, 1.621e-26, 1.185e-26, 8.92e-27, 6.804e-27, 5.191e-27,
403 4.041e-27
404 };
405
406 static const double co[121] = {
407 1.907e-07, 1.553e-07, 1.362e-07, 1.216e-07, 1.114e-07, 1.036e-07,
408 9.737e-08, 9.152e-08, 8.559e-08, 7.966e-08, 7.277e-08, 6.615e-08,
409 5.884e-08, 5.22e-08, 4.699e-08, 4.284e-08, 3.776e-08, 3.274e-08,
410 2.845e-08, 2.479e-08, 2.246e-08, 2.054e-08, 1.991e-08, 1.951e-08,
411 1.94e-08, 2.009e-08, 2.1e-08, 2.201e-08, 2.322e-08, 2.45e-08,
412 2.602e-08, 2.73e-08, 2.867e-08, 2.998e-08, 3.135e-08, 3.255e-08,
413 3.352e-08, 3.426e-08, 3.484e-08, 3.53e-08, 3.593e-08, 3.671e-08,
414 3.759e-08, 3.945e-08, 4.192e-08, 4.49e-08, 5.03e-08, 5.703e-08,
415 6.538e-08, 7.878e-08, 9.644e-08, 1.196e-07, 1.498e-07, 1.904e-07,
416 2.422e-07, 3.055e-07, 3.804e-07, 4.747e-07, 5.899e-07, 7.272e-07,
417 8.91e-07, 1.071e-06, 1.296e-06, 1.546e-06, 1.823e-06, 2.135e-06,
418 2.44e-06, 2.714e-06, 2.967e-06, 3.189e-06, 3.391e-06, 3.58e-06,
419 3.773e-06, 4.022e-06, 4.346e-06, 4.749e-06, 5.199e-06, 5.668e-06,
420 6.157e-06, 6.688e-06, 7.254e-06, 7.867e-06, 8.539e-06, 9.26e-06,
421 1.009e-05, 1.119e-05, 1.228e-05, 1.365e-05, 1.506e-05, 1.641e-05,
422 1.784e-05, 1.952e-05, 2.132e-05, 2.323e-05, 2.531e-05, 2.754e-05,
423 3.047e-05, 3.459e-05, 3.922e-05, 4.439e-05, 4.825e-05, 5.077e-05,
424 5.34e-05, 5.618e-05, 5.909e-05, 6.207e-05, 6.519e-05, 6.845e-05,
425 6.819e-05, 6.726e-05, 6.622e-05, 6.512e-05, 6.671e-05, 6.862e-05,
426 7.048e-05, 7.264e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05, 7.3e-05
427 };
428
429 static const double cof2[121] = {
430 7.5e-14, 1.055e-13, 1.485e-13, 2.111e-13, 3.001e-13, 4.333e-13,
431 6.269e-13, 9.221e-13, 1.364e-12, 2.046e-12, 3.093e-12, 4.703e-12,
432 7.225e-12, 1.113e-11, 1.66e-11, 2.088e-11, 2.626e-11, 3.433e-11,
433 4.549e-11, 5.886e-11, 7.21e-11, 8.824e-11, 1.015e-10, 1.155e-10,
434 1.288e-10, 1.388e-10, 1.497e-10, 1.554e-10, 1.606e-10, 1.639e-10,
435 1.64e-10, 1.64e-10, 1.596e-10, 1.542e-10, 1.482e-10, 1.382e-10,
436 1.289e-10, 1.198e-10, 1.109e-10, 1.026e-10, 9.484e-11, 8.75e-11,
437 8.086e-11, 7.49e-11, 6.948e-11, 6.446e-11, 5.961e-11, 5.505e-11,
438 5.085e-11, 4.586e-11, 4.1e-11, 3.665e-11, 3.235e-11, 2.842e-11,
439 2.491e-11, 2.11e-11, 1.769e-11, 1.479e-11, 1.197e-11, 9.631e-12,
440 7.74e-12, 6.201e-12, 4.963e-12, 3.956e-12, 3.151e-12, 2.507e-12,
441 1.99e-12, 1.576e-12, 1.245e-12, 9.83e-13, 7.742e-13, 6.088e-13,
442 4.782e-13, 3.745e-13, 2.929e-13, 2.286e-13, 1.782e-13, 1.388e-13,
443 1.079e-13, 8.362e-14, 6.471e-14, 4.996e-14, 3.85e-14, 2.96e-14,
444 2.265e-14, 1.729e-14, 1.317e-14, 9.998e-15, 7.549e-15, 5.683e-15,
445 4.273e-15, 3.193e-15, 2.385e-15, 1.782e-15, 1.331e-15, 9.957e-16,
446 7.461e-16, 5.601e-16, 4.228e-16, 3.201e-16, 2.438e-16, 1.878e-16,
447 1.445e-16, 1.111e-16, 8.544e-17, 6.734e-17, 5.341e-17, 4.237e-17,
448 3.394e-17, 2.759e-17, 2.254e-17, 1.851e-17, 1.54e-17, 1.297e-17,
449 1.096e-17, 9.365e-18, 8e-18, 6.938e-18, 6.056e-18, 5.287e-18,
450 4.662e-18
451 };
452
453 static const double f11[121] = {
454 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10,
455 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.65e-10, 2.635e-10, 2.536e-10,
456 2.44e-10, 2.348e-10, 2.258e-10, 2.153e-10, 2.046e-10, 1.929e-10,
457 1.782e-10, 1.648e-10, 1.463e-10, 1.291e-10, 1.1e-10, 8.874e-11,
458 7.165e-11, 5.201e-11, 3.744e-11, 2.577e-11, 1.64e-11, 1.048e-11,
459 5.993e-12, 3.345e-12, 1.839e-12, 9.264e-13, 4.688e-13, 2.329e-13,
460 1.129e-13, 5.505e-14, 2.825e-14, 1.492e-14, 7.997e-15, 5.384e-15,
461 3.988e-15, 2.955e-15, 2.196e-15, 1.632e-15, 1.214e-15, 9.025e-16,
462 6.708e-16, 4.984e-16, 3.693e-16, 2.733e-16, 2.013e-16, 1.481e-16,
463 1.087e-16, 7.945e-17, 5.782e-17, 4.195e-17, 3.038e-17, 2.19e-17,
464 1.577e-17, 1.128e-17, 8.063e-18, 5.753e-18, 4.09e-18, 2.899e-18,
465 2.048e-18, 1.444e-18, 1.015e-18, 7.12e-19, 4.985e-19, 3.474e-19,
466 2.417e-19, 1.677e-19, 1.161e-19, 8.029e-20, 5.533e-20, 3.799e-20,
467 2.602e-20, 1.776e-20, 1.209e-20, 8.202e-21, 5.522e-21, 3.707e-21,
468 2.48e-21, 1.652e-21, 1.091e-21, 7.174e-22, 4.709e-22, 3.063e-22,
469 1.991e-22, 1.294e-22, 8.412e-23, 5.483e-23, 3.581e-23, 2.345e-23,
470 1.548e-23, 1.027e-23, 6.869e-24, 4.673e-24, 3.173e-24, 2.153e-24,
471 1.461e-24, 1.028e-24, 7.302e-25, 5.188e-25, 3.739e-25, 2.753e-25,
472 2.043e-25, 1.528e-25, 1.164e-25, 9.041e-26, 7.051e-26, 5.587e-26,
473 4.428e-26, 3.588e-26, 2.936e-26, 2.402e-26, 1.995e-26
474 };
475
476 static const double f113[121] = {
477 1.9e-11, 1.9e-11, 1.899e-11, 1.899e-11, 1.898e-11, 1.898e-11,
478 1.897e-11, 1.896e-11, 1.895e-11, 1.894e-11, 1.893e-11, 1.89e-11,
479 1.887e-11, 1.871e-11, 1.854e-11, 1.803e-11, 1.751e-11, 1.664e-11,
480 1.576e-11, 1.466e-11, 1.356e-11, 1.236e-11, 1.116e-11, 9.931e-12,
481 8.702e-12, 7.515e-12, 6.4238e-12, 5.3326e-12, 4.3652e-12, 3.5216e-12,
482 2.678e-12, 2.1532e-12, 1.6284e-12, 1.2202e-12, 9.286e-13, 6.37e-13,
483 4.95e-13, 3.53e-13, 2.5004e-13, 1.8612e-13, 1.222e-13, 9.704e-14,
484 7.188e-14, 5.3338e-14, 4.1414e-14, 2.949e-14, 2.3722e-14, 1.7954e-14,
485 1.37794e-14, 1.11982e-14, 8.617e-15, 7.6036e-15, 6.5902e-15,
486 5.5768e-15, 4.5634e-15, 3.55e-15, 3.1008e-15, 2.6516e-15, 2.2024e-15,
487 1.7532e-15, 1.304e-15, 1.1354e-15, 9.668e-16, 7.982e-16, 6.296e-16,
488 4.61e-16, 3.9734e-16, 3.3368e-16, 2.7002e-16, 2.0636e-16, 1.427e-16,
489 1.22804e-16, 1.02908e-16, 8.3012e-17, 6.3116e-17, 4.322e-17,
490 3.6838e-17, 3.0456e-17, 2.4074e-17, 1.7692e-17, 1.131e-17,
491 9.6202e-18, 7.9304e-18, 6.2406e-18, 4.5508e-18, 2.861e-18,
492 2.40476e-18, 1.94852e-18, 1.49228e-18, 1.03604e-18, 5.798e-19,
493 4.8502e-19, 3.9024e-19, 2.9546e-19, 2.0068e-19, 1.059e-19,
494 8.7084e-20, 6.8268e-20, 4.9452e-20, 3.0636e-20, 1.182e-20,
495 9.64344e-21, 7.46688e-21, 5.29032e-21, 3.11376e-21, 9.372e-22,
496 7.5685e-22, 5.765e-22, 3.9615e-22, 2.158e-22, 3.545e-23,
497 2.86046e-23, 2.17592e-23, 1.49138e-23, 8.0684e-24, 1.223e-24,
498 9.92358e-25, 7.61716e-25, 5.31074e-25, 3.00432e-25, 6.979e-26
499 };
500
501 static const double f114[121] = {
502 1.2e-11, 1.2e-11, 1.2e-11, 1.2e-11, 1.199e-11, 1.199e-11,
503 1.199e-11, 1.199e-11, 1.198e-11, 1.198e-11, 1.198e-11, 1.197e-11,
504 1.196e-11, 1.191e-11, 1.185e-11, 1.167e-11, 1.149e-11, 1.12e-11,
505 1.09e-11, 1.053e-11, 1.015e-11, 9.731e-12, 9.311e-12, 8.865e-12,
506 8.419e-12, 7.949e-12, 7.4774e-12, 7.0058e-12, 6.54e-12, 6.08e-12,
507 5.62e-12, 5.1908e-12, 4.7616e-12, 4.3622e-12, 3.9926e-12, 3.623e-12,
508 3.3274e-12, 3.0318e-12, 2.7702e-12, 2.5426e-12, 2.315e-12, 2.1514e-12,
509 1.9878e-12, 1.8448e-12, 1.7224e-12, 1.6e-12, 1.51e-12, 1.42e-12,
510 1.3462e-12, 1.2886e-12, 1.231e-12, 1.1922e-12, 1.1534e-12, 1.1146e-12,
511 1.0758e-12, 1.037e-12, 1.0025e-12, 9.68e-13, 9.335e-13, 8.99e-13,
512 8.645e-13, 8.344e-13, 8.043e-13, 7.742e-13, 7.441e-13, 7.14e-13,
513 6.8718e-13, 6.6036e-13, 6.3354e-13, 6.0672e-13, 5.799e-13, 5.5612e-13,
514 5.3234e-13, 5.0856e-13, 4.8478e-13, 4.61e-13, 4.394e-13, 4.178e-13,
515 3.962e-13, 3.746e-13, 3.53e-13, 3.3288e-13, 3.1276e-13, 2.9264e-13,
516 2.7252e-13, 2.524e-13, 2.3368e-13, 2.1496e-13, 1.9624e-13, 1.7752e-13,
517 1.588e-13, 1.4221e-13, 1.2562e-13, 1.0903e-13, 9.244e-14, 7.585e-14,
518 6.4942e-14, 5.4034e-14, 4.3126e-14, 3.2218e-14, 2.131e-14, 1.76694e-14,
519 1.40288e-14, 1.03882e-14, 6.7476e-15, 3.107e-15, 2.52738e-15,
520 1.94776e-15, 1.36814e-15, 7.8852e-16, 2.089e-16, 1.69288e-16,
521 1.29676e-16, 9.0064e-17, 5.0452e-17, 1.084e-17, 8.85136e-18,
522 6.86272e-18, 4.87408e-18, 2.88544e-18, 8.968e-19
523 };
524
525 static const double f12[121] = {
526 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10,
527 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.45e-10, 5.429e-10, 5.291e-10,
528 5.155e-10, 5.022e-10, 4.893e-10, 4.772e-10, 4.655e-10, 4.497e-10,
529 4.249e-10, 4.015e-10, 3.632e-10, 3.261e-10, 2.858e-10, 2.408e-10,
530 2.03e-10, 1.685e-10, 1.4e-10, 1.163e-10, 9.65e-11, 8.02e-11, 6.705e-11,
531 5.624e-11, 4.764e-11, 4.249e-11, 3.792e-11, 3.315e-11, 2.819e-11,
532 2.4e-11, 1.999e-11, 1.64e-11, 1.352e-11, 1.14e-11, 9.714e-12,
533 8.28e-12, 7.176e-12, 6.251e-12, 5.446e-12, 4.72e-12, 4.081e-12,
534 3.528e-12, 3.08e-12, 2.699e-12, 2.359e-12, 2.111e-12, 1.901e-12,
535 1.709e-12, 1.534e-12, 1.376e-12, 1.233e-12, 1.103e-12, 9.869e-13,
536 8.808e-13, 7.859e-13, 7.008e-13, 6.241e-13, 5.553e-13, 4.935e-13,
537 4.383e-13, 3.889e-13, 3.447e-13, 3.054e-13, 2.702e-13, 2.389e-13,
538 2.11e-13, 1.862e-13, 1.643e-13, 1.448e-13, 1.274e-13, 1.121e-13,
539 9.844e-14, 8.638e-14, 7.572e-14, 6.62e-14, 5.782e-14, 5.045e-14,
540 4.394e-14, 3.817e-14, 3.311e-14, 2.87e-14, 2.48e-14, 2.142e-14,
541 1.851e-14, 1.599e-14, 1.383e-14, 1.196e-14, 1.036e-14, 9e-15,
542 7.828e-15, 6.829e-15, 5.992e-15, 5.254e-15, 4.606e-15, 4.037e-15,
543 3.583e-15, 3.19e-15, 2.841e-15, 2.542e-15, 2.291e-15, 2.07e-15,
544 1.875e-15, 1.71e-15, 1.57e-15, 1.442e-15, 1.333e-15, 1.232e-15,
545 1.147e-15, 1.071e-15, 1.001e-15, 9.396e-16
546 };
547
548 static const double f14[121] = {
549 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 9e-11,
550 9e-11, 9e-11, 9e-11, 9e-11, 9e-11, 8.91e-11, 8.73e-11, 8.46e-11,
551 8.19e-11, 7.92e-11, 7.74e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
552 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
553 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
554 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
555 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
556 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
557 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
558 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
559 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
560 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
561 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
562 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
563 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
564 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11,
565 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11, 7.65e-11
566 };
567
568 static const double f22[121] = {
569 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10, 1.4e-10,
570 1.4e-10, 1.4e-10, 1.4e-10, 1.372e-10, 1.317e-10, 1.235e-10, 1.153e-10,
571 1.075e-10, 1.002e-10, 9.332e-11, 8.738e-11, 8.194e-11, 7.7e-11,
572 7.165e-11, 6.753e-11, 6.341e-11, 5.971e-11, 5.6e-11, 5.229e-11,
573 4.859e-11, 4.488e-11, 4.118e-11, 3.83e-11, 3.568e-11, 3.308e-11,
574 3.047e-11, 2.82e-11, 2.594e-11, 2.409e-11, 2.237e-11, 2.065e-11,
575 1.894e-11, 1.771e-11, 1.647e-11, 1.532e-11, 1.416e-11, 1.332e-11,
576 1.246e-11, 1.161e-11, 1.087e-11, 1.017e-11, 9.471e-12, 8.853e-12,
577 8.235e-12, 7.741e-12, 7.247e-12, 6.836e-12, 6.506e-12, 6.176e-12,
578 5.913e-12, 5.65e-12, 5.419e-12, 5.221e-12, 5.024e-12, 4.859e-12,
579 4.694e-12, 4.546e-12, 4.414e-12, 4.282e-12, 4.15e-12, 4.019e-12,
580 3.903e-12, 3.805e-12, 3.706e-12, 3.607e-12, 3.508e-12, 3.41e-12,
581 3.31e-12, 3.212e-12, 3.129e-12, 3.047e-12, 2.964e-12, 2.882e-12,
582 2.8e-12, 2.734e-12, 2.668e-12, 2.602e-12, 2.537e-12, 2.471e-12,
583 2.421e-12, 2.372e-12, 2.322e-12, 2.273e-12, 2.224e-12, 2.182e-12,
584 2.141e-12, 2.1e-12, 2.059e-12, 2.018e-12, 1.977e-12, 1.935e-12,
585 1.894e-12, 1.853e-12, 1.812e-12, 1.77e-12, 1.73e-12, 1.688e-12,
586 1.647e-12, 1.606e-12, 1.565e-12, 1.524e-12, 1.483e-12, 1.441e-12,
587 1.4e-12, 1.359e-12, 1.317e-12, 1.276e-12, 1.235e-12, 1.194e-12,
588 1.153e-12, 1.112e-12, 1.071e-12, 1.029e-12, 9.883e-13
589 };
590
591 static const double h2co[121] = {
592 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11, 8.71857e-11,
593 8.71857e-11, 7.72315e-11, 6.85464e-11, 6.0758e-11, 5.32087e-11,
594 4.5719e-11, 3.79458e-11, 3.07607e-11, 2.46025e-11, 1.94038e-11,
595 1.40882e-11, 1.0623e-11, 8.35457e-12, 6.87427e-12, 7.09071e-12,
596 8.96183e-12, 1.09012e-11, 1.50545e-11, 1.92077e-11, 2.3361e-11,
597 2.7054e-11, 3.01936e-11, 3.33333e-11, 3.69281e-11, 4.08069e-11,
598 4.57318e-11, 5.1348e-11, 5.69642e-11, 6.33173e-11, 6.98984e-11,
599 7.63144e-11, 8.22774e-11, 8.82405e-11, 9.3746e-11, 9.92074e-11,
600 1.04669e-10, 1.10055e-10, 1.15293e-10, 1.20531e-10, 1.26293e-10,
601 1.32585e-10, 1.35966e-10, 1.36242e-10, 1.36519e-10, 1.61155e-10,
602 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
603 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
604 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
605 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
606 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
607 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
608 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
609 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
610 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
611 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
612 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
613 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
614 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
615 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10, 1.99157e-10,
616 1.99157e-10
617 };
618
619 static const double h2o[121] = {
620 0.01166, 0.008269, 0.005742, 0.003845, 0.00277, 0.001897, 0.001272,
621 0.000827, 0.000539, 0.0003469, 0.0001579, 3.134e-05, 1.341e-05,
622 6.764e-06, 4.498e-06, 3.703e-06, 3.724e-06, 3.899e-06, 4.002e-06,
623 4.122e-06, 4.277e-06, 4.438e-06, 4.558e-06, 4.673e-06, 4.763e-06,
624 4.809e-06, 4.856e-06, 4.936e-06, 5.021e-06, 5.114e-06, 5.222e-06,
625 5.331e-06, 5.414e-06, 5.488e-06, 5.563e-06, 5.633e-06, 5.704e-06,
626 5.767e-06, 5.819e-06, 5.872e-06, 5.914e-06, 5.949e-06, 5.984e-06,
627 6.015e-06, 6.044e-06, 6.073e-06, 6.104e-06, 6.136e-06, 6.167e-06,
628 6.189e-06, 6.208e-06, 6.226e-06, 6.212e-06, 6.185e-06, 6.158e-06,
629 6.114e-06, 6.066e-06, 6.018e-06, 5.877e-06, 5.728e-06, 5.582e-06,
630 5.437e-06, 5.296e-06, 5.156e-06, 5.02e-06, 4.886e-06, 4.754e-06,
631 4.625e-06, 4.498e-06, 4.374e-06, 4.242e-06, 4.096e-06, 3.955e-06,
632 3.817e-06, 3.683e-06, 3.491e-06, 3.204e-06, 2.94e-06, 2.696e-06,
633 2.47e-06, 2.252e-06, 2.019e-06, 1.808e-06, 1.618e-06, 1.445e-06,
634 1.285e-06, 1.105e-06, 9.489e-07, 8.121e-07, 6.938e-07, 5.924e-07,
635 5.04e-07, 4.288e-07, 3.648e-07, 3.103e-07, 2.642e-07, 2.252e-07,
636 1.921e-07, 1.643e-07, 1.408e-07, 1.211e-07, 1.048e-07, 9.063e-08,
637 7.835e-08, 6.774e-08, 5.936e-08, 5.221e-08, 4.592e-08, 4.061e-08,
638 3.62e-08, 3.236e-08, 2.902e-08, 2.62e-08, 2.383e-08, 2.171e-08,
639 1.989e-08, 1.823e-08, 1.684e-08, 1.562e-08, 1.449e-08, 1.351e-08
640 };
641
642 static const double h2o2[121] = {
643 1.779e-10, 7.938e-10, 8.953e-10, 8.032e-10, 6.564e-10, 5.159e-10,
644 4.003e-10, 3.026e-10, 2.222e-10, 1.58e-10, 1.044e-10, 6.605e-11,
645 3.413e-11, 1.453e-11, 1.062e-11, 1.009e-11, 9.597e-12, 1.175e-11,
646 1.572e-11, 2.091e-11, 2.746e-11, 3.603e-11, 4.791e-11, 6.387e-11,
647 8.239e-11, 1.007e-10, 1.23e-10, 1.363e-10, 1.489e-10, 1.585e-10,
648 1.608e-10, 1.632e-10, 1.576e-10, 1.502e-10, 1.423e-10, 1.302e-10,
649 1.192e-10, 1.085e-10, 9.795e-11, 8.854e-11, 8.057e-11, 7.36e-11,
650 6.736e-11, 6.362e-11, 6.087e-11, 5.825e-11, 5.623e-11, 5.443e-11,
651 5.27e-11, 5.098e-11, 4.931e-11, 4.769e-11, 4.611e-11, 4.458e-11,
652 4.308e-11, 4.102e-11, 3.887e-11, 3.682e-11, 3.521e-11, 3.369e-11,
653 3.224e-11, 3.082e-11, 2.946e-11, 2.814e-11, 2.687e-11, 2.566e-11,
654 2.449e-11, 2.336e-11, 2.227e-11, 2.123e-11, 2.023e-11, 1.927e-11,
655 1.835e-11, 1.746e-11, 1.661e-11, 1.58e-11, 1.502e-11, 1.428e-11,
656 1.357e-11, 1.289e-11, 1.224e-11, 1.161e-11, 1.102e-11, 1.045e-11,
657 9.895e-12, 9.369e-12, 8.866e-12, 8.386e-12, 7.922e-12, 7.479e-12,
658 7.06e-12, 6.656e-12, 6.274e-12, 5.914e-12, 5.575e-12, 5.257e-12,
659 4.959e-12, 4.679e-12, 4.42e-12, 4.178e-12, 3.954e-12, 3.75e-12,
660 3.557e-12, 3.372e-12, 3.198e-12, 3.047e-12, 2.908e-12, 2.775e-12,
661 2.653e-12, 2.544e-12, 2.442e-12, 2.346e-12, 2.26e-12, 2.183e-12,
662 2.11e-12, 2.044e-12, 1.98e-12, 1.924e-12, 1.871e-12, 1.821e-12,
663 1.775e-12
664 };
665
666 static const double hcl[121] = {
667 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11, 3.70385e-11,
668 3.70385e-11, 2.21247e-11, 1.88117e-11, 2.36957e-11, 3.72192e-11,
669 5.79399e-11, 8.04158e-11, 1.01779e-10, 1.2301e-10, 1.53924e-10,
670 1.93737e-10, 2.5561e-10, 3.84228e-10, 6.18248e-10, 6.31222e-10,
671 7.84907e-10, 9.36932e-10, 1.03508e-09, 1.13323e-09, 1.23138e-09,
672 1.31985e-09, 1.39669e-09, 1.47352e-09, 1.56375e-09, 1.66234e-09,
673 1.78086e-09, 1.91256e-09, 2.04425e-09, 2.16629e-09, 2.28535e-09,
674 2.39439e-09, 2.47597e-09, 2.55755e-09, 2.60873e-09, 2.65696e-09,
675 2.70519e-09, 2.75658e-09, 2.81422e-09, 2.87187e-09, 2.94013e-09,
676 3.01911e-09, 3.09497e-09, 3.16749e-09, 3.24001e-09, 3.30525e-09,
677 3.3665e-09, 3.42424e-09, 3.4619e-09, 3.49956e-09, 3.52273e-09,
678 3.54214e-09, 3.56154e-09, 3.57918e-09, 3.59049e-09, 3.6018e-09,
679 3.6132e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
680 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
681 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
682 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
683 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
684 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
685 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
686 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
687 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
688 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
689 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
690 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09, 3.62476e-09,
691 3.62476e-09
692 };
693
694 static const double hcn[121] = {
695 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10,
696 5.5e-10, 5.5e-10, 5.5e-10, 5.5e-10, 5.498e-10, 5.495e-10, 5.493e-10,
697 5.49e-10, 5.488e-10, 4.717e-10, 3.946e-10, 3.174e-10, 2.4e-10,
698 1.626e-10, 1.619e-10, 1.612e-10, 1.602e-10, 1.593e-10, 1.582e-10,
699 1.572e-10, 1.56e-10, 1.549e-10, 1.539e-10, 1.53e-10, 1.519e-10,
700 1.506e-10, 1.487e-10, 1.467e-10, 1.449e-10, 1.43e-10, 1.413e-10,
701 1.397e-10, 1.382e-10, 1.368e-10, 1.354e-10, 1.337e-10, 1.315e-10,
702 1.292e-10, 1.267e-10, 1.241e-10, 1.215e-10, 1.19e-10, 1.165e-10,
703 1.141e-10, 1.118e-10, 1.096e-10, 1.072e-10, 1.047e-10, 1.021e-10,
704 9.968e-11, 9.739e-11, 9.539e-11, 9.339e-11, 9.135e-11, 8.898e-11,
705 8.664e-11, 8.439e-11, 8.249e-11, 8.075e-11, 7.904e-11, 7.735e-11,
706 7.565e-11, 7.399e-11, 7.245e-11, 7.109e-11, 6.982e-11, 6.863e-11,
707 6.755e-11, 6.657e-11, 6.587e-11, 6.527e-11, 6.476e-11, 6.428e-11,
708 6.382e-11, 6.343e-11, 6.307e-11, 6.272e-11, 6.238e-11, 6.205e-11,
709 6.17e-11, 6.137e-11, 6.102e-11, 6.072e-11, 6.046e-11, 6.03e-11,
710 6.018e-11, 6.01e-11, 6.001e-11, 5.992e-11, 5.984e-11, 5.975e-11,
711 5.967e-11, 5.958e-11, 5.95e-11, 5.941e-11, 5.933e-11, 5.925e-11,
712 5.916e-11, 5.908e-11, 5.899e-11, 5.891e-11, 5.883e-11, 5.874e-11,
713 5.866e-11, 5.858e-11, 5.85e-11, 5.841e-11, 5.833e-11, 5.825e-11,
714 5.817e-11, 5.808e-11, 5.8e-11, 5.792e-11, 5.784e-11
715 };
716
717 static const double hf[121] = {
718 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
719 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11, 2.64279e-11,
720 2.64279e-11, 2.64279e-11, 2.64279e-11, 3.86691e-11, 5.22002e-11,
721 6.92471e-11, 9.13979e-11, 1.37918e-10, 2.24918e-10, 2.29824e-10,
722 2.94241e-10, 3.58363e-10, 4.12881e-10, 4.67399e-10, 5.21917e-10,
723 5.74229e-10, 6.23889e-10, 6.73549e-10, 7.24119e-10, 7.75256e-10,
724 8.319e-10, 8.92185e-10, 9.52469e-10, 1.01325e-09, 1.07419e-09,
725 1.13565e-09, 1.19856e-09, 1.26146e-09, 1.31439e-09, 1.36635e-09,
726 1.41831e-09, 1.46549e-09, 1.50321e-09, 1.54093e-09, 1.57986e-09,
727 1.62e-09, 1.66286e-09, 1.70863e-09, 1.75439e-09, 1.79827e-09,
728 1.84111e-09, 1.88125e-09, 1.90603e-09, 1.93081e-09, 1.9413e-09,
729 1.94807e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
730 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
731 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
732 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
733 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
734 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
735 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
736 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
737 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
738 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
739 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
740 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
741 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09, 1.95485e-09,
742 1.95485e-09
743 };
744
745 static const double hno3[121] = {
746 1.809e-10, 7.234e-10, 5.899e-10, 4.342e-10, 3.277e-10, 2.661e-10,
747 2.35e-10, 2.267e-10, 2.389e-10, 2.651e-10, 3.255e-10, 4.099e-10,
748 5.42e-10, 6.978e-10, 8.807e-10, 1.112e-09, 1.405e-09, 2.04e-09,
749 3.111e-09, 4.5e-09, 5.762e-09, 7.37e-09, 7.852e-09, 8.109e-09,
750 8.067e-09, 7.554e-09, 7.076e-09, 6.268e-09, 5.524e-09, 4.749e-09,
751 3.909e-09, 3.223e-09, 2.517e-09, 1.942e-09, 1.493e-09, 1.122e-09,
752 8.449e-10, 6.361e-10, 4.787e-10, 3.611e-10, 2.804e-10, 2.215e-10,
753 1.758e-10, 1.441e-10, 1.197e-10, 9.953e-11, 8.505e-11, 7.334e-11,
754 6.325e-11, 5.625e-11, 5.058e-11, 4.548e-11, 4.122e-11, 3.748e-11,
755 3.402e-11, 3.088e-11, 2.8e-11, 2.536e-11, 2.293e-11, 2.072e-11,
756 1.871e-11, 1.687e-11, 1.52e-11, 1.368e-11, 1.23e-11, 1.105e-11,
757 9.922e-12, 8.898e-12, 7.972e-12, 7.139e-12, 6.385e-12, 5.708e-12,
758 5.099e-12, 4.549e-12, 4.056e-12, 3.613e-12, 3.216e-12, 2.862e-12,
759 2.544e-12, 2.259e-12, 2.004e-12, 1.776e-12, 1.572e-12, 1.391e-12,
760 1.227e-12, 1.082e-12, 9.528e-13, 8.379e-13, 7.349e-13, 6.436e-13,
761 5.634e-13, 4.917e-13, 4.291e-13, 3.745e-13, 3.267e-13, 2.854e-13,
762 2.494e-13, 2.181e-13, 1.913e-13, 1.68e-13, 1.479e-13, 1.31e-13,
763 1.159e-13, 1.025e-13, 9.067e-14, 8.113e-14, 7.281e-14, 6.535e-14,
764 5.892e-14, 5.348e-14, 4.867e-14, 4.439e-14, 4.073e-14, 3.76e-14,
765 3.476e-14, 3.229e-14, 3e-14, 2.807e-14, 2.635e-14, 2.473e-14,
766 2.332e-14
767 };
768
769 static const double hno4[121] = {
770 6.118e-12, 3.594e-12, 2.807e-12, 3.04e-12, 4.458e-12, 7.986e-12,
771 1.509e-11, 2.661e-11, 3.738e-11, 4.652e-11, 4.429e-11, 3.992e-11,
772 3.347e-11, 3.005e-11, 3.173e-11, 4.055e-11, 5.812e-11, 8.489e-11,
773 1.19e-10, 1.482e-10, 1.766e-10, 2.103e-10, 2.35e-10, 2.598e-10,
774 2.801e-10, 2.899e-10, 3e-10, 2.817e-10, 2.617e-10, 2.332e-10,
775 1.933e-10, 1.605e-10, 1.232e-10, 9.285e-11, 6.941e-11, 4.951e-11,
776 3.539e-11, 2.402e-11, 1.522e-11, 9.676e-12, 6.056e-12, 3.745e-12,
777 2.34e-12, 1.463e-12, 9.186e-13, 5.769e-13, 3.322e-13, 1.853e-13,
778 1.035e-13, 7.173e-14, 5.382e-14, 4.036e-14, 3.401e-14, 2.997e-14,
779 2.635e-14, 2.316e-14, 2.034e-14, 1.783e-14, 1.56e-14, 1.363e-14,
780 1.19e-14, 1.037e-14, 9.032e-15, 7.846e-15, 6.813e-15, 5.912e-15,
781 5.121e-15, 4.431e-15, 3.829e-15, 3.306e-15, 2.851e-15, 2.456e-15,
782 2.114e-15, 1.816e-15, 1.559e-15, 1.337e-15, 1.146e-15, 9.811e-16,
783 8.389e-16, 7.162e-16, 6.109e-16, 5.203e-16, 4.425e-16, 3.76e-16,
784 3.184e-16, 2.692e-16, 2.274e-16, 1.917e-16, 1.61e-16, 1.35e-16,
785 1.131e-16, 9.437e-17, 7.874e-17, 6.57e-17, 5.481e-17, 4.579e-17,
786 3.828e-17, 3.204e-17, 2.691e-17, 2.264e-17, 1.912e-17, 1.626e-17,
787 1.382e-17, 1.174e-17, 9.972e-18, 8.603e-18, 7.45e-18, 6.453e-18,
788 5.623e-18, 4.944e-18, 4.361e-18, 3.859e-18, 3.443e-18, 3.096e-18,
789 2.788e-18, 2.528e-18, 2.293e-18, 2.099e-18, 1.929e-18, 1.773e-18,
790 1.64e-18
791 };
792
793 static const double hocl[121] = {
794 1.056e-12, 1.194e-12, 1.35e-12, 1.531e-12, 1.737e-12, 1.982e-12,
795 2.263e-12, 2.599e-12, 2.991e-12, 3.459e-12, 4.012e-12, 4.662e-12,
796 5.438e-12, 6.35e-12, 7.425e-12, 8.686e-12, 1.016e-11, 1.188e-11,
797 1.389e-11, 1.659e-11, 2.087e-11, 2.621e-11, 3.265e-11, 4.064e-11,
798 4.859e-11, 5.441e-11, 6.09e-11, 6.373e-11, 6.611e-11, 6.94e-11,
799 7.44e-11, 7.97e-11, 8.775e-11, 9.722e-11, 1.064e-10, 1.089e-10,
800 1.114e-10, 1.106e-10, 1.053e-10, 1.004e-10, 9.006e-11, 7.778e-11,
801 6.739e-11, 5.636e-11, 4.655e-11, 3.845e-11, 3.042e-11, 2.368e-11,
802 1.845e-11, 1.442e-11, 1.127e-11, 8.814e-12, 6.544e-12, 4.763e-12,
803 3.449e-12, 2.612e-12, 1.999e-12, 1.526e-12, 1.16e-12, 8.793e-13,
804 6.655e-13, 5.017e-13, 3.778e-13, 2.829e-13, 2.117e-13, 1.582e-13,
805 1.178e-13, 8.755e-14, 6.486e-14, 4.799e-14, 3.54e-14, 2.606e-14,
806 1.916e-14, 1.403e-14, 1.026e-14, 7.48e-15, 5.446e-15, 3.961e-15,
807 2.872e-15, 2.076e-15, 1.498e-15, 1.077e-15, 7.726e-16, 5.528e-16,
808 3.929e-16, 2.785e-16, 1.969e-16, 1.386e-16, 9.69e-17, 6.747e-17,
809 4.692e-17, 3.236e-17, 2.232e-17, 1.539e-17, 1.061e-17, 7.332e-18,
810 5.076e-18, 3.522e-18, 2.461e-18, 1.726e-18, 1.22e-18, 8.75e-19,
811 6.264e-19, 4.482e-19, 3.207e-19, 2.368e-19, 1.762e-19, 1.312e-19,
812 9.891e-20, 7.595e-20, 5.87e-20, 4.567e-20, 3.612e-20, 2.904e-20,
813 2.343e-20, 1.917e-20, 1.568e-20, 1.308e-20, 1.1e-20, 9.25e-21,
814 7.881e-21
815 };
816
817 static const double n2o[121] = {
818 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07, 3.17e-07,
819 3.17e-07, 3.17e-07, 3.17e-07, 3.124e-07, 3.077e-07, 3.03e-07,
820 2.984e-07, 2.938e-07, 2.892e-07, 2.847e-07, 2.779e-07, 2.705e-07,
821 2.631e-07, 2.557e-07, 2.484e-07, 2.345e-07, 2.201e-07, 2.01e-07,
822 1.754e-07, 1.532e-07, 1.329e-07, 1.154e-07, 1.003e-07, 8.735e-08,
823 7.617e-08, 6.512e-08, 5.547e-08, 4.709e-08, 3.915e-08, 3.259e-08,
824 2.738e-08, 2.327e-08, 1.98e-08, 1.711e-08, 1.493e-08, 1.306e-08,
825 1.165e-08, 1.049e-08, 9.439e-09, 8.375e-09, 7.391e-09, 6.525e-09,
826 5.759e-09, 5.083e-09, 4.485e-09, 3.953e-09, 3.601e-09, 3.27e-09,
827 2.975e-09, 2.757e-09, 2.556e-09, 2.37e-09, 2.195e-09, 2.032e-09,
828 1.912e-09, 1.79e-09, 1.679e-09, 1.572e-09, 1.482e-09, 1.402e-09,
829 1.326e-09, 1.254e-09, 1.187e-09, 1.127e-09, 1.071e-09, 1.02e-09,
830 9.673e-10, 9.193e-10, 8.752e-10, 8.379e-10, 8.017e-10, 7.66e-10,
831 7.319e-10, 7.004e-10, 6.721e-10, 6.459e-10, 6.199e-10, 5.942e-10,
832 5.703e-10, 5.488e-10, 5.283e-10, 5.082e-10, 4.877e-10, 4.696e-10,
833 4.52e-10, 4.355e-10, 4.198e-10, 4.039e-10, 3.888e-10, 3.754e-10,
834 3.624e-10, 3.499e-10, 3.381e-10, 3.267e-10, 3.163e-10, 3.058e-10,
835 2.959e-10, 2.864e-10, 2.77e-10, 2.686e-10, 2.604e-10, 2.534e-10,
836 2.462e-10, 2.386e-10, 2.318e-10, 2.247e-10, 2.189e-10, 2.133e-10,
837 2.071e-10, 2.014e-10, 1.955e-10, 1.908e-10, 1.86e-10, 1.817e-10
838 };
839
840 static const double n2o5[121] = {
841 1.231e-11, 3.035e-12, 1.702e-12, 9.877e-13, 8.081e-13, 9.039e-13,
842 1.169e-12, 1.474e-12, 1.651e-12, 1.795e-12, 1.998e-12, 2.543e-12,
843 4.398e-12, 7.698e-12, 1.28e-11, 2.131e-11, 3.548e-11, 5.894e-11,
844 7.645e-11, 1.089e-10, 1.391e-10, 1.886e-10, 2.386e-10, 2.986e-10,
845 3.487e-10, 3.994e-10, 4.5e-10, 4.6e-10, 4.591e-10, 4.1e-10, 3.488e-10,
846 2.846e-10, 2.287e-10, 1.696e-10, 1.011e-10, 6.428e-11, 4.324e-11,
847 2.225e-11, 6.214e-12, 3.608e-12, 8.793e-13, 4.491e-13, 1.04e-13,
848 6.1e-14, 3.436e-14, 6.671e-15, 1.171e-15, 5.848e-16, 1.212e-16,
849 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
850 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
851 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
852 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
853 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
854 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
855 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16, 1e-16,
856 1e-16, 1e-16
857 };
858
859 static const double nh3[121] = {
860 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
861 1e-10, 1e-10, 1e-10, 1e-10, 9.444e-11, 8.488e-11, 7.241e-11, 5.785e-11,
862 4.178e-11, 3.018e-11, 2.18e-11, 1.574e-11, 1.137e-11, 8.211e-12,
863 5.973e-12, 4.327e-12, 3.118e-12, 2.234e-12, 1.573e-12, 1.04e-12,
864 6.762e-13, 4.202e-13, 2.406e-13, 1.335e-13, 6.938e-14, 3.105e-14,
865 1.609e-14, 1.033e-14, 6.432e-15, 4.031e-15, 2.555e-15, 1.656e-15,
866 1.115e-15, 7.904e-16, 5.63e-16, 4.048e-16, 2.876e-16, 2.004e-16,
867 1.356e-16, 9.237e-17, 6.235e-17, 4.223e-17, 3.009e-17, 2.328e-17,
868 2.002e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
869 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
870 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
871 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
872 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
873 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
874 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
875 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
876 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
877 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
878 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17, 1.914e-17,
879 1.914e-17
880 };
881
882 static const double no[121] = {
883 2.586e-10, 4.143e-11, 1.566e-11, 9.591e-12, 8.088e-12, 8.462e-12,
884 1.013e-11, 1.328e-11, 1.855e-11, 2.678e-11, 3.926e-11, 5.464e-11,
885 7.012e-11, 8.912e-11, 1.127e-10, 1.347e-10, 1.498e-10, 1.544e-10,
886 1.602e-10, 1.824e-10, 2.078e-10, 2.366e-10, 2.691e-10, 5.141e-10,
887 8.259e-10, 1.254e-09, 1.849e-09, 2.473e-09, 3.294e-09, 4.16e-09,
888 5.095e-09, 6.11e-09, 6.93e-09, 7.888e-09, 8.903e-09, 9.713e-09,
889 1.052e-08, 1.115e-08, 1.173e-08, 1.21e-08, 1.228e-08, 1.239e-08,
890 1.231e-08, 1.213e-08, 1.192e-08, 1.138e-08, 1.085e-08, 1.008e-08,
891 9.224e-09, 8.389e-09, 7.262e-09, 6.278e-09, 5.335e-09, 4.388e-09,
892 3.589e-09, 2.761e-09, 2.129e-09, 1.633e-09, 1.243e-09, 9.681e-10,
893 8.355e-10, 7.665e-10, 7.442e-10, 8.584e-10, 9.732e-10, 1.063e-09,
894 1.163e-09, 1.286e-09, 1.472e-09, 1.707e-09, 2.032e-09, 2.474e-09,
895 2.977e-09, 3.506e-09, 4.102e-09, 5.013e-09, 6.493e-09, 8.414e-09,
896 1.077e-08, 1.367e-08, 1.777e-08, 2.625e-08, 3.926e-08, 5.545e-08,
897 7.195e-08, 9.464e-08, 1.404e-07, 2.183e-07, 3.329e-07, 4.535e-07,
898 6.158e-07, 8.187e-07, 1.075e-06, 1.422e-06, 1.979e-06, 2.71e-06,
899 3.58e-06, 4.573e-06, 5.951e-06, 7.999e-06, 1.072e-05, 1.372e-05,
900 1.697e-05, 2.112e-05, 2.643e-05, 3.288e-05, 3.994e-05, 4.794e-05,
901 5.606e-05, 6.383e-05, 7.286e-05, 8.156e-05, 8.883e-05, 9.469e-05,
902 9.848e-05, 0.0001023, 0.0001066, 0.0001115, 0.0001145, 0.0001142,
903 0.0001133
904 };
905
906 static const double no2[121] = {
907 3.036e-09, 2.945e-10, 9.982e-11, 5.069e-11, 3.485e-11, 2.982e-11,
908 2.947e-11, 3.164e-11, 3.714e-11, 4.586e-11, 6.164e-11, 8.041e-11,
909 9.982e-11, 1.283e-10, 1.73e-10, 2.56e-10, 3.909e-10, 5.959e-10,
910 9.081e-10, 1.384e-09, 1.788e-09, 2.189e-09, 2.686e-09, 3.091e-09,
911 3.49e-09, 3.796e-09, 4.2e-09, 5.103e-09, 6.005e-09, 6.3e-09, 6.706e-09,
912 7.07e-09, 7.434e-09, 7.663e-09, 7.788e-09, 7.8e-09, 7.597e-09,
913 7.482e-09, 7.227e-09, 6.403e-09, 5.585e-09, 4.606e-09, 3.703e-09,
914 2.984e-09, 2.183e-09, 1.48e-09, 8.441e-10, 5.994e-10, 3.799e-10,
915 2.751e-10, 1.927e-10, 1.507e-10, 1.102e-10, 6.971e-11, 5.839e-11,
916 3.904e-11, 3.087e-11, 2.176e-11, 1.464e-11, 1.209e-11, 8.497e-12,
917 6.477e-12, 4.371e-12, 2.914e-12, 2.424e-12, 1.753e-12, 1.35e-12,
918 9.417e-13, 6.622e-13, 5.148e-13, 3.841e-13, 3.446e-13, 3.01e-13,
919 2.551e-13, 2.151e-13, 1.829e-13, 1.64e-13, 1.475e-13, 1.352e-13,
920 1.155e-13, 9.963e-14, 9.771e-14, 9.577e-14, 9.384e-14, 9.186e-14,
921 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
922 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
923 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14,
924 9e-14, 9e-14, 9e-14, 9e-14, 9e-14, 9e-14
925 };
926
927 static const double o3[121] = {
928 2.218e-08, 3.394e-08, 3.869e-08, 4.219e-08, 4.501e-08, 4.778e-08,
929 5.067e-08, 5.402e-08, 5.872e-08, 6.521e-08, 7.709e-08, 9.461e-08,
930 1.269e-07, 1.853e-07, 2.723e-07, 3.964e-07, 5.773e-07, 8.2e-07,
931 1.155e-06, 1.59e-06, 2.076e-06, 2.706e-06, 3.249e-06, 3.848e-06,
932 4.459e-06, 4.986e-06, 5.573e-06, 5.958e-06, 6.328e-06, 6.661e-06,
933 6.9e-06, 7.146e-06, 7.276e-06, 7.374e-06, 7.447e-06, 7.383e-06,
934 7.321e-06, 7.161e-06, 6.879e-06, 6.611e-06, 6.216e-06, 5.765e-06,
935 5.355e-06, 4.905e-06, 4.471e-06, 4.075e-06, 3.728e-06, 3.413e-06,
936 3.125e-06, 2.856e-06, 2.607e-06, 2.379e-06, 2.17e-06, 1.978e-06,
937 1.8e-06, 1.646e-06, 1.506e-06, 1.376e-06, 1.233e-06, 1.102e-06,
938 9.839e-07, 8.771e-07, 7.814e-07, 6.947e-07, 6.102e-07, 5.228e-07,
939 4.509e-07, 3.922e-07, 3.501e-07, 3.183e-07, 2.909e-07, 2.686e-07,
940 2.476e-07, 2.284e-07, 2.109e-07, 2.003e-07, 2.013e-07, 2.022e-07,
941 2.032e-07, 2.042e-07, 2.097e-07, 2.361e-07, 2.656e-07, 2.989e-07,
942 3.37e-07, 3.826e-07, 4.489e-07, 5.26e-07, 6.189e-07, 7.312e-07,
943 8.496e-07, 8.444e-07, 8.392e-07, 8.339e-07, 8.286e-07, 8.234e-07,
944 8.181e-07, 8.129e-07, 8.077e-07, 8.026e-07, 6.918e-07, 5.176e-07,
945 3.865e-07, 2.885e-07, 2.156e-07, 1.619e-07, 1.219e-07, 9.161e-08,
946 6.972e-08, 5.399e-08, 3.498e-08, 2.111e-08, 1.322e-08, 8.482e-09,
947 5.527e-09, 3.423e-09, 2.071e-09, 1.314e-09, 8.529e-10, 5.503e-10,
948 3.665e-10
949 };
950
951 static const double ocs[121] = {
952 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 6e-10, 5.997e-10,
953 5.989e-10, 5.881e-10, 5.765e-10, 5.433e-10, 5.074e-10, 4.567e-10,
954 4.067e-10, 3.601e-10, 3.093e-10, 2.619e-10, 2.232e-10, 1.805e-10,
955 1.46e-10, 1.187e-10, 8.03e-11, 5.435e-11, 3.686e-11, 2.217e-11,
956 1.341e-11, 8.756e-12, 4.511e-12, 2.37e-12, 1.264e-12, 8.28e-13,
957 5.263e-13, 3.209e-13, 1.717e-13, 9.068e-14, 4.709e-14, 2.389e-14,
958 1.236e-14, 1.127e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
959 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
960 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
961 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
962 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
963 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
964 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
965 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
966 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
967 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
968 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
969 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
970 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14, 1.091e-14,
971 1.091e-14, 1.091e-14, 1.091e-14
972 };
973
974 static const double sf6[121] = {
975 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12, 4.103e-12,
976 4.103e-12, 4.103e-12, 4.103e-12, 4.087e-12, 4.064e-12, 4.023e-12,
977 3.988e-12, 3.941e-12, 3.884e-12, 3.755e-12, 3.622e-12, 3.484e-12,
978 3.32e-12, 3.144e-12, 2.978e-12, 2.811e-12, 2.653e-12, 2.489e-12,
979 2.332e-12, 2.199e-12, 2.089e-12, 2.013e-12, 1.953e-12, 1.898e-12,
980 1.859e-12, 1.826e-12, 1.798e-12, 1.776e-12, 1.757e-12, 1.742e-12,
981 1.728e-12, 1.717e-12, 1.707e-12, 1.698e-12, 1.691e-12, 1.685e-12,
982 1.679e-12, 1.675e-12, 1.671e-12, 1.668e-12, 1.665e-12, 1.663e-12,
983 1.661e-12, 1.659e-12, 1.658e-12, 1.657e-12, 1.656e-12, 1.655e-12,
984 1.654e-12, 1.653e-12, 1.653e-12, 1.652e-12, 1.652e-12, 1.652e-12,
985 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12, 1.651e-12,
986 1.651e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
987 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
988 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
989 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
990 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
991 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
992 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12,
993 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12, 1.65e-12
994 };
995
996 static const double so2[121] = {
997 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10, 1e-10,
998 1e-10, 1e-10, 9.867e-11, 9.537e-11, 9e-11, 8.404e-11, 7.799e-11,
999 7.205e-11, 6.616e-11, 6.036e-11, 5.475e-11, 5.007e-11, 4.638e-11,
1000 4.346e-11, 4.055e-11, 3.763e-11, 3.471e-11, 3.186e-11, 2.905e-11,
1001 2.631e-11, 2.358e-11, 2.415e-11, 2.949e-11, 3.952e-11, 5.155e-11,
1002 6.76e-11, 8.741e-11, 1.099e-10, 1.278e-10, 1.414e-10, 1.512e-10,
1003 1.607e-10, 1.699e-10, 1.774e-10, 1.832e-10, 1.871e-10, 1.907e-10,
1004 1.943e-10, 1.974e-10, 1.993e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1005 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1006 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1007 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1008 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1009 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1010 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10,
1011 2e-10, 2e-10, 2e-10, 2e-10, 2e-10, 2e-10
1012 };
1013
1014 const double *q[NG] = { NULL };
1015
1016 /* Identify variable... */
1017 for (int ig = 0; ig < ctl->ng; ig++) {
1018 q[ig] = NULL;
1019 if (strcasecmp(ctl->emitter[ig], "C2H2") == 0)
1020 q[ig] = c2h2;
1021 if (strcasecmp(ctl->emitter[ig], "C2H6") == 0)
1022 q[ig] = c2h6;
1023 if (strcasecmp(ctl->emitter[ig], "CCl4") == 0)
1024 q[ig] = ccl4;
1025 if (strcasecmp(ctl->emitter[ig], "CH3OH") == 0)
1026 q[ig] = ch3oh;
1027 if (strcasecmp(ctl->emitter[ig], "CH4") == 0)
1028 q[ig] = ch4;
1029 if (strcasecmp(ctl->emitter[ig], "ClO") == 0)
1030 q[ig] = clo;
1031 if (strcasecmp(ctl->emitter[ig], "ClONO2") == 0)
1032 q[ig] = clono2;
1033 if (strcasecmp(ctl->emitter[ig], "CO") == 0)
1034 q[ig] = co;
1035 if (strcasecmp(ctl->emitter[ig], "COF2") == 0)
1036 q[ig] = cof2;
1037 if (strcasecmp(ctl->emitter[ig], "F11") == 0)
1038 q[ig] = f11;
1039 if (strcasecmp(ctl->emitter[ig], "F113") == 0)
1040 q[ig] = f113;
1041 if (strcasecmp(ctl->emitter[ig], "F114") == 0)
1042 q[ig] = f114;
1043 if (strcasecmp(ctl->emitter[ig], "F12") == 0)
1044 q[ig] = f12;
1045 if (strcasecmp(ctl->emitter[ig], "F14") == 0)
1046 q[ig] = f14;
1047 if (strcasecmp(ctl->emitter[ig], "F22") == 0)
1048 q[ig] = f22;
1049 if (strcasecmp(ctl->emitter[ig], "H2CO") == 0)
1050 q[ig] = h2co;
1051 if (strcasecmp(ctl->emitter[ig], "H2O") == 0)
1052 q[ig] = h2o;
1053 if (strcasecmp(ctl->emitter[ig], "H2O2") == 0)
1054 q[ig] = h2o2;
1055 if (strcasecmp(ctl->emitter[ig], "HCl") == 0)
1056 q[ig] = hcl;
1057 if (strcasecmp(ctl->emitter[ig], "HCN") == 0)
1058 q[ig] = hcn;
1059 if (strcasecmp(ctl->emitter[ig], "HF") == 0)
1060 q[ig] = hf;
1061 if (strcasecmp(ctl->emitter[ig], "HNO3") == 0)
1062 q[ig] = hno3;
1063 if (strcasecmp(ctl->emitter[ig], "HNO4") == 0)
1064 q[ig] = hno4;
1065 if (strcasecmp(ctl->emitter[ig], "HOCl") == 0)
1066 q[ig] = hocl;
1067 if (strcasecmp(ctl->emitter[ig], "N2O") == 0)
1068 q[ig] = n2o;
1069 if (strcasecmp(ctl->emitter[ig], "N2O5") == 0)
1070 q[ig] = n2o5;
1071 if (strcasecmp(ctl->emitter[ig], "NH3") == 0)
1072 q[ig] = nh3;
1073 if (strcasecmp(ctl->emitter[ig], "NO") == 0)
1074 q[ig] = no;
1075 if (strcasecmp(ctl->emitter[ig], "NO2") == 0)
1076 q[ig] = no2;
1077 if (strcasecmp(ctl->emitter[ig], "O3") == 0)
1078 q[ig] = o3;
1079 if (strcasecmp(ctl->emitter[ig], "OCS") == 0)
1080 q[ig] = ocs;
1081 if (strcasecmp(ctl->emitter[ig], "SF6") == 0)
1082 q[ig] = sf6;
1083 if (strcasecmp(ctl->emitter[ig], "SO2") == 0)
1084 q[ig] = so2;
1085 }
1086
1087 /* Loop over atmospheric data points... */
1088 for (int ip = 0; ip < atm->np; ip++) {
1089
1090 /* Get altitude index... */
1091 const int iz = locate_reg(z, 121, atm->z[ip]);
1092
1093 /* Interpolate pressure... */
1094 atm->p[ip] = LOGY(z[iz], pre[iz], z[iz + 1], pre[iz + 1], atm->z[ip]);
1095
1096 /* Interpolate temperature... */
1097 atm->t[ip] = LIN(z[iz], tem[iz], z[iz + 1], tem[iz + 1], atm->z[ip]);
1098
1099 /* Interpolate trace gases... */
1100 for (int ig = 0; ig < ctl->ng; ig++)
1101 if (q[ig] != NULL)
1102 atm->q[ig][ip] =
1103 LIN(z[iz], q[ig][iz], z[iz + 1], q[ig][iz + 1], atm->z[ip]);
1104 else
1105 atm->q[ig][ip] = 0;
1106
1107 /* Set CO2... */
1108 if (ctl->ig_co2 >= 0)
1109 atm->q[ctl->ig_co2][ip] =
1110 371.789948e-6 + 2.026214e-6 * (atm->time[ip] - 63158400.) / 31557600.;
1111
1112 /* Set N2... */
1113 if (ctl->ig_n2 >= 0)
1114 atm->q[ctl->ig_n2][ip] = N2;
1115
1116 /* Set O2... */
1117 if (ctl->ig_o2 >= 0)
1118 atm->q[ctl->ig_o2][ip] = O2;
1119
1120 /* Set extinction to zero... */
1121 for (int iw = 0; iw < ctl->nw; iw++)
1122 atm->k[iw][ip] = 0;
1123
1124 /* Set cloud layer... */
1125 atm->clz = atm->cldz = 0;
1126 for (int icl = 0; icl < ctl->ncl; icl++)
1127 atm->clk[icl] = 0;
1128
1129 /* Set surface layer... */
1130 atm->sft = 0;
1131 for (int isf = 0; isf < ctl->nsf; isf++)
1132 atm->sfeps[isf] = 1;
1133 }
1134}
int locate_reg(const double *xx, const int n, const double x)
Locate index for interpolation on a regular (uniform) grid.
Definition: jurassic.c:4367
#define O2
Oxygen concentration.
Definition: jurassic.h:177
#define LOGY(x0, y0, x1, y1, x)
Compute logarithmic interpolation in y.
Definition: jurassic.h:617
#define NG
Maximum number of emitters.
Definition: jurassic.h:241
#define N2
Nitrogen concentration.
Definition: jurassic.h:172
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:573
double time[NP]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:920
int ig_co2
Emitter index of CO2.
Definition: jurassic.h:976
int ig_o2
Emitter index of O2.
Definition: jurassic.h:985
int ig_n2
Emitter index of N2.
Definition: jurassic.h:982
char emitter[NG][LEN]
Name of each emitter.
Definition: jurassic.h:973
Here is the call graph for this function:

◆ cost_function()

double cost_function ( gsl_vector *  dx,
gsl_vector *  dy,
gsl_matrix *  s_a_inv,
gsl_vector *  sig_eps_inv 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 1138 of file jurassic.c.

1142 {
1143
1144 double chisq_a, chisq_m = 0;
1145
1146 /* Get sizes... */
1147 const size_t m = dy->size;
1148 const size_t n = dx->size;
1149
1150 /* Allocate... */
1151 gsl_vector *x_aux = gsl_vector_alloc(n);
1152 gsl_vector *y_aux = gsl_vector_alloc(m);
1153
1154 /* Determine normalized cost function...
1155 (chi^2 = 1/m * [dy^T * S_eps^{-1} * dy + dx^T * S_a^{-1} * dx]) */
1156 for (size_t i = 0; i < m; i++)
1157 chisq_m += POW2(gsl_vector_get(dy, i) * gsl_vector_get(sig_eps_inv, i));
1158 gsl_blas_dgemv(CblasNoTrans, 1.0, s_a_inv, dx, 0.0, x_aux);
1159 gsl_blas_ddot(dx, x_aux, &chisq_a);
1160
1161 /* Free... */
1162 gsl_vector_free(x_aux);
1163 gsl_vector_free(y_aux);
1164
1165 /* Return cost function value... */
1166 return (chisq_m + chisq_a) / (double) m;
1167}
#define POW2(x)
Compute the square of a value.
Definition: jurassic.h:669

◆ ctmco2()

double ctmco2 ( const double  nu,
const double  p,
const double  t,
const double  u 
)

Compute carbon dioxide continuum (optical depth).

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 1171 of file jurassic.c.

1175 {
1176
1177 static const double co2296[2001] =
1178 { 9.3388e-5, 9.7711e-5, 1.0224e-4, 1.0697e-4,
1179 1.1193e-4, 1.1712e-4, 1.2255e-4, 1.2824e-4, 1.3419e-4, 1.4043e-4,
1180 1.4695e-4, 1.5378e-4, 1.6094e-4, 1.6842e-4, 1.7626e-4, 1.8447e-4,
1181 1.9307e-4, 2.0207e-4, 2.1149e-4, 2.2136e-4, 2.3169e-4, 2.4251e-4,
1182 2.5384e-4, 2.657e-4, 2.7813e-4, 2.9114e-4, 3.0477e-4, 3.1904e-4,
1183 3.3399e-4, 3.4965e-4, 3.6604e-4, 3.8322e-4, 4.0121e-4, 4.2006e-4,
1184 4.398e-4, 4.6047e-4, 4.8214e-4, 5.0483e-4, 5.286e-4, 5.535e-4,
1185 5.7959e-4, 6.0693e-4, 6.3557e-4, 6.6558e-4, 6.9702e-4, 7.2996e-4,
1186 7.6449e-4, 8.0066e-4, 8.3856e-4, 8.7829e-4, 9.1991e-4, 9.6354e-4,
1187 .0010093, .0010572, .0011074, .00116, .0012152, .001273,
1188 .0013336, .0013972, .0014638, .0015336, .0016068, .0016835,
1189 .001764, .0018483, .0019367, .0020295, .0021267, .0022286,
1190 .0023355, .0024476, .0025652, .0026885, .0028178, .0029534,
1191 .0030956, .0032448, .0034012, .0035654, .0037375, .0039181,
1192 .0041076, .0043063, .0045148, .0047336, .0049632, .005204,
1193 .0054567, .0057219, .0060002, .0062923, .0065988, .0069204,
1194 .007258, .0076123, .0079842, .0083746, .0087844, .0092146,
1195 .0096663, .01014, .010638, .011161, .01171, .012286, .012891,
1196 .013527, .014194, .014895, .015631, .016404, .017217, .01807,
1197 .018966, .019908, .020897, .021936, .023028, .024176, .025382,
1198 .026649, .027981, .02938, .030851, .032397, .034023, .035732,
1199 .037528, .039416, .041402, .04349, .045685, .047994, .050422,
1200 .052975, .055661, .058486, .061458, .064584, .067873, .071334,
1201 .074975, .078807, .082839, .087082, .091549, .096249, .1012,
1202 .10641, .11189, .11767, .12375, .13015, .13689, .14399, .15147,
1203 .15935, .16765, .17639, .18561, .19531, .20554, .21632, .22769,
1204 .23967, .25229, .2656, .27964, .29443, .31004, .3265, .34386,
1205 .36218, .3815, .40188, .42339, .44609, .47004, .49533, .52202,
1206 .5502, .57995, .61137, .64455, .6796, .71663, .75574, .79707,
1207 .84075, .88691, .9357, .98728, 1.0418, 1.0995, 1.1605, 1.225,
1208 1.2932, 1.3654, 1.4418, 1.5227, 1.6083, 1.6989, 1.7948, 1.8964,
1209 2.004, 2.118, 2.2388, 2.3668, 2.5025, 2.6463, 2.7988, 2.9606,
1210 3.1321, 3.314, 3.5071, 3.712, 3.9296, 4.1605, 4.4058, 4.6663,
1211 4.9431, 5.2374, 5.5501, 5.8818, 6.2353, 6.6114, 7.0115, 7.4372,
1212 7.8905, 8.3731, 8.8871, 9.4349, 10.019, 10.641, 11.305, 12.013,
1213 12.769, 13.576, 14.437, 15.358, 16.342, 17.39, 18.513, 19.716,
1214 21.003, 22.379, 23.854, 25.436, 27.126, 28.942, 30.89, 32.973,
1215 35.219, 37.634, 40.224, 43.021, 46.037, 49.29, 52.803, 56.447,
1216 60.418, 64.792, 69.526, 74.637, 80.182, 86.193, 92.713, 99.786,
1217 107.47, 115.84, 124.94, 134.86, 145.69, 157.49, 170.3, 184.39,
1218 199.83, 216.4, 234.55, 254.72, 276.82, 299.85, 326.16, 354.99,
1219 386.51, 416.68, 449.89, 490.12, 534.35, 578.25, 632.26, 692.61,
1220 756.43, 834.75, 924.11, 1016.9, 996.96, 1102.7, 1219.2, 1351.9,
1221 1494.3, 1654.1, 1826.5, 2027.9, 2249., 2453.8, 2714.4, 2999.4,
1222 3209.5, 3509., 3840.4, 3907.5, 4190.7, 4533.5, 4648.3, 5059.1,
1223 5561.6, 6191.4, 6820.8, 7905.9, 9362.2, 2431.3, 2211.3, 2046.8,
1224 2023.8, 1985.9, 1905.9, 1491.1, 1369.8, 1262.2, 1200.7, 887.74,
1225 820.25, 885.23, 887.21, 816.73, 1126.9, 1216.2, 1272.4, 1579.5,
1226 1634.2, 1656.3, 1657.9, 1789.5, 1670.8, 1509.5, 8474.6, 7489.2,
1227 6793.6, 6117., 5574.1, 5141.2, 5084.6, 4745.1, 4413.2, 4102.8,
1228 4024.7, 3715., 3398.6, 3100.8, 2900.4, 2629.2, 2374., 2144.7,
1229 1955.8, 1760.8, 1591.2, 1435.2, 1296.2, 1174., 1065.1, 967.76,
1230 999.48, 897.45, 809.23, 732.77, 670.26, 611.93, 560.11, 518.77,
1231 476.84, 438.8, 408.48, 380.21, 349.24, 322.71, 296.65, 272.85,
1232 251.96, 232.04, 213.88, 197.69, 182.41, 168.41, 155.79, 144.05,
1233 133.31, 123.48, 114.5, 106.21, 98.591, 91.612, 85.156, 79.204,
1234 73.719, 68.666, 63.975, 59.637, 56.35, 52.545, 49.042, 45.788,
1235 42.78, 39.992, 37.441, 35.037, 32.8, 30.744, 28.801, 26.986,
1236 25.297, 23.731, 22.258, 20.883, 19.603, 18.403, 17.295, 16.249,
1237 15.271, 14.356, 13.501, 12.701, 11.954, 11.254, 10.6, 9.9864,
1238 9.4118, 8.8745, 8.3714, 7.8997, 7.4578, 7.0446, 6.6573, 6.2949,
1239 5.9577, 5.6395, 5.3419, 5.063, 4.8037, 4.5608, 4.3452, 4.1364,
1240 3.9413, 3.7394, 3.562, 3.3932, 3.2325, 3.0789, 2.9318, 2.7898,
1241 2.6537, 2.5225, 2.3958, 2.2305, 2.1215, 2.0245, 1.9427, 1.8795,
1242 1.8336, 1.7604, 1.7016, 1.6419, 1.5282, 1.4611, 1.3443, 1.27,
1243 1.1675, 1.0824, 1.0534, .99833, .95854, .92981, .90887, .89346,
1244 .88113, .87068, .86102, .85096, .88262, .86151, .83565, .80518,
1245 .77045, .73736, .74744, .74954, .75773, .82267, .83493, .89402,
1246 .89725, .93426, .95564, .94045, .94174, .93404, .92035, .90456,
1247 .88621, .86673, .78117, .7515, .72056, .68822, .65658, .62764,
1248 .55984, .55598, .57407, .60963, .63763, .66198, .61132, .60972,
1249 .52496, .50649, .41872, .3964, .32422, .27276, .24048, .23772,
1250 .2286, .22711, .23999, .32038, .34371, .36621, .38561, .39953,
1251 .40636, .44913, .42716, .3919, .35477, .33935, .3351, .39746,
1252 .40993, .49398, .49956, .56157, .54742, .57295, .57386, .55417,
1253 .50745, .471, .43446, .39102, .34993, .31269, .27888, .24912,
1254 .22291, .19994, .17972, .16197, .14633, .13252, .12029, .10942,
1255 .099745, .091118, .083404, .076494, .070292, .064716, .059697,
1256 .055173, .051093, .047411, .044089, .041092, .038392, .035965,
1257 .033789, .031846, .030122, .028607, .02729, .026169, .025209,
1258 .024405, .023766, .023288, .022925, .022716, .022681, .022685,
1259 .022768, .023133, .023325, .023486, .024004, .024126, .024083,
1260 .023785, .024023, .023029, .021649, .021108, .019454, .017809,
1261 .017292, .016635, .017037, .018068, .018977, .018756, .017847,
1262 .016557, .016142, .014459, .012869, .012381, .010875, .0098701,
1263 .009285, .0091698, .0091701, .0096145, .010553, .01106, .012613,
1264 .014362, .015017, .016507, .017741, .01768, .017784, .0171,
1265 .016357, .016172, .017257, .018978, .020935, .021741, .023567,
1266 .025183, .025589, .026732, .027648, .028278, .028215, .02856,
1267 .029015, .029062, .028851, .028497, .027825, .027801, .026523,
1268 .02487, .022967, .022168, .020194, .018605, .017903, .018439,
1269 .019697, .020311, .020855, .020057, .018608, .016738, .015963,
1270 .013844, .011801, .011134, .0097573, .0086007, .0086226,
1271 .0083721, .0090978, .0097616, .0098426, .011317, .012853, .01447,
1272 .014657, .015771, .016351, .016079, .014829, .013431, .013185,
1273 .013207, .01448, .016176, .017971, .018265, .019526, .020455,
1274 .019797, .019802, .0194, .018176, .017505, .016197, .015339,
1275 .014401, .013213, .012203, .011186, .010236, .0093288, .0084854,
1276 .0076837, .0069375, .0062614, .0056628, .0051153, .0046015,
1277 .0041501, .003752, .0033996, .0030865, .0028077, .0025586,
1278 .0023355, .0021353, .0019553, .0017931, .0016466, .0015141,
1279 .0013941, .0012852, .0011862, .0010962, .0010142, 9.3935e-4,
1280 8.71e-4, 8.0851e-4, 7.5132e-4, 6.9894e-4, 6.5093e-4, 6.0689e-4,
1281 5.6647e-4, 5.2935e-4, 4.9525e-4, 4.6391e-4, 4.3509e-4, 4.086e-4,
1282 3.8424e-4, 3.6185e-4, 3.4126e-4, 3.2235e-4, 3.0498e-4, 2.8904e-4,
1283 2.7444e-4, 2.6106e-4, 2.4883e-4, 2.3766e-4, 2.275e-4, 2.1827e-4,
1284 2.0992e-4, 2.0239e-4, 1.9563e-4, 1.896e-4, 1.8427e-4, 1.796e-4,
1285 1.7555e-4, 1.7209e-4, 1.692e-4, 1.6687e-4, 1.6505e-4, 1.6375e-4,
1286 1.6294e-4, 1.6261e-4, 1.6274e-4, 1.6334e-4, 1.6438e-4, 1.6587e-4,
1287 1.678e-4, 1.7017e-4, 1.7297e-4, 1.762e-4, 1.7988e-4, 1.8399e-4,
1288 1.8855e-4, 1.9355e-4, 1.9902e-4, 2.0494e-4, 2.1134e-4, 2.1823e-4,
1289 2.2561e-4, 2.335e-4, 2.4192e-4, 2.5088e-4, 2.604e-4, 2.705e-4,
1290 2.8119e-4, 2.9251e-4, 3.0447e-4, 3.171e-4, 3.3042e-4, 3.4447e-4,
1291 3.5927e-4, 3.7486e-4, 3.9127e-4, 4.0854e-4, 4.267e-4, 4.4579e-4,
1292 4.6586e-4, 4.8696e-4, 5.0912e-4, 5.324e-4, 5.5685e-4, 5.8253e-4,
1293 6.0949e-4, 6.378e-4, 6.6753e-4, 6.9873e-4, 7.3149e-4, 7.6588e-4,
1294 8.0198e-4, 8.3987e-4, 8.7964e-4, 9.2139e-4, 9.6522e-4, .0010112,
1295 .0010595, .0011102, .0011634, .0012193, .001278, .0013396,
1296 .0014043, .0014722, .0015436, .0016185, .0016972, .0017799,
1297 .0018668, .001958, .0020539, .0021547, .0022606, .0023719,
1298 .002489, .002612, .0027414, .0028775, .0030206, .0031712,
1299 .0033295, .0034962, .0036716, .0038563, .0040506, .0042553,
1300 .0044709, .004698, .0049373, .0051894, .0054552, .0057354,
1301 .006031, .0063427, .0066717, .0070188, .0073854, .0077726,
1302 .0081816, .0086138, .0090709, .0095543, .010066, .010607,
1303 .011181, .011789, .012433, .013116, .013842, .014613, .015432,
1304 .016304, .017233, .018224, .019281, .020394, .021574, .022836,
1305 .024181, .025594, .027088, .028707, .030401, .032245, .034219,
1306 .036262, .038539, .040987, .043578, .04641, .04949, .052726,
1307 .056326, .0602, .064093, .068521, .073278, .077734, .083064,
1308 .088731, .093885, .1003, .1072, .11365, .12187, .13078, .13989,
1309 .15095, .16299, .17634, .19116, .20628, .22419, .24386, .26587,
1310 .28811, .31399, .34321, .36606, .39675, .42742, .44243, .47197,
1311 .49993, .49027, .51147, .52803, .48931, .49729, .5026, .43854,
1312 .441, .44766, .43414, .46151, .50029, .55247, .43855, .32115,
1313 .32607, .3431, .36119, .38029, .41179, .43996, .47144, .51853,
1314 .55362, .59122, .66338, .69877, .74001, .82923, .86907, .90361,
1315 1.0025, 1.031, 1.0559, 1.104, 1.1178, 1.1341, 1.1547, 1.351,
1316 1.4772, 1.4812, 1.4907, 1.512, 1.5442, 1.5853, 1.6358, 1.6963,
1317 1.7674, 1.8474, 1.9353, 2.0335, 2.143, 2.2592, 2.3853, 2.5217,
1318 2.6686, 2.8273, 2.9998, 3.183, 3.3868, 3.6109, 3.8564, 4.1159,
1319 4.4079, 4.7278, 5.0497, 5.3695, 5.758, 6.0834, 6.4976, 6.9312,
1320 7.38, 7.5746, 7.9833, 8.3791, 8.3956, 8.7501, 9.1067, 9.072,
1321 9.4649, 9.9112, 10.402, 10.829, 11.605, 12.54, 12.713, 10.443,
1322 10.825, 11.375, 11.955, 12.623, 13.326, 14.101, 15.041, 15.547,
1323 16.461, 17.439, 18.716, 19.84, 21.036, 22.642, 23.901, 25.244,
1324 27.03, 28.411, 29.871, 31.403, 33.147, 34.744, 36.456, 39.239,
1325 43.605, 45.162, 47.004, 49.093, 51.391, 53.946, 56.673, 59.629,
1326 63.167, 66.576, 70.254, 74.222, 78.477, 83.034, 87.914, 93.18,
1327 98.77, 104.74, 111.15, 117.95, 125.23, 133.01, 141.33, 150.21,
1328 159.71, 169.89, 180.93, 192.54, 204.99, 218.34, 232.65, 248.,
1329 264.47, 282.14, 301.13, 321.53, 343.48, 367.08, 392.5, 419.88,
1330 449.4, 481.26, 515.64, 552.79, 592.99, 636.48, 683.61, 734.65,
1331 789.99, 850.02, 915.14, 985.81, 1062.5, 1147.1, 1237.8, 1336.4,
1332 1443.2, 1558.9, 1684.2, 1819.2, 1965.2, 2122.6, 2291.7, 2470.8,
1333 2665.7, 2874.9, 3099.4, 3337.9, 3541., 3813.3, 4111.9, 4439.3,
1334 4798.9, 5196., 5639.2, 6087.5, 6657.7, 7306.7, 8040.7, 8845.5,
1335 9702.2, 10670., 11739., 12842., 14141., 15498., 17068., 18729.,
1336 20557., 22559., 25248., 27664., 30207., 32915., 35611., 38081.,
1337 40715., 43191., 41651., 42750., 43785., 44353., 44366., 44189.,
1338 43618., 42862., 41878., 35133., 35215., 36383., 39420., 44055.,
1339 44155., 45850., 46853., 39197., 38274., 29942., 28553., 21792.,
1340 21228., 17106., 14955., 18181., 19557., 21427., 23728., 26301.,
1341 28584., 30775., 32536., 33867., 40089., 39204., 37329., 34452.,
1342 31373., 33921., 34800., 36043., 44415., 45162., 52181., 50895.,
1343 54140., 50840., 50468., 48302., 44915., 40910., 36754., 32755.,
1344 29093., 25860., 22962., 20448., 18247., 16326., 14645., 13165.,
1345 11861., 10708., 9686.9, 8779.7, 7971.9, 7250.8, 6605.7, 6027.2,
1346 5507.3, 5039.1, 4616.6, 4234.8, 3889., 3575.4, 3290.5, 3031.3,
1347 2795.2, 2579.9, 2383.1, 2203.3, 2038.6, 1887.6, 1749.1, 1621.9,
1348 1505., 1397.4, 1298.3, 1207., 1122.8, 1045., 973.1, 906.64,
1349 845.16, 788.22, 735.48, 686.57, 641.21, 599.1, 559.99, 523.64,
1350 489.85, 458.42, 429.16, 401.92, 376.54, 352.88, 330.82, 310.24,
1351 291.03, 273.09, 256.34, 240.69, 226.05, 212.37, 199.57, 187.59,
1352 176.37, 165.87, 156.03, 146.82, 138.17, 130.07, 122.47, 115.34,
1353 108.65, 102.37, 96.473, 90.934, 85.73, 80.84, 76.243, 71.922,
1354 67.858, 64.034, 60.438, 57.052, 53.866, 50.866, 48.04, 45.379,
1355 42.872, 40.51, 38.285, 36.188, 34.211, 32.347, 30.588, 28.929,
1356 27.362, 25.884, 24.489, 23.171, 21.929, 20.755, 19.646, 18.599,
1357 17.61, 16.677, 15.795, 14.961, 14.174, 13.43, 12.725, 12.06,
1358 11.431, 10.834, 10.27, 9.7361, 9.2302, 8.7518, 8.2997, 7.8724,
1359 7.4674, 7.0848, 6.7226, 6.3794, 6.054, 5.745, 5.4525, 5.1752,
1360 4.9121, 4.6625, 4.4259, 4.2015, 3.9888, 3.7872, 3.5961, 3.4149,
1361 3.2431, 3.0802, 2.9257, 2.7792, 2.6402, 2.5084, 2.3834, 2.2648,
1362 2.1522, 2.0455, 1.9441, 1.848, 1.7567, 1.6701, 1.5878, 1.5097,
1363 1.4356, 1.3651, 1.2981, 1.2345, 1.174, 1.1167, 1.062, 1.0101,
1364 .96087, .91414, .86986, .82781, .78777, .74971, .71339, .67882,
1365 .64604, .61473, .58507, .55676, .52987, .5044, .48014, .45715,
1366 .43527, .41453, .3948, .37609, .35831, .34142, .32524, .30995,
1367 .29536, .28142, .26807, .25527, .24311, .23166, .22077, .21053,
1368 .20081, .19143, .18261, .17407, .16603, .15833, .15089, .14385,
1369 .13707, .13065, .12449, .11865, .11306, .10774, .10266, .097818,
1370 .093203, .088815, .084641, .080671, .076892, .073296, .069873,
1371 .066613, .06351, .060555, .05774, .055058, .052504, .050071,
1372 .047752, .045543, .043438, .041432, .039521, .037699, .035962,
1373 .034307, .032729, .031225, .029791, .028423, .02712, .025877,
1374 .024692, .023563, .022485, .021458, .020478, .019543, .018652,
1375 .017802, .016992, .016219, .015481, .014778, .014107, .013467,
1376 .012856, .012274, .011718, .011188, .010682, .0102, .0097393,
1377 .0093001, .008881, .0084812, .0080997, .0077358, .0073885,
1378 .0070571, .0067409, .0064393, .0061514, .0058768, .0056147,
1379 .0053647, .0051262, .0048987, .0046816, .0044745, .0042769,
1380 .0040884, .0039088, .0037373, .0035739, .003418, .0032693,
1381 .0031277, .0029926, .0028639, .0027413, .0026245, .0025133,
1382 .0024074, .0023066, .0022108, .0021196, .002033, .0019507,
1383 .0018726, .0017985, .0017282, .0016617, .0015988, .0015394,
1384 .0014834, .0014306, .0013811, .0013346, .0012911, .0012506,
1385 .0012131, .0011784, .0011465, .0011175, .0010912, .0010678,
1386 .0010472, .0010295, .0010147, .001003, 9.9428e-4, 9.8883e-4,
1387 9.8673e-4, 9.8821e-4, 9.9343e-4, .0010027, .0010164, .0010348,
1388 .0010586, .0010882, .0011245, .0011685, .0012145, .0012666,
1389 .0013095, .0013688, .0014048, .0014663, .0015309, .0015499,
1390 .0016144, .0016312, .001705, .0017892, .0018499, .0019715,
1391 .0021102, .0022442, .0024284, .0025893, .0027703, .0029445,
1392 .0031193, .003346, .0034552, .0036906, .0037584, .0040084,
1393 .0041934, .0044587, .0047093, .0049759, .0053421, .0055134,
1394 .0059048, .0058663, .0061036, .0063259, .0059657, .0060653,
1395 .0060972, .0055539, .0055653, .0055772, .005331, .0054953,
1396 .0055919, .0058684, .006183, .0066675, .0069808, .0075142,
1397 .0078536, .0084282, .0089454, .0094625, .0093703, .0095857,
1398 .0099283, .010063, .010521, .0097778, .0098175, .010379, .010447,
1399 .0105, .010617, .010706, .01078, .011177, .011212, .011304,
1400 .011446, .011603, .011816, .012165, .012545, .013069, .013539,
1401 .01411, .014776, .016103, .017016, .017994, .018978, .01998,
1402 .021799, .022745, .023681, .024627, .025562, .026992, .027958,
1403 .029013, .030154, .031402, .03228, .033651, .035272, .037088,
1404 .039021, .041213, .043597, .045977, .04877, .051809, .054943,
1405 .058064, .061528, .06537, .069309, .071928, .075752, .079589,
1406 .083352, .084096, .087497, .090817, .091198, .094966, .099045,
1407 .10429, .10867, .11518, .12269, .13126, .14087, .15161, .16388,
1408 .16423, .1759, .18721, .19994, .21275, .22513, .23041, .24231,
1409 .25299, .25396, .26396, .27696, .27929, .2908, .30595, .31433,
1410 .3282, .3429, .35944, .37467, .39277, .41245, .43326, .45649,
1411 .48152, .51897, .54686, .57877, .61263, .64962, .68983, .73945,
1412 .78619, .83537, .89622, .95002, 1.0067, 1.0742, 1.1355, 1.2007,
1413 1.2738, 1.347, 1.4254, 1.5094, 1.6009, 1.6976, 1.8019, 1.9148,
1414 2.0357, 2.166, 2.3066, 2.4579, 2.6208, 2.7966, 2.986, 3.188,
1415 3.4081, 3.6456, 3.9, 4.1747, 4.4712, 4.7931, 5.1359, 5.5097,
1416 5.9117, 6.3435, 6.8003, 7.3001, 7.8385, 8.3945, 9.011, 9.6869,
1417 10.392, 11.18, 12.036, 12.938, 13.944, 14.881, 16.029, 17.255,
1418 18.574, 19.945, 21.38, 22.9, 24.477, 26.128, 27.87, 29.037,
1419 30.988, 33.145, 35.506, 37.76, 40.885, 44.487, 48.505, 52.911,
1420 57.56, 61.964, 67.217, 72.26, 78.343, 85.08, 91.867, 99.435,
1421 107.68, 116.97, 127.12, 138.32, 150.26, 163.04, 174.81, 189.26,
1422 205.61, 224.68, 240.98, 261.88, 285.1, 307.58, 334.35, 363.53,
1423 394.68, 427.85, 458.85, 489.25, 472.87, 486.93, 496.27, 501.52,
1424 501.57, 497.14, 488.09, 476.32, 393.76, 388.51, 393.42, 414.45,
1425 455.12, 514.62, 520.38, 547.42, 562.6, 487.47, 480.83, 391.06,
1426 376.92, 303.7, 295.91, 256.03, 236.73, 280.38, 310.71, 335.53,
1427 367.88, 401.94, 435.52, 469.13, 497.94, 588.82, 597.94, 597.2,
1428 588.28, 571.2, 555.75, 603.56, 638.15, 680.75, 801.72, 848.01,
1429 962.15, 990.06, 1068.1, 1076.2, 1115.3, 1134.2, 1136.6, 1119.1,
1430 1108.9, 1090.6, 1068.7, 1041.9, 1005.4, 967.98, 927.08, 780.1,
1431 751.41, 733.12, 742.65, 785.56, 855.16, 852.45, 878.1, 784.59,
1432 777.81, 765.13, 622.93, 498.09, 474.89, 386.9, 378.48, 336.17,
1433 322.04, 329.57, 350.5, 383.38, 420.02, 462.39, 499.71, 531.98,
1434 654.99, 653.43, 639.99, 605.16, 554.16, 504.42, 540.64, 552.33,
1435 679.46, 699.51, 713.91, 832.17, 919.91, 884.96, 907.57, 846.56,
1436 818.56, 768.93, 706.71, 642.17, 575.95, 515.38, 459.07, 409.02,
1437 364.61, 325.46, 291.1, 260.89, 234.39, 211.01, 190.38, 172.11,
1438 155.91, 141.49, 128.63, 117.13, 106.84, 97.584, 89.262, 81.756,
1439 74.975, 68.842, 63.28, 58.232, 53.641, 49.46, 45.649, 42.168,
1440 38.991, 36.078, 33.409, 30.96, 28.71, 26.642, 24.737, 22.985,
1441 21.37, 19.882, 18.512, 17.242, 16.073, 14.987, 13.984, 13.05,
1442 12.186, 11.384, 10.637, 9.9436, 9.2988, 8.6991, 8.141, 7.6215,
1443 7.1378, 6.6872, 6.2671, 5.8754, 5.51, 5.1691, 4.851, 4.5539,
1444 4.2764, 4.0169, 3.7742, 3.5472, 3.3348, 3.1359, 2.9495, 2.7749,
1445 2.6113, 2.4578, 2.3139, 2.1789, 2.0523, 1.9334, 1.8219, 1.7171,
1446 1.6188, 1.5263, 1.4395, 1.3579, 1.2812, 1.209, 1.1411, 1.0773,
1447 1.0171, .96048, .90713, .85684, .80959, .76495, .72282, .68309,
1448 .64563, .61035, .57707, .54573, .51622, .48834, .46199, .43709,
1449 .41359, .39129, .37034, .35064, .33198, .31442, .29784, .28218,
1450 .26732, .25337, .24017, .22774, .21601, .20479, .19426
1451 };
1452
1453 static const double co2260[2001] =
1454 { 5.7971e-5, 6.0733e-5, 6.3628e-5, 6.6662e-5,
1455 6.9843e-5, 7.3176e-5, 7.6671e-5, 8.0334e-5, 8.4175e-5, 8.8201e-5,
1456 9.2421e-5, 9.6846e-5, 1.0149e-4, 1.0635e-4, 1.1145e-4, 1.1679e-4,
1457 1.224e-4, 1.2828e-4, 1.3444e-4, 1.409e-4, 1.4768e-4, 1.5479e-4,
1458 1.6224e-4, 1.7006e-4, 1.7826e-4, 1.8685e-4, 1.9587e-4, 2.0532e-4,
1459 2.1524e-4, 2.2565e-4, 2.3656e-4, 2.48e-4, 2.6001e-4, 2.7261e-4,
1460 2.8582e-4, 2.9968e-4, 3.1422e-4, 3.2948e-4, 3.4548e-4, 3.6228e-4,
1461 3.799e-4, 3.9838e-4, 4.1778e-4, 4.3814e-4, 4.595e-4, 4.8191e-4,
1462 5.0543e-4, 5.3012e-4, 5.5603e-4, 5.8321e-4, 6.1175e-4, 6.417e-4,
1463 6.7314e-4, 7.0614e-4, 7.4078e-4, 7.7714e-4, 8.1531e-4, 8.5538e-4,
1464 8.9745e-4, 9.4162e-4, 9.8798e-4, .0010367, .0010878, .0011415,
1465 .0011978, .001257, .0013191, .0013844, .001453, .0015249,
1466 .0016006, .00168, .0017634, .001851, .001943, .0020397, .0021412,
1467 .0022479, .00236, .0024778, .0026015, .0027316, .0028682,
1468 .0030117, .0031626, .0033211, .0034877, .0036628, .0038469,
1469 .0040403, .0042436, .0044574, .004682, .0049182, .0051665,
1470 .0054276, .0057021, .0059907, .0062942, .0066133, .0069489,
1471 .0073018, .0076729, .0080632, .0084738, .0089056, .0093599,
1472 .0098377, .01034, .010869, .011426, .012011, .012627, .013276,
1473 .013958, .014676, .015431, .016226, .017063, .017944, .018872,
1474 .019848, .020876, .021958, .023098, .024298, .025561, .026892,
1475 .028293, .029769, .031323, .032961, .034686, .036503, .038418,
1476 .040435, .042561, .044801, .047161, .049649, .052271, .055035,
1477 .057948, .061019, .064256, .06767, .07127, .075066, .079069,
1478 .083291, .087744, .092441, .097396, .10262, .10814, .11396,
1479 .1201, .12658, .13342, .14064, .14826, .1563, .1648, .17376,
1480 .18323, .19324, .2038, .21496, .22674, .23919, .25234, .26624,
1481 .28093, .29646, .31287, .33021, .34855, .36794, .38844, .41012,
1482 .43305, .45731, .48297, .51011, .53884, .56924, .60141, .63547,
1483 .67152, .70969, .75012, .79292, .83826, .8863, .93718, .99111,
1484 1.0482, 1.1088, 1.173, 1.2411, 1.3133, 1.3898, 1.471, 1.5571,
1485 1.6485, 1.7455, 1.8485, 1.9577, 2.0737, 2.197, 2.3278, 2.4668,
1486 2.6145, 2.7715, 2.9383, 3.1156, 3.3042, 3.5047, 3.7181, 3.9451,
1487 4.1866, 4.4437, 4.7174, 5.0089, 5.3192, 5.65, 6.0025, 6.3782,
1488 6.7787, 7.206, 7.6617, 8.1479, 8.6669, 9.221, 9.8128, 10.445,
1489 11.12, 11.843, 12.615, 13.441, 14.325, 15.271, 16.283, 17.367,
1490 18.529, 19.776, 21.111, 22.544, 24.082, 25.731, 27.504, 29.409,
1491 31.452, 33.654, 36.024, 38.573, 41.323, 44.29, 47.492, 50.951,
1492 54.608, 58.588, 62.929, 67.629, 72.712, 78.226, 84.207, 90.699,
1493 97.749, 105.42, 113.77, 122.86, 132.78, 143.61, 155.44, 168.33,
1494 182.48, 198.01, 214.87, 233.39, 253.86, 276.34, 300.3, 327.28,
1495 356.89, 389.48, 422.29, 458.99, 501.39, 548.13, 595.62, 652.74,
1496 716.54, 784.57, 866.78, 960.59, 1062.8, 1072.5, 1189.5, 1319.4,
1497 1467.6, 1630.2, 1813.7, 2016.9, 2253., 2515.3, 2773.5, 3092.8,
1498 3444.4, 3720.4, 4104.3, 4527.5, 4645.9, 5021.7, 5462.2, 5597.,
1499 6110.6, 6732.5, 7513.8, 8270.6, 9640.6, 11487., 2796.1, 2680.1,
1500 2441.6, 2404.2, 2334.8, 2215.2, 1642.5, 1477.9, 1328.1, 1223.5,
1501 843.34, 766.96, 831.65, 834.84, 774.85, 1156.3, 1275.6, 1366.1,
1502 1795.6, 1885., 1936.5, 1953.4, 2154.4, 2002.7, 1789.8, 10381.,
1503 9040., 8216.5, 7384.7, 6721.9, 6187.7, 6143.8, 5703.9, 5276.6,
1504 4873.1, 4736., 4325.3, 3927., 3554.1, 3286.1, 2950.1, 2642.4,
1505 2368.7, 2138.9, 1914., 1719.6, 1543.9, 1388.6, 1252.1, 1132.2,
1506 1024.1, 1025.4, 920.58, 829.59, 750.54, 685.01, 624.25, 570.14,
1507 525.81, 481.85, 441.95, 408.71, 377.23, 345.86, 318.51, 292.26,
1508 268.34, 247.04, 227.14, 209.02, 192.69, 177.59, 163.78, 151.26,
1509 139.73, 129.19, 119.53, 110.7, 102.57, 95.109, 88.264, 81.948,
1510 76.13, 70.768, 65.827, 61.251, 57.022, 53.495, 49.824, 46.443,
1511 43.307, 40.405, 37.716, 35.241, 32.923, 30.77, 28.78, 26.915,
1512 25.177, 23.56, 22.059, 20.654, 19.345, 18.126, 16.988, 15.93,
1513 14.939, 14.014, 13.149, 12.343, 11.589, 10.884, 10.225, 9.6093,
1514 9.0327, 8.4934, 7.9889, 7.5166, 7.0744, 6.6604, 6.2727, 5.9098,
1515 5.5701, 5.2529, 4.955, 4.676, 4.4148, 4.171, 3.9426, 3.7332,
1516 3.5347, 3.3493, 3.1677, 3.0025, 2.8466, 2.6994, 2.5601, 2.4277,
1517 2.3016, 2.1814, 2.0664, 1.9564, 1.8279, 1.7311, 1.6427, 1.5645,
1518 1.4982, 1.443, 1.374, 1.3146, 1.2562, 1.17, 1.1105, 1.0272,
1519 .96863, .89718, .83654, .80226, .75908, .72431, .69573, .67174,
1520 .65126, .63315, .61693, .60182, .58715, .59554, .57649, .55526,
1521 .53177, .50622, .48176, .4813, .47642, .47492, .50273, .50293,
1522 .52687, .52239, .53419, .53814, .52626, .52211, .51492, .50622,
1523 .49746, .48841, .4792, .43534, .41999, .40349, .38586, .36799,
1524 .35108, .31089, .30803, .3171, .33599, .35041, .36149, .32924,
1525 .32462, .27309, .25961, .20922, .19504, .15683, .13098, .11588,
1526 .11478, .11204, .11363, .12135, .16423, .17785, .19094, .20236,
1527 .21084, .2154, .24108, .22848, .20871, .18797, .17963, .17834,
1528 .21552, .22284, .26945, .27052, .30108, .28977, .29772, .29224,
1529 .27658, .24956, .22777, .20654, .18392, .16338, .1452, .12916,
1530 .1152, .10304, .092437, .083163, .075031, .067878, .061564,
1531 .055976, .051018, .046609, .042679, .03917, .036032, .033223,
1532 .030706, .02845, .026428, .024617, .022998, .021554, .02027,
1533 .019136, .018141, .017278, .016541, .015926, .015432, .015058,
1534 .014807, .014666, .014635, .014728, .014947, .01527, .015728,
1535 .016345, .017026, .017798, .018839, .019752, .020636, .021886,
1536 .022695, .02327, .023478, .024292, .023544, .022222, .021932,
1537 .020052, .018143, .017722, .017031, .017782, .01938, .020734,
1538 .020476, .019255, .017477, .016878, .014617, .012489, .011765,
1539 .0099077, .0086446, .0079446, .0078644, .0079763, .008671,
1540 .01001, .0108, .012933, .015349, .016341, .018484, .020254,
1541 .020254, .020478, .019591, .018595, .018385, .019913, .022254,
1542 .024847, .025809, .028053, .029924, .030212, .031367, .03222,
1543 .032739, .032537, .03286, .033344, .033507, .033499, .033339,
1544 .032809, .033041, .031723, .029837, .027511, .026603, .024032,
1545 .021914, .020948, .021701, .023425, .024259, .024987, .023818,
1546 .021768, .019223, .018144, .015282, .012604, .01163, .0097907,
1547 .008336, .0082473, .0079582, .0088077, .009779, .010129, .012145,
1548 .014378, .016761, .01726, .018997, .019998, .019809, .01819,
1549 .016358, .016099, .01617, .017939, .020223, .022521, .02277,
1550 .024279, .025247, .024222, .023989, .023224, .021493, .020362,
1551 .018596, .017309, .015975, .014466, .013171, .011921, .01078,
1552 .0097229, .0087612, .0078729, .0070682, .0063494, .0057156,
1553 .0051459, .0046273, .0041712, .0037686, .0034119, .003095,
1554 .0028126, .0025603, .0023342, .0021314, .0019489, .0017845,
1555 .001636, .0015017, .00138, .0012697, .0011694, .0010782,
1556 9.9507e-4, 9.1931e-4, 8.5013e-4, 7.869e-4, 7.2907e-4, 6.7611e-4,
1557 6.2758e-4, 5.8308e-4, 5.4223e-4, 5.0473e-4, 4.7027e-4, 4.3859e-4,
1558 4.0946e-4, 3.8265e-4, 3.5798e-4, 3.3526e-4, 3.1436e-4, 2.9511e-4,
1559 2.7739e-4, 2.6109e-4, 2.4609e-4, 2.3229e-4, 2.1961e-4, 2.0797e-4,
1560 1.9729e-4, 1.875e-4, 1.7855e-4, 1.7038e-4, 1.6294e-4, 1.5619e-4,
1561 1.5007e-4, 1.4456e-4, 1.3961e-4, 1.3521e-4, 1.3131e-4, 1.2789e-4,
1562 1.2494e-4, 1.2242e-4, 1.2032e-4, 1.1863e-4, 1.1733e-4, 1.1641e-4,
1563 1.1585e-4, 1.1565e-4, 1.158e-4, 1.1629e-4, 1.1712e-4, 1.1827e-4,
1564 1.1976e-4, 1.2158e-4, 1.2373e-4, 1.262e-4, 1.2901e-4, 1.3214e-4,
1565 1.3562e-4, 1.3944e-4, 1.4361e-4, 1.4814e-4, 1.5303e-4, 1.5829e-4,
1566 1.6394e-4, 1.6999e-4, 1.7644e-4, 1.8332e-4, 1.9063e-4, 1.984e-4,
1567 2.0663e-4, 2.1536e-4, 2.246e-4, 2.3436e-4, 2.4468e-4, 2.5558e-4,
1568 2.6708e-4, 2.7921e-4, 2.92e-4, 3.0548e-4, 3.1968e-4, 3.3464e-4,
1569 3.5039e-4, 3.6698e-4, 3.8443e-4, 4.0281e-4, 4.2214e-4, 4.4248e-4,
1570 4.6389e-4, 4.864e-4, 5.1009e-4, 5.3501e-4, 5.6123e-4, 5.888e-4,
1571 6.1781e-4, 6.4833e-4, 6.8043e-4, 7.142e-4, 7.4973e-4, 7.8711e-4,
1572 8.2644e-4, 8.6783e-4, 9.1137e-4, 9.5721e-4, .0010054, .0010562,
1573 .0011096, .0011659, .0012251, .0012875, .0013532, .0014224,
1574 .0014953, .001572, .0016529, .0017381, .0018279, .0019226,
1575 .0020224, .0021277, .0022386, .0023557, .0024792, .0026095,
1576 .002747, .0028921, .0030453, .0032071, .003378, .0035586,
1577 .0037494, .003951, .0041642, .0043897, .0046282, .0048805,
1578 .0051476, .0054304, .00573, .0060473, .0063837, .0067404,
1579 .0071188, .0075203, .0079466, .0083994, .0088806, .0093922,
1580 .0099366, .010516, .011134, .011792, .012494, .013244, .014046,
1581 .014898, .015808, .016781, .017822, .018929, .020108, .02138,
1582 .022729, .02419, .02576, .027412, .029233, .031198, .033301,
1583 .035594, .038092, .040767, .04372, .046918, .050246, .053974,
1584 .058009, .061976, .066586, .071537, .076209, .081856, .087998,
1585 .093821, .10113, .10913, .11731, .12724, .13821, .15025, .1639,
1586 .17807, .19472, .21356, .23496, .25758, .28387, .31389, .34104,
1587 .37469, .40989, .43309, .46845, .5042, .5023, .52981, .55275,
1588 .51075, .51976, .52457, .44779, .44721, .4503, .4243, .45244,
1589 .49491, .55399, .39021, .24802, .2501, .2618, .27475, .28879,
1590 .31317, .33643, .36257, .4018, .43275, .46525, .53333, .56599,
1591 .60557, .70142, .74194, .77736, .88567, .91182, .93294, .98407,
1592 .98772, .99176, .9995, 1.2405, 1.3602, 1.338, 1.3255, 1.3267,
1593 1.3404, 1.3634, 1.3967, 1.4407, 1.4961, 1.5603, 1.6328, 1.7153,
1594 1.8094, 1.9091, 2.018, 2.1367, 2.264, 2.4035, 2.5562, 2.7179,
1595 2.9017, 3.1052, 3.3304, 3.5731, 3.8488, 4.1553, 4.4769, 4.7818,
1596 5.1711, 5.5204, 5.9516, 6.4097, 6.8899, 7.1118, 7.5469, 7.9735,
1597 7.9511, 8.3014, 8.6418, 8.4757, 8.8256, 9.2294, 9.6923, 10.033,
1598 10.842, 11.851, 11.78, 8.8435, 9.1381, 9.5956, 10.076, 10.629,
1599 11.22, 11.883, 12.69, 13.163, 13.974, 14.846, 16.027, 17.053,
1600 18.148, 19.715, 20.907, 22.163, 23.956, 25.235, 26.566, 27.94,
1601 29.576, 30.956, 32.432, 35.337, 39.911, 41.128, 42.625, 44.386,
1602 46.369, 48.619, 51.031, 53.674, 56.825, 59.921, 63.286, 66.929,
1603 70.859, 75.081, 79.618, 84.513, 89.739, 95.335, 101.35, 107.76,
1604 114.63, 121.98, 129.87, 138.3, 147.34, 157.04, 167.56, 178.67,
1605 190.61, 203.43, 217.19, 231.99, 247.88, 264.98, 283.37, 303.17,
1606 324.49, 347.47, 372.25, 398.98, 427.85, 459.06, 492.8, 529.31,
1607 568.89, 611.79, 658.35, 708.91, 763.87, 823.65, 888.72, 959.58,
1608 1036.8, 1121.8, 1213.9, 1314.3, 1423.8, 1543., 1672.8, 1813.4,
1609 1966.1, 2131.4, 2309.5, 2499.3, 2705., 2925.7, 3161.6, 3411.3,
1610 3611.5, 3889.2, 4191.1, 4519.3, 4877.9, 5272.9, 5712.9, 6142.7,
1611 6719.6, 7385., 8145., 8977.7, 9831.9, 10827., 11934., 13063.,
1612 14434., 15878., 17591., 19435., 21510., 23835., 26835., 29740.,
1613 32878., 36305., 39830., 43273., 46931., 50499., 49586., 51598.,
1614 53429., 54619., 55081., 55102., 54485., 53487., 52042., 42689.,
1615 42607., 44020., 47994., 54169., 53916., 55808., 56642., 46049.,
1616 44243., 32929., 30658., 21963., 20835., 15962., 13679., 17652.,
1617 19680., 22388., 25625., 29184., 32520., 35720., 38414., 40523.,
1618 49228., 48173., 45678., 41768., 37600., 41313., 42654., 44465.,
1619 55736., 56630., 65409., 63308., 66572., 61845., 60379., 56777.,
1620 51920., 46601., 41367., 36529., 32219., 28470., 25192., 22362.,
1621 19907., 17772., 15907., 14273., 12835., 11567., 10445., 9450.2,
1622 8565.1, 7776., 7070.8, 6439.2, 5872.3, 5362.4, 4903., 4488.3,
1623 4113.4, 3773.8, 3465.8, 3186.1, 2931.7, 2700.1, 2488.8, 2296.,
1624 2119.8, 1958.6, 1810.9, 1675.6, 1551.4, 1437.3, 1332.4, 1236.,
1625 1147.2, 1065.3, 989.86, 920.22, 855.91, 796.48, 741.53, 690.69,
1626 643.62, 600.02, 559.6, 522.13, 487.35, 455.06, 425.08, 397.21,
1627 371.3, 347.2, 324.78, 303.9, 284.46, 266.34, 249.45, 233.7,
1628 219.01, 205.3, 192.5, 180.55, 169.38, 158.95, 149.2, 140.07,
1629 131.54, 123.56, 116.09, 109.09, 102.54, 96.405, 90.655, 85.266,
1630 80.213, 75.475, 71.031, 66.861, 62.948, 59.275, 55.827, 52.587,
1631 49.544, 46.686, 43.998, 41.473, 39.099, 36.867, 34.768, 32.795,
1632 30.939, 29.192, 27.546, 25.998, 24.539, 23.164, 21.869, 20.65,
1633 19.501, 18.419, 17.399, 16.438, 15.532, 14.678, 13.874, 13.115,
1634 12.4, 11.726, 11.088, 10.488, 9.921, 9.3846, 8.8784, 8.3996,
1635 7.9469, 7.5197, 7.1174, 6.738, 6.379, 6.0409, 5.7213, 5.419,
1636 5.1327, 4.8611, 4.6046, 4.3617, 4.1316, 3.9138, 3.7077, 3.5125,
1637 3.3281, 3.1536, 2.9885, 2.8323, 2.6846, 2.5447, 2.4124, 2.2871,
1638 2.1686, 2.0564, 1.9501, 1.8495, 1.7543, 1.6641, 1.5787, 1.4978,
1639 1.4212, 1.3486, 1.2799, 1.2147, 1.1529, 1.0943, 1.0388, .98602,
1640 .93596, .8886, .84352, .80078, .76029, .722, .68585, .65161,
1641 .61901, .58808, .55854, .53044, .5039, .47853, .45459, .43173,
1642 .41008, .38965, .37021, .35186, .33444, .31797, .30234, .28758,
1643 .2736, .26036, .24764, .2357, .22431, .21342, .20295, .19288,
1644 .18334, .17444, .166, .15815, .15072, .14348, .13674, .13015,
1645 .12399, .11807, .11231, .10689, .10164, .096696, .091955,
1646 .087476, .083183, .079113, .075229, .071536, .068026, .064698,
1647 .06154, .058544, .055699, .052997, .050431, .047993, .045676,
1648 .043475, .041382, .039392, .037501, .035702, .033991, .032364,
1649 .030817, .029345, .027945, .026613, .025345, .024139, .022991,
1650 .021899, .02086, .019871, .018929, .018033, .01718, .016368,
1651 .015595, .014859, .014158, .013491, .012856, .012251, .011675,
1652 .011126, .010604, .010107, .0096331, .009182, .0087523, .0083431,
1653 .0079533, .0075821, .0072284, .0068915, .0065706, .0062649,
1654 .0059737, .0056963, .005432, .0051802, .0049404, .0047118,
1655 .0044941, .0042867, .0040891, .0039009, .0037216, .0035507,
1656 .003388, .0032329, .0030852, .0029445, .0028105, .0026829,
1657 .0025613, .0024455, .0023353, .0022303, .0021304, .0020353,
1658 .0019448, .0018587, .0017767, .0016988, .0016247, .0015543,
1659 .0014874, .0014238, .0013635, .0013062, .0012519, .0012005,
1660 .0011517, .0011057, .0010621, .001021, 9.8233e-4, 9.4589e-4,
1661 9.1167e-4, 8.7961e-4, 8.4964e-4, 8.2173e-4, 7.9582e-4, 7.7189e-4,
1662 7.499e-4, 7.2983e-4, 7.1167e-4, 6.9542e-4, 6.8108e-4, 6.6866e-4,
1663 6.5819e-4, 6.4971e-4, 6.4328e-4, 6.3895e-4, 6.3681e-4, 6.3697e-4,
1664 6.3956e-4, 6.4472e-4, 6.5266e-4, 6.6359e-4, 6.778e-4, 6.9563e-4,
1665 7.1749e-4, 7.4392e-4, 7.7556e-4, 8.1028e-4, 8.4994e-4, 8.8709e-4,
1666 9.3413e-4, 9.6953e-4, .0010202, .0010738, .0010976, .0011507,
1667 .0011686, .0012264, .001291, .0013346, .0014246, .0015293,
1668 .0016359, .0017824, .0019255, .0020854, .002247, .0024148,
1669 .0026199, .0027523, .0029704, .0030702, .0033047, .0035013,
1670 .0037576, .0040275, .0043089, .0046927, .0049307, .0053486,
1671 .0053809, .0056699, .0059325, .0055488, .005634, .0056392,
1672 .004946, .0048855, .0048208, .0044386, .0045498, .0046377,
1673 .0048939, .0052396, .0057324, .0060859, .0066906, .0071148,
1674 .0077224, .0082687, .008769, .0084471, .008572, .0087729,
1675 .008775, .0090742, .0080704, .0080288, .0085747, .0086087,
1676 .0086408, .0088752, .0089381, .0089757, .0093532, .0092824,
1677 .0092566, .0092645, .0092735, .009342, .0095806, .0097991,
1678 .010213, .010611, .011129, .011756, .013237, .01412, .015034,
1679 .015936, .01682, .018597, .019315, .019995, .020658, .021289,
1680 .022363, .022996, .023716, .024512, .025434, .026067, .027118,
1681 .028396, .029865, .031442, .033253, .03525, .037296, .039701,
1682 .042356, .045154, .048059, .051294, .054893, .058636, .061407,
1683 .065172, .068974, .072676, .073379, .076547, .079556, .079134,
1684 .082308, .085739, .090192, .09359, .099599, .10669, .11496,
1685 .1244, .13512, .14752, .14494, .15647, .1668, .17863, .19029,
1686 .20124, .20254, .21179, .21982, .21625, .22364, .23405, .23382,
1687 .2434, .25708, .26406, .27621, .28909, .30395, .31717, .33271,
1688 .3496, .36765, .38774, .40949, .446, .46985, .49846, .5287, .562,
1689 .59841, .64598, .68834, .7327, .78978, .8373, .88708, .94744,
1690 1.0006, 1.0574, 1.1215, 1.1856, 1.2546, 1.3292, 1.4107, 1.4974,
1691 1.5913, 1.6931, 1.8028, 1.9212, 2.0492, 2.1874, 2.3365, 2.4978,
1692 2.6718, 2.8588, 3.062, 3.2818, 3.5188, 3.7752, 4.0527, 4.3542,
1693 4.6782, 5.0312, 5.4123, 5.8246, 6.2639, 6.7435, 7.2636, 7.8064,
1694 8.4091, 9.0696, 9.7677, 10.548, 11.4, 12.309, 13.324, 14.284,
1695 15.445, 16.687, 18.019, 19.403, 20.847, 22.366, 23.925, 25.537,
1696 27.213, 28.069, 29.864, 31.829, 33.988, 35.856, 38.829, 42.321,
1697 46.319, 50.606, 55.126, 59.126, 64.162, 68.708, 74.615, 81.176,
1698 87.739, 95.494, 103.83, 113.38, 123.99, 135.8, 148.7, 162.58,
1699 176.32, 192.6, 211.47, 232.7, 252.64, 277.41, 305.38, 333.44,
1700 366.42, 402.66, 442.14, 484.53, 526.42, 568.15, 558.78, 582.6,
1701 600.98, 613.94, 619.44, 618.24, 609.84, 595.96, 484.86, 475.59,
1702 478.49, 501.56, 552.19, 628.44, 630.39, 658.92, 671.96, 562.7,
1703 545.88, 423.43, 400.14, 306.59, 294.13, 246.8, 226.51, 278.21,
1704 314.39, 347.22, 389.13, 433.16, 477.48, 521.67, 560.54, 683.6,
1705 696.37, 695.91, 683.1, 658.24, 634.89, 698.85, 742.87, 796.66,
1706 954.49, 1009.5, 1150.5, 1179.1, 1267.9, 1272.4, 1312.7, 1330.4,
1707 1331.6, 1315.8, 1308.3, 1293.3, 1274.6, 1249.5, 1213.2, 1172.1,
1708 1124.4, 930.33, 893.36, 871.27, 883.54, 940.76, 1036., 1025.6,
1709 1053.1, 914.51, 894.15, 865.03, 670.63, 508.41, 475.15, 370.85,
1710 361.06, 319.38, 312.75, 331.87, 367.13, 415., 467.94, 525.49,
1711 578.41, 624.66, 794.82, 796.97, 780.29, 736.49, 670.18, 603.75,
1712 659.67, 679.8, 857.12, 884.05, 900.65, 1046.1, 1141.9, 1083.,
1713 1089.2, 1e3, 947.08, 872.31, 787.91, 704.75, 624.93, 553.68,
1714 489.91, 434.21, 385.64, 343.3, 306.42, 274.18, 245.94, 221.11,
1715 199.23, 179.88, 162.73, 147.48, 133.88, 121.73, 110.86, 101.1,
1716 92.323, 84.417, 77.281, 70.831, 64.991, 59.694, 54.884, 50.509,
1717 46.526, 42.893, 39.58, 36.549, 33.776, 31.236, 28.907, 26.77,
1718 24.805, 23., 21.339, 19.81, 18.404, 17.105, 15.909, 14.801,
1719 13.778, 12.83, 11.954, 11.142, 10.389, 9.691, 9.0434, 8.4423,
1720 7.8842, 7.3657, 6.8838, 6.4357, 6.0189, 5.6308, 5.2696, 4.9332,
1721 4.6198, 4.3277, 4.0553, 3.8012, 3.5639, 3.3424, 3.1355, 2.9422,
1722 2.7614, 2.5924, 2.4343, 2.2864, 2.148, 2.0184, 1.8971, 1.7835,
1723 1.677, 1.5773, 1.4838, 1.3961, 1.3139, 1.2369, 1.1645, 1.0966,
1724 1.0329, .97309, .91686, .86406, .81439, .76767, .72381, .68252,
1725 .64359, .60695, .57247, .54008, .50957, .48092, .45401, .42862,
1726 .40465, .38202, .36072, .34052, .3216, .30386, .28711, .27135,
1727 .25651, .24252, .2293, .21689, .20517, .19416, .18381, .17396,
1728 .16469
1729 };
1730
1731 static const double co2230[2001] =
1732 { 2.743e-5, 2.8815e-5, 3.027e-5, 3.1798e-5,
1733 3.3405e-5, 3.5094e-5, 3.6869e-5, 3.8734e-5, 4.0694e-5, 4.2754e-5,
1734 4.492e-5, 4.7196e-5, 4.9588e-5, 5.2103e-5, 5.4747e-5, 5.7525e-5,
1735 6.0446e-5, 6.3516e-5, 6.6744e-5, 7.0137e-5, 7.3704e-5, 7.7455e-5,
1736 8.1397e-5, 8.5543e-5, 8.9901e-5, 9.4484e-5, 9.9302e-5, 1.0437e-4,
1737 1.097e-4, 1.153e-4, 1.2119e-4, 1.2738e-4, 1.3389e-4, 1.4074e-4,
1738 1.4795e-4, 1.5552e-4, 1.6349e-4, 1.7187e-4, 1.8068e-4, 1.8995e-4,
1739 1.997e-4, 2.0996e-4, 2.2075e-4, 2.321e-4, 2.4403e-4, 2.5659e-4,
1740 2.698e-4, 2.837e-4, 2.9832e-4, 3.137e-4, 3.2988e-4, 3.4691e-4,
1741 3.6483e-4, 3.8368e-4, 4.0351e-4, 4.2439e-4, 4.4635e-4, 4.6947e-4,
1742 4.9379e-4, 5.1939e-4, 5.4633e-4, 5.7468e-4, 6.0452e-4, 6.3593e-4,
1743 6.69e-4, 7.038e-4, 7.4043e-4, 7.79e-4, 8.1959e-4, 8.6233e-4,
1744 9.0732e-4, 9.5469e-4, .0010046, .0010571, .0011124, .0011706,
1745 .0012319, .0012964, .0013644, .001436, .0015114, .0015908,
1746 .0016745, .0017625, .0018553, .0019531, .002056, .0021645,
1747 .0022788, .0023992, .002526, .0026596, .0028004, .0029488,
1748 .0031052, .0032699, .0034436, .0036265, .0038194, .0040227,
1749 .0042369, .0044628, .0047008, .0049518, .0052164, .0054953,
1750 .0057894, .0060995, .0064265, .0067713, .007135, .0075184,
1751 .0079228, .0083494, .0087993, .0092738, .0097745, .010303,
1752 .01086, .011448, .012068, .012722, .013413, .014142, .014911,
1753 .015723, .01658, .017484, .018439, .019447, .020511, .021635,
1754 .022821, .024074, .025397, .026794, .02827, .029829, .031475,
1755 .033215, .035052, .036994, .039045, .041213, .043504, .045926,
1756 .048485, .05119, .05405, .057074, .060271, .063651, .067225,
1757 .071006, .075004, .079233, .083708, .088441, .093449, .098749,
1758 .10436, .11029, .11657, .12322, .13026, .13772, .14561, .15397,
1759 .16282, .1722, .18214, .19266, .20381, .21563, .22816, .24143,
1760 .2555, .27043, .28625, .30303, .32082, .3397, .35972, .38097,
1761 .40352, .42746, .45286, .47983, .50847, .53888, .57119, .6055,
1762 .64196, .6807, .72187, .76564, .81217, .86165, .91427, .97025,
1763 1.0298, 1.0932, 1.1606, 1.2324, 1.3088, 1.3902, 1.477, 1.5693,
1764 1.6678, 1.7727, 1.8845, 2.0038, 2.131, 2.2666, 2.4114, 2.5659,
1765 2.7309, 2.907, 3.0951, 3.2961, 3.5109, 3.7405, 3.986, 4.2485,
1766 4.5293, 4.8299, 5.1516, 5.4961, 5.8651, 6.2605, 6.6842, 7.1385,
1767 7.6256, 8.1481, 8.7089, 9.3109, 9.9573, 10.652, 11.398, 12.2,
1768 13.063, 13.992, 14.99, 16.064, 17.222, 18.469, 19.813, 21.263,
1769 22.828, 24.516, 26.34, 28.31, 30.437, 32.738, 35.226, 37.914,
1770 40.824, 43.974, 47.377, 51.061, 55.011, 59.299, 63.961, 69.013,
1771 74.492, 80.444, 86.919, 93.836, 101.23, 109.25, 117.98, 127.47,
1772 137.81, 149.07, 161.35, 174.75, 189.42, 205.49, 223.02, 242.26,
1773 263.45, 286.75, 311.94, 340.01, 370.86, 404.92, 440.44, 480.27,
1774 525.17, 574.71, 626.22, 686.8, 754.38, 827.07, 913.38, 1011.7,
1775 1121.5, 1161.6, 1289.5, 1432.2, 1595.4, 1777., 1983.3, 2216.1,
1776 2485.7, 2788.3, 3101.5, 3481., 3902.1, 4257.1, 4740., 5272.8,
1777 5457.9, 5946.2, 6505.3, 6668.4, 7302.4, 8061.6, 9015.8, 9908.3,
1778 11613., 13956., 3249.6, 3243., 2901.5, 2841.3, 2729.6, 2558.2,
1779 1797.8, 1583.2, 1386., 1233.5, 787.74, 701.46, 761.66, 767.21,
1780 722.83, 1180.6, 1332.1, 1461.6, 2032.9, 2166., 2255.9, 2294.7,
1781 2587.2, 2396.5, 2122.4, 12553., 10784., 9832.5, 8827.3, 8029.1,
1782 7377.9, 7347.1, 6783.8, 6239.1, 5721.1, 5503., 4975.1, 4477.8,
1783 4021.3, 3676.8, 3275.3, 2914.9, 2597.4, 2328.2, 2075.4, 1857.6,
1784 1663.6, 1493.3, 1343.8, 1213.3, 1095.6, 1066.5, 958.91, 865.15,
1785 783.31, 714.35, 650.77, 593.98, 546.2, 499.9, 457.87, 421.75,
1786 387.61, 355.25, 326.62, 299.7, 275.21, 253.17, 232.83, 214.31,
1787 197.5, 182.08, 167.98, 155.12, 143.32, 132.5, 122.58, 113.48,
1788 105.11, 97.415, 90.182, 83.463, 77.281, 71.587, 66.341, 61.493,
1789 57.014, 53.062, 49.21, 45.663, 42.38, 39.348, 36.547, 33.967,
1790 31.573, 29.357, 27.314, 25.415, 23.658, 22.03, 20.524, 19.125,
1791 17.829, 16.627, 15.511, 14.476, 13.514, 12.618, 11.786, 11.013,
1792 10.294, 9.6246, 9.0018, 8.4218, 7.8816, 7.3783, 6.9092, 6.4719,
1793 6.0641, 5.6838, 5.3289, 4.998, 4.6893, 4.4014, 4.1325, 3.8813,
1794 3.6469, 3.4283, 3.2241, 3.035, 2.8576, 2.6922, 2.5348, 2.3896,
1795 2.2535, 2.1258, 2.0059, 1.8929, 1.7862, 1.6854, 1.5898, 1.4992,
1796 1.4017, 1.3218, 1.2479, 1.1809, 1.1215, 1.0693, 1.0116, .96016,
1797 .9105, .84859, .80105, .74381, .69982, .65127, .60899, .57843,
1798 .54592, .51792, .49336, .47155, .45201, .43426, .41807, .40303,
1799 .38876, .3863, .37098, .35492, .33801, .32032, .30341, .29874,
1800 .29193, .28689, .29584, .29155, .29826, .29195, .29287, .2904,
1801 .28199, .27709, .27162, .26622, .26133, .25676, .25235, .23137,
1802 .22365, .21519, .20597, .19636, .18699, .16485, .16262, .16643,
1803 .17542, .18198, .18631, .16759, .16338, .13505, .1267, .10053,
1804 .092554, .074093, .062159, .055523, .054849, .05401, .05528,
1805 .058982, .07952, .08647, .093244, .099285, .10393, .10661,
1806 .12072, .11417, .10396, .093265, .089137, .088909, .10902,
1807 .11277, .13625, .13565, .14907, .14167, .1428, .13744, .12768,
1808 .11382, .10244, .091686, .08109, .071739, .063616, .056579,
1809 .050504, .045251, .040689, .036715, .033237, .030181, .027488,
1810 .025107, .022998, .021125, .01946, .017979, .016661, .015489,
1811 .014448, .013526, .012712, .011998, .011375, .010839, .010384,
1812 .010007, .0097053, .0094783, .0093257, .0092489, .0092504,
1813 .0093346, .0095077, .0097676, .01012, .01058, .011157, .011844,
1814 .012672, .013665, .014766, .015999, .017509, .018972, .020444,
1815 .022311, .023742, .0249, .025599, .026981, .026462, .025143,
1816 .025066, .022814, .020458, .020026, .019142, .020189, .022371,
1817 .024163, .023728, .02199, .019506, .018591, .015576, .012784,
1818 .011744, .0094777, .0079148, .0070652, .006986, .0071758,
1819 .008086, .0098025, .01087, .013609, .016764, .018137, .021061,
1820 .023498, .023576, .023965, .022828, .021519, .021283, .023364,
1821 .026457, .029782, .030856, .033486, .035515, .035543, .036558,
1822 .037198, .037472, .037045, .037284, .03777, .038085, .038366,
1823 .038526, .038282, .038915, .037697, .035667, .032941, .031959,
1824 .028692, .025918, .024596, .025592, .027873, .028935, .02984,
1825 .028148, .025305, .021912, .020454, .016732, .013357, .01205,
1826 .009731, .0079881, .0077704, .0074387, .0083895, .0096776,
1827 .010326, .01293, .015955, .019247, .020145, .02267, .024231,
1828 .024184, .022131, .019784, .01955, .01971, .022119, .025116,
1829 .027978, .028107, .029808, .030701, .029164, .028551, .027286,
1830 .024946, .023259, .020982, .019221, .017471, .015643, .014074,
1831 .01261, .011301, .010116, .0090582, .0081036, .0072542, .0065034,
1832 .0058436, .0052571, .0047321, .0042697, .0038607, .0034977,
1833 .0031747, .0028864, .0026284, .002397, .002189, .0020017,
1834 .0018326, .0016798, .0015414, .0014159, .0013019, .0011983,
1835 .0011039, .0010177, 9.391e-4, 8.6717e-4, 8.0131e-4, 7.4093e-4,
1836 6.8553e-4, 6.3464e-4, 5.8787e-4, 5.4487e-4, 5.0533e-4, 4.69e-4,
1837 4.3556e-4, 4.0474e-4, 3.7629e-4, 3.5e-4, 3.2569e-4, 3.032e-4,
1838 2.8239e-4, 2.6314e-4, 2.4535e-4, 2.2891e-4, 2.1374e-4, 1.9975e-4,
1839 1.8685e-4, 1.7498e-4, 1.6406e-4, 1.5401e-4, 1.4479e-4, 1.3633e-4,
1840 1.2858e-4, 1.2148e-4, 1.1499e-4, 1.0907e-4, 1.0369e-4, 9.8791e-5,
1841 9.4359e-5, 9.0359e-5, 8.6766e-5, 8.3555e-5, 8.0703e-5, 7.8192e-5,
1842 7.6003e-5, 7.4119e-5, 7.2528e-5, 7.1216e-5, 7.0171e-5, 6.9385e-5,
1843 6.8848e-5, 6.8554e-5, 6.8496e-5, 6.8669e-5, 6.9069e-5, 6.9694e-5,
1844 7.054e-5, 7.1608e-5, 7.2896e-5, 7.4406e-5, 7.6139e-5, 7.8097e-5,
1845 8.0283e-5, 8.2702e-5, 8.5357e-5, 8.8255e-5, 9.1402e-5, 9.4806e-5,
1846 9.8473e-5, 1.0241e-4, 1.0664e-4, 1.1115e-4, 1.1598e-4, 1.2112e-4,
1847 1.2659e-4, 1.3241e-4, 1.3859e-4, 1.4515e-4, 1.521e-4, 1.5947e-4,
1848 1.6728e-4, 1.7555e-4, 1.8429e-4, 1.9355e-4, 2.0334e-4, 2.1369e-4,
1849 2.2463e-4, 2.3619e-4, 2.4841e-4, 2.6132e-4, 2.7497e-4, 2.8938e-4,
1850 3.0462e-4, 3.2071e-4, 3.3771e-4, 3.5567e-4, 3.7465e-4, 3.947e-4,
1851 4.1588e-4, 4.3828e-4, 4.6194e-4, 4.8695e-4, 5.1338e-4, 5.4133e-4,
1852 5.7087e-4, 6.0211e-4, 6.3515e-4, 6.701e-4, 7.0706e-4, 7.4617e-4,
1853 7.8756e-4, 8.3136e-4, 8.7772e-4, 9.2681e-4, 9.788e-4, .0010339,
1854 .0010922, .001154, .0012195, .0012889, .0013626, .0014407,
1855 .0015235, .0016114, .0017048, .0018038, .001909, .0020207,
1856 .0021395, .0022657, .0023998, .0025426, .0026944, .002856,
1857 .0030281, .0032114, .0034068, .003615, .0038371, .004074,
1858 .004327, .0045971, .0048857, .0051942, .0055239, .0058766,
1859 .0062538, .0066573, .0070891, .007551, .0080455, .0085747,
1860 .0091412, .0097481, .010397, .011092, .011837, .012638, .013495,
1861 .014415, .01541, .016475, .017621, .018857, .020175, .02162,
1862 .023185, .024876, .02672, .028732, .030916, .033319, .035939,
1863 .038736, .041847, .04524, .048715, .052678, .056977, .061203,
1864 .066184, .07164, .076952, .083477, .090674, .098049, .10697,
1865 .1169, .1277, .14011, .15323, .1684, .18601, .20626, .22831,
1866 .25417, .28407, .31405, .34957, .38823, .41923, .46026, .50409,
1867 .51227, .54805, .57976, .53818, .55056, .557, .46741, .46403,
1868 .4636, .42265, .45166, .49852, .56663, .34306, .17779, .17697,
1869 .18346, .19129, .20014, .21778, .23604, .25649, .28676, .31238,
1870 .33856, .39998, .4288, .46568, .56654, .60786, .64473, .76466,
1871 .7897, .80778, .86443, .85736, .84798, .84157, 1.1385, 1.2446,
1872 1.1923, 1.1552, 1.1338, 1.1266, 1.1292, 1.1431, 1.1683, 1.2059,
1873 1.2521, 1.3069, 1.3712, 1.4471, 1.5275, 1.6165, 1.7145, 1.8189,
1874 1.9359, 2.065, 2.2007, 2.3591, 2.5362, 2.7346, 2.9515, 3.2021,
1875 3.4851, 3.7935, 4.0694, 4.4463, 4.807, 5.2443, 5.7178, 6.2231,
1876 6.4796, 6.9461, 7.4099, 7.3652, 7.7182, 8.048, 7.7373, 8.0363,
1877 8.3855, 8.8044, 9.0257, 9.8574, 10.948, 10.563, 6.8979, 7.0744,
1878 7.4121, 7.7663, 8.1768, 8.6243, 9.1437, 9.7847, 10.182, 10.849,
1879 11.572, 12.602, 13.482, 14.431, 15.907, 16.983, 18.11, 19.884,
1880 21.02, 22.18, 23.355, 24.848, 25.954, 27.13, 30.186, 34.893,
1881 35.682, 36.755, 38.111, 39.703, 41.58, 43.606, 45.868, 48.573,
1882 51.298, 54.291, 57.559, 61.116, 64.964, 69.124, 73.628, 78.471,
1883 83.683, 89.307, 95.341, 101.84, 108.83, 116.36, 124.46, 133.18,
1884 142.57, 152.79, 163.69, 175.43, 188.11, 201.79, 216.55, 232.51,
1885 249.74, 268.38, 288.54, 310.35, 333.97, 359.55, 387.26, 417.3,
1886 449.88, 485.2, 523.54, 565.14, 610.28, 659.31, 712.56, 770.43,
1887 833.36, 901.82, 976.36, 1057.6, 1146.8, 1243.8, 1350., 1466.3,
1888 1593.6, 1732.7, 1884.1, 2049.1, 2228.2, 2421.9, 2629.4, 2853.7,
1889 3094.4, 3351.1, 3622.3, 3829.8, 4123.1, 4438.3, 4777.2, 5144.1,
1890 5545.4, 5990.5, 6404.5, 6996.8, 7687.6, 8482.9, 9349.4, 10203.,
1891 11223., 12358., 13493., 14916., 16416., 18236., 20222., 22501.,
1892 25102., 28358., 31707., 35404., 39538., 43911., 48391., 53193.,
1893 58028., 58082., 61276., 64193., 66294., 67480., 67921., 67423.,
1894 66254., 64341., 51737., 51420., 53072., 58145., 66195., 65358.,
1895 67377., 67869., 53509., 50553., 35737., 32425., 21704., 19974.,
1896 14457., 12142., 16798., 19489., 23049., 27270., 31910., 36457.,
1897 40877., 44748., 47876., 59793., 58626., 55454., 50337., 44893.,
1898 50228., 52216., 54747., 69541., 70455., 81014., 77694., 80533.,
1899 73953., 70927., 65539., 59002., 52281., 45953., 40292., 35360.,
1900 31124., 27478., 24346., 21647., 19308., 17271., 15491., 13927.,
1901 12550., 11331., 10250., 9288.8, 8431.4, 7664.9, 6978.3, 6361.8,
1902 5807.4, 5307.7, 4856.8, 4449., 4079.8, 3744.9, 3440.8, 3164.2,
1903 2912.3, 2682.7, 2473., 2281.4, 2106., 1945.3, 1797.9, 1662.5,
1904 1538.1, 1423.6, 1318.1, 1221., 1131.5, 1049., 972.99, 902.87,
1905 838.01, 777.95, 722.2, 670.44, 622.35, 577.68, 536.21, 497.76,
1906 462.12, 429.13, 398.61, 370.39, 344.29, 320.16, 297.85, 277.2,
1907 258.08, 240.38, 223.97, 208.77, 194.66, 181.58, 169.43, 158.15,
1908 147.67, 137.92, 128.86, 120.44, 112.6, 105.3, 98.499, 92.166,
1909 86.264, 80.763, 75.632, 70.846, 66.381, 62.213, 58.321, 54.685,
1910 51.288, 48.114, 45.145, 42.368, 39.772, 37.341, 35.065, 32.937,
1911 30.943, 29.077, 27.33, 25.693, 24.158, 22.717, 21.367, 20.099,
1912 18.909, 17.792, 16.744, 15.761, 14.838, 13.971, 13.157, 12.393,
1913 11.676, 11.003, 10.369, 9.775, 9.2165, 8.6902, 8.1963, 7.7314,
1914 7.2923, 6.8794, 6.4898, 6.122, 5.7764, 5.4525, 5.1484, 4.8611,
1915 4.5918, 4.3379, 4.0982, 3.8716, 3.6567, 3.4545, 3.2634, 3.0828,
1916 2.9122, 2.7512, 2.5993, 2.4561, 2.3211, 2.1938, 2.0737, 1.9603,
1917 1.8534, 1.7525, 1.6572, 1.5673, 1.4824, 1.4022, 1.3265, 1.2551,
1918 1.1876, 1.1239, 1.0637, 1.0069, .9532, .90248, .85454, .80921,
1919 .76631, .72569, .6872, .65072, .61635, .5836, .55261, .52336,
1920 .49581, .46998, .44559, .42236, .40036, .37929, .35924, .34043,
1921 .32238, .30547, .28931, .27405, .25975, .24616, .23341, .22133,
1922 .20997, .19924, .18917, .17967, .17075, .16211, .15411, .14646,
1923 .13912, .13201, .12509, .11857, .11261, .10698, .10186, .097039,
1924 .092236, .087844, .083443, .07938, .075452, .071564, .067931,
1925 .064389, .061078, .057901, .054921, .052061, .049364, .046789,
1926 .04435, .042044, .039866, .037808, .035863, .034023, .032282,
1927 .030634, .029073, .027595, .026194, .024866, .023608, .022415,
1928 .021283, .02021, .019193, .018228, .017312, .016443, .015619,
1929 .014837, .014094, .01339, .012721, .012086, .011483, .010911,
1930 .010368, .009852, .0093623, .0088972, .0084556, .0080362,
1931 .0076379, .0072596, .0069003, .006559, .0062349, .0059269,
1932 .0056344, .0053565, .0050925, .0048417, .0046034, .004377,
1933 .0041618, .0039575, .0037633, .0035788, .0034034, .0032368,
1934 .0030785, .002928, .0027851, .0026492, .0025201, .0023975,
1935 .0022809, .0021701, .0020649, .0019649, .0018699, .0017796,
1936 .0016938, .0016122, .0015348, .0014612, .0013913, .001325,
1937 .0012619, .0012021, .0011452, .0010913, .0010401, 9.9149e-4,
1938 9.454e-4, 9.0169e-4, 8.6024e-4, 8.2097e-4, 7.8377e-4, 7.4854e-4,
1939 7.1522e-4, 6.8371e-4, 6.5393e-4, 6.2582e-4, 5.9932e-4, 5.7435e-4,
1940 5.5087e-4, 5.2882e-4, 5.0814e-4, 4.8881e-4, 4.7076e-4, 4.5398e-4,
1941 4.3843e-4, 4.2407e-4, 4.109e-4, 3.9888e-4, 3.88e-4, 3.7826e-4,
1942 3.6963e-4, 3.6213e-4, 3.5575e-4, 3.505e-4, 3.464e-4, 3.4346e-4,
1943 3.4173e-4, 3.4125e-4, 3.4206e-4, 3.4424e-4, 3.4787e-4, 3.5303e-4,
1944 3.5986e-4, 3.6847e-4, 3.7903e-4, 3.9174e-4, 4.0681e-4, 4.2455e-4,
1945 4.4527e-4, 4.6942e-4, 4.9637e-4, 5.2698e-4, 5.5808e-4, 5.9514e-4,
1946 6.2757e-4, 6.689e-4, 7.1298e-4, 7.3955e-4, 7.8403e-4, 8.0449e-4,
1947 8.5131e-4, 9.0256e-4, 9.3692e-4, .0010051, .0010846, .0011678,
1948 .001282, .0014016, .0015355, .0016764, .0018272, .0020055,
1949 .0021455, .0023421, .0024615, .0026786, .0028787, .0031259,
1950 .0034046, .0036985, .0040917, .0043902, .0048349, .0049531,
1951 .0052989, .0056148, .0052452, .0053357, .005333, .0045069,
1952 .0043851, .004253, .003738, .0038084, .0039013, .0041505,
1953 .0045372, .0050569, .0054507, .0061267, .0066122, .0072449,
1954 .0078012, .0082651, .0076538, .0076573, .0076806, .0075227,
1955 .0076269, .0063758, .006254, .0067749, .0067909, .0068231,
1956 .0072143, .0072762, .0072954, .007679, .0075107, .0073658,
1957 .0072441, .0071074, .0070378, .007176, .0072472, .0075844,
1958 .0079291, .008412, .0090165, .010688, .011535, .012375, .013166,
1959 .013895, .015567, .016011, .016392, .016737, .017043, .017731,
1960 .018031, .018419, .018877, .019474, .019868, .020604, .021538,
1961 .022653, .023869, .025288, .026879, .028547, .030524, .03274,
1962 .035132, .03769, .040567, .043793, .047188, .049962, .053542,
1963 .057205, .060776, .061489, .064419, .067124, .065945, .068487,
1964 .071209, .074783, .077039, .082444, .08902, .09692, .10617,
1965 .11687, .12952, .12362, .13498, .14412, .15492, .16519, .1744,
1966 .17096, .17714, .18208, .17363, .17813, .18564, .18295, .19045,
1967 .20252, .20815, .21844, .22929, .24229, .25321, .26588, .2797,
1968 .29465, .31136, .32961, .36529, .38486, .41027, .43694, .4667,
1969 .49943, .54542, .58348, .62303, .67633, .71755, .76054, .81371,
1970 .85934, .90841, .96438, 1.0207, 1.0821, 1.1491, 1.2226, 1.3018,
1971 1.388, 1.4818, 1.5835, 1.6939, 1.8137, 1.9435, 2.0843, 2.237,
1972 2.4026, 2.5818, 2.7767, 2.9885, 3.2182, 3.4679, 3.7391, 4.0349,
1973 4.3554, 4.7053, 5.0849, 5.4986, 5.9436, 6.4294, 6.9598, 7.5203,
1974 8.143, 8.8253, 9.5568, 10.371, 11.267, 12.233, 13.31, 14.357,
1975 15.598, 16.93, 18.358, 19.849, 21.408, 23.04, 24.706, 26.409,
1976 28.153, 28.795, 30.549, 32.43, 34.49, 36.027, 38.955, 42.465,
1977 46.565, 50.875, 55.378, 59.002, 63.882, 67.949, 73.693, 80.095,
1978 86.403, 94.264, 102.65, 112.37, 123.3, 135.54, 149.14, 163.83,
1979 179.17, 196.89, 217.91, 240.94, 264.13, 292.39, 324.83, 358.21,
1980 397.16, 440.5, 488.6, 541.04, 595.3, 650.43, 652.03, 688.74,
1981 719.47, 743.54, 757.68, 762.35, 756.43, 741.42, 595.43, 580.97,
1982 580.83, 605.68, 667.88, 764.49, 759.93, 789.12, 798.17, 645.66,
1983 615.65, 455.05, 421.09, 306.45, 289.14, 235.7, 215.52, 274.57,
1984 316.53, 357.73, 409.89, 465.06, 521.84, 579.02, 630.64, 794.46,
1985 813., 813.56, 796.25, 761.57, 727.97, 812.14, 866.75, 932.5,
1986 1132.8, 1194.8, 1362.2, 1387.2, 1482.3, 1479.7, 1517.9, 1533.1,
1987 1534.2, 1523.3, 1522.5, 1515.5, 1505.2, 1486.5, 1454., 1412.,
1988 1358.8, 1107.8, 1060.9, 1033.5, 1048.2, 1122.4, 1248.9, 1227.1,
1989 1255.4, 1058.9, 1020.7, 970.59, 715.24, 512.56, 468.47, 349.3,
1990 338.26, 299.22, 301.26, 332.38, 382.08, 445.49, 515.87, 590.85,
1991 662.3, 726.05, 955.59, 964.11, 945.17, 891.48, 807.11, 720.9,
1992 803.36, 834.46, 1073.9, 1107.1, 1123.6, 1296., 1393.7, 1303.1,
1993 1284.3, 1161.8, 1078.8, 976.13, 868.72, 767.4, 674.72, 593.73,
1994 523.12, 462.24, 409.75, 364.34, 325., 290.73, 260.76, 234.46,
1995 211.28, 190.78, 172.61, 156.44, 142.01, 129.12, 117.57, 107.2,
1996 97.877, 89.47, 81.882, 75.021, 68.807, 63.171, 58.052, 53.396,
1997 49.155, 45.288, 41.759, 38.531, 35.576, 32.868, 30.384, 28.102,
1998 26.003, 24.071, 22.293, 20.655, 19.147, 17.756, 16.476, 15.292,
1999 14.198, 13.183, 12.241, 11.367, 10.554, 9.7989, 9.0978, 8.4475,
2000 7.845, 7.2868, 6.7704, 6.2927, 5.8508, 5.4421, 5.064, 4.714,
2001 4.3902, 4.0902, 3.8121, 3.5543, 3.315, 3.093, 2.8869, 2.6953,
2002 2.5172, 2.3517, 2.1977, 2.0544, 1.9211, 1.7969, 1.6812, 1.5735,
2003 1.4731, 1.3794, 1.2921, 1.2107, 1.1346, 1.0637, .99744, .93554,
2004 .87771, .82368, .77313, .72587, .6816, .64014, .60134, .565,
2005 .53086, .49883, .46881, .44074, .4144, .38979, .36679, .34513,
2006 .32474, .30552, .28751, .27045, .25458, .23976, .22584, .21278,
2007 .20051, .18899, .17815, .16801, .15846, .14954, .14117, .13328,
2008 .12584
2009 };
2010
2011 /* Get CO2 continuum absorption... */
2012 const double xw = nu / 2 + 1;
2013 if (xw >= 1 && xw < 2001) {
2014 const int iw = (int) xw;
2015 const double dw = xw - iw;
2016 const double ew = 1 - dw;
2017 const double cw296 = ew * co2296[iw - 1] + dw * co2296[iw];
2018 const double cw260 = ew * co2260[iw - 1] + dw * co2260[iw];
2019 const double cw230 = ew * co2230[iw - 1] + dw * co2230[iw];
2020 const double dt230 = t - 230;
2021 const double dt260 = t - 260;
2022 const double dt296 = t - 296;
2023 const double ctw =
2024 dt260 * 5.050505e-4 * dt296 * cw230 -
2025 dt230 * 9.259259e-4 * dt296 * cw260 +
2026 dt230 * 4.208754e-4 * dt260 * cw296;
2027 return u / NA / 1000 * p / P0 * ctw;
2028 } else
2029 return 0;
2030}
#define P0
Standard pressure [hPa].
Definition: jurassic.h:182
#define NA
Avogadro's number.
Definition: jurassic.h:167

◆ ctmh2o()

double ctmh2o ( const double  nu,
const double  p,
const double  t,
const double  q,
const double  u 
)

Compute water vapor continuum (optical depth).

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 2034 of file jurassic.c.

2039 {
2040
2041 static const double h2o296[2001] =
2042 { .17, .1695, .172, .168, .1687, .1624, .1606,
2043 .1508, .1447, .1344, .1214, .1133, .1009, .09217, .08297, .06989,
2044 .06513, .05469, .05056, .04417, .03779, .03484, .02994, .0272,
2045 .02325, .02063, .01818, .01592, .01405, .01251, .0108, .009647,
2046 .008424, .007519, .006555, .00588, .005136, .004511, .003989,
2047 .003509, .003114, .00274, .002446, .002144, .001895, .001676,
2048 .001486, .001312, .001164, .001031, 9.129e-4, 8.106e-4, 7.213e-4,
2049 6.4e-4, 5.687e-4, 5.063e-4, 4.511e-4, 4.029e-4, 3.596e-4,
2050 3.22e-4, 2.889e-4, 2.597e-4, 2.337e-4, 2.108e-4, 1.907e-4,
2051 1.728e-4, 1.57e-4, 1.43e-4, 1.305e-4, 1.195e-4, 1.097e-4,
2052 1.009e-4, 9.307e-5, 8.604e-5, 7.971e-5, 7.407e-5, 6.896e-5,
2053 6.433e-5, 6.013e-5, 5.631e-5, 5.283e-5, 4.963e-5, 4.669e-5,
2054 4.398e-5, 4.148e-5, 3.917e-5, 3.702e-5, 3.502e-5, 3.316e-5,
2055 3.142e-5, 2.978e-5, 2.825e-5, 2.681e-5, 2.546e-5, 2.419e-5,
2056 2.299e-5, 2.186e-5, 2.079e-5, 1.979e-5, 1.884e-5, 1.795e-5,
2057 1.711e-5, 1.633e-5, 1.559e-5, 1.49e-5, 1.426e-5, 1.367e-5,
2058 1.312e-5, 1.263e-5, 1.218e-5, 1.178e-5, 1.143e-5, 1.112e-5,
2059 1.088e-5, 1.07e-5, 1.057e-5, 1.05e-5, 1.051e-5, 1.059e-5,
2060 1.076e-5, 1.1e-5, 1.133e-5, 1.18e-5, 1.237e-5, 1.308e-5,
2061 1.393e-5, 1.483e-5, 1.614e-5, 1.758e-5, 1.93e-5, 2.123e-5,
2062 2.346e-5, 2.647e-5, 2.93e-5, 3.279e-5, 3.745e-5, 4.152e-5,
2063 4.813e-5, 5.477e-5, 6.203e-5, 7.331e-5, 8.056e-5, 9.882e-5,
2064 1.05e-4, 1.21e-4, 1.341e-4, 1.572e-4, 1.698e-4, 1.968e-4,
2065 2.175e-4, 2.431e-4, 2.735e-4, 2.867e-4, 3.19e-4, 3.371e-4,
2066 3.554e-4, 3.726e-4, 3.837e-4, 3.878e-4, 3.864e-4, 3.858e-4,
2067 3.841e-4, 3.852e-4, 3.815e-4, 3.762e-4, 3.618e-4, 3.579e-4,
2068 3.45e-4, 3.202e-4, 3.018e-4, 2.785e-4, 2.602e-4, 2.416e-4,
2069 2.097e-4, 1.939e-4, 1.689e-4, 1.498e-4, 1.308e-4, 1.17e-4,
2070 1.011e-4, 9.237e-5, 7.909e-5, 7.006e-5, 6.112e-5, 5.401e-5,
2071 4.914e-5, 4.266e-5, 3.963e-5, 3.316e-5, 3.037e-5, 2.598e-5,
2072 2.294e-5, 2.066e-5, 1.813e-5, 1.583e-5, 1.423e-5, 1.247e-5,
2073 1.116e-5, 9.76e-6, 8.596e-6, 7.72e-6, 6.825e-6, 6.108e-6,
2074 5.366e-6, 4.733e-6, 4.229e-6, 3.731e-6, 3.346e-6, 2.972e-6,
2075 2.628e-6, 2.356e-6, 2.102e-6, 1.878e-6, 1.678e-6, 1.507e-6,
2076 1.348e-6, 1.21e-6, 1.089e-6, 9.806e-7, 8.857e-7, 8.004e-7,
2077 7.261e-7, 6.599e-7, 6.005e-7, 5.479e-7, 5.011e-7, 4.595e-7,
2078 4.219e-7, 3.885e-7, 3.583e-7, 3.314e-7, 3.071e-7, 2.852e-7,
2079 2.654e-7, 2.474e-7, 2.311e-7, 2.162e-7, 2.026e-7, 1.902e-7,
2080 1.788e-7, 1.683e-7, 1.587e-7, 1.497e-7, 1.415e-7, 1.338e-7,
2081 1.266e-7, 1.2e-7, 1.138e-7, 1.08e-7, 1.027e-7, 9.764e-8,
2082 9.296e-8, 8.862e-8, 8.458e-8, 8.087e-8, 7.744e-8, 7.429e-8,
2083 7.145e-8, 6.893e-8, 6.664e-8, 6.468e-8, 6.322e-8, 6.162e-8,
2084 6.07e-8, 5.992e-8, 5.913e-8, 5.841e-8, 5.796e-8, 5.757e-8,
2085 5.746e-8, 5.731e-8, 5.679e-8, 5.577e-8, 5.671e-8, 5.656e-8,
2086 5.594e-8, 5.593e-8, 5.602e-8, 5.62e-8, 5.693e-8, 5.725e-8,
2087 5.858e-8, 6.037e-8, 6.249e-8, 6.535e-8, 6.899e-8, 7.356e-8,
2088 7.918e-8, 8.618e-8, 9.385e-8, 1.039e-7, 1.158e-7, 1.29e-7,
2089 1.437e-7, 1.65e-7, 1.871e-7, 2.121e-7, 2.427e-7, 2.773e-7,
2090 3.247e-7, 3.677e-7, 4.037e-7, 4.776e-7, 5.101e-7, 6.214e-7,
2091 6.936e-7, 7.581e-7, 8.486e-7, 9.355e-7, 9.942e-7, 1.063e-6,
2092 1.123e-6, 1.191e-6, 1.215e-6, 1.247e-6, 1.26e-6, 1.271e-6,
2093 1.284e-6, 1.317e-6, 1.323e-6, 1.349e-6, 1.353e-6, 1.362e-6,
2094 1.344e-6, 1.329e-6, 1.336e-6, 1.327e-6, 1.325e-6, 1.359e-6,
2095 1.374e-6, 1.415e-6, 1.462e-6, 1.526e-6, 1.619e-6, 1.735e-6,
2096 1.863e-6, 2.034e-6, 2.265e-6, 2.482e-6, 2.756e-6, 3.103e-6,
2097 3.466e-6, 3.832e-6, 4.378e-6, 4.913e-6, 5.651e-6, 6.311e-6,
2098 7.169e-6, 8.057e-6, 9.253e-6, 1.047e-5, 1.212e-5, 1.36e-5,
2099 1.569e-5, 1.776e-5, 2.02e-5, 2.281e-5, 2.683e-5, 2.994e-5,
2100 3.488e-5, 3.896e-5, 4.499e-5, 5.175e-5, 6.035e-5, 6.34e-5,
2101 7.281e-5, 7.923e-5, 8.348e-5, 9.631e-5, 1.044e-4, 1.102e-4,
2102 1.176e-4, 1.244e-4, 1.283e-4, 1.326e-4, 1.4e-4, 1.395e-4,
2103 1.387e-4, 1.363e-4, 1.314e-4, 1.241e-4, 1.228e-4, 1.148e-4,
2104 1.086e-4, 1.018e-4, 8.89e-5, 8.316e-5, 7.292e-5, 6.452e-5,
2105 5.625e-5, 5.045e-5, 4.38e-5, 3.762e-5, 3.29e-5, 2.836e-5,
2106 2.485e-5, 2.168e-5, 1.895e-5, 1.659e-5, 1.453e-5, 1.282e-5,
2107 1.132e-5, 1.001e-5, 8.836e-6, 7.804e-6, 6.922e-6, 6.116e-6,
2108 5.429e-6, 4.824e-6, 4.278e-6, 3.788e-6, 3.371e-6, 2.985e-6,
2109 2.649e-6, 2.357e-6, 2.09e-6, 1.858e-6, 1.647e-6, 1.462e-6,
2110 1.299e-6, 1.155e-6, 1.028e-6, 9.142e-7, 8.132e-7, 7.246e-7,
2111 6.451e-7, 5.764e-7, 5.151e-7, 4.603e-7, 4.121e-7, 3.694e-7,
2112 3.318e-7, 2.985e-7, 2.69e-7, 2.428e-7, 2.197e-7, 1.992e-7,
2113 1.81e-7, 1.649e-7, 1.506e-7, 1.378e-7, 1.265e-7, 1.163e-7,
2114 1.073e-7, 9.918e-8, 9.191e-8, 8.538e-8, 7.949e-8, 7.419e-8,
2115 6.94e-8, 6.508e-8, 6.114e-8, 5.761e-8, 5.437e-8, 5.146e-8,
2116 4.89e-8, 4.636e-8, 4.406e-8, 4.201e-8, 4.015e-8, 3.84e-8,
2117 3.661e-8, 3.51e-8, 3.377e-8, 3.242e-8, 3.13e-8, 3.015e-8,
2118 2.918e-8, 2.83e-8, 2.758e-8, 2.707e-8, 2.656e-8, 2.619e-8,
2119 2.609e-8, 2.615e-8, 2.63e-8, 2.675e-8, 2.745e-8, 2.842e-8,
2120 2.966e-8, 3.125e-8, 3.318e-8, 3.565e-8, 3.85e-8, 4.191e-8,
2121 4.59e-8, 5.059e-8, 5.607e-8, 6.239e-8, 6.958e-8, 7.796e-8,
2122 8.773e-8, 9.88e-8, 1.114e-7, 1.258e-7, 1.422e-7, 1.61e-7,
2123 1.822e-7, 2.06e-7, 2.337e-7, 2.645e-7, 2.996e-7, 3.393e-7,
2124 3.843e-7, 4.363e-7, 4.935e-7, 5.607e-7, 6.363e-7, 7.242e-7,
2125 8.23e-7, 9.411e-7, 1.071e-6, 1.232e-6, 1.402e-6, 1.6e-6, 1.82e-6,
2126 2.128e-6, 2.386e-6, 2.781e-6, 3.242e-6, 3.653e-6, 4.323e-6,
2127 4.747e-6, 5.321e-6, 5.919e-6, 6.681e-6, 7.101e-6, 7.983e-6,
2128 8.342e-6, 8.741e-6, 9.431e-6, 9.952e-6, 1.026e-5, 1.055e-5,
2129 1.095e-5, 1.095e-5, 1.087e-5, 1.056e-5, 1.026e-5, 9.715e-6,
2130 9.252e-6, 8.452e-6, 7.958e-6, 7.268e-6, 6.295e-6, 6.003e-6, 5e-6,
2131 4.591e-6, 3.983e-6, 3.479e-6, 3.058e-6, 2.667e-6, 2.293e-6,
2132 1.995e-6, 1.747e-6, 1.517e-6, 1.335e-6, 1.165e-6, 1.028e-6,
2133 9.007e-7, 7.956e-7, 7.015e-7, 6.192e-7, 5.491e-7, 4.859e-7,
2134 4.297e-7, 3.799e-7, 3.38e-7, 3.002e-7, 2.659e-7, 2.366e-7,
2135 2.103e-7, 1.861e-7, 1.655e-7, 1.469e-7, 1.309e-7, 1.162e-7,
2136 1.032e-7, 9.198e-8, 8.181e-8, 7.294e-8, 6.516e-8, 5.787e-8,
2137 5.163e-8, 4.612e-8, 4.119e-8, 3.695e-8, 3.308e-8, 2.976e-8,
2138 2.67e-8, 2.407e-8, 2.171e-8, 1.965e-8, 1.78e-8, 1.617e-8,
2139 1.47e-8, 1.341e-8, 1.227e-8, 1.125e-8, 1.033e-8, 9.524e-9,
2140 8.797e-9, 8.162e-9, 7.565e-9, 7.04e-9, 6.56e-9, 6.129e-9,
2141 5.733e-9, 5.376e-9, 5.043e-9, 4.75e-9, 4.466e-9, 4.211e-9,
2142 3.977e-9, 3.759e-9, 3.558e-9, 3.373e-9, 3.201e-9, 3.043e-9,
2143 2.895e-9, 2.76e-9, 2.635e-9, 2.518e-9, 2.411e-9, 2.314e-9,
2144 2.23e-9, 2.151e-9, 2.087e-9, 2.035e-9, 1.988e-9, 1.946e-9,
2145 1.927e-9, 1.916e-9, 1.916e-9, 1.933e-9, 1.966e-9, 2.018e-9,
2146 2.09e-9, 2.182e-9, 2.299e-9, 2.442e-9, 2.623e-9, 2.832e-9,
2147 3.079e-9, 3.368e-9, 3.714e-9, 4.104e-9, 4.567e-9, 5.091e-9,
2148 5.701e-9, 6.398e-9, 7.194e-9, 8.127e-9, 9.141e-9, 1.035e-8,
2149 1.177e-8, 1.338e-8, 1.508e-8, 1.711e-8, 1.955e-8, 2.216e-8,
2150 2.534e-8, 2.871e-8, 3.291e-8, 3.711e-8, 4.285e-8, 4.868e-8,
2151 5.509e-8, 6.276e-8, 7.262e-8, 8.252e-8, 9.4e-8, 1.064e-7,
2152 1.247e-7, 1.411e-7, 1.626e-7, 1.827e-7, 2.044e-7, 2.284e-7,
2153 2.452e-7, 2.854e-7, 3.026e-7, 3.278e-7, 3.474e-7, 3.693e-7,
2154 3.93e-7, 4.104e-7, 4.22e-7, 4.439e-7, 4.545e-7, 4.778e-7,
2155 4.812e-7, 5.018e-7, 4.899e-7, 5.075e-7, 5.073e-7, 5.171e-7,
2156 5.131e-7, 5.25e-7, 5.617e-7, 5.846e-7, 6.239e-7, 6.696e-7,
2157 7.398e-7, 8.073e-7, 9.15e-7, 1.009e-6, 1.116e-6, 1.264e-6,
2158 1.439e-6, 1.644e-6, 1.856e-6, 2.147e-6, 2.317e-6, 2.713e-6,
2159 2.882e-6, 2.99e-6, 3.489e-6, 3.581e-6, 4.033e-6, 4.26e-6,
2160 4.543e-6, 4.84e-6, 4.826e-6, 5.013e-6, 5.252e-6, 5.277e-6,
2161 5.306e-6, 5.236e-6, 5.123e-6, 5.171e-6, 4.843e-6, 4.615e-6,
2162 4.385e-6, 3.97e-6, 3.693e-6, 3.231e-6, 2.915e-6, 2.495e-6,
2163 2.144e-6, 1.91e-6, 1.639e-6, 1.417e-6, 1.226e-6, 1.065e-6,
2164 9.29e-7, 8.142e-7, 7.161e-7, 6.318e-7, 5.581e-7, 4.943e-7,
2165 4.376e-7, 3.884e-7, 3.449e-7, 3.06e-7, 2.712e-7, 2.412e-7,
2166 2.139e-7, 1.903e-7, 1.689e-7, 1.499e-7, 1.331e-7, 1.183e-7,
2167 1.05e-7, 9.362e-8, 8.306e-8, 7.403e-8, 6.578e-8, 5.853e-8,
2168 5.216e-8, 4.632e-8, 4.127e-8, 3.678e-8, 3.279e-8, 2.923e-8,
2169 2.612e-8, 2.339e-8, 2.094e-8, 1.877e-8, 1.686e-8, 1.516e-8,
2170 1.366e-8, 1.234e-8, 1.114e-8, 1.012e-8, 9.182e-9, 8.362e-9,
2171 7.634e-9, 6.981e-9, 6.406e-9, 5.888e-9, 5.428e-9, 5.021e-9,
2172 4.65e-9, 4.326e-9, 4.033e-9, 3.77e-9, 3.536e-9, 3.327e-9,
2173 3.141e-9, 2.974e-9, 2.825e-9, 2.697e-9, 2.584e-9, 2.488e-9,
2174 2.406e-9, 2.34e-9, 2.292e-9, 2.259e-9, 2.244e-9, 2.243e-9,
2175 2.272e-9, 2.31e-9, 2.378e-9, 2.454e-9, 2.618e-9, 2.672e-9,
2176 2.831e-9, 3.05e-9, 3.225e-9, 3.425e-9, 3.677e-9, 3.968e-9,
2177 4.221e-9, 4.639e-9, 4.96e-9, 5.359e-9, 5.649e-9, 6.23e-9,
2178 6.716e-9, 7.218e-9, 7.746e-9, 7.988e-9, 8.627e-9, 8.999e-9,
2179 9.442e-9, 9.82e-9, 1.015e-8, 1.06e-8, 1.079e-8, 1.109e-8,
2180 1.137e-8, 1.186e-8, 1.18e-8, 1.187e-8, 1.194e-8, 1.192e-8,
2181 1.224e-8, 1.245e-8, 1.246e-8, 1.318e-8, 1.377e-8, 1.471e-8,
2182 1.582e-8, 1.713e-8, 1.853e-8, 2.063e-8, 2.27e-8, 2.567e-8,
2183 2.891e-8, 3.264e-8, 3.744e-8, 4.286e-8, 4.915e-8, 5.623e-8,
2184 6.336e-8, 7.293e-8, 8.309e-8, 9.319e-8, 1.091e-7, 1.243e-7,
2185 1.348e-7, 1.449e-7, 1.62e-7, 1.846e-7, 1.937e-7, 2.04e-7,
2186 2.179e-7, 2.298e-7, 2.433e-7, 2.439e-7, 2.464e-7, 2.611e-7,
2187 2.617e-7, 2.582e-7, 2.453e-7, 2.401e-7, 2.349e-7, 2.203e-7,
2188 2.066e-7, 1.939e-7, 1.78e-7, 1.558e-7, 1.391e-7, 1.203e-7,
2189 1.048e-7, 9.464e-8, 8.306e-8, 7.239e-8, 6.317e-8, 5.52e-8,
2190 4.847e-8, 4.282e-8, 3.796e-8, 3.377e-8, 2.996e-8, 2.678e-8,
2191 2.4e-8, 2.134e-8, 1.904e-8, 1.705e-8, 1.523e-8, 1.35e-8,
2192 1.204e-8, 1.07e-8, 9.408e-9, 8.476e-9, 7.47e-9, 6.679e-9,
2193 5.929e-9, 5.267e-9, 4.711e-9, 4.172e-9, 3.761e-9, 3.288e-9,
2194 2.929e-9, 2.609e-9, 2.315e-9, 2.042e-9, 1.844e-9, 1.64e-9,
2195 1.47e-9, 1.31e-9, 1.176e-9, 1.049e-9, 9.377e-10, 8.462e-10,
2196 7.616e-10, 6.854e-10, 6.191e-10, 5.596e-10, 5.078e-10, 4.611e-10,
2197 4.197e-10, 3.83e-10, 3.505e-10, 3.215e-10, 2.956e-10, 2.726e-10,
2198 2.521e-10, 2.338e-10, 2.173e-10, 2.026e-10, 1.895e-10, 1.777e-10,
2199 1.672e-10, 1.579e-10, 1.496e-10, 1.423e-10, 1.358e-10, 1.302e-10,
2200 1.254e-10, 1.216e-10, 1.187e-10, 1.163e-10, 1.147e-10, 1.145e-10,
2201 1.15e-10, 1.17e-10, 1.192e-10, 1.25e-10, 1.298e-10, 1.345e-10,
2202 1.405e-10, 1.538e-10, 1.648e-10, 1.721e-10, 1.872e-10, 1.968e-10,
2203 2.089e-10, 2.172e-10, 2.317e-10, 2.389e-10, 2.503e-10, 2.585e-10,
2204 2.686e-10, 2.8e-10, 2.895e-10, 3.019e-10, 3.037e-10, 3.076e-10,
2205 3.146e-10, 3.198e-10, 3.332e-10, 3.397e-10, 3.54e-10, 3.667e-10,
2206 3.895e-10, 4.071e-10, 4.565e-10, 4.983e-10, 5.439e-10, 5.968e-10,
2207 6.676e-10, 7.456e-10, 8.405e-10, 9.478e-10, 1.064e-9, 1.218e-9,
2208 1.386e-9, 1.581e-9, 1.787e-9, 2.032e-9, 2.347e-9, 2.677e-9,
2209 3.008e-9, 3.544e-9, 4.056e-9, 4.687e-9, 5.331e-9, 6.227e-9,
2210 6.854e-9, 8.139e-9, 8.945e-9, 9.865e-9, 1.125e-8, 1.178e-8,
2211 1.364e-8, 1.436e-8, 1.54e-8, 1.672e-8, 1.793e-8, 1.906e-8,
2212 2.036e-8, 2.144e-8, 2.292e-8, 2.371e-8, 2.493e-8, 2.606e-8,
2213 2.706e-8, 2.866e-8, 3.036e-8, 3.136e-8, 3.405e-8, 3.665e-8,
2214 3.837e-8, 4.229e-8, 4.748e-8, 5.32e-8, 5.763e-8, 6.677e-8,
2215 7.216e-8, 7.716e-8, 8.958e-8, 9.419e-8, 1.036e-7, 1.108e-7,
2216 1.189e-7, 1.246e-7, 1.348e-7, 1.31e-7, 1.361e-7, 1.364e-7,
2217 1.363e-7, 1.343e-7, 1.293e-7, 1.254e-7, 1.235e-7, 1.158e-7,
2218 1.107e-7, 9.961e-8, 9.011e-8, 7.91e-8, 6.916e-8, 6.338e-8,
2219 5.564e-8, 4.827e-8, 4.198e-8, 3.695e-8, 3.276e-8, 2.929e-8,
2220 2.633e-8, 2.391e-8, 2.192e-8, 2.021e-8, 1.89e-8, 1.772e-8,
2221 1.667e-8, 1.603e-8, 1.547e-8, 1.537e-8, 1.492e-8, 1.515e-8,
2222 1.479e-8, 1.45e-8, 1.513e-8, 1.495e-8, 1.529e-8, 1.565e-8,
2223 1.564e-8, 1.553e-8, 1.569e-8, 1.584e-8, 1.57e-8, 1.538e-8,
2224 1.513e-8, 1.472e-8, 1.425e-8, 1.349e-8, 1.328e-8, 1.249e-8,
2225 1.17e-8, 1.077e-8, 9.514e-9, 8.614e-9, 7.46e-9, 6.621e-9,
2226 5.775e-9, 5.006e-9, 4.308e-9, 3.747e-9, 3.24e-9, 2.84e-9,
2227 2.481e-9, 2.184e-9, 1.923e-9, 1.71e-9, 1.504e-9, 1.334e-9,
2228 1.187e-9, 1.053e-9, 9.367e-10, 8.306e-10, 7.419e-10, 6.63e-10,
2229 5.918e-10, 5.277e-10, 4.717e-10, 4.222e-10, 3.783e-10, 3.39e-10,
2230 3.036e-10, 2.729e-10, 2.455e-10, 2.211e-10, 1.995e-10, 1.804e-10,
2231 1.635e-10, 1.485e-10, 1.355e-10, 1.24e-10, 1.139e-10, 1.051e-10,
2232 9.757e-11, 9.114e-11, 8.577e-11, 8.139e-11, 7.792e-11, 7.52e-11,
2233 7.39e-11, 7.311e-11, 7.277e-11, 7.482e-11, 7.698e-11, 8.162e-11,
2234 8.517e-11, 8.968e-11, 9.905e-11, 1.075e-10, 1.187e-10, 1.291e-10,
2235 1.426e-10, 1.573e-10, 1.734e-10, 1.905e-10, 2.097e-10, 2.28e-10,
2236 2.473e-10, 2.718e-10, 2.922e-10, 3.128e-10, 3.361e-10, 3.641e-10,
2237 3.91e-10, 4.196e-10, 4.501e-10, 4.932e-10, 5.258e-10, 5.755e-10,
2238 6.253e-10, 6.664e-10, 7.344e-10, 7.985e-10, 8.877e-10, 1.005e-9,
2239 1.118e-9, 1.251e-9, 1.428e-9, 1.61e-9, 1.888e-9, 2.077e-9,
2240 2.331e-9, 2.751e-9, 3.061e-9, 3.522e-9, 3.805e-9, 4.181e-9,
2241 4.575e-9, 5.167e-9, 5.634e-9, 6.007e-9, 6.501e-9, 6.829e-9,
2242 7.211e-9, 7.262e-9, 7.696e-9, 7.832e-9, 7.799e-9, 7.651e-9,
2243 7.304e-9, 7.15e-9, 6.977e-9, 6.603e-9, 6.209e-9, 5.69e-9,
2244 5.432e-9, 4.764e-9, 4.189e-9, 3.64e-9, 3.203e-9, 2.848e-9,
2245 2.51e-9, 2.194e-9, 1.946e-9, 1.75e-9, 1.567e-9, 1.426e-9,
2246 1.302e-9, 1.197e-9, 1.109e-9, 1.035e-9, 9.719e-10, 9.207e-10,
2247 8.957e-10, 8.578e-10, 8.262e-10, 8.117e-10, 7.987e-10, 7.875e-10,
2248 7.741e-10, 7.762e-10, 7.537e-10, 7.424e-10, 7.474e-10, 7.294e-10,
2249 7.216e-10, 7.233e-10, 7.075e-10, 6.892e-10, 6.618e-10, 6.314e-10,
2250 6.208e-10, 5.689e-10, 5.55e-10, 4.984e-10, 4.6e-10, 4.078e-10,
2251 3.879e-10, 3.459e-10, 2.982e-10, 2.626e-10, 2.329e-10, 1.988e-10,
2252 1.735e-10, 1.487e-10, 1.297e-10, 1.133e-10, 9.943e-11, 8.736e-11,
2253 7.726e-11, 6.836e-11, 6.053e-11, 5.384e-11, 4.789e-11, 4.267e-11,
2254 3.804e-11, 3.398e-11, 3.034e-11, 2.71e-11, 2.425e-11, 2.173e-11,
2255 1.95e-11, 1.752e-11, 1.574e-11, 1.418e-11, 1.278e-11, 1.154e-11,
2256 1.044e-11, 9.463e-12, 8.602e-12, 7.841e-12, 7.171e-12, 6.584e-12,
2257 6.073e-12, 5.631e-12, 5.254e-12, 4.937e-12, 4.679e-12, 4.476e-12,
2258 4.328e-12, 4.233e-12, 4.194e-12, 4.211e-12, 4.286e-12, 4.424e-12,
2259 4.628e-12, 4.906e-12, 5.262e-12, 5.708e-12, 6.254e-12, 6.914e-12,
2260 7.714e-12, 8.677e-12, 9.747e-12, 1.101e-11, 1.256e-11, 1.409e-11,
2261 1.597e-11, 1.807e-11, 2.034e-11, 2.316e-11, 2.622e-11, 2.962e-11,
2262 3.369e-11, 3.819e-11, 4.329e-11, 4.932e-11, 5.589e-11, 6.364e-11,
2263 7.284e-11, 8.236e-11, 9.447e-11, 1.078e-10, 1.229e-10, 1.417e-10,
2264 1.614e-10, 1.843e-10, 2.107e-10, 2.406e-10, 2.728e-10, 3.195e-10,
2265 3.595e-10, 4.153e-10, 4.736e-10, 5.41e-10, 6.088e-10, 6.769e-10,
2266 7.691e-10, 8.545e-10, 9.621e-10, 1.047e-9, 1.161e-9, 1.296e-9,
2267 1.424e-9, 1.576e-9, 1.739e-9, 1.893e-9, 2.08e-9, 2.336e-9,
2268 2.604e-9, 2.76e-9, 3.001e-9, 3.365e-9, 3.55e-9, 3.895e-9,
2269 4.183e-9, 4.614e-9, 4.846e-9, 5.068e-9, 5.427e-9, 5.541e-9,
2270 5.864e-9, 5.997e-9, 5.997e-9, 6.061e-9, 5.944e-9, 5.855e-9,
2271 5.661e-9, 5.523e-9, 5.374e-9, 4.94e-9, 4.688e-9, 4.17e-9,
2272 3.913e-9, 3.423e-9, 2.997e-9, 2.598e-9, 2.253e-9, 1.946e-9,
2273 1.71e-9, 1.507e-9, 1.336e-9, 1.19e-9, 1.068e-9, 9.623e-10,
2274 8.772e-10, 8.007e-10, 7.42e-10, 6.884e-10, 6.483e-10, 6.162e-10,
2275 5.922e-10, 5.688e-10, 5.654e-10, 5.637e-10, 5.701e-10, 5.781e-10,
2276 5.874e-10, 6.268e-10, 6.357e-10, 6.525e-10, 7.137e-10, 7.441e-10,
2277 8.024e-10, 8.485e-10, 9.143e-10, 9.536e-10, 9.717e-10, 1.018e-9,
2278 1.042e-9, 1.054e-9, 1.092e-9, 1.079e-9, 1.064e-9, 1.043e-9,
2279 1.02e-9, 9.687e-10, 9.273e-10, 9.208e-10, 9.068e-10, 7.687e-10,
2280 7.385e-10, 6.595e-10, 5.87e-10, 5.144e-10, 4.417e-10, 3.804e-10,
2281 3.301e-10, 2.866e-10, 2.509e-10, 2.202e-10, 1.947e-10, 1.719e-10,
2282 1.525e-10, 1.361e-10, 1.21e-10, 1.084e-10, 9.8e-11, 8.801e-11,
2283 7.954e-11, 7.124e-11, 6.335e-11, 5.76e-11, 5.132e-11, 4.601e-11,
2284 4.096e-11, 3.657e-11, 3.25e-11, 2.909e-11, 2.587e-11, 2.297e-11,
2285 2.05e-11, 1.828e-11, 1.632e-11, 1.462e-11, 1.314e-11, 1.185e-11,
2286 1.073e-11, 9.76e-12, 8.922e-12, 8.206e-12, 7.602e-12, 7.1e-12,
2287 6.694e-12, 6.378e-12, 6.149e-12, 6.004e-12, 5.941e-12, 5.962e-12,
2288 6.069e-12, 6.265e-12, 6.551e-12, 6.935e-12, 7.457e-12, 8.074e-12,
2289 8.811e-12, 9.852e-12, 1.086e-11, 1.207e-11, 1.361e-11, 1.553e-11,
2290 1.737e-11, 1.93e-11, 2.175e-11, 2.41e-11, 2.706e-11, 3.023e-11,
2291 3.313e-11, 3.657e-11, 4.118e-11, 4.569e-11, 5.025e-11, 5.66e-11,
2292 6.231e-11, 6.881e-11, 7.996e-11, 8.526e-11, 9.694e-11, 1.106e-10,
2293 1.222e-10, 1.355e-10, 1.525e-10, 1.775e-10, 1.924e-10, 2.181e-10,
2294 2.379e-10, 2.662e-10, 2.907e-10, 3.154e-10, 3.366e-10, 3.579e-10,
2295 3.858e-10, 4.046e-10, 4.196e-10, 4.166e-10, 4.457e-10, 4.466e-10,
2296 4.404e-10, 4.337e-10, 4.15e-10, 4.083e-10, 3.91e-10, 3.723e-10,
2297 3.514e-10, 3.303e-10, 2.847e-10, 2.546e-10, 2.23e-10, 1.994e-10,
2298 1.733e-10, 1.488e-10, 1.297e-10, 1.144e-10, 1.004e-10, 8.741e-11,
2299 7.928e-11, 7.034e-11, 6.323e-11, 5.754e-11, 5.25e-11, 4.85e-11,
2300 4.502e-11, 4.286e-11, 4.028e-11, 3.899e-11, 3.824e-11, 3.761e-11,
2301 3.804e-11, 3.839e-11, 3.845e-11, 4.244e-11, 4.382e-11, 4.582e-11,
2302 4.847e-11, 5.209e-11, 5.384e-11, 5.887e-11, 6.371e-11, 6.737e-11,
2303 7.168e-11, 7.415e-11, 7.827e-11, 8.037e-11, 8.12e-11, 8.071e-11,
2304 8.008e-11, 7.851e-11, 7.544e-11, 7.377e-11, 7.173e-11, 6.801e-11,
2305 6.267e-11, 5.727e-11, 5.288e-11, 4.853e-11, 4.082e-11, 3.645e-11,
2306 3.136e-11, 2.672e-11, 2.304e-11, 1.986e-11, 1.725e-11, 1.503e-11,
2307 1.315e-11, 1.153e-11, 1.014e-11, 8.942e-12, 7.901e-12, 6.993e-12,
2308 6.199e-12, 5.502e-12, 4.89e-12, 4.351e-12, 3.878e-12, 3.461e-12,
2309 3.094e-12, 2.771e-12, 2.488e-12, 2.241e-12, 2.025e-12, 1.838e-12,
2310 1.677e-12, 1.541e-12, 1.427e-12, 1.335e-12, 1.262e-12, 1.209e-12,
2311 1.176e-12, 1.161e-12, 1.165e-12, 1.189e-12, 1.234e-12, 1.3e-12,
2312 1.389e-12, 1.503e-12, 1.644e-12, 1.814e-12, 2.017e-12, 2.255e-12,
2313 2.534e-12, 2.858e-12, 3.231e-12, 3.661e-12, 4.153e-12, 4.717e-12,
2314 5.36e-12, 6.094e-12, 6.93e-12, 7.882e-12, 8.966e-12, 1.02e-11,
2315 1.162e-11, 1.324e-11, 1.51e-11, 1.72e-11, 1.965e-11, 2.237e-11,
2316 2.56e-11, 2.927e-11, 3.371e-11, 3.842e-11, 4.429e-11, 5.139e-11,
2317 5.798e-11, 6.697e-11, 7.626e-11, 8.647e-11, 1.022e-10, 1.136e-10,
2318 1.3e-10, 1.481e-10, 1.672e-10, 1.871e-10, 2.126e-10, 2.357e-10,
2319 2.583e-10, 2.997e-10, 3.289e-10, 3.702e-10, 4.012e-10, 4.319e-10,
2320 4.527e-10, 5.001e-10, 5.448e-10, 5.611e-10, 5.76e-10, 5.965e-10,
2321 6.079e-10, 6.207e-10, 6.276e-10, 6.222e-10, 6.137e-10, 6e-10,
2322 5.814e-10, 5.393e-10, 5.35e-10, 4.947e-10, 4.629e-10, 4.117e-10,
2323 3.712e-10, 3.372e-10, 2.923e-10, 2.55e-10, 2.232e-10, 1.929e-10,
2324 1.679e-10, 1.46e-10, 1.289e-10, 1.13e-10, 9.953e-11, 8.763e-11,
2325 7.76e-11, 6.9e-11, 6.16e-11, 5.525e-11, 4.958e-11, 4.489e-11,
2326 4.072e-11, 3.728e-11, 3.438e-11, 3.205e-11, 3.006e-11, 2.848e-11,
2327 2.766e-11, 2.688e-11, 2.664e-11, 2.67e-11, 2.696e-11, 2.786e-11,
2328 2.861e-11, 3.009e-11, 3.178e-11, 3.389e-11, 3.587e-11, 3.819e-11,
2329 4.054e-11, 4.417e-11, 4.703e-11, 5.137e-11, 5.46e-11, 6.055e-11,
2330 6.333e-11, 6.773e-11, 7.219e-11, 7.717e-11, 8.131e-11, 8.491e-11,
2331 8.574e-11, 9.01e-11, 9.017e-11, 8.999e-11, 8.959e-11, 8.838e-11,
2332 8.579e-11, 8.162e-11, 8.098e-11, 7.472e-11, 7.108e-11, 6.559e-11,
2333 5.994e-11, 5.172e-11, 4.424e-11, 3.951e-11, 3.34e-11, 2.902e-11,
2334 2.541e-11, 2.215e-11, 1.945e-11, 1.716e-11, 1.503e-11, 1.339e-11,
2335 1.185e-11, 1.05e-11, 9.336e-12, 8.307e-12, 7.312e-12, 6.55e-12,
2336 5.836e-12, 5.178e-12, 4.6e-12, 4.086e-12, 3.639e-12, 3.247e-12,
2337 2.904e-12, 2.604e-12, 2.341e-12, 2.112e-12, 1.914e-12, 1.744e-12,
2338 1.598e-12, 1.476e-12, 1.374e-12, 1.293e-12, 1.23e-12, 1.185e-12,
2339 1.158e-12, 1.147e-12, 1.154e-12, 1.177e-12, 1.219e-12, 1.28e-12,
2340 1.36e-12, 1.463e-12, 1.591e-12, 1.75e-12, 1.94e-12, 2.156e-12,
2341 2.43e-12, 2.748e-12, 3.052e-12, 3.533e-12, 3.967e-12, 4.471e-12,
2342 5.041e-12, 5.86e-12, 6.664e-12, 7.522e-12, 8.342e-12, 9.412e-12,
2343 1.072e-11, 1.213e-11, 1.343e-11, 1.496e-11, 1.664e-11, 1.822e-11,
2344 2.029e-11, 2.233e-11, 2.457e-11, 2.709e-11, 2.928e-11, 3.115e-11,
2345 3.356e-11, 3.592e-11, 3.818e-11, 3.936e-11, 4.061e-11, 4.149e-11,
2346 4.299e-11, 4.223e-11, 4.251e-11, 4.287e-11, 4.177e-11, 4.094e-11,
2347 3.942e-11, 3.772e-11, 3.614e-11, 3.394e-11, 3.222e-11, 2.791e-11,
2348 2.665e-11, 2.309e-11, 2.032e-11, 1.74e-11, 1.535e-11, 1.323e-11,
2349 1.151e-11, 9.803e-12, 8.65e-12, 7.54e-12, 6.619e-12, 5.832e-12,
2350 5.113e-12, 4.503e-12, 3.975e-12, 3.52e-12, 3.112e-12, 2.797e-12,
2351 2.5e-12, 2.24e-12, 2.013e-12, 1.819e-12, 1.653e-12, 1.513e-12,
2352 1.395e-12, 1.299e-12, 1.225e-12, 1.168e-12, 1.124e-12, 1.148e-12,
2353 1.107e-12, 1.128e-12, 1.169e-12, 1.233e-12, 1.307e-12, 1.359e-12,
2354 1.543e-12, 1.686e-12, 1.794e-12, 2.028e-12, 2.21e-12, 2.441e-12,
2355 2.653e-12, 2.828e-12, 3.093e-12, 3.28e-12, 3.551e-12, 3.677e-12,
2356 3.803e-12, 3.844e-12, 4.068e-12, 4.093e-12, 4.002e-12, 3.904e-12,
2357 3.624e-12, 3.633e-12, 3.622e-12, 3.443e-12, 3.184e-12, 2.934e-12,
2358 2.476e-12, 2.212e-12, 1.867e-12, 1.594e-12, 1.37e-12, 1.192e-12,
2359 1.045e-12, 9.211e-13, 8.17e-13, 7.29e-13, 6.55e-13, 5.929e-13,
2360 5.415e-13, 4.995e-13, 4.661e-13, 4.406e-13, 4.225e-13, 4.116e-13,
2361 4.075e-13, 4.102e-13, 4.198e-13, 4.365e-13, 4.606e-13, 4.925e-13,
2362 5.326e-13, 5.818e-13, 6.407e-13, 7.104e-13, 7.92e-13, 8.868e-13,
2363 9.964e-13, 1.123e-12, 1.268e-12, 1.434e-12, 1.626e-12, 1.848e-12,
2364 2.107e-12, 2.422e-12, 2.772e-12, 3.145e-12, 3.704e-12, 4.27e-12,
2365 4.721e-12, 5.361e-12, 6.083e-12, 7.095e-12, 7.968e-12, 9.228e-12,
2366 1.048e-11, 1.187e-11, 1.336e-11, 1.577e-11, 1.772e-11, 2.017e-11,
2367 2.25e-11, 2.63e-11, 2.911e-11, 3.356e-11, 3.82e-11, 4.173e-11,
2368 4.811e-11, 5.254e-11, 5.839e-11, 6.187e-11, 6.805e-11, 7.118e-11,
2369 7.369e-11, 7.664e-11, 7.794e-11, 7.947e-11, 8.036e-11, 7.954e-11,
2370 7.849e-11, 7.518e-11, 7.462e-11, 6.926e-11, 6.531e-11, 6.197e-11,
2371 5.421e-11, 4.777e-11, 4.111e-11, 3.679e-11, 3.166e-11, 2.786e-11,
2372 2.436e-11, 2.144e-11, 1.859e-11, 1.628e-11, 1.414e-11, 1.237e-11,
2373 1.093e-11, 9.558e-12
2374 };
2375
2376 static const double h2o260[2001] =
2377 { .2752, .2732, .2749, .2676, .2667, .2545,
2378 .2497, .2327, .2218, .2036, .1825, .1694, .1497, .1353, .121,
2379 .1014, .09405, .07848, .07195, .06246, .05306, .04853, .04138,
2380 .03735, .03171, .02785, .02431, .02111, .01845, .0164, .01405,
2381 .01255, .01098, .009797, .008646, .007779, .006898, .006099,
2382 .005453, .004909, .004413, .003959, .003581, .003199, .002871,
2383 .002583, .00233, .002086, .001874, .001684, .001512, .001361,
2384 .001225, .0011, 9.89e-4, 8.916e-4, 8.039e-4, 7.256e-4, 6.545e-4,
2385 5.918e-4, 5.359e-4, 4.867e-4, 4.426e-4, 4.033e-4, 3.682e-4,
2386 3.366e-4, 3.085e-4, 2.833e-4, 2.605e-4, 2.403e-4, 2.221e-4,
2387 2.055e-4, 1.908e-4, 1.774e-4, 1.653e-4, 1.544e-4, 1.443e-4,
2388 1.351e-4, 1.267e-4, 1.19e-4, 1.119e-4, 1.053e-4, 9.922e-5,
2389 9.355e-5, 8.831e-5, 8.339e-5, 7.878e-5, 7.449e-5, 7.043e-5,
2390 6.664e-5, 6.307e-5, 5.969e-5, 5.654e-5, 5.357e-5, 5.075e-5,
2391 4.81e-5, 4.56e-5, 4.322e-5, 4.102e-5, 3.892e-5, 3.696e-5,
2392 3.511e-5, 3.339e-5, 3.177e-5, 3.026e-5, 2.886e-5, 2.756e-5,
2393 2.636e-5, 2.527e-5, 2.427e-5, 2.337e-5, 2.257e-5, 2.185e-5,
2394 2.127e-5, 2.08e-5, 2.041e-5, 2.013e-5, 2e-5, 1.997e-5, 2.009e-5,
2395 2.031e-5, 2.068e-5, 2.124e-5, 2.189e-5, 2.267e-5, 2.364e-5,
2396 2.463e-5, 2.618e-5, 2.774e-5, 2.937e-5, 3.144e-5, 3.359e-5,
2397 3.695e-5, 4.002e-5, 4.374e-5, 4.947e-5, 5.431e-5, 6.281e-5,
2398 7.169e-5, 8.157e-5, 9.728e-5, 1.079e-4, 1.337e-4, 1.442e-4,
2399 1.683e-4, 1.879e-4, 2.223e-4, 2.425e-4, 2.838e-4, 3.143e-4,
2400 3.527e-4, 4.012e-4, 4.237e-4, 4.747e-4, 5.057e-4, 5.409e-4,
2401 5.734e-4, 5.944e-4, 6.077e-4, 6.175e-4, 6.238e-4, 6.226e-4,
2402 6.248e-4, 6.192e-4, 6.098e-4, 5.818e-4, 5.709e-4, 5.465e-4,
2403 5.043e-4, 4.699e-4, 4.294e-4, 3.984e-4, 3.672e-4, 3.152e-4,
2404 2.883e-4, 2.503e-4, 2.211e-4, 1.92e-4, 1.714e-4, 1.485e-4,
2405 1.358e-4, 1.156e-4, 1.021e-4, 8.887e-5, 7.842e-5, 7.12e-5,
2406 6.186e-5, 5.73e-5, 4.792e-5, 4.364e-5, 3.72e-5, 3.28e-5,
2407 2.946e-5, 2.591e-5, 2.261e-5, 2.048e-5, 1.813e-5, 1.63e-5,
2408 1.447e-5, 1.282e-5, 1.167e-5, 1.041e-5, 9.449e-6, 8.51e-6,
2409 7.596e-6, 6.961e-6, 6.272e-6, 5.728e-6, 5.198e-6, 4.667e-6,
2410 4.288e-6, 3.897e-6, 3.551e-6, 3.235e-6, 2.952e-6, 2.688e-6,
2411 2.449e-6, 2.241e-6, 2.05e-6, 1.879e-6, 1.722e-6, 1.582e-6,
2412 1.456e-6, 1.339e-6, 1.236e-6, 1.144e-6, 1.06e-6, 9.83e-7,
2413 9.149e-7, 8.535e-7, 7.973e-7, 7.466e-7, 6.999e-7, 6.574e-7,
2414 6.18e-7, 5.821e-7, 5.487e-7, 5.18e-7, 4.896e-7, 4.631e-7,
2415 4.386e-7, 4.16e-7, 3.945e-7, 3.748e-7, 3.562e-7, 3.385e-7,
2416 3.222e-7, 3.068e-7, 2.922e-7, 2.788e-7, 2.659e-7, 2.539e-7,
2417 2.425e-7, 2.318e-7, 2.219e-7, 2.127e-7, 2.039e-7, 1.958e-7,
2418 1.885e-7, 1.818e-7, 1.758e-7, 1.711e-7, 1.662e-7, 1.63e-7,
2419 1.605e-7, 1.58e-7, 1.559e-7, 1.545e-7, 1.532e-7, 1.522e-7,
2420 1.51e-7, 1.495e-7, 1.465e-7, 1.483e-7, 1.469e-7, 1.448e-7,
2421 1.444e-7, 1.436e-7, 1.426e-7, 1.431e-7, 1.425e-7, 1.445e-7,
2422 1.477e-7, 1.515e-7, 1.567e-7, 1.634e-7, 1.712e-7, 1.802e-7,
2423 1.914e-7, 2.024e-7, 2.159e-7, 2.295e-7, 2.461e-7, 2.621e-7,
2424 2.868e-7, 3.102e-7, 3.394e-7, 3.784e-7, 4.223e-7, 4.864e-7,
2425 5.501e-7, 6.039e-7, 7.193e-7, 7.728e-7, 9.514e-7, 1.073e-6,
2426 1.18e-6, 1.333e-6, 1.472e-6, 1.566e-6, 1.677e-6, 1.784e-6,
2427 1.904e-6, 1.953e-6, 2.02e-6, 2.074e-6, 2.128e-6, 2.162e-6,
2428 2.219e-6, 2.221e-6, 2.249e-6, 2.239e-6, 2.235e-6, 2.185e-6,
2429 2.141e-6, 2.124e-6, 2.09e-6, 2.068e-6, 2.1e-6, 2.104e-6,
2430 2.142e-6, 2.181e-6, 2.257e-6, 2.362e-6, 2.5e-6, 2.664e-6,
2431 2.884e-6, 3.189e-6, 3.48e-6, 3.847e-6, 4.313e-6, 4.79e-6,
2432 5.25e-6, 5.989e-6, 6.692e-6, 7.668e-6, 8.52e-6, 9.606e-6,
2433 1.073e-5, 1.225e-5, 1.377e-5, 1.582e-5, 1.761e-5, 2.029e-5,
2434 2.284e-5, 2.602e-5, 2.94e-5, 3.483e-5, 3.928e-5, 4.618e-5,
2435 5.24e-5, 6.132e-5, 7.183e-5, 8.521e-5, 9.111e-5, 1.07e-4,
2436 1.184e-4, 1.264e-4, 1.475e-4, 1.612e-4, 1.704e-4, 1.818e-4,
2437 1.924e-4, 1.994e-4, 2.061e-4, 2.18e-4, 2.187e-4, 2.2e-4,
2438 2.196e-4, 2.131e-4, 2.015e-4, 1.988e-4, 1.847e-4, 1.729e-4,
2439 1.597e-4, 1.373e-4, 1.262e-4, 1.087e-4, 9.439e-5, 8.061e-5,
2440 7.093e-5, 6.049e-5, 5.12e-5, 4.435e-5, 3.817e-5, 3.34e-5,
2441 2.927e-5, 2.573e-5, 2.291e-5, 2.04e-5, 1.827e-5, 1.636e-5,
2442 1.463e-5, 1.309e-5, 1.17e-5, 1.047e-5, 9.315e-6, 8.328e-6,
2443 7.458e-6, 6.665e-6, 5.94e-6, 5.316e-6, 4.752e-6, 4.252e-6,
2444 3.825e-6, 3.421e-6, 3.064e-6, 2.746e-6, 2.465e-6, 2.216e-6,
2445 1.99e-6, 1.79e-6, 1.609e-6, 1.449e-6, 1.306e-6, 1.177e-6,
2446 1.063e-6, 9.607e-7, 8.672e-7, 7.855e-7, 7.118e-7, 6.46e-7,
2447 5.871e-7, 5.34e-7, 4.868e-7, 4.447e-7, 4.068e-7, 3.729e-7,
2448 3.423e-7, 3.151e-7, 2.905e-7, 2.686e-7, 2.484e-7, 2.306e-7,
2449 2.142e-7, 1.995e-7, 1.86e-7, 1.738e-7, 1.626e-7, 1.522e-7,
2450 1.427e-7, 1.338e-7, 1.258e-7, 1.183e-7, 1.116e-7, 1.056e-7,
2451 9.972e-8, 9.46e-8, 9.007e-8, 8.592e-8, 8.195e-8, 7.816e-8,
2452 7.483e-8, 7.193e-8, 6.892e-8, 6.642e-8, 6.386e-8, 6.154e-8,
2453 5.949e-8, 5.764e-8, 5.622e-8, 5.479e-8, 5.364e-8, 5.301e-8,
2454 5.267e-8, 5.263e-8, 5.313e-8, 5.41e-8, 5.55e-8, 5.745e-8,
2455 6.003e-8, 6.311e-8, 6.713e-8, 7.173e-8, 7.724e-8, 8.368e-8,
2456 9.121e-8, 9.986e-8, 1.097e-7, 1.209e-7, 1.338e-7, 1.486e-7,
2457 1.651e-7, 1.837e-7, 2.048e-7, 2.289e-7, 2.557e-7, 2.857e-7,
2458 3.195e-7, 3.587e-7, 4.015e-7, 4.497e-7, 5.049e-7, 5.665e-7,
2459 6.366e-7, 7.121e-7, 7.996e-7, 8.946e-7, 1.002e-6, 1.117e-6,
2460 1.262e-6, 1.416e-6, 1.611e-6, 1.807e-6, 2.056e-6, 2.351e-6,
2461 2.769e-6, 3.138e-6, 3.699e-6, 4.386e-6, 5.041e-6, 6.074e-6,
2462 6.812e-6, 7.79e-6, 8.855e-6, 1.014e-5, 1.095e-5, 1.245e-5,
2463 1.316e-5, 1.39e-5, 1.504e-5, 1.583e-5, 1.617e-5, 1.652e-5,
2464 1.713e-5, 1.724e-5, 1.715e-5, 1.668e-5, 1.629e-5, 1.552e-5,
2465 1.478e-5, 1.34e-5, 1.245e-5, 1.121e-5, 9.575e-6, 8.956e-6,
2466 7.345e-6, 6.597e-6, 5.612e-6, 4.818e-6, 4.165e-6, 3.579e-6,
2467 3.041e-6, 2.623e-6, 2.29e-6, 1.984e-6, 1.748e-6, 1.534e-6,
2468 1.369e-6, 1.219e-6, 1.092e-6, 9.8e-7, 8.762e-7, 7.896e-7,
2469 7.104e-7, 6.364e-7, 5.691e-7, 5.107e-7, 4.575e-7, 4.09e-7,
2470 3.667e-7, 3.287e-7, 2.931e-7, 2.633e-7, 2.356e-7, 2.111e-7,
2471 1.895e-7, 1.697e-7, 1.525e-7, 1.369e-7, 1.233e-7, 1.114e-7,
2472 9.988e-8, 9.004e-8, 8.149e-8, 7.352e-8, 6.662e-8, 6.03e-8,
2473 5.479e-8, 4.974e-8, 4.532e-8, 4.129e-8, 3.781e-8, 3.462e-8,
2474 3.176e-8, 2.919e-8, 2.687e-8, 2.481e-8, 2.292e-8, 2.119e-8,
2475 1.967e-8, 1.828e-8, 1.706e-8, 1.589e-8, 1.487e-8, 1.393e-8,
2476 1.307e-8, 1.228e-8, 1.156e-8, 1.089e-8, 1.028e-8, 9.696e-9,
2477 9.159e-9, 8.658e-9, 8.187e-9, 7.746e-9, 7.34e-9, 6.953e-9,
2478 6.594e-9, 6.259e-9, 5.948e-9, 5.66e-9, 5.386e-9, 5.135e-9,
2479 4.903e-9, 4.703e-9, 4.515e-9, 4.362e-9, 4.233e-9, 4.117e-9,
2480 4.017e-9, 3.962e-9, 3.924e-9, 3.905e-9, 3.922e-9, 3.967e-9,
2481 4.046e-9, 4.165e-9, 4.32e-9, 4.522e-9, 4.769e-9, 5.083e-9,
2482 5.443e-9, 5.872e-9, 6.366e-9, 6.949e-9, 7.601e-9, 8.371e-9,
2483 9.22e-9, 1.02e-8, 1.129e-8, 1.251e-8, 1.393e-8, 1.542e-8,
2484 1.72e-8, 1.926e-8, 2.152e-8, 2.392e-8, 2.678e-8, 3.028e-8,
2485 3.39e-8, 3.836e-8, 4.309e-8, 4.9e-8, 5.481e-8, 6.252e-8,
2486 7.039e-8, 7.883e-8, 8.849e-8, 1.012e-7, 1.142e-7, 1.3e-7,
2487 1.475e-7, 1.732e-7, 1.978e-7, 2.304e-7, 2.631e-7, 2.988e-7,
2488 3.392e-7, 3.69e-7, 4.355e-7, 4.672e-7, 5.11e-7, 5.461e-7,
2489 5.828e-7, 6.233e-7, 6.509e-7, 6.672e-7, 6.969e-7, 7.104e-7,
2490 7.439e-7, 7.463e-7, 7.708e-7, 7.466e-7, 7.668e-7, 7.549e-7,
2491 7.586e-7, 7.384e-7, 7.439e-7, 7.785e-7, 7.915e-7, 8.31e-7,
2492 8.745e-7, 9.558e-7, 1.038e-6, 1.173e-6, 1.304e-6, 1.452e-6,
2493 1.671e-6, 1.931e-6, 2.239e-6, 2.578e-6, 3.032e-6, 3.334e-6,
2494 3.98e-6, 4.3e-6, 4.518e-6, 5.321e-6, 5.508e-6, 6.211e-6, 6.59e-6,
2495 7.046e-6, 7.555e-6, 7.558e-6, 7.875e-6, 8.319e-6, 8.433e-6,
2496 8.59e-6, 8.503e-6, 8.304e-6, 8.336e-6, 7.739e-6, 7.301e-6,
2497 6.827e-6, 6.078e-6, 5.551e-6, 4.762e-6, 4.224e-6, 3.538e-6,
2498 2.984e-6, 2.619e-6, 2.227e-6, 1.923e-6, 1.669e-6, 1.462e-6,
2499 1.294e-6, 1.155e-6, 1.033e-6, 9.231e-7, 8.238e-7, 7.36e-7,
2500 6.564e-7, 5.869e-7, 5.236e-7, 4.673e-7, 4.174e-7, 3.736e-7,
2501 3.33e-7, 2.976e-7, 2.657e-7, 2.367e-7, 2.106e-7, 1.877e-7,
2502 1.671e-7, 1.494e-7, 1.332e-7, 1.192e-7, 1.065e-7, 9.558e-8,
2503 8.586e-8, 7.717e-8, 6.958e-8, 6.278e-8, 5.666e-8, 5.121e-8,
2504 4.647e-8, 4.213e-8, 3.815e-8, 3.459e-8, 3.146e-8, 2.862e-8,
2505 2.604e-8, 2.375e-8, 2.162e-8, 1.981e-8, 1.817e-8, 1.67e-8,
2506 1.537e-8, 1.417e-8, 1.31e-8, 1.215e-8, 1.128e-8, 1.05e-8,
2507 9.793e-9, 9.158e-9, 8.586e-9, 8.068e-9, 7.595e-9, 7.166e-9,
2508 6.778e-9, 6.427e-9, 6.108e-9, 5.826e-9, 5.571e-9, 5.347e-9,
2509 5.144e-9, 4.968e-9, 4.822e-9, 4.692e-9, 4.589e-9, 4.506e-9,
2510 4.467e-9, 4.44e-9, 4.466e-9, 4.515e-9, 4.718e-9, 4.729e-9,
2511 4.937e-9, 5.249e-9, 5.466e-9, 5.713e-9, 6.03e-9, 6.436e-9,
2512 6.741e-9, 7.33e-9, 7.787e-9, 8.414e-9, 8.908e-9, 9.868e-9,
2513 1.069e-8, 1.158e-8, 1.253e-8, 1.3e-8, 1.409e-8, 1.47e-8,
2514 1.548e-8, 1.612e-8, 1.666e-8, 1.736e-8, 1.763e-8, 1.812e-8,
2515 1.852e-8, 1.923e-8, 1.897e-8, 1.893e-8, 1.888e-8, 1.868e-8,
2516 1.895e-8, 1.899e-8, 1.876e-8, 1.96e-8, 2.02e-8, 2.121e-8,
2517 2.239e-8, 2.379e-8, 2.526e-8, 2.766e-8, 2.994e-8, 3.332e-8,
2518 3.703e-8, 4.158e-8, 4.774e-8, 5.499e-8, 6.355e-8, 7.349e-8,
2519 8.414e-8, 9.846e-8, 1.143e-7, 1.307e-7, 1.562e-7, 1.817e-7,
2520 2.011e-7, 2.192e-7, 2.485e-7, 2.867e-7, 3.035e-7, 3.223e-7,
2521 3.443e-7, 3.617e-7, 3.793e-7, 3.793e-7, 3.839e-7, 4.081e-7,
2522 4.117e-7, 4.085e-7, 3.92e-7, 3.851e-7, 3.754e-7, 3.49e-7,
2523 3.229e-7, 2.978e-7, 2.691e-7, 2.312e-7, 2.029e-7, 1.721e-7,
2524 1.472e-7, 1.308e-7, 1.132e-7, 9.736e-8, 8.458e-8, 7.402e-8,
2525 6.534e-8, 5.811e-8, 5.235e-8, 4.762e-8, 4.293e-8, 3.896e-8,
2526 3.526e-8, 3.165e-8, 2.833e-8, 2.551e-8, 2.288e-8, 2.036e-8,
2527 1.82e-8, 1.626e-8, 1.438e-8, 1.299e-8, 1.149e-8, 1.03e-8,
2528 9.148e-9, 8.122e-9, 7.264e-9, 6.425e-9, 5.777e-9, 5.06e-9,
2529 4.502e-9, 4.013e-9, 3.567e-9, 3.145e-9, 2.864e-9, 2.553e-9,
2530 2.311e-9, 2.087e-9, 1.886e-9, 1.716e-9, 1.556e-9, 1.432e-9,
2531 1.311e-9, 1.202e-9, 1.104e-9, 1.013e-9, 9.293e-10, 8.493e-10,
2532 7.79e-10, 7.185e-10, 6.642e-10, 6.141e-10, 5.684e-10, 5.346e-10,
2533 5.032e-10, 4.725e-10, 4.439e-10, 4.176e-10, 3.93e-10, 3.714e-10,
2534 3.515e-10, 3.332e-10, 3.167e-10, 3.02e-10, 2.887e-10, 2.769e-10,
2535 2.665e-10, 2.578e-10, 2.503e-10, 2.436e-10, 2.377e-10, 2.342e-10,
2536 2.305e-10, 2.296e-10, 2.278e-10, 2.321e-10, 2.355e-10, 2.402e-10,
2537 2.478e-10, 2.67e-10, 2.848e-10, 2.982e-10, 3.263e-10, 3.438e-10,
2538 3.649e-10, 3.829e-10, 4.115e-10, 4.264e-10, 4.473e-10, 4.63e-10,
2539 4.808e-10, 4.995e-10, 5.142e-10, 5.313e-10, 5.318e-10, 5.358e-10,
2540 5.452e-10, 5.507e-10, 5.698e-10, 5.782e-10, 5.983e-10, 6.164e-10,
2541 6.532e-10, 6.811e-10, 7.624e-10, 8.302e-10, 9.067e-10, 9.937e-10,
2542 1.104e-9, 1.221e-9, 1.361e-9, 1.516e-9, 1.675e-9, 1.883e-9,
2543 2.101e-9, 2.349e-9, 2.614e-9, 2.92e-9, 3.305e-9, 3.724e-9,
2544 4.142e-9, 4.887e-9, 5.614e-9, 6.506e-9, 7.463e-9, 8.817e-9,
2545 9.849e-9, 1.187e-8, 1.321e-8, 1.474e-8, 1.698e-8, 1.794e-8,
2546 2.09e-8, 2.211e-8, 2.362e-8, 2.556e-8, 2.729e-8, 2.88e-8,
2547 3.046e-8, 3.167e-8, 3.367e-8, 3.457e-8, 3.59e-8, 3.711e-8,
2548 3.826e-8, 4.001e-8, 4.211e-8, 4.315e-8, 4.661e-8, 5.01e-8,
2549 5.249e-8, 5.84e-8, 6.628e-8, 7.512e-8, 8.253e-8, 9.722e-8,
2550 1.067e-7, 1.153e-7, 1.347e-7, 1.428e-7, 1.577e-7, 1.694e-7,
2551 1.833e-7, 1.938e-7, 2.108e-7, 2.059e-7, 2.157e-7, 2.185e-7,
2552 2.208e-7, 2.182e-7, 2.093e-7, 2.014e-7, 1.962e-7, 1.819e-7,
2553 1.713e-7, 1.51e-7, 1.34e-7, 1.154e-7, 9.89e-8, 8.88e-8, 7.673e-8,
2554 6.599e-8, 5.73e-8, 5.081e-8, 4.567e-8, 4.147e-8, 3.773e-8,
2555 3.46e-8, 3.194e-8, 2.953e-8, 2.759e-8, 2.594e-8, 2.442e-8,
2556 2.355e-8, 2.283e-8, 2.279e-8, 2.231e-8, 2.279e-8, 2.239e-8,
2557 2.21e-8, 2.309e-8, 2.293e-8, 2.352e-8, 2.415e-8, 2.43e-8,
2558 2.426e-8, 2.465e-8, 2.5e-8, 2.496e-8, 2.465e-8, 2.445e-8,
2559 2.383e-8, 2.299e-8, 2.165e-8, 2.113e-8, 1.968e-8, 1.819e-8,
2560 1.644e-8, 1.427e-8, 1.27e-8, 1.082e-8, 9.428e-9, 8.091e-9,
2561 6.958e-9, 5.988e-9, 5.246e-9, 4.601e-9, 4.098e-9, 3.664e-9,
2562 3.287e-9, 2.942e-9, 2.656e-9, 2.364e-9, 2.118e-9, 1.903e-9,
2563 1.703e-9, 1.525e-9, 1.365e-9, 1.229e-9, 1.107e-9, 9.96e-10,
2564 8.945e-10, 8.08e-10, 7.308e-10, 6.616e-10, 5.994e-10, 5.422e-10,
2565 4.929e-10, 4.478e-10, 4.07e-10, 3.707e-10, 3.379e-10, 3.087e-10,
2566 2.823e-10, 2.592e-10, 2.385e-10, 2.201e-10, 2.038e-10, 1.897e-10,
2567 1.774e-10, 1.667e-10, 1.577e-10, 1.502e-10, 1.437e-10, 1.394e-10,
2568 1.358e-10, 1.324e-10, 1.329e-10, 1.324e-10, 1.36e-10, 1.39e-10,
2569 1.424e-10, 1.544e-10, 1.651e-10, 1.817e-10, 1.984e-10, 2.195e-10,
2570 2.438e-10, 2.7e-10, 2.991e-10, 3.322e-10, 3.632e-10, 3.957e-10,
2571 4.36e-10, 4.701e-10, 5.03e-10, 5.381e-10, 5.793e-10, 6.19e-10,
2572 6.596e-10, 7.004e-10, 7.561e-10, 7.934e-10, 8.552e-10, 9.142e-10,
2573 9.57e-10, 1.027e-9, 1.097e-9, 1.193e-9, 1.334e-9, 1.47e-9,
2574 1.636e-9, 1.871e-9, 2.122e-9, 2.519e-9, 2.806e-9, 3.203e-9,
2575 3.846e-9, 4.362e-9, 5.114e-9, 5.643e-9, 6.305e-9, 6.981e-9,
2576 7.983e-9, 8.783e-9, 9.419e-9, 1.017e-8, 1.063e-8, 1.121e-8,
2577 1.13e-8, 1.201e-8, 1.225e-8, 1.232e-8, 1.223e-8, 1.177e-8,
2578 1.151e-8, 1.116e-8, 1.047e-8, 9.698e-9, 8.734e-9, 8.202e-9,
2579 7.041e-9, 6.074e-9, 5.172e-9, 4.468e-9, 3.913e-9, 3.414e-9,
2580 2.975e-9, 2.65e-9, 2.406e-9, 2.173e-9, 2.009e-9, 1.861e-9,
2581 1.727e-9, 1.612e-9, 1.514e-9, 1.43e-9, 1.362e-9, 1.333e-9,
2582 1.288e-9, 1.249e-9, 1.238e-9, 1.228e-9, 1.217e-9, 1.202e-9,
2583 1.209e-9, 1.177e-9, 1.157e-9, 1.165e-9, 1.142e-9, 1.131e-9,
2584 1.138e-9, 1.117e-9, 1.1e-9, 1.069e-9, 1.023e-9, 1.005e-9,
2585 9.159e-10, 8.863e-10, 7.865e-10, 7.153e-10, 6.247e-10, 5.846e-10,
2586 5.133e-10, 4.36e-10, 3.789e-10, 3.335e-10, 2.833e-10, 2.483e-10,
2587 2.155e-10, 1.918e-10, 1.709e-10, 1.529e-10, 1.374e-10, 1.235e-10,
2588 1.108e-10, 9.933e-11, 8.932e-11, 8.022e-11, 7.224e-11, 6.52e-11,
2589 5.896e-11, 5.328e-11, 4.813e-11, 4.365e-11, 3.961e-11, 3.594e-11,
2590 3.266e-11, 2.967e-11, 2.701e-11, 2.464e-11, 2.248e-11, 2.054e-11,
2591 1.878e-11, 1.721e-11, 1.579e-11, 1.453e-11, 1.341e-11, 1.241e-11,
2592 1.154e-11, 1.078e-11, 1.014e-11, 9.601e-12, 9.167e-12, 8.838e-12,
2593 8.614e-12, 8.493e-12, 8.481e-12, 8.581e-12, 8.795e-12, 9.131e-12,
2594 9.601e-12, 1.021e-11, 1.097e-11, 1.191e-11, 1.303e-11, 1.439e-11,
2595 1.601e-11, 1.778e-11, 1.984e-11, 2.234e-11, 2.474e-11, 2.766e-11,
2596 3.085e-11, 3.415e-11, 3.821e-11, 4.261e-11, 4.748e-11, 5.323e-11,
2597 5.935e-11, 6.619e-11, 7.418e-11, 8.294e-11, 9.26e-11, 1.039e-10,
2598 1.156e-10, 1.297e-10, 1.46e-10, 1.641e-10, 1.858e-10, 2.1e-10,
2599 2.383e-10, 2.724e-10, 3.116e-10, 3.538e-10, 4.173e-10, 4.727e-10,
2600 5.503e-10, 6.337e-10, 7.32e-10, 8.298e-10, 9.328e-10, 1.059e-9,
2601 1.176e-9, 1.328e-9, 1.445e-9, 1.593e-9, 1.77e-9, 1.954e-9,
2602 2.175e-9, 2.405e-9, 2.622e-9, 2.906e-9, 3.294e-9, 3.713e-9,
2603 3.98e-9, 4.384e-9, 4.987e-9, 5.311e-9, 5.874e-9, 6.337e-9,
2604 7.027e-9, 7.39e-9, 7.769e-9, 8.374e-9, 8.605e-9, 9.165e-9,
2605 9.415e-9, 9.511e-9, 9.704e-9, 9.588e-9, 9.45e-9, 9.086e-9,
2606 8.798e-9, 8.469e-9, 7.697e-9, 7.168e-9, 6.255e-9, 5.772e-9,
2607 4.97e-9, 4.271e-9, 3.653e-9, 3.154e-9, 2.742e-9, 2.435e-9,
2608 2.166e-9, 1.936e-9, 1.731e-9, 1.556e-9, 1.399e-9, 1.272e-9,
2609 1.157e-9, 1.066e-9, 9.844e-10, 9.258e-10, 8.787e-10, 8.421e-10,
2610 8.083e-10, 8.046e-10, 8.067e-10, 8.181e-10, 8.325e-10, 8.517e-10,
2611 9.151e-10, 9.351e-10, 9.677e-10, 1.071e-9, 1.126e-9, 1.219e-9,
2612 1.297e-9, 1.408e-9, 1.476e-9, 1.517e-9, 1.6e-9, 1.649e-9,
2613 1.678e-9, 1.746e-9, 1.742e-9, 1.728e-9, 1.699e-9, 1.655e-9,
2614 1.561e-9, 1.48e-9, 1.451e-9, 1.411e-9, 1.171e-9, 1.106e-9,
2615 9.714e-10, 8.523e-10, 7.346e-10, 6.241e-10, 5.371e-10, 4.704e-10,
2616 4.144e-10, 3.683e-10, 3.292e-10, 2.942e-10, 2.62e-10, 2.341e-10,
2617 2.104e-10, 1.884e-10, 1.7e-10, 1.546e-10, 1.394e-10, 1.265e-10,
2618 1.14e-10, 1.019e-10, 9.279e-11, 8.283e-11, 7.458e-11, 6.668e-11,
2619 5.976e-11, 5.33e-11, 4.794e-11, 4.289e-11, 3.841e-11, 3.467e-11,
2620 3.13e-11, 2.832e-11, 2.582e-11, 2.356e-11, 2.152e-11, 1.97e-11,
2621 1.808e-11, 1.664e-11, 1.539e-11, 1.434e-11, 1.344e-11, 1.269e-11,
2622 1.209e-11, 1.162e-11, 1.129e-11, 1.108e-11, 1.099e-11, 1.103e-11,
2623 1.119e-11, 1.148e-11, 1.193e-11, 1.252e-11, 1.329e-11, 1.421e-11,
2624 1.555e-11, 1.685e-11, 1.839e-11, 2.054e-11, 2.317e-11, 2.571e-11,
2625 2.839e-11, 3.171e-11, 3.49e-11, 3.886e-11, 4.287e-11, 4.645e-11,
2626 5.047e-11, 5.592e-11, 6.109e-11, 6.628e-11, 7.381e-11, 8.088e-11,
2627 8.966e-11, 1.045e-10, 1.12e-10, 1.287e-10, 1.486e-10, 1.662e-10,
2628 1.866e-10, 2.133e-10, 2.524e-10, 2.776e-10, 3.204e-10, 3.559e-10,
2629 4.028e-10, 4.448e-10, 4.882e-10, 5.244e-10, 5.605e-10, 6.018e-10,
2630 6.328e-10, 6.579e-10, 6.541e-10, 7.024e-10, 7.074e-10, 7.068e-10,
2631 7.009e-10, 6.698e-10, 6.545e-10, 6.209e-10, 5.834e-10, 5.412e-10,
2632 5.001e-10, 4.231e-10, 3.727e-10, 3.211e-10, 2.833e-10, 2.447e-10,
2633 2.097e-10, 1.843e-10, 1.639e-10, 1.449e-10, 1.27e-10, 1.161e-10,
2634 1.033e-10, 9.282e-11, 8.407e-11, 7.639e-11, 7.023e-11, 6.474e-11,
2635 6.142e-11, 5.76e-11, 5.568e-11, 5.472e-11, 5.39e-11, 5.455e-11,
2636 5.54e-11, 5.587e-11, 6.23e-11, 6.49e-11, 6.868e-11, 7.382e-11,
2637 8.022e-11, 8.372e-11, 9.243e-11, 1.004e-10, 1.062e-10, 1.13e-10,
2638 1.176e-10, 1.244e-10, 1.279e-10, 1.298e-10, 1.302e-10, 1.312e-10,
2639 1.295e-10, 1.244e-10, 1.211e-10, 1.167e-10, 1.098e-10, 9.927e-11,
2640 8.854e-11, 8.011e-11, 7.182e-11, 5.923e-11, 5.212e-11, 4.453e-11,
2641 3.832e-11, 3.371e-11, 2.987e-11, 2.651e-11, 2.354e-11, 2.093e-11,
2642 1.863e-11, 1.662e-11, 1.486e-11, 1.331e-11, 1.193e-11, 1.071e-11,
2643 9.628e-12, 8.66e-12, 7.801e-12, 7.031e-12, 6.347e-12, 5.733e-12,
2644 5.182e-12, 4.695e-12, 4.26e-12, 3.874e-12, 3.533e-12, 3.235e-12,
2645 2.979e-12, 2.76e-12, 2.579e-12, 2.432e-12, 2.321e-12, 2.246e-12,
2646 2.205e-12, 2.196e-12, 2.223e-12, 2.288e-12, 2.387e-12, 2.525e-12,
2647 2.704e-12, 2.925e-12, 3.191e-12, 3.508e-12, 3.876e-12, 4.303e-12,
2648 4.793e-12, 5.347e-12, 5.978e-12, 6.682e-12, 7.467e-12, 8.34e-12,
2649 9.293e-12, 1.035e-11, 1.152e-11, 1.285e-11, 1.428e-11, 1.586e-11,
2650 1.764e-11, 1.972e-11, 2.214e-11, 2.478e-11, 2.776e-11, 3.151e-11,
2651 3.591e-11, 4.103e-11, 4.66e-11, 5.395e-11, 6.306e-11, 7.172e-11,
2652 8.358e-11, 9.67e-11, 1.11e-10, 1.325e-10, 1.494e-10, 1.736e-10,
2653 2.007e-10, 2.296e-10, 2.608e-10, 3.004e-10, 3.361e-10, 3.727e-10,
2654 4.373e-10, 4.838e-10, 5.483e-10, 6.006e-10, 6.535e-10, 6.899e-10,
2655 7.687e-10, 8.444e-10, 8.798e-10, 9.135e-10, 9.532e-10, 9.757e-10,
2656 9.968e-10, 1.006e-9, 9.949e-10, 9.789e-10, 9.564e-10, 9.215e-10,
2657 8.51e-10, 8.394e-10, 7.707e-10, 7.152e-10, 6.274e-10, 5.598e-10,
2658 5.028e-10, 4.3e-10, 3.71e-10, 3.245e-10, 2.809e-10, 2.461e-10,
2659 2.154e-10, 1.91e-10, 1.685e-10, 1.487e-10, 1.313e-10, 1.163e-10,
2660 1.031e-10, 9.172e-11, 8.221e-11, 7.382e-11, 6.693e-11, 6.079e-11,
2661 5.581e-11, 5.167e-11, 4.811e-11, 4.506e-11, 4.255e-11, 4.083e-11,
2662 3.949e-11, 3.881e-11, 3.861e-11, 3.858e-11, 3.951e-11, 4.045e-11,
2663 4.24e-11, 4.487e-11, 4.806e-11, 5.133e-11, 5.518e-11, 5.919e-11,
2664 6.533e-11, 7.031e-11, 7.762e-11, 8.305e-11, 9.252e-11, 9.727e-11,
2665 1.045e-10, 1.117e-10, 1.2e-10, 1.275e-10, 1.341e-10, 1.362e-10,
2666 1.438e-10, 1.45e-10, 1.455e-10, 1.455e-10, 1.434e-10, 1.381e-10,
2667 1.301e-10, 1.276e-10, 1.163e-10, 1.089e-10, 9.911e-11, 8.943e-11,
2668 7.618e-11, 6.424e-11, 5.717e-11, 4.866e-11, 4.257e-11, 3.773e-11,
2669 3.331e-11, 2.958e-11, 2.629e-11, 2.316e-11, 2.073e-11, 1.841e-11,
2670 1.635e-11, 1.464e-11, 1.31e-11, 1.16e-11, 1.047e-11, 9.408e-12,
2671 8.414e-12, 7.521e-12, 6.705e-12, 5.993e-12, 5.371e-12, 4.815e-12,
2672 4.338e-12, 3.921e-12, 3.567e-12, 3.265e-12, 3.01e-12, 2.795e-12,
2673 2.613e-12, 2.464e-12, 2.346e-12, 2.256e-12, 2.195e-12, 2.165e-12,
2674 2.166e-12, 2.198e-12, 2.262e-12, 2.364e-12, 2.502e-12, 2.682e-12,
2675 2.908e-12, 3.187e-12, 3.533e-12, 3.946e-12, 4.418e-12, 5.013e-12,
2676 5.708e-12, 6.379e-12, 7.43e-12, 8.39e-12, 9.51e-12, 1.078e-11,
2677 1.259e-11, 1.438e-11, 1.63e-11, 1.814e-11, 2.055e-11, 2.348e-11,
2678 2.664e-11, 2.956e-11, 3.3e-11, 3.677e-11, 4.032e-11, 4.494e-11,
2679 4.951e-11, 5.452e-11, 6.014e-11, 6.5e-11, 6.915e-11, 7.45e-11,
2680 7.971e-11, 8.468e-11, 8.726e-11, 8.995e-11, 9.182e-11, 9.509e-11,
2681 9.333e-11, 9.386e-11, 9.457e-11, 9.21e-11, 9.019e-11, 8.68e-11,
2682 8.298e-11, 7.947e-11, 7.46e-11, 7.082e-11, 6.132e-11, 5.855e-11,
2683 5.073e-11, 4.464e-11, 3.825e-11, 3.375e-11, 2.911e-11, 2.535e-11,
2684 2.16e-11, 1.907e-11, 1.665e-11, 1.463e-11, 1.291e-11, 1.133e-11,
2685 9.997e-12, 8.836e-12, 7.839e-12, 6.943e-12, 6.254e-12, 5.6e-12,
2686 5.029e-12, 4.529e-12, 4.102e-12, 3.737e-12, 3.428e-12, 3.169e-12,
2687 2.959e-12, 2.798e-12, 2.675e-12, 2.582e-12, 2.644e-12, 2.557e-12,
2688 2.614e-12, 2.717e-12, 2.874e-12, 3.056e-12, 3.187e-12, 3.631e-12,
2689 3.979e-12, 4.248e-12, 4.817e-12, 5.266e-12, 5.836e-12, 6.365e-12,
2690 6.807e-12, 7.47e-12, 7.951e-12, 8.636e-12, 8.972e-12, 9.314e-12,
2691 9.445e-12, 1.003e-11, 1.013e-11, 9.937e-12, 9.729e-12, 9.064e-12,
2692 9.119e-12, 9.124e-12, 8.704e-12, 8.078e-12, 7.47e-12, 6.329e-12,
2693 5.674e-12, 4.808e-12, 4.119e-12, 3.554e-12, 3.103e-12, 2.731e-12,
2694 2.415e-12, 2.15e-12, 1.926e-12, 1.737e-12, 1.578e-12, 1.447e-12,
2695 1.34e-12, 1.255e-12, 1.191e-12, 1.146e-12, 1.121e-12, 1.114e-12,
2696 1.126e-12, 1.156e-12, 1.207e-12, 1.278e-12, 1.372e-12, 1.49e-12,
2697 1.633e-12, 1.805e-12, 2.01e-12, 2.249e-12, 2.528e-12, 2.852e-12,
2698 3.228e-12, 3.658e-12, 4.153e-12, 4.728e-12, 5.394e-12, 6.176e-12,
2699 7.126e-12, 8.188e-12, 9.328e-12, 1.103e-11, 1.276e-11, 1.417e-11,
2700 1.615e-11, 1.84e-11, 2.155e-11, 2.429e-11, 2.826e-11, 3.222e-11,
2701 3.664e-11, 4.14e-11, 4.906e-11, 5.536e-11, 6.327e-11, 7.088e-11,
2702 8.316e-11, 9.242e-11, 1.07e-10, 1.223e-10, 1.341e-10, 1.553e-10,
2703 1.703e-10, 1.9e-10, 2.022e-10, 2.233e-10, 2.345e-10, 2.438e-10,
2704 2.546e-10, 2.599e-10, 2.661e-10, 2.703e-10, 2.686e-10, 2.662e-10,
2705 2.56e-10, 2.552e-10, 2.378e-10, 2.252e-10, 2.146e-10, 1.885e-10,
2706 1.668e-10, 1.441e-10, 1.295e-10, 1.119e-10, 9.893e-11, 8.687e-11,
2707 7.678e-11, 6.685e-11, 5.879e-11, 5.127e-11, 4.505e-11, 3.997e-11,
2708 3.511e-11
2709 };
2710
2711 static const double h2ofrn[2001] = { .01095, .01126, .01205, .01322, .0143,
2712 .01506, .01548, .01534, .01486, .01373, .01262, .01134, .01001,
2713 .008702, .007475, .006481, .00548, .0046, .003833, .00311,
2714 .002543, .002049, .00168, .001374, .001046, 8.193e-4, 6.267e-4,
2715 4.968e-4, 3.924e-4, 2.983e-4, 2.477e-4, 1.997e-4, 1.596e-4,
2716 1.331e-4, 1.061e-4, 8.942e-5, 7.168e-5, 5.887e-5, 4.848e-5,
2717 3.817e-5, 3.17e-5, 2.579e-5, 2.162e-5, 1.768e-5, 1.49e-5,
2718 1.231e-5, 1.013e-5, 8.555e-6, 7.328e-6, 6.148e-6, 5.207e-6,
2719 4.387e-6, 3.741e-6, 3.22e-6, 2.753e-6, 2.346e-6, 1.985e-6,
2720 1.716e-6, 1.475e-6, 1.286e-6, 1.122e-6, 9.661e-7, 8.284e-7,
2721 7.057e-7, 6.119e-7, 5.29e-7, 4.571e-7, 3.948e-7, 3.432e-7,
2722 2.983e-7, 2.589e-7, 2.265e-7, 1.976e-7, 1.704e-7, 1.456e-7,
2723 1.26e-7, 1.101e-7, 9.648e-8, 8.415e-8, 7.34e-8, 6.441e-8,
2724 5.643e-8, 4.94e-8, 4.276e-8, 3.703e-8, 3.227e-8, 2.825e-8,
2725 2.478e-8, 2.174e-8, 1.898e-8, 1.664e-8, 1.458e-8, 1.278e-8,
2726 1.126e-8, 9.891e-9, 8.709e-9, 7.652e-9, 6.759e-9, 5.975e-9,
2727 5.31e-9, 4.728e-9, 4.214e-9, 3.792e-9, 3.463e-9, 3.226e-9,
2728 2.992e-9, 2.813e-9, 2.749e-9, 2.809e-9, 2.913e-9, 3.037e-9,
2729 3.413e-9, 3.738e-9, 4.189e-9, 4.808e-9, 5.978e-9, 7.088e-9,
2730 8.071e-9, 9.61e-9, 1.21e-8, 1.5e-8, 1.764e-8, 2.221e-8, 2.898e-8,
2731 3.948e-8, 5.068e-8, 6.227e-8, 7.898e-8, 1.033e-7, 1.437e-7,
2732 1.889e-7, 2.589e-7, 3.59e-7, 4.971e-7, 7.156e-7, 9.983e-7,
2733 1.381e-6, 1.929e-6, 2.591e-6, 3.453e-6, 4.57e-6, 5.93e-6,
2734 7.552e-6, 9.556e-6, 1.183e-5, 1.425e-5, 1.681e-5, 1.978e-5,
2735 2.335e-5, 2.668e-5, 3.022e-5, 3.371e-5, 3.715e-5, 3.967e-5,
2736 4.06e-5, 4.01e-5, 3.809e-5, 3.491e-5, 3.155e-5, 2.848e-5,
2737 2.678e-5, 2.66e-5, 2.811e-5, 3.071e-5, 3.294e-5, 3.459e-5,
2738 3.569e-5, 3.56e-5, 3.434e-5, 3.186e-5, 2.916e-5, 2.622e-5,
2739 2.275e-5, 1.918e-5, 1.62e-5, 1.373e-5, 1.182e-5, 1.006e-5,
2740 8.556e-6, 7.26e-6, 6.107e-6, 5.034e-6, 4.211e-6, 3.426e-6,
2741 2.865e-6, 2.446e-6, 1.998e-6, 1.628e-6, 1.242e-6, 1.005e-6,
2742 7.853e-7, 6.21e-7, 5.071e-7, 4.156e-7, 3.548e-7, 2.825e-7,
2743 2.261e-7, 1.916e-7, 1.51e-7, 1.279e-7, 1.059e-7, 9.14e-8,
2744 7.707e-8, 6.17e-8, 5.311e-8, 4.263e-8, 3.518e-8, 2.961e-8,
2745 2.457e-8, 2.119e-8, 1.712e-8, 1.439e-8, 1.201e-8, 1.003e-8,
2746 8.564e-9, 7.199e-9, 6.184e-9, 5.206e-9, 4.376e-9, 3.708e-9,
2747 3.157e-9, 2.725e-9, 2.361e-9, 2.074e-9, 1.797e-9, 1.562e-9,
2748 1.364e-9, 1.196e-9, 1.042e-9, 8.862e-10, 7.648e-10, 6.544e-10,
2749 5.609e-10, 4.791e-10, 4.108e-10, 3.531e-10, 3.038e-10, 2.618e-10,
2750 2.268e-10, 1.969e-10, 1.715e-10, 1.496e-10, 1.308e-10, 1.147e-10,
2751 1.008e-10, 8.894e-11, 7.885e-11, 7.031e-11, 6.355e-11, 5.854e-11,
2752 5.534e-11, 5.466e-11, 5.725e-11, 6.447e-11, 7.943e-11, 1.038e-10,
2753 1.437e-10, 2.04e-10, 2.901e-10, 4.051e-10, 5.556e-10, 7.314e-10,
2754 9.291e-10, 1.134e-9, 1.321e-9, 1.482e-9, 1.596e-9, 1.669e-9,
2755 1.715e-9, 1.762e-9, 1.817e-9, 1.828e-9, 1.848e-9, 1.873e-9,
2756 1.902e-9, 1.894e-9, 1.864e-9, 1.841e-9, 1.797e-9, 1.704e-9,
2757 1.559e-9, 1.382e-9, 1.187e-9, 1.001e-9, 8.468e-10, 7.265e-10,
2758 6.521e-10, 6.381e-10, 6.66e-10, 7.637e-10, 9.705e-10, 1.368e-9,
2759 1.856e-9, 2.656e-9, 3.954e-9, 5.96e-9, 8.72e-9, 1.247e-8,
2760 1.781e-8, 2.491e-8, 3.311e-8, 4.272e-8, 5.205e-8, 6.268e-8,
2761 7.337e-8, 8.277e-8, 9.185e-8, 1.004e-7, 1.091e-7, 1.159e-7,
2762 1.188e-7, 1.175e-7, 1.124e-7, 1.033e-7, 9.381e-8, 8.501e-8,
2763 7.956e-8, 7.894e-8, 8.331e-8, 9.102e-8, 9.836e-8, 1.035e-7,
2764 1.064e-7, 1.06e-7, 1.032e-7, 9.808e-8, 9.139e-8, 8.442e-8,
2765 7.641e-8, 6.881e-8, 6.161e-8, 5.404e-8, 4.804e-8, 4.446e-8,
2766 4.328e-8, 4.259e-8, 4.421e-8, 4.673e-8, 4.985e-8, 5.335e-8,
2767 5.796e-8, 6.542e-8, 7.714e-8, 8.827e-8, 1.04e-7, 1.238e-7,
2768 1.499e-7, 1.829e-7, 2.222e-7, 2.689e-7, 3.303e-7, 3.981e-7,
2769 4.84e-7, 5.91e-7, 7.363e-7, 9.087e-7, 1.139e-6, 1.455e-6,
2770 1.866e-6, 2.44e-6, 3.115e-6, 3.941e-6, 4.891e-6, 5.992e-6,
2771 7.111e-6, 8.296e-6, 9.21e-6, 9.987e-6, 1.044e-5, 1.073e-5,
2772 1.092e-5, 1.106e-5, 1.138e-5, 1.171e-5, 1.186e-5, 1.186e-5,
2773 1.179e-5, 1.166e-5, 1.151e-5, 1.16e-5, 1.197e-5, 1.241e-5,
2774 1.268e-5, 1.26e-5, 1.184e-5, 1.063e-5, 9.204e-6, 7.584e-6,
2775 6.053e-6, 4.482e-6, 3.252e-6, 2.337e-6, 1.662e-6, 1.18e-6,
2776 8.15e-7, 5.95e-7, 4.354e-7, 3.302e-7, 2.494e-7, 1.93e-7,
2777 1.545e-7, 1.25e-7, 1.039e-7, 8.602e-8, 7.127e-8, 5.897e-8,
2778 4.838e-8, 4.018e-8, 3.28e-8, 2.72e-8, 2.307e-8, 1.972e-8,
2779 1.654e-8, 1.421e-8, 1.174e-8, 1.004e-8, 8.739e-9, 7.358e-9,
2780 6.242e-9, 5.303e-9, 4.567e-9, 3.94e-9, 3.375e-9, 2.864e-9,
2781 2.422e-9, 2.057e-9, 1.75e-9, 1.505e-9, 1.294e-9, 1.101e-9,
2782 9.401e-10, 8.018e-10, 6.903e-10, 5.965e-10, 5.087e-10, 4.364e-10,
2783 3.759e-10, 3.247e-10, 2.809e-10, 2.438e-10, 2.123e-10, 1.853e-10,
2784 1.622e-10, 1.426e-10, 1.26e-10, 1.125e-10, 1.022e-10, 9.582e-11,
2785 9.388e-11, 9.801e-11, 1.08e-10, 1.276e-10, 1.551e-10, 1.903e-10,
2786 2.291e-10, 2.724e-10, 3.117e-10, 3.4e-10, 3.562e-10, 3.625e-10,
2787 3.619e-10, 3.429e-10, 3.221e-10, 2.943e-10, 2.645e-10, 2.338e-10,
2788 2.062e-10, 1.901e-10, 1.814e-10, 1.827e-10, 1.906e-10, 1.984e-10,
2789 2.04e-10, 2.068e-10, 2.075e-10, 2.018e-10, 1.959e-10, 1.897e-10,
2790 1.852e-10, 1.791e-10, 1.696e-10, 1.634e-10, 1.598e-10, 1.561e-10,
2791 1.518e-10, 1.443e-10, 1.377e-10, 1.346e-10, 1.342e-10, 1.375e-10,
2792 1.525e-10, 1.767e-10, 2.108e-10, 2.524e-10, 2.981e-10, 3.477e-10,
2793 4.262e-10, 5.326e-10, 6.646e-10, 8.321e-10, 1.069e-9, 1.386e-9,
2794 1.743e-9, 2.216e-9, 2.808e-9, 3.585e-9, 4.552e-9, 5.907e-9,
2795 7.611e-9, 9.774e-9, 1.255e-8, 1.666e-8, 2.279e-8, 3.221e-8,
2796 4.531e-8, 6.4e-8, 9.187e-8, 1.295e-7, 1.825e-7, 2.431e-7,
2797 3.181e-7, 4.009e-7, 4.941e-7, 5.88e-7, 6.623e-7, 7.155e-7,
2798 7.451e-7, 7.594e-7, 7.541e-7, 7.467e-7, 7.527e-7, 7.935e-7,
2799 8.461e-7, 8.954e-7, 9.364e-7, 9.843e-7, 1.024e-6, 1.05e-6,
2800 1.059e-6, 1.074e-6, 1.072e-6, 1.043e-6, 9.789e-7, 8.803e-7,
2801 7.662e-7, 6.378e-7, 5.133e-7, 3.958e-7, 2.914e-7, 2.144e-7,
2802 1.57e-7, 1.14e-7, 8.47e-8, 6.2e-8, 4.657e-8, 3.559e-8, 2.813e-8,
2803 2.222e-8, 1.769e-8, 1.391e-8, 1.125e-8, 9.186e-9, 7.704e-9,
2804 6.447e-9, 5.381e-9, 4.442e-9, 3.669e-9, 3.057e-9, 2.564e-9,
2805 2.153e-9, 1.784e-9, 1.499e-9, 1.281e-9, 1.082e-9, 9.304e-10,
2806 8.169e-10, 6.856e-10, 5.866e-10, 5.043e-10, 4.336e-10, 3.731e-10,
2807 3.175e-10, 2.745e-10, 2.374e-10, 2.007e-10, 1.737e-10, 1.508e-10,
2808 1.302e-10, 1.13e-10, 9.672e-11, 8.375e-11, 7.265e-11, 6.244e-11,
2809 5.343e-11, 4.654e-11, 3.975e-11, 3.488e-11, 3.097e-11, 2.834e-11,
2810 2.649e-11, 2.519e-11, 2.462e-11, 2.443e-11, 2.44e-11, 2.398e-11,
2811 2.306e-11, 2.183e-11, 2.021e-11, 1.821e-11, 1.599e-11, 1.403e-11,
2812 1.196e-11, 1.023e-11, 8.728e-12, 7.606e-12, 6.941e-12, 6.545e-12,
2813 6.484e-12, 6.6e-12, 6.718e-12, 6.785e-12, 6.746e-12, 6.724e-12,
2814 6.764e-12, 6.995e-12, 7.144e-12, 7.32e-12, 7.33e-12, 7.208e-12,
2815 6.789e-12, 6.09e-12, 5.337e-12, 4.62e-12, 4.037e-12, 3.574e-12,
2816 3.311e-12, 3.346e-12, 3.566e-12, 3.836e-12, 4.076e-12, 4.351e-12,
2817 4.691e-12, 5.114e-12, 5.427e-12, 6.167e-12, 7.436e-12, 8.842e-12,
2818 1.038e-11, 1.249e-11, 1.54e-11, 1.915e-11, 2.48e-11, 3.256e-11,
2819 4.339e-11, 5.611e-11, 7.519e-11, 1.037e-10, 1.409e-10, 1.883e-10,
2820 2.503e-10, 3.38e-10, 4.468e-10, 5.801e-10, 7.335e-10, 8.98e-10,
2821 1.11e-9, 1.363e-9, 1.677e-9, 2.104e-9, 2.681e-9, 3.531e-9,
2822 4.621e-9, 6.106e-9, 8.154e-9, 1.046e-8, 1.312e-8, 1.607e-8,
2823 1.948e-8, 2.266e-8, 2.495e-8, 2.655e-8, 2.739e-8, 2.739e-8,
2824 2.662e-8, 2.589e-8, 2.59e-8, 2.664e-8, 2.833e-8, 3.023e-8,
2825 3.305e-8, 3.558e-8, 3.793e-8, 3.961e-8, 4.056e-8, 4.102e-8,
2826 4.025e-8, 3.917e-8, 3.706e-8, 3.493e-8, 3.249e-8, 3.096e-8,
2827 3.011e-8, 3.111e-8, 3.395e-8, 3.958e-8, 4.875e-8, 6.066e-8,
2828 7.915e-8, 1.011e-7, 1.3e-7, 1.622e-7, 2.003e-7, 2.448e-7,
2829 2.863e-7, 3.317e-7, 3.655e-7, 3.96e-7, 4.098e-7, 4.168e-7,
2830 4.198e-7, 4.207e-7, 4.289e-7, 4.384e-7, 4.471e-7, 4.524e-7,
2831 4.574e-7, 4.633e-7, 4.785e-7, 5.028e-7, 5.371e-7, 5.727e-7,
2832 5.955e-7, 5.998e-7, 5.669e-7, 5.082e-7, 4.397e-7, 3.596e-7,
2833 2.814e-7, 2.074e-7, 1.486e-7, 1.057e-7, 7.25e-8, 4.946e-8,
2834 3.43e-8, 2.447e-8, 1.793e-8, 1.375e-8, 1.096e-8, 9.091e-9,
2835 7.709e-9, 6.631e-9, 5.714e-9, 4.886e-9, 4.205e-9, 3.575e-9,
2836 3.07e-9, 2.631e-9, 2.284e-9, 2.002e-9, 1.745e-9, 1.509e-9,
2837 1.284e-9, 1.084e-9, 9.163e-10, 7.663e-10, 6.346e-10, 5.283e-10,
2838 4.354e-10, 3.59e-10, 2.982e-10, 2.455e-10, 2.033e-10, 1.696e-10,
2839 1.432e-10, 1.211e-10, 1.02e-10, 8.702e-11, 7.38e-11, 6.293e-11,
2840 5.343e-11, 4.532e-11, 3.907e-11, 3.365e-11, 2.945e-11, 2.558e-11,
2841 2.192e-11, 1.895e-11, 1.636e-11, 1.42e-11, 1.228e-11, 1.063e-11,
2842 9.348e-12, 8.2e-12, 7.231e-12, 6.43e-12, 5.702e-12, 5.052e-12,
2843 4.469e-12, 4e-12, 3.679e-12, 3.387e-12, 3.197e-12, 3.158e-12,
2844 3.327e-12, 3.675e-12, 4.292e-12, 5.437e-12, 7.197e-12, 1.008e-11,
2845 1.437e-11, 2.035e-11, 2.905e-11, 4.062e-11, 5.528e-11, 7.177e-11,
2846 9.064e-11, 1.109e-10, 1.297e-10, 1.473e-10, 1.652e-10, 1.851e-10,
2847 2.079e-10, 2.313e-10, 2.619e-10, 2.958e-10, 3.352e-10, 3.796e-10,
2848 4.295e-10, 4.923e-10, 5.49e-10, 5.998e-10, 6.388e-10, 6.645e-10,
2849 6.712e-10, 6.549e-10, 6.38e-10, 6.255e-10, 6.253e-10, 6.459e-10,
2850 6.977e-10, 7.59e-10, 8.242e-10, 8.92e-10, 9.403e-10, 9.701e-10,
2851 9.483e-10, 9.135e-10, 8.617e-10, 7.921e-10, 7.168e-10, 6.382e-10,
2852 5.677e-10, 5.045e-10, 4.572e-10, 4.312e-10, 4.145e-10, 4.192e-10,
2853 4.541e-10, 5.368e-10, 6.771e-10, 8.962e-10, 1.21e-9, 1.659e-9,
2854 2.33e-9, 3.249e-9, 4.495e-9, 5.923e-9, 7.642e-9, 9.607e-9,
2855 1.178e-8, 1.399e-8, 1.584e-8, 1.73e-8, 1.816e-8, 1.87e-8,
2856 1.868e-8, 1.87e-8, 1.884e-8, 1.99e-8, 2.15e-8, 2.258e-8,
2857 2.364e-8, 2.473e-8, 2.602e-8, 2.689e-8, 2.731e-8, 2.816e-8,
2858 2.859e-8, 2.839e-8, 2.703e-8, 2.451e-8, 2.149e-8, 1.787e-8,
2859 1.449e-8, 1.111e-8, 8.282e-9, 6.121e-9, 4.494e-9, 3.367e-9,
2860 2.487e-9, 1.885e-9, 1.503e-9, 1.249e-9, 1.074e-9, 9.427e-10,
2861 8.439e-10, 7.563e-10, 6.772e-10, 6.002e-10, 5.254e-10, 4.588e-10,
2862 3.977e-10, 3.449e-10, 3.003e-10, 2.624e-10, 2.335e-10, 2.04e-10,
2863 1.771e-10, 1.534e-10, 1.296e-10, 1.097e-10, 9.173e-11, 7.73e-11,
2864 6.547e-11, 5.191e-11, 4.198e-11, 3.361e-11, 2.732e-11, 2.244e-11,
2865 1.791e-11, 1.509e-11, 1.243e-11, 1.035e-11, 8.969e-12, 7.394e-12,
2866 6.323e-12, 5.282e-12, 4.543e-12, 3.752e-12, 3.14e-12, 2.6e-12,
2867 2.194e-12, 1.825e-12, 1.511e-12, 1.245e-12, 1.024e-12, 8.539e-13,
2868 7.227e-13, 6.102e-13, 5.189e-13, 4.43e-13, 3.774e-13, 3.236e-13,
2869 2.8e-13, 2.444e-13, 2.156e-13, 1.932e-13, 1.775e-13, 1.695e-13,
2870 1.672e-13, 1.704e-13, 1.825e-13, 2.087e-13, 2.614e-13, 3.377e-13,
2871 4.817e-13, 6.989e-13, 1.062e-12, 1.562e-12, 2.288e-12, 3.295e-12,
2872 4.55e-12, 5.965e-12, 7.546e-12, 9.395e-12, 1.103e-11, 1.228e-11,
2873 1.318e-11, 1.38e-11, 1.421e-11, 1.39e-11, 1.358e-11, 1.336e-11,
2874 1.342e-11, 1.356e-11, 1.424e-11, 1.552e-11, 1.73e-11, 1.951e-11,
2875 2.128e-11, 2.249e-11, 2.277e-11, 2.226e-11, 2.111e-11, 1.922e-11,
2876 1.775e-11, 1.661e-11, 1.547e-11, 1.446e-11, 1.323e-11, 1.21e-11,
2877 1.054e-11, 9.283e-12, 8.671e-12, 8.67e-12, 9.429e-12, 1.062e-11,
2878 1.255e-11, 1.506e-11, 1.818e-11, 2.26e-11, 2.831e-11, 3.723e-11,
2879 5.092e-11, 6.968e-11, 9.826e-11, 1.349e-10, 1.87e-10, 2.58e-10,
2880 3.43e-10, 4.424e-10, 5.521e-10, 6.812e-10, 8.064e-10, 9.109e-10,
2881 9.839e-10, 1.028e-9, 1.044e-9, 1.029e-9, 1.005e-9, 1.002e-9,
2882 1.038e-9, 1.122e-9, 1.233e-9, 1.372e-9, 1.524e-9, 1.665e-9,
2883 1.804e-9, 1.908e-9, 2.015e-9, 2.117e-9, 2.219e-9, 2.336e-9,
2884 2.531e-9, 2.805e-9, 3.189e-9, 3.617e-9, 4.208e-9, 4.911e-9,
2885 5.619e-9, 6.469e-9, 7.188e-9, 7.957e-9, 8.503e-9, 9.028e-9,
2886 9.571e-9, 9.99e-9, 1.055e-8, 1.102e-8, 1.132e-8, 1.141e-8,
2887 1.145e-8, 1.145e-8, 1.176e-8, 1.224e-8, 1.304e-8, 1.388e-8,
2888 1.445e-8, 1.453e-8, 1.368e-8, 1.22e-8, 1.042e-8, 8.404e-9,
2889 6.403e-9, 4.643e-9, 3.325e-9, 2.335e-9, 1.638e-9, 1.19e-9,
2890 9.161e-10, 7.412e-10, 6.226e-10, 5.516e-10, 5.068e-10, 4.831e-10,
2891 4.856e-10, 5.162e-10, 5.785e-10, 6.539e-10, 7.485e-10, 8.565e-10,
2892 9.534e-10, 1.052e-9, 1.115e-9, 1.173e-9, 1.203e-9, 1.224e-9,
2893 1.243e-9, 1.248e-9, 1.261e-9, 1.265e-9, 1.25e-9, 1.217e-9,
2894 1.176e-9, 1.145e-9, 1.153e-9, 1.199e-9, 1.278e-9, 1.366e-9,
2895 1.426e-9, 1.444e-9, 1.365e-9, 1.224e-9, 1.051e-9, 8.539e-10,
2896 6.564e-10, 4.751e-10, 3.404e-10, 2.377e-10, 1.631e-10, 1.114e-10,
2897 7.87e-11, 5.793e-11, 4.284e-11, 3.3e-11, 2.62e-11, 2.152e-11,
2898 1.777e-11, 1.496e-11, 1.242e-11, 1.037e-11, 8.725e-12, 7.004e-12,
2899 5.718e-12, 4.769e-12, 3.952e-12, 3.336e-12, 2.712e-12, 2.213e-12,
2900 1.803e-12, 1.492e-12, 1.236e-12, 1.006e-12, 8.384e-13, 7.063e-13,
2901 5.879e-13, 4.93e-13, 4.171e-13, 3.569e-13, 3.083e-13, 2.688e-13,
2902 2.333e-13, 2.035e-13, 1.82e-13, 1.682e-13, 1.635e-13, 1.674e-13,
2903 1.769e-13, 2.022e-13, 2.485e-13, 3.127e-13, 4.25e-13, 5.928e-13,
2904 8.514e-13, 1.236e-12, 1.701e-12, 2.392e-12, 3.231e-12, 4.35e-12,
2905 5.559e-12, 6.915e-12, 8.519e-12, 1.013e-11, 1.146e-11, 1.24e-11,
2906 1.305e-11, 1.333e-11, 1.318e-11, 1.263e-11, 1.238e-11, 1.244e-11,
2907 1.305e-11, 1.432e-11, 1.623e-11, 1.846e-11, 2.09e-11, 2.328e-11,
2908 2.526e-11, 2.637e-11, 2.702e-11, 2.794e-11, 2.889e-11, 2.989e-11,
2909 3.231e-11, 3.68e-11, 4.375e-11, 5.504e-11, 7.159e-11, 9.502e-11,
2910 1.279e-10, 1.645e-10, 2.098e-10, 2.618e-10, 3.189e-10, 3.79e-10,
2911 4.303e-10, 4.753e-10, 5.027e-10, 5.221e-10, 5.293e-10, 5.346e-10,
2912 5.467e-10, 5.796e-10, 6.2e-10, 6.454e-10, 6.705e-10, 6.925e-10,
2913 7.233e-10, 7.35e-10, 7.538e-10, 7.861e-10, 8.077e-10, 8.132e-10,
2914 7.749e-10, 7.036e-10, 6.143e-10, 5.093e-10, 4.089e-10, 3.092e-10,
2915 2.299e-10, 1.705e-10, 1.277e-10, 9.723e-11, 7.533e-11, 6.126e-11,
2916 5.154e-11, 4.428e-11, 3.913e-11, 3.521e-11, 3.297e-11, 3.275e-11,
2917 3.46e-11, 3.798e-11, 4.251e-11, 4.745e-11, 5.232e-11, 5.606e-11,
2918 5.82e-11, 5.88e-11, 5.79e-11, 5.661e-11, 5.491e-11, 5.366e-11,
2919 5.341e-11, 5.353e-11, 5.336e-11, 5.293e-11, 5.248e-11, 5.235e-11,
2920 5.208e-11, 5.322e-11, 5.521e-11, 5.725e-11, 5.827e-11, 5.685e-11,
2921 5.245e-11, 4.612e-11, 3.884e-11, 3.129e-11, 2.404e-11, 1.732e-11,
2922 1.223e-11, 8.574e-12, 5.888e-12, 3.986e-12, 2.732e-12, 1.948e-12,
2923 1.414e-12, 1.061e-12, 8.298e-13, 6.612e-13, 5.413e-13, 4.472e-13,
2924 3.772e-13, 3.181e-13, 2.645e-13, 2.171e-13, 1.778e-13, 1.464e-13,
2925 1.183e-13, 9.637e-14, 7.991e-14, 6.668e-14, 5.57e-14, 4.663e-14,
2926 3.848e-14, 3.233e-14, 2.706e-14, 2.284e-14, 1.944e-14, 1.664e-14,
2927 1.43e-14, 1.233e-14, 1.066e-14, 9.234e-15, 8.023e-15, 6.993e-15,
2928 6.119e-15, 5.384e-15, 4.774e-15, 4.283e-15, 3.916e-15, 3.695e-15,
2929 3.682e-15, 4.004e-15, 4.912e-15, 6.853e-15, 1.056e-14, 1.712e-14,
2930 2.804e-14, 4.516e-14, 7.113e-14, 1.084e-13, 1.426e-13, 1.734e-13,
2931 1.978e-13, 2.194e-13, 2.388e-13, 2.489e-13, 2.626e-13, 2.865e-13,
2932 3.105e-13, 3.387e-13, 3.652e-13, 3.984e-13, 4.398e-13, 4.906e-13,
2933 5.55e-13, 6.517e-13, 7.813e-13, 9.272e-13, 1.164e-12, 1.434e-12,
2934 1.849e-12, 2.524e-12, 3.328e-12, 4.523e-12, 6.108e-12, 8.207e-12,
2935 1.122e-11, 1.477e-11, 1.9e-11, 2.412e-11, 2.984e-11, 3.68e-11,
2936 4.353e-11, 4.963e-11, 5.478e-11, 5.903e-11, 6.233e-11, 6.483e-11,
2937 6.904e-11, 7.569e-11, 8.719e-11, 1.048e-10, 1.278e-10, 1.557e-10,
2938 1.869e-10, 2.218e-10, 2.61e-10, 2.975e-10, 3.371e-10, 3.746e-10,
2939 4.065e-10, 4.336e-10, 4.503e-10, 4.701e-10, 4.8e-10, 4.917e-10,
2940 5.038e-10, 5.128e-10, 5.143e-10, 5.071e-10, 5.019e-10, 5.025e-10,
2941 5.183e-10, 5.496e-10, 5.877e-10, 6.235e-10, 6.42e-10, 6.234e-10,
2942 5.698e-10, 4.916e-10, 4.022e-10, 3.126e-10, 2.282e-10, 1.639e-10,
2943 1.142e-10, 7.919e-11, 5.69e-11, 4.313e-11, 3.413e-11, 2.807e-11,
2944 2.41e-11, 2.166e-11, 2.024e-11, 1.946e-11, 1.929e-11, 1.963e-11,
2945 2.035e-11, 2.162e-11, 2.305e-11, 2.493e-11, 2.748e-11, 3.048e-11,
2946 3.413e-11, 3.754e-11, 4.155e-11, 4.635e-11, 5.11e-11, 5.734e-11,
2947 6.338e-11, 6.99e-11, 7.611e-11, 8.125e-11, 8.654e-11, 8.951e-11,
2948 9.182e-11, 9.31e-11, 9.273e-11, 9.094e-11, 8.849e-11, 8.662e-11,
2949 8.67e-11, 8.972e-11, 9.566e-11, 1.025e-10, 1.083e-10, 1.111e-10,
2950 1.074e-10, 9.771e-11, 8.468e-11, 6.958e-11, 5.47e-11, 4.04e-11,
2951 2.94e-11, 2.075e-11, 1.442e-11, 1.01e-11, 7.281e-12, 5.409e-12,
2952 4.138e-12, 3.304e-12, 2.784e-12, 2.473e-12, 2.273e-12, 2.186e-12,
2953 2.118e-12, 2.066e-12, 1.958e-12, 1.818e-12, 1.675e-12, 1.509e-12,
2954 1.349e-12, 1.171e-12, 9.838e-13, 8.213e-13, 6.765e-13, 5.378e-13,
2955 4.161e-13, 3.119e-13, 2.279e-13, 1.637e-13, 1.152e-13, 8.112e-14,
2956 5.919e-14, 4.47e-14, 3.492e-14, 2.811e-14, 2.319e-14, 1.948e-14,
2957 1.66e-14, 1.432e-14, 1.251e-14, 1.109e-14, 1.006e-14, 9.45e-15,
2958 9.384e-15, 1.012e-14, 1.216e-14, 1.636e-14, 2.305e-14, 3.488e-14,
2959 5.572e-14, 8.479e-14, 1.265e-13, 1.905e-13, 2.73e-13, 3.809e-13,
2960 4.955e-13, 6.303e-13, 7.861e-13, 9.427e-13, 1.097e-12, 1.212e-12,
2961 1.328e-12, 1.415e-12, 1.463e-12, 1.495e-12, 1.571e-12, 1.731e-12,
2962 1.981e-12, 2.387e-12, 2.93e-12, 3.642e-12, 4.584e-12, 5.822e-12,
2963 7.278e-12, 9.193e-12, 1.135e-11, 1.382e-11, 1.662e-11, 1.958e-11,
2964 2.286e-11, 2.559e-11, 2.805e-11, 2.988e-11, 3.106e-11, 3.182e-11,
2965 3.2e-11, 3.258e-11, 3.362e-11, 3.558e-11, 3.688e-11, 3.8e-11,
2966 3.929e-11, 4.062e-11, 4.186e-11, 4.293e-11, 4.48e-11, 4.643e-11,
2967 4.704e-11, 4.571e-11, 4.206e-11, 3.715e-11, 3.131e-11, 2.541e-11,
2968 1.978e-11, 1.508e-11, 1.146e-11, 8.7e-12, 6.603e-12, 5.162e-12,
2969 4.157e-12, 3.408e-12, 2.829e-12, 2.405e-12, 2.071e-12, 1.826e-12,
2970 1.648e-12, 1.542e-12, 1.489e-12, 1.485e-12, 1.493e-12, 1.545e-12,
2971 1.637e-12, 1.814e-12, 2.061e-12, 2.312e-12, 2.651e-12, 3.03e-12,
2972 3.46e-12, 3.901e-12, 4.306e-12, 4.721e-12, 5.008e-12, 5.281e-12,
2973 5.541e-12, 5.791e-12, 6.115e-12, 6.442e-12, 6.68e-12, 6.791e-12,
2974 6.831e-12, 6.839e-12, 6.946e-12, 7.128e-12, 7.537e-12, 8.036e-12,
2975 8.392e-12, 8.526e-12, 8.11e-12, 7.325e-12, 6.329e-12, 5.183e-12,
2976 4.081e-12, 2.985e-12, 2.141e-12, 1.492e-12, 1.015e-12, 6.684e-13,
2977 4.414e-13, 2.987e-13, 2.038e-13, 1.391e-13, 9.86e-14, 7.24e-14,
2978 5.493e-14, 4.288e-14, 3.427e-14, 2.787e-14, 2.296e-14, 1.909e-14,
2979 1.598e-14, 1.344e-14, 1.135e-14, 9.616e-15, 8.169e-15, 6.957e-15,
2980 5.938e-15, 5.08e-15, 4.353e-15, 3.738e-15, 3.217e-15, 2.773e-15,
2981 2.397e-15, 2.077e-15, 1.805e-15, 1.575e-15, 1.382e-15, 1.221e-15,
2982 1.09e-15, 9.855e-16, 9.068e-16, 8.537e-16, 8.27e-16, 8.29e-16,
2983 8.634e-16, 9.359e-16, 1.055e-15, 1.233e-15, 1.486e-15, 1.839e-15,
2984 2.326e-15, 2.998e-15, 3.934e-15, 5.256e-15, 7.164e-15, 9.984e-15,
2985 1.427e-14, 2.099e-14, 3.196e-14, 5.121e-14, 7.908e-14, 1.131e-13,
2986 1.602e-13, 2.239e-13, 3.075e-13, 4.134e-13, 5.749e-13, 7.886e-13,
2987 1.071e-12, 1.464e-12, 2.032e-12, 2.8e-12, 3.732e-12, 4.996e-12,
2988 6.483e-12, 8.143e-12, 1.006e-11, 1.238e-11, 1.484e-11, 1.744e-11,
2989 2.02e-11, 2.274e-11, 2.562e-11, 2.848e-11, 3.191e-11, 3.617e-11,
2990 4.081e-11, 4.577e-11, 4.937e-11, 5.204e-11, 5.401e-11, 5.462e-11,
2991 5.507e-11, 5.51e-11, 5.605e-11, 5.686e-11, 5.739e-11, 5.766e-11,
2992 5.74e-11, 5.754e-11, 5.761e-11, 5.777e-11, 5.712e-11, 5.51e-11,
2993 5.088e-11, 4.438e-11, 3.728e-11, 2.994e-11, 2.305e-11, 1.715e-11,
2994 1.256e-11, 9.208e-12, 6.745e-12, 5.014e-12, 3.785e-12, 2.9e-12,
2995 2.239e-12, 1.757e-12, 1.414e-12, 1.142e-12, 9.482e-13, 8.01e-13,
2996 6.961e-13, 6.253e-13, 5.735e-13, 5.433e-13, 5.352e-13, 5.493e-13,
2997 5.706e-13, 6.068e-13, 6.531e-13, 7.109e-13, 7.767e-13, 8.59e-13,
2998 9.792e-13, 1.142e-12, 1.371e-12, 1.65e-12, 1.957e-12, 2.302e-12,
2999 2.705e-12, 3.145e-12, 3.608e-12, 4.071e-12, 4.602e-12, 5.133e-12,
3000 5.572e-12, 5.987e-12, 6.248e-12, 6.533e-12, 6.757e-12, 6.935e-12,
3001 7.224e-12, 7.422e-12, 7.538e-12, 7.547e-12, 7.495e-12, 7.543e-12,
3002 7.725e-12, 8.139e-12, 8.627e-12, 9.146e-12, 9.443e-12, 9.318e-12,
3003 8.649e-12, 7.512e-12, 6.261e-12, 4.915e-12, 3.647e-12, 2.597e-12,
3004 1.785e-12, 1.242e-12, 8.66e-13, 6.207e-13, 4.61e-13, 3.444e-13,
3005 2.634e-13, 2.1e-13, 1.725e-13, 1.455e-13, 1.237e-13, 1.085e-13,
3006 9.513e-14, 7.978e-14, 6.603e-14, 5.288e-14, 4.084e-14, 2.952e-14,
3007 2.157e-14, 1.593e-14, 1.199e-14, 9.267e-15, 7.365e-15, 6.004e-15,
3008 4.995e-15, 4.218e-15, 3.601e-15, 3.101e-15, 2.692e-15, 2.36e-15,
3009 2.094e-15, 1.891e-15, 1.755e-15, 1.699e-15, 1.755e-15, 1.987e-15,
3010 2.506e-15, 3.506e-15, 5.289e-15, 8.311e-15, 1.325e-14, 2.129e-14,
3011 3.237e-14, 4.595e-14, 6.441e-14, 8.433e-14, 1.074e-13, 1.383e-13,
3012 1.762e-13, 2.281e-13, 2.831e-13, 3.523e-13, 4.38e-13, 5.304e-13,
3013 6.29e-13, 7.142e-13, 8.032e-13, 8.934e-13, 9.888e-13, 1.109e-12,
3014 1.261e-12, 1.462e-12, 1.74e-12, 2.099e-12, 2.535e-12, 3.008e-12,
3015 3.462e-12, 3.856e-12, 4.098e-12, 4.239e-12, 4.234e-12, 4.132e-12,
3016 3.986e-12, 3.866e-12, 3.829e-12, 3.742e-12, 3.705e-12, 3.694e-12,
3017 3.765e-12, 3.849e-12, 3.929e-12, 4.056e-12, 4.092e-12, 4.047e-12,
3018 3.792e-12, 3.407e-12, 2.953e-12, 2.429e-12, 1.931e-12, 1.46e-12,
3019 1.099e-12, 8.199e-13, 6.077e-13, 4.449e-13, 3.359e-13, 2.524e-13,
3020 1.881e-13, 1.391e-13, 1.02e-13, 7.544e-14, 5.555e-14, 4.22e-14,
3021 3.321e-14, 2.686e-14, 2.212e-14, 1.78e-14, 1.369e-14, 1.094e-14,
3022 9.13e-15, 8.101e-15, 7.828e-15, 8.393e-15, 1.012e-14, 1.259e-14,
3023 1.538e-14, 1.961e-14, 2.619e-14, 3.679e-14, 5.049e-14, 6.917e-14,
3024 8.88e-14, 1.115e-13, 1.373e-13, 1.619e-13, 1.878e-13, 2.111e-13,
3025 2.33e-13, 2.503e-13, 2.613e-13, 2.743e-13, 2.826e-13, 2.976e-13,
3026 3.162e-13, 3.36e-13, 3.491e-13, 3.541e-13, 3.595e-13, 3.608e-13,
3027 3.709e-13, 3.869e-13, 4.12e-13, 4.366e-13, 4.504e-13, 4.379e-13,
3028 3.955e-13, 3.385e-13, 2.741e-13, 2.089e-13, 1.427e-13, 9.294e-14,
3029 5.775e-14, 3.565e-14, 2.21e-14, 1.398e-14, 9.194e-15, 6.363e-15,
3030 4.644e-15, 3.55e-15, 2.808e-15, 2.274e-15, 1.871e-15, 1.557e-15,
3031 1.308e-15, 1.108e-15, 9.488e-16, 8.222e-16, 7.238e-16, 6.506e-16,
3032 6.008e-16, 5.742e-16, 5.724e-16, 5.991e-16, 6.625e-16, 7.775e-16,
3033 9.734e-16, 1.306e-15, 1.88e-15, 2.879e-15, 4.616e-15, 7.579e-15,
3034 1.248e-14, 2.03e-14, 3.244e-14, 5.171e-14, 7.394e-14, 9.676e-14,
3035 1.199e-13, 1.467e-13, 1.737e-13, 2.02e-13, 2.425e-13, 3.016e-13,
3036 3.7e-13, 4.617e-13, 5.949e-13, 7.473e-13, 9.378e-13, 1.191e-12,
3037 1.481e-12, 1.813e-12, 2.232e-12, 2.722e-12, 3.254e-12, 3.845e-12,
3038 4.458e-12, 5.048e-12, 5.511e-12, 5.898e-12, 6.204e-12, 6.293e-12,
3039 6.386e-12, 6.467e-12, 6.507e-12, 6.466e-12, 6.443e-12, 6.598e-12,
3040 6.873e-12, 7.3e-12, 7.816e-12, 8.368e-12, 8.643e-12, 8.466e-12,
3041 7.871e-12, 6.853e-12, 5.714e-12, 4.482e-12, 3.392e-12, 2.613e-12,
3042 2.008e-12, 1.562e-12, 1.228e-12, 9.888e-13, 7.646e-13, 5.769e-13,
3043 4.368e-13, 3.324e-13, 2.508e-13, 1.916e-13
3044 };
3045
3046 static const double xfcrev[15] =
3047 { 1.003, 1.009, 1.015, 1.023, 1.029, 1.033, 1.037,
3048 1.039, 1.04, 1.046, 1.036, 1.027, 1.01, 1.002, 1.
3049 };
3050
3051 double sfac;
3052
3053 /* Get H2O continuum absorption... */
3054 const double xw = nu / 10 + 1;
3055 if (xw >= 1 && xw < 2001) {
3056 const int iw = (int) xw;
3057 const double dw = xw - iw;
3058 const double ew = 1 - dw;
3059 const double cw296 = ew * h2o296[iw - 1] + dw * h2o296[iw];
3060 const double cw260 = ew * h2o260[iw - 1] + dw * h2o260[iw];
3061 const double cwfrn = ew * h2ofrn[iw - 1] + dw * h2ofrn[iw];
3062 if (nu <= 820 || nu >= 960) {
3063 sfac = 1;
3064 } else {
3065 const double xx = (nu - 820) / 10;
3066 const int ix = (int) xx;
3067 const double dx = xx - ix;
3068 sfac = (1 - dx) * xfcrev[ix] + dx * xfcrev[ix + 1];
3069 }
3070 const double ctwslf =
3071 sfac * cw296 * pow(cw260 / cw296, (296 - t) / (296 - 260));
3072 const double vf2 = POW2(nu - 370);
3073 const double vf6 = POW3(vf2);
3074 const double fscal = 36100 / (vf2 + vf6 * 1e-8 + 36100) * -.25 + 1;
3075 const double ctwfrn = cwfrn * fscal;
3076 const double a1 = nu * u * tanh(.7193876 / t * nu);
3077 const double a2 = 296 / t;
3078 const double a3 = p / P0 * (q * ctwslf + (1 - q) * ctwfrn) * 1e-20;
3079 return a1 * a2 * a3;
3080 } else
3081 return 0;
3082}
#define POW3(x)
Compute the cube of a value.
Definition: jurassic.h:682

◆ ctmn2()

double ctmn2 ( const double  nu,
const double  p,
const double  t 
)

Compute N₂ collision-induced absorption coefficient.

Calculates the nitrogen (N₂) absorption coefficient due to collision-induced absorption (CIA) near the 4.3 µm CO₂ band using tabulated laboratory data for the absorption strength (B) and temperature exponent (β).

The function linearly interpolates B and β as a function of wavenumber, then applies a temperature- and pressure-dependent scaling relation to compute the absorption coefficient.

Parameters
[in]nuWavenumber [cm⁻¹].
[in]pPressure [hPa].
[in]tTemperature [K].
Returns
N₂ absorption coefficient [km⁻¹].
Note
Valid for approximately 2120–2600 cm⁻¹ (4.0–4.7 µm) where N₂–N₂ and N₂–O₂ CIA dominates. Returns zero outside the tabulated range.
See also
locate_reg, LIN, P0, N2

[Lafferty] et al., J. Quant. Spectrosc. Radiat. Transf., 68, 473–479 (2001)

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3086 of file jurassic.c.

3089 {
3090
3091 static const double ba[98] =
3092 { 0., 4.45e-8, 5.22e-8, 6.46e-8, 7.75e-8, 9.03e-8,
3093 1.06e-7, 1.21e-7, 1.37e-7, 1.57e-7, 1.75e-7, 2.01e-7, 2.3e-7,
3094 2.59e-7, 2.95e-7, 3.26e-7, 3.66e-7, 4.05e-7, 4.47e-7, 4.92e-7,
3095 5.34e-7, 5.84e-7, 6.24e-7, 6.67e-7, 7.14e-7, 7.26e-7, 7.54e-7,
3096 7.84e-7, 8.09e-7, 8.42e-7, 8.62e-7, 8.87e-7, 9.11e-7, 9.36e-7,
3097 9.76e-7, 1.03e-6, 1.11e-6, 1.23e-6, 1.39e-6, 1.61e-6, 1.76e-6,
3098 1.94e-6, 1.97e-6, 1.87e-6, 1.75e-6, 1.56e-6, 1.42e-6, 1.35e-6,
3099 1.32e-6, 1.29e-6, 1.29e-6, 1.29e-6, 1.3e-6, 1.32e-6, 1.33e-6,
3100 1.34e-6, 1.35e-6, 1.33e-6, 1.31e-6, 1.29e-6, 1.24e-6, 1.2e-6,
3101 1.16e-6, 1.1e-6, 1.04e-6, 9.96e-7, 9.38e-7, 8.63e-7, 7.98e-7,
3102 7.26e-7, 6.55e-7, 5.94e-7, 5.35e-7, 4.74e-7, 4.24e-7, 3.77e-7,
3103 3.33e-7, 2.96e-7, 2.63e-7, 2.34e-7, 2.08e-7, 1.85e-7, 1.67e-7,
3104 1.47e-7, 1.32e-7, 1.2e-7, 1.09e-7, 9.85e-8, 9.08e-8, 8.18e-8,
3105 7.56e-8, 6.85e-8, 6.14e-8, 5.83e-8, 5.77e-8, 5e-8, 4.32e-8, 0.
3106 };
3107
3108 static const double betaa[98] =
3109 { 802., 802., 761., 722., 679., 646., 609., 562.,
3110 511., 472., 436., 406., 377., 355., 338., 319., 299., 278., 255.,
3111 233., 208., 184., 149., 107., 66., 25., -13., -49., -82., -104.,
3112 -119., -130., -139., -144., -146., -146., -147., -148., -150.,
3113 -153., -160., -169., -181., -189., -195., -200., -205., -209.,
3114 -211., -210., -210., -209., -205., -199., -190., -180., -168.,
3115 -157., -143., -126., -108., -89., -63., -32., 1., 35., 65., 95.,
3116 121., 141., 152., 161., 164., 164., 161., 155., 148., 143., 137.,
3117 133., 131., 133., 139., 150., 165., 187., 213., 248., 284., 321.,
3118 372., 449., 514., 569., 609., 642., 673., 673.
3119 };
3120
3121 static const double nua[98] =
3122 { 2120., 2125., 2130., 2135., 2140., 2145., 2150.,
3123 2155., 2160., 2165., 2170., 2175., 2180., 2185., 2190., 2195.,
3124 2200., 2205., 2210., 2215., 2220., 2225., 2230., 2235., 2240.,
3125 2245., 2250., 2255., 2260., 2265., 2270., 2275., 2280., 2285.,
3126 2290., 2295., 2300., 2305., 2310., 2315., 2320., 2325., 2330.,
3127 2335., 2340., 2345., 2350., 2355., 2360., 2365., 2370., 2375.,
3128 2380., 2385., 2390., 2395., 2400., 2405., 2410., 2415., 2420.,
3129 2425., 2430., 2435., 2440., 2445., 2450., 2455., 2460., 2465.,
3130 2470., 2475., 2480., 2485., 2490., 2495., 2500., 2505., 2510.,
3131 2515., 2520., 2525., 2530., 2535., 2540., 2545., 2550., 2555.,
3132 2560., 2565., 2570., 2575., 2580., 2585., 2590., 2595., 2600., 2605.
3133 };
3134
3135 const double t0 = 273.0, tr = 296.0;
3136
3137 /* Check wavenumber range... */
3138 if (nu < nua[0] || nu > nua[97])
3139 return 0;
3140
3141 /* Interpolate B and beta... */
3142 const int idx = locate_reg(nua, 98, nu);
3143 const double b =
3144 1e6 * LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3145 const double beta =
3146 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3147
3148 /* Compute absorption coefficient... */
3149 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t))
3150 * N2 * b * (N2 + (1 - N2) * (1.294 - 0.4545 * t / tr));
3151}
Here is the call graph for this function:

◆ ctmo2()

double ctmo2 ( const double  nu,
const double  p,
const double  t 
)

Compute O₂ collision-induced absorption coefficient.

Calculates the molecular oxygen (O₂) absorption coefficient due to collision-induced absorption (CIA) using tabulated laboratory data for the absorption strength (B) and temperature exponent (β).

The function linearly interpolates B and β as a function of wavenumber and applies a pressure- and temperature-dependent scaling relation to compute the absorption coefficient.

Parameters
[in]nuWavenumber [cm⁻¹].
[in]pPressure [hPa].
[in]tTemperature [K].
Returns
O₂ absorption coefficient [km⁻¹].
Note
Valid for approximately 1360–1800 cm⁻¹ (∼ 7.4–5.5 µm), corresponding to the O₂ CIA band. Returns zero outside the tabulated range.
See also
locate_reg, LIN, P0, O2

[Greenblatt] et al., J. Quant. Spectrosc. Radiat. Transf., 33, 127–140 (1985) [Smith] and Newnham, Appl. Opt., 39, 318–326 (2000)

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3155 of file jurassic.c.

3158 {
3159
3160 static const double ba[90] =
3161 { 0., .061, .074, .084, .096, .12, .162, .208, .246,
3162 .285, .314, .38, .444, .5, .571, .673, .768, .853, .966, 1.097,
3163 1.214, 1.333, 1.466, 1.591, 1.693, 1.796, 1.922, 2.037, 2.154,
3164 2.264, 2.375, 2.508, 2.671, 2.847, 3.066, 3.417, 3.828, 4.204,
3165 4.453, 4.599, 4.528, 4.284, 3.955, 3.678, 3.477, 3.346, 3.29,
3166 3.251, 3.231, 3.226, 3.212, 3.192, 3.108, 3.033, 2.911, 2.798,
3167 2.646, 2.508, 2.322, 2.13, 1.928, 1.757, 1.588, 1.417, 1.253,
3168 1.109, .99, .888, .791, .678, .587, .524, .464, .403, .357, .32,
3169 .29, .267, .242, .215, .182, .16, .146, .128, .103, .087, .081,
3170 .071, .064, 0.
3171 };
3172
3173 static const double betaa[90] =
3174 { 467., 467., 400., 315., 379., 368., 475., 521.,
3175 531., 512., 442., 444., 430., 381., 335., 324., 296., 248., 215.,
3176 193., 158., 127., 101., 71., 31., -6., -26., -47., -63., -79.,
3177 -88., -88., -87., -90., -98., -99., -109., -134., -160., -167.,
3178 -164., -158., -153., -151., -156., -166., -168., -173., -170.,
3179 -161., -145., -126., -108., -84., -59., -29., 4., 41., 73., 97.,
3180 123., 159., 198., 220., 242., 256., 281., 311., 334., 319., 313.,
3181 321., 323., 310., 315., 320., 335., 361., 378., 373., 338., 319.,
3182 346., 322., 291., 290., 350., 371., 504., 504.
3183 };
3184
3185 static const double nua[90] =
3186 { 1360., 1365., 1370., 1375., 1380., 1385., 1390.,
3187 1395., 1400., 1405., 1410., 1415., 1420., 1425., 1430., 1435.,
3188 1440., 1445., 1450., 1455., 1460., 1465., 1470., 1475., 1480.,
3189 1485., 1490., 1495., 1500., 1505., 1510., 1515., 1520., 1525.,
3190 1530., 1535., 1540., 1545., 1550., 1555., 1560., 1565., 1570.,
3191 1575., 1580., 1585., 1590., 1595., 1600., 1605., 1610., 1615.,
3192 1620., 1625., 1630., 1635., 1640., 1645., 1650., 1655., 1660.,
3193 1665., 1670., 1675., 1680., 1685., 1690., 1695., 1700., 1705.,
3194 1710., 1715., 1720., 1725., 1730., 1735., 1740., 1745., 1750.,
3195 1755., 1760., 1765., 1770., 1775., 1780., 1785., 1790., 1795.,
3196 1800., 1805.
3197 };
3198
3199 const double t0 = 273, tr = 296;
3200
3201 /* Check wavenumber range... */
3202 if (nu < nua[0] || nu > nua[89])
3203 return 0;
3204
3205 /* Interpolate B and beta... */
3206 const int idx = locate_reg(nua, 90, nu);
3207 const double b = LIN(nua[idx], ba[idx], nua[idx + 1], ba[idx + 1], nu);
3208 const double beta =
3209 LIN(nua[idx], betaa[idx], nua[idx + 1], betaa[idx + 1], nu);
3210
3211 /* Compute absorption coefficient... */
3212 return 0.1 * POW2(p / P0 * t0 / t) * exp(beta * (1 / tr - 1 / t)) * O2 * b;
3213}
Here is the call graph for this function:

◆ copy_atm()

void copy_atm ( const ctl_t ctl,
atm_t atm_dest,
const atm_t atm_src,
const int  init 
)

Copy or initialize atmospheric profile data.

Copies all fields from one atmospheric structure (atm_src) to another (atm_dest), including geolocation, thermodynamic, gas, extinction, cloud, and surface parameters. If init is nonzero, the destination fields are instead initialized to default values (zeros for most fields, unity for surface emissivity).

Parameters
[in]ctlControl structure defining array dimensions.
[out]atm_destDestination atmospheric structure.
[in]atm_srcSource atmospheric structure.
[in]initInitialization flag:
  • 0 → copy data from atm_src
  • 1 → initialize atm_dest to default values
Note
The number of vertical levels (atm_src->np) determines the amount of data copied. The function performs shallow copies using memcpy for efficiency.
See also
atm_t, ctl_t
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3217 of file jurassic.c.

3221 {
3222
3223 /* Data size... */
3224 const size_t s = (size_t) atm_src->np * sizeof(double);
3225
3226 /* Copy data... */
3227 atm_dest->np = atm_src->np;
3228 memcpy(atm_dest->time, atm_src->time, s);
3229 memcpy(atm_dest->z, atm_src->z, s);
3230 memcpy(atm_dest->lon, atm_src->lon, s);
3231 memcpy(atm_dest->lat, atm_src->lat, s);
3232 memcpy(atm_dest->p, atm_src->p, s);
3233 memcpy(atm_dest->t, atm_src->t, s);
3234 for (int ig = 0; ig < ctl->ng; ig++)
3235 memcpy(atm_dest->q[ig], atm_src->q[ig], s);
3236 for (int iw = 0; iw < ctl->nw; iw++)
3237 memcpy(atm_dest->k[iw], atm_src->k[iw], s);
3238 atm_dest->clz = atm_src->clz;
3239 atm_dest->cldz = atm_src->cldz;
3240 for (int icl = 0; icl < ctl->ncl; icl++)
3241 atm_dest->clk[icl] = atm_src->clk[icl];
3242 atm_dest->sft = atm_src->sft;
3243 for (int isf = 0; isf < ctl->nsf; isf++)
3244 atm_dest->sfeps[isf] = atm_src->sfeps[isf];
3245
3246 /* Initialize... */
3247 if (init)
3248 for (int ip = 0; ip < atm_dest->np; ip++) {
3249 atm_dest->p[ip] = 0;
3250 atm_dest->t[ip] = 0;
3251 for (int ig = 0; ig < ctl->ng; ig++)
3252 atm_dest->q[ig][ip] = 0;
3253 for (int iw = 0; iw < ctl->nw; iw++)
3254 atm_dest->k[iw][ip] = 0;
3255 atm_dest->clz = 0;
3256 atm_dest->cldz = 0;
3257 for (int icl = 0; icl < ctl->ncl; icl++)
3258 atm_dest->clk[icl] = 0;
3259 atm_dest->sft = 0;
3260 for (int isf = 0; isf < ctl->nsf; isf++)
3261 atm_dest->sfeps[isf] = 1;
3262 }
3263}
double lat[NP]
Latitude [deg].
Definition: jurassic.h:929
double lon[NP]
Longitude [deg].
Definition: jurassic.h:926

◆ copy_obs()

void copy_obs ( const ctl_t ctl,
obs_t obs_dest,
const obs_t obs_src,
const int  init 
)

Copy or initialize observation geometry and radiance data.

Copies all observation fields from a source structure (obs_src) to a destination structure (obs_dest), including observer, view, and tangent point geometry, as well as radiance and transmittance data. If init is nonzero, radiance and transmittance values are reset to zero wherever finite values are found.

Parameters
[in]ctlControl structure defining the number of channels (ctl_t::nd) and other dimensions.
[out]obs_destDestination observation structure.
[in]obs_srcSource observation structure.
[in]initInitialization flag:
  • 0 → copy data from obs_src
  • 1 → initialize obs_dest (set rad and tau to zero)
Note
The number of ray paths (obs_src->nr) defines the copied data size. Shallow copies are performed via memcpy for efficiency.
See also
obs_t, ctl_t
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3267 of file jurassic.c.

3271 {
3272
3273 /* Data size... */
3274 const size_t s = (size_t) obs_src->nr * sizeof(double);
3275
3276 /* Copy data... */
3277 obs_dest->nr = obs_src->nr;
3278 memcpy(obs_dest->time, obs_src->time, s);
3279 memcpy(obs_dest->obsz, obs_src->obsz, s);
3280 memcpy(obs_dest->obslon, obs_src->obslon, s);
3281 memcpy(obs_dest->obslat, obs_src->obslat, s);
3282 memcpy(obs_dest->vpz, obs_src->vpz, s);
3283 memcpy(obs_dest->vplon, obs_src->vplon, s);
3284 memcpy(obs_dest->vplat, obs_src->vplat, s);
3285 memcpy(obs_dest->tpz, obs_src->tpz, s);
3286 memcpy(obs_dest->tplon, obs_src->tplon, s);
3287 memcpy(obs_dest->tplat, obs_src->tplat, s);
3288 for (int id = 0; id < ctl->nd; id++)
3289 memcpy(obs_dest->rad[id], obs_src->rad[id], s);
3290 for (int id = 0; id < ctl->nd; id++)
3291 memcpy(obs_dest->tau[id], obs_src->tau[id], s);
3292
3293 /* Initialize... */
3294 if (init)
3295 for (int id = 0; id < ctl->nd; id++)
3296 for (int ir = 0; ir < obs_dest->nr; ir++)
3297 if (isfinite(obs_dest->rad[id][ir])) {
3298 obs_dest->rad[id][ir] = 0;
3299 obs_dest->tau[id][ir] = 0;
3300 }
3301}
int nd
Number of radiance channels.
Definition: jurassic.h:988
double tau[ND][NR]
Transmittance of ray path.
Definition: jurassic.h:1223
double rad[ND][NR]
Radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1226
double tplon[NR]
Tangent point longitude [deg].
Definition: jurassic.h:1217
double vpz[NR]
View point altitude [km].
Definition: jurassic.h:1205
double vplat[NR]
View point latitude [deg].
Definition: jurassic.h:1211
double obslon[NR]
Observer longitude [deg].
Definition: jurassic.h:1199
double obslat[NR]
Observer latitude [deg].
Definition: jurassic.h:1202
double obsz[NR]
Observer altitude [km].
Definition: jurassic.h:1196
double tplat[NR]
Tangent point latitude [deg].
Definition: jurassic.h:1220
double vplon[NR]
View point longitude [deg].
Definition: jurassic.h:1208
double time[NR]
Time (seconds since 2000-01-01T00:00Z).
Definition: jurassic.h:1193
double tpz[NR]
Tangent point altitude [km].
Definition: jurassic.h:1214
int nr
Number of ray paths.
Definition: jurassic.h:1190

◆ find_emitter()

int find_emitter ( const ctl_t ctl,
const char *  emitter 
)

Find gas species index by name.

Searches the list of emitter (gas) names defined in the control structure for a case-insensitive match to the given string. Returns the corresponding gas index if found, or -1 otherwise.

Parameters
[in]ctlControl structure containing the list of gas emitters.
[in]emitterName of the gas species to search for (e.g. "H2O", "CO2").
Returns
Index of the matching emitter (0 ≤ index < ctl->ng), or -1 if no match is found.
Note
Comparison is case-insensitive using strcasecmp().
See also
ctl_t
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3305 of file jurassic.c.

3307 {
3308
3309 for (int ig = 0; ig < ctl->ng; ig++)
3310 if (strcasecmp(ctl->emitter[ig], emitter) == 0)
3311 return ig;
3312
3313 return -1;
3314}

◆ formod()

void formod ( const ctl_t ctl,
const tbl_t tbl,
atm_t atm,
obs_t obs 
)

Execute the selected forward model.

Computes synthetic radiances or brightness temperatures for the given atmospheric state and observation geometry using the selected forward-model method (CGA, EGA, or RFM). The function also applies hydrostatic adjustment, field-of-view convolution, and optional brightness-temperature conversion.

Parameters
[in]ctlControl structure defining model settings and options.
[in]tblEmissivity and source-function lookup tables.
[in,out]atmAtmospheric profile; may be adjusted for hydrostatic balance.
[in,out]obsObservation geometry and radiance data; populated with model output.
Note
The model type is selected via ctl_t::formod:
The function preserves obs->rad elements marked as invalid (NaN) by applying an internal observation mask.
See also
ctl_t, atm_t, obs_t, tbl_t, formod_pencil, formod_rfm, formod_fov, hydrostatic
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3318 of file jurassic.c.

3322 {
3323
3324 int *mask;
3325
3326 /* Allocate... */
3327 ALLOC(mask, int,
3328 ND * NR);
3329
3330 /* Save observation mask... */
3331 for (int id = 0; id < ctl->nd; id++)
3332 for (int ir = 0; ir < obs->nr; ir++)
3333 mask[id * NR + ir] = !isfinite(obs->rad[id][ir]);
3334
3335 /* Hydrostatic equilibrium... */
3336 hydrostatic(ctl, atm);
3337
3338 /* CGA or EGA forward model... */
3339 if (ctl->formod == 0 || ctl->formod == 1)
3340 for (int ir = 0; ir < obs->nr; ir++)
3341 formod_pencil(ctl, tbl, atm, obs, ir);
3342
3343 /* Call RFM... */
3344 else if (ctl->formod == 2)
3345 formod_rfm(ctl, atm, obs);
3346
3347 /* Apply field-of-view convolution... */
3348 formod_fov(ctl, obs);
3349
3350 /* Convert radiance to brightness temperature... */
3351 if (ctl->write_bbt)
3352 for (int id = 0; id < ctl->nd; id++)
3353 for (int ir = 0; ir < obs->nr; ir++)
3354 obs->rad[id][ir] = BRIGHT(obs->rad[id][ir], ctl->nu[id]);
3355
3356 /* Apply observation mask... */
3357 for (int id = 0; id < ctl->nd; id++)
3358 for (int ir = 0; ir < obs->nr; ir++)
3359 if (mask[id * NR + ir])
3360 obs->rad[id][ir] = NAN;
3361
3362 /* Free... */
3363 free(mask);
3364}
void formod_rfm(const ctl_t *ctl, const atm_t *atm, obs_t *obs)
Interface routine for the Reference Forward Model (RFM).
Definition: jurassic.c:3604
void formod_pencil(const ctl_t *ctl, const tbl_t *tbl, const atm_t *atm, obs_t *obs, const int ir)
Compute line-of-sight radiances using the pencil-beam forward model.
Definition: jurassic.c:3469
void formod_fov(const ctl_t *ctl, obs_t *obs)
Apply field-of-view (FOV) convolution to modeled radiances.
Definition: jurassic.c:3404
void hydrostatic(const ctl_t *ctl, atm_t *atm)
Adjust pressure profile using the hydrostatic equation.
Definition: jurassic.c:3782
#define BRIGHT(rad, nu)
Compute brightness temperature from radiance.
Definition: jurassic.h:401
#define ND
Maximum number of radiance channels.
Definition: jurassic.h:236
#define ALLOC(ptr, type, n)
Allocate memory for an array.
Definition: jurassic.h:376
#define NR
Maximum number of ray paths.
Definition: jurassic.h:251
double nu[ND]
Centroid wavenumber of each channel [cm^-1].
Definition: jurassic.h:991
int formod
Forward model (0=CGA, 1=EGA, 2=RFM).
Definition: jurassic.h:1105
int write_bbt
Use brightness temperature instead of radiance (0=no, 1=yes).
Definition: jurassic.h:1099
Here is the call graph for this function:

◆ formod_continua()

void formod_continua ( const ctl_t ctl,
const los_t los,
const int  ip,
double *  beta 
)

Compute total extinction including gaseous continua.

Calculates the total extinction coefficient for a given line-of-sight point by summing spectrally dependent extinction and optional gaseous continuum contributions (CO₂, H₂O, N₂, O₂).

The function updates the extinction array beta for each spectral channel based on line-by-line extinction and enabled continua flags specified in ctl.

Parameters
[in]ctlControl structure defining model setup and continuum options.
[in]losLine-of-sight data containing pressure, temperature, gas concentrations, and extinction coefficients.
[in]ipIndex of the line-of-sight point to process.
[out]betaArray of total extinction coefficients [km⁻¹] per channel.
Note
Each continuum component is added only if its corresponding control flag (e.g., ctl_t::ctm_co2, ctl_t::ctm_h2o) is enabled and the gas index is valid.
See also
ctl_t, los_t, ctmco2, ctmh2o, ctmn2, ctmo2
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3368 of file jurassic.c.

3372 {
3373
3374 /* Extinction... */
3375 for (int id = 0; id < ctl->nd; id++)
3376 beta[id] = los->k[ip][id];
3377
3378 /* CO2 continuum... */
3379 if (ctl->ctm_co2 && ctl->ig_co2 >= 0)
3380 for (int id = 0; id < ctl->nd; id++)
3381 beta[id] += ctmco2(ctl->nu[id], los->p[ip], los->t[ip],
3382 los->u[ip][ctl->ig_co2]) / los->ds[ip];
3383
3384 /* H2O continuum... */
3385 if (ctl->ctm_h2o && ctl->ig_h2o >= 0)
3386 for (int id = 0; id < ctl->nd; id++)
3387 beta[id] += ctmh2o(ctl->nu[id], los->p[ip], los->t[ip],
3388 los->q[ip][ctl->ig_h2o], los->u[ip][ctl->ig_h2o])
3389 / los->ds[ip];
3390
3391 /* N2 continuum... */
3392 if (ctl->ctm_n2)
3393 for (int id = 0; id < ctl->nd; id++)
3394 beta[id] += ctmn2(ctl->nu[id], los->p[ip], los->t[ip]);
3395
3396 /* O2 continuum... */
3397 if (ctl->ctm_o2)
3398 for (int id = 0; id < ctl->nd; id++)
3399 beta[id] += ctmo2(ctl->nu[id], los->p[ip], los->t[ip]);
3400}
double ctmo2(const double nu, const double p, const double t)
Compute O₂ collision-induced absorption coefficient.
Definition: jurassic.c:3155
double ctmh2o(const double nu, const double p, const double t, const double q, const double u)
Compute water vapor continuum (optical depth).
Definition: jurassic.c:2034
double ctmco2(const double nu, const double p, const double t, const double u)
Compute carbon dioxide continuum (optical depth).
Definition: jurassic.c:1171
double ctmn2(const double nu, const double p, const double t)
Compute N₂ collision-induced absorption coefficient.
Definition: jurassic.c:3086
int ctm_co2
Compute CO2 continuum (0=no, 1=yes).
Definition: jurassic.h:1027
int ctm_n2
Compute N2 continuum (0=no, 1=yes).
Definition: jurassic.h:1033
int ctm_h2o
Compute H2O continuum (0=no, 1=yes).
Definition: jurassic.h:1030
int ctm_o2
Compute O2 continuum (0=no, 1=yes).
Definition: jurassic.h:1036
int ig_h2o
Emitter index of H2O.
Definition: jurassic.h:979
double q[NLOS][NG]
Volume mixing ratio [ppv].
Definition: jurassic.h:1146
double ds[NLOS]
Segment length [km].
Definition: jurassic.h:1158
double u[NLOS][NG]
Column density [molecules/cm^2].
Definition: jurassic.h:1161
double k[NLOS][ND]
Extinction [km^-1].
Definition: jurassic.h:1149
double t[NLOS]
Temperature [K].
Definition: jurassic.h:1143
double p[NLOS]
Pressure [hPa].
Definition: jurassic.h:1140
Here is the call graph for this function:

◆ formod_fov()

void formod_fov ( const ctl_t ctl,
obs_t obs 
)

Apply field-of-view (FOV) convolution to modeled radiances.

Convolves pencil-beam radiances and transmittances along each ray path with the instrument field-of-view weighting function defined in the control structure. This simulates finite FOV effects on measured radiances and transmittances.

Parameters
[in]ctlControl structure containing FOV parameters (offsets ctl_t::fov_dz and weights ctl_t::fov_w).
[in,out]obsObservation structure; input pencil-beam data are replaced with FOV-convolved radiances and transmittances.
Note
The convolution is skipped if ctl_t::fov starts with '-' (indicating no FOV correction). Requires at least two valid altitude samples per time step.
Exceptions
ERRMSGif insufficient data are available for convolution.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3404 of file jurassic.c.

3406 {
3407
3408 obs_t *obs2;
3409
3410 double rad[ND][NR], tau[ND][NR], z[NR];
3411
3412 /* Do not take into account FOV... */
3413 if (ctl->fov[0] == '-')
3414 return;
3415
3416 /* Allocate... */
3417 ALLOC(obs2, obs_t, 1);
3418
3419 /* Copy observation data... */
3420 copy_obs(ctl, obs2, obs, 0);
3421
3422 /* Loop over ray paths... */
3423 for (int ir = 0; ir < obs->nr; ir++) {
3424
3425 /* Get radiance and transmittance profiles... */
3426 int nz = 0;
3427 for (int ir2 = MAX(ir - NFOV, 0);
3428 ir2 < MIN(ir + 1 + NFOV, obs->nr); ir2++)
3429 if (obs->time[ir2] == obs->time[ir]) {
3430 z[nz] = obs2->vpz[ir2];
3431 for (int id = 0; id < ctl->nd; id++) {
3432 rad[id][nz] = obs2->rad[id][ir2];
3433 tau[id][nz] = obs2->tau[id][ir2];
3434 }
3435 nz++;
3436 }
3437 if (nz < 2)
3438 ERRMSG("Cannot apply FOV convolution!");
3439
3440 /* Convolute profiles with FOV... */
3441 double wsum = 0;
3442 for (int id = 0; id < ctl->nd; id++) {
3443 obs->rad[id][ir] = 0;
3444 obs->tau[id][ir] = 0;
3445 }
3446 for (int i = 0; i < ctl->fov_n; i++) {
3447 const double zfov = obs->vpz[ir] + ctl->fov_dz[i];
3448 const int idx = locate_irr(z, nz, zfov);
3449 for (int id = 0; id < ctl->nd; id++) {
3450 obs->rad[id][ir] += ctl->fov_w[i]
3451 * LIN(z[idx], rad[id][idx], z[idx + 1], rad[id][idx + 1], zfov);
3452 obs->tau[id][ir] += ctl->fov_w[i]
3453 * LIN(z[idx], tau[id][idx], z[idx + 1], tau[id][idx + 1], zfov);
3454 }
3455 wsum += ctl->fov_w[i];
3456 }
3457 for (int id = 0; id < ctl->nd; id++) {
3458 obs->rad[id][ir] /= wsum;
3459 obs->tau[id][ir] /= wsum;
3460 }
3461 }
3462
3463 /* Free... */
3464 free(obs2);
3465}
int locate_irr(const double *xx, const int n, const double x)
Locate index for interpolation on an irregular grid.
Definition: jurassic.c:4337
void copy_obs(const ctl_t *ctl, obs_t *obs_dest, const obs_t *obs_src, const int init)
Copy or initialize observation geometry and radiance data.
Definition: jurassic.c:3267
#define NFOV
Number of ray paths used for FOV calculations.
Definition: jurassic.h:296
#define MIN(a, b)
Determine the minimum of two values.
Definition: jurassic.h:553
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition: jurassic.h:864
#define MAX(a, b)
Determine the maximum of two values.
Definition: jurassic.h:535
char fov[LEN]
Field-of-view data file.
Definition: jurassic.h:1048
int fov_n
Field-of-view number of data points.
Definition: jurassic.h:1057
double fov_dz[NSHAPE]
Field-of-view vertical distance [km].
Definition: jurassic.h:1051
double fov_w[NSHAPE]
Field-of-view weighting factor.
Definition: jurassic.h:1054
Observation geometry and radiance data.
Definition: jurassic.h:1187
Here is the call graph for this function:

◆ formod_pencil()

void formod_pencil ( const ctl_t ctl,
const tbl_t tbl,
const atm_t atm,
obs_t obs,
const int  ir 
)

Compute line-of-sight radiances using the pencil-beam forward model.

Simulates monochromatic radiances and transmittances along a single line of sight using a layer-by-layer pencil-beam approximation. The model includes gaseous absorption, continuum extinction, surface emission, reflection, and optional solar illumination.

Parameters
[in]ctlControl structure defining model configuration, gas setup, surface type, and spectral parameters.
[in]tblEmissivity and source-function lookup tables.
[in]atmAtmospheric state containing pressure, temperature, and gas profiles.
[in,out]obsObservation data; updated with modeled radiances and transmittances for the specified ray path.
[in]irIndex of the current ray path in obs.
Note
Depending on ctl_t::formod, this function calls either intpol_tbl_cga() (CGA) or intpol_tbl_ega() (EGA) for gas absorption interpolation.
Surface effects include emission, reflection, and—if enabled— solar illumination based on the solar zenith angle.
See also
ctl_t, atm_t, obs_t, tbl_t, los_t, raytrace, formod_continua, formod_srcfunc, intpol_tbl_cga, intpol_tbl_ega, PLANCK
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3469 of file jurassic.c.

3474 {
3475
3476 los_t *los;
3477
3478 double beta_ctm[ND], rad[ND], tau[ND], tau_refl[ND],
3479 tau_path[ND][NG], tau_gas[ND], x0[3], x1[3];
3480
3481 /* Allocate... */
3482 ALLOC(los, los_t, 1);
3483
3484 /* Initialize... */
3485 for (int id = 0; id < ctl->nd; id++) {
3486 rad[id] = 0;
3487 tau[id] = 1;
3488 for (int ig = 0; ig < ctl->ng; ig++)
3489 tau_path[id][ig] = 1;
3490 }
3491
3492 /* Raytracing... */
3493 raytrace(ctl, atm, obs, los, ir);
3494
3495 /* Loop over LOS points... */
3496 for (int ip = 0; ip < los->np; ip++) {
3497
3498 /* Get trace gas transmittance... */
3499 if (ctl->formod == 0)
3500 intpol_tbl_cga(ctl, tbl, los, ip, tau_path, tau_gas);
3501 else
3502 intpol_tbl_ega(ctl, tbl, los, ip, tau_path, tau_gas);
3503
3504 /* Get continuum absorption... */
3505 formod_continua(ctl, los, ip, beta_ctm);
3506
3507 /* Compute Planck function... */
3508 formod_srcfunc(ctl, tbl, los->t[ip], los->src[ip]);
3509
3510 /* Loop over channels... */
3511 for (int id = 0; id < ctl->nd; id++)
3512 if (tau_gas[id] > 0) {
3513
3514 /* Get segment emissivity... */
3515 los->eps[ip][id] = 1 - tau_gas[id] * exp(-beta_ctm[id] * los->ds[ip]);
3516
3517 /* Compute radiance... */
3518 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau[id];
3519
3520 /* Compute path transmittance... */
3521 tau[id] *= (1 - los->eps[ip][id]);
3522 }
3523 }
3524
3525 /* Check whether LOS hit the ground... */
3526 if (ctl->sftype >= 1 && los->sft > 0) {
3527
3528 /* Add surface emissions... */
3529 double src_sf[ND];
3530 formod_srcfunc(ctl, tbl, los->sft, src_sf);
3531 for (int id = 0; id < ctl->nd; id++)
3532 rad[id] += los->sfeps[id] * src_sf[id] * tau[id];
3533
3534 /* Check reflectivity... */
3535 int refl = 0;
3536 if (ctl->sftype >= 2)
3537 for (int id = 0; id < ctl->nd; id++)
3538 if (los->sfeps[id] < 1) {
3539 refl = 1;
3540 break;
3541 }
3542
3543 /* Calculate reflection... */
3544 if (refl) {
3545
3546 /* Initialize... */
3547 for (int id = 0; id < ctl->nd; id++)
3548 tau_refl[id] = 1;
3549
3550 /* Add down-welling radiance... */
3551 for (int ip = los->np - 1; ip >= 0; ip--)
3552 for (int id = 0; id < ctl->nd; id++) {
3553 rad[id] += los->src[ip][id] * los->eps[ip][id] * tau_refl[id]
3554 * tau[id] * (1 - los->sfeps[id]);
3555 tau_refl[id] *= (1 - los->eps[ip][id]);
3556 }
3557
3558 /* Add solar term... */
3559 if (ctl->sftype >= 3) {
3560
3561 /* Get solar zenith angle... */
3562 double sza2;
3563 if (ctl->sfsza < 0)
3564 sza2 =
3565 sza(obs->time[ir], los->lon[los->np - 1], los->lat[los->np - 1]);
3566 else
3567 sza2 = ctl->sfsza;
3568
3569 /* Check solar zenith angle... */
3570 if (sza2 < 89.999) {
3571
3572 /* Get angle of incidence... */
3573 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
3574 los->lat[los->np - 1], x0);
3575 geo2cart(los->z[0], los->lon[0], los->lat[0], x1);
3576 for (int i = 0; i < 3; i++)
3577 x1[i] -= x0[i];
3578 const double cosa = DOTP(x0, x1) / NORM(x0) / NORM(x1);
3579
3580 /* Get ratio of SZA and incident radiation... */
3581 const double rcos = cosa / cos(DEG2RAD(sza2));
3582
3583 /* Add solar radiation... */
3584 for (int id = 0; id < ctl->nd; id++)
3585 rad[id] += 6.764e-5 / (2. * M_PI) * PLANCK(TSUN, ctl->nu[id])
3586 * tau_refl[id] * (1 - los->sfeps[id]) * tau[id] * rcos;
3587 }
3588 }
3589 }
3590 }
3591
3592 /* Copy results... */
3593 for (int id = 0; id < ctl->nd; id++) {
3594 obs->rad[id][ir] = rad[id];
3595 obs->tau[id][ir] = tau[id];
3596 }
3597
3598 /* Free... */
3599 free(los);
3600}
void intpol_tbl_ega(const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
Interpolate emissivities and transmittances using the Emissivity Growth Approximation (EGA).
Definition: jurassic.c:4049
void formod_continua(const ctl_t *ctl, const los_t *los, const int ip, double *beta)
Compute total extinction including gaseous continua.
Definition: jurassic.c:3368
void raytrace(const ctl_t *ctl, const atm_t *atm, obs_t *obs, los_t *los, const int ir)
Perform line-of-sight (LOS) ray tracing through the atmosphere.
Definition: jurassic.c:4510
void intpol_tbl_cga(const ctl_t *ctl, const tbl_t *tbl, const los_t *los, const int ip, double tau_path[ND][NG], double tau_seg[ND])
Interpolate emissivities and transmittances using the Curtis–Godson approximation (CGA).
Definition: jurassic.c:3960
double sza(const double sec, const double lon, const double lat)
Compute the solar zenith angle for a given time and location.
Definition: jurassic.c:5560
void formod_srcfunc(const ctl_t *ctl, const tbl_t *tbl, const double t, double *src)
Interpolate the source function (Planck radiance) at a given temperature.
Definition: jurassic.c:3745
void geo2cart(const double z, const double lon, const double lat, double *x)
Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates.
Definition: jurassic.c:3762
#define DOTP(a, b)
Compute dot product of two 3D vectors.
Definition: jurassic.h:471
#define DEG2RAD(deg)
Convert degrees to radians.
Definition: jurassic.h:418
#define TSUN
Effective temperature of the sun [K].
Definition: jurassic.h:212
#define PLANCK(T, nu)
Compute the Planck function in wavenumber form.
Definition: jurassic.h:655
double sfsza
Solar zenith angle at the surface [deg] (-999=auto).
Definition: jurassic.h:1015
int sftype
Surface treatment (0=none, 1=emissions, 2=downward, 3=solar).
Definition: jurassic.h:1012
Line-of-sight data.
Definition: jurassic.h:1125
double z[NLOS]
Altitude [km].
Definition: jurassic.h:1131
double eps[NLOS][ND]
Segment emissivity.
Definition: jurassic.h:1173
double sft
Surface temperature [K].
Definition: jurassic.h:1152
double lon[NLOS]
Longitude [deg].
Definition: jurassic.h:1134
int np
Number of LOS points.
Definition: jurassic.h:1128
double lat[NLOS]
Latitude [deg].
Definition: jurassic.h:1137
double src[NLOS][ND]
Segment source function [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1176
double sfeps[ND]
Surface emissivity.
Definition: jurassic.h:1155
Here is the call graph for this function:

◆ formod_rfm()

void formod_rfm ( const ctl_t ctl,
const atm_t atm,
obs_t obs 
)

Interface routine for the Reference Forward Model (RFM).

Prepares input data, executes the RFM executable, and imports simulated radiances and transmittances into the observation structure. The routine converts the atmospheric and geometric configuration from internal JURASSIC data structures into RFM-compatible driver and atmosphere files, then reads the RFM output spectra.

Parameters
[in]ctlControl structure defining model configuration, RFM executable path, HITRAN database, and spectral setup.
[in]atmAtmospheric state structure containing pressure, temperature, and gas profiles.
[in,out]obsObservation geometry and radiance data to be populated with RFM-computed radiances and transmittances.
Note
The function assumes identical observer positions across all ray paths and no extinction data in atm. It automatically determines whether the geometry is limb, nadir, or observer-based.
Adds appropriate RFM flags (e.g., RAD, TRA, MIX, CTM) based on the control settings. Temporary files such as rfm.drv, rfm.atm, and rad_*.asc are created and removed automatically.
See also
ctl_t, atm_t, obs_t, raytrace, write_atm_rfm, read_shape, read_obs_rfm, geo2cart, NORM, DOTP
Exceptions
ERRMSGon inconsistent geometry, failed I/O, or system call errors.
Warning
Requires external RFM binary; ensure ctl_t::rfmbin is set.

[Dudhia], A., "The Reference Forward Model (RFM)", JQSRT 186, 243–253 (2017)

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3604 of file jurassic.c.

3607 {
3608
3609 los_t *los;
3610
3611 FILE *out;
3612
3613 char cmd[2 * LEN], filename[2 * LEN],
3614 rfmflg[LEN] = { "RAD TRA MIX LIN SFC" };
3615
3616 double f[NSHAPE], nu[NSHAPE], nu0, nu1, obsz = -999, tsurf,
3617 xd[3], xo[3], xv[3], z[NR], zmin, zmax;
3618
3619 int n, nadir = 0;
3620
3621 /* Allocate... */
3622 ALLOC(los, los_t, 1);
3623
3624 /* Check observer positions... */
3625 for (int ir = 1; ir < obs->nr; ir++)
3626 if (obs->obsz[ir] != obs->obsz[0]
3627 || obs->obslon[ir] != obs->obslon[0]
3628 || obs->obslat[ir] != obs->obslat[0])
3629 ERRMSG("RFM interface requires identical observer positions!");
3630
3631 /* Check extinction data... */
3632 for (int iw = 0; iw < ctl->nw; iw++)
3633 for (int ip = 0; ip < atm->np; ip++)
3634 if (atm->k[iw][ip] != 0)
3635 ERRMSG("RFM interface cannot handle extinction data!");
3636
3637 /* Get altitude range of atmospheric data... */
3638 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
3639
3640 /* Observer within atmosphere? */
3641 if (obs->obsz[0] >= zmin && obs->obsz[0] <= zmax) {
3642 obsz = obs->obsz[0];
3643 strcat(rfmflg, " OBS");
3644 }
3645
3646 /* Determine tangent altitude or air mass factor... */
3647 for (int ir = 0; ir < obs->nr; ir++) {
3648
3649 /* Raytracing... */
3650 raytrace(ctl, atm, obs, los, ir);
3651
3652 /* Nadir? */
3653 if (obs->tpz[ir] <= zmin) {
3654 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xo);
3655 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xv);
3656 for (int i = 0; i < 3; i++)
3657 xd[i] = xo[i] - xv[i];
3658 z[ir] = NORM(xo) * NORM(xd) / DOTP(xo, xd);
3659 nadir++;
3660 } else
3661 z[ir] = obs->tpz[ir];
3662 }
3663 if (nadir > 0 && nadir < obs->nr)
3664 ERRMSG("Limb and nadir not simultaneously possible!");
3665
3666 /* Nadir? */
3667 if (nadir)
3668 strcat(rfmflg, " NAD");
3669
3670 /* Get surface temperature... */
3671 tsurf = atm->t[gsl_stats_min_index(atm->z, 1, (size_t) atm->np)];
3672
3673 /* Refraction? */
3674 if (!nadir && !ctl->refrac)
3675 strcat(rfmflg, " GEO");
3676
3677 /* Continua? */
3678 if (ctl->ctm_co2 || ctl->ctm_h2o || ctl->ctm_n2 || ctl->ctm_o2)
3679 strcat(rfmflg, " CTM");
3680
3681 /* Write atmospheric data file... */
3682 write_atm_rfm("rfm.atm", ctl, atm);
3683
3684 /* Loop over channels... */
3685 for (int id = 0; id < ctl->nd; id++) {
3686
3687 /* Read filter function... */
3688 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3689 read_shape(filename, nu, f, &n);
3690
3691 /* Set spectral range... */
3692 nu0 = nu[0];
3693 nu1 = nu[n - 1];
3694
3695 /* Create RFM driver file... */
3696 if (!(out = fopen("rfm.drv", "w")))
3697 ERRMSG("Cannot create file!");
3698 fprintf(out, "*HDR\nRFM call by JURASSIC.\n");
3699 fprintf(out, "*FLG\n%s\n", rfmflg);
3700 fprintf(out, "*SPC\n%.4f %.4f 0.0005\n", nu0, nu1);
3701 fprintf(out, "*GAS\n");
3702 for (int ig = 0; ig < ctl->ng; ig++)
3703 fprintf(out, "%s\n", ctl->emitter[ig]);
3704 fprintf(out, "*ATM\nrfm.atm\n");
3705 fprintf(out, "*TAN\n");
3706 for (int ir = 0; ir < obs->nr; ir++)
3707 fprintf(out, "%g\n", z[ir]);
3708 fprintf(out, "*SFC\n%g 1.0\n", tsurf);
3709 if (obsz >= 0)
3710 fprintf(out, "*OBS\n%g\n", obsz);
3711 fprintf(out, "*HIT\n%s\n", ctl->rfmhit);
3712 fprintf(out, "*XSC\n");
3713 for (int ig = 0; ig < ctl->ng; ig++)
3714 if (ctl->rfmxsc[ig][0] != '-')
3715 fprintf(out, "%s\n", ctl->rfmxsc[ig]);
3716 fprintf(out, "*END\n");
3717 fclose(out);
3718
3719 /* Remove temporary files... */
3720 if (system("rm -f rfm.runlog rad_*.asc tra_*.asc"))
3721 ERRMSG("Cannot remove temporary files!");
3722
3723 /* Call RFM... */
3724 sprintf(cmd, "echo | %s", ctl->rfmbin);
3725 if (system(cmd))
3726 ERRMSG("Error while calling RFM!");
3727
3728 /* Read data... */
3729 for (int ir = 0; ir < obs->nr; ir++) {
3730 obs->rad[id][ir] = read_obs_rfm("rad", z[ir], nu, f, n) * 1e-5;
3731 obs->tau[id][ir] = read_obs_rfm("tra", z[ir], nu, f, n);
3732 }
3733 }
3734
3735 /* Remove temporary files... */
3736 if (system("rm -f rfm.drv rfm.atm rfm.runlog rad_*.asc tra_*.asc"))
3737 ERRMSG("Error while removing temporary files!");
3738
3739 /* Free... */
3740 free(los);
3741}
double read_obs_rfm(const char *basename, const double z, double *nu, double *f, int n)
Read and spectrally convolve an RFM output spectrum.
Definition: jurassic.c:5103
void write_atm_rfm(const char *filename, const ctl_t *ctl, const atm_t *atm)
Definition: jurassic.c:5985
void read_shape(const char *filename, double *x, double *y, int *n)
Read a two-column shape function from an ASCII file.
Definition: jurassic.c:5275
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:266
#define NSHAPE
Maximum number of shape function grid points.
Definition: jurassic.h:291
char rfmhit[LEN]
HITRAN file for RFM.
Definition: jurassic.h:1111
char tblbase[LEN]
Basename for table files and filter function files.
Definition: jurassic.h:1018
char rfmbin[LEN]
Path to RFM binary.
Definition: jurassic.h:1108
char rfmxsc[NG][LEN]
Emitter cross-section files for RFM.
Definition: jurassic.h:1114
int refrac
Take into account refractivity (0=no, 1=yes).
Definition: jurassic.h:1039
Here is the call graph for this function:

◆ formod_srcfunc()

void formod_srcfunc ( const ctl_t ctl,
const tbl_t tbl,
const double  t,
double *  src 
)

Interpolate the source function (Planck radiance) at a given temperature.

Computes source function values by linearly interpolating between precomputed Planck radiances in the lookup table. The resulting radiance spectrum corresponds to the input temperature and is stored in src for all spectral channels.

Parameters
[in]ctlControl structure defining the number of spectral channels.
[in]tblEmissivity and source-function lookup table containing Planck radiances (tbl_t::sr) and corresponding temperatures (tbl_t::st).
[in]tTemperature [K] for which the source function is evaluated.
[out]srcOutput array of interpolated source-function values [W·m⁻²·sr⁻¹·cm⁻¹] per spectral channel.
Note
Linear interpolation is used between the two nearest temperature grid points. The function does not extrapolate beyond the tabulated temperature range.
See also
ctl_t, tbl_t, LIN, locate_reg
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3745 of file jurassic.c.

3749 {
3750
3751 /* Determine index in temperature array... */
3752 const int it = locate_reg(tbl->st, TBLNS, t);
3753
3754 /* Interpolate Planck function value... */
3755 for (int id = 0; id < ctl->nd; id++)
3756 src[id] = LIN(tbl->st[it], tbl->sr[it][id],
3757 tbl->st[it + 1], tbl->sr[it + 1][id], t);
3758}
#define TBLNS
Maximum number of source function temperature levels.
Definition: jurassic.h:316
double sr[TBLNS][ND]
Source function radiance [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1348
double st[TBLNS]
Source function temperature [K].
Definition: jurassic.h:1345
Here is the call graph for this function:

◆ geo2cart()

void geo2cart ( const double  z,
const double  lon,
const double  lat,
double *  x 
)

Converts geographic coordinates (longitude, latitude, altitude) to Cartesian coordinates.

This function converts geographic coordinates specified by longitude, latitude, and altitude into Cartesian coordinates. The Earth is approximated as a sphere with radius defined by the constant RE.

Parameters
zThe altitude above the Earth's surface in kilometers.
lonThe longitude in degrees.
latThe latitude in degrees.
xPointer to an array of three doubles where the computed Cartesian coordinates (x, y, z) will be stored.

The function computes the Cartesian coordinates using the given altitude, longitude, and latitude. It assumes the Earth is a perfect sphere and uses the following formulas:

  • \( x = (\textrm{radius}) \cos(\textrm{lat in radians}) \cos(\textrm{lon in radians}) \)
  • \( y = (\textrm{radius}) \cos(\textrm{lat in radians}) \sin(\textrm{lon in radians}) \)
  • \( z = (\textrm{radius}) \sin(\textrm{lat in radians}) \)
Note
The constant RE is defined as the Earth's radius in kilometers.
Longitude and latitude should be in degrees.
See also
https://en.wikipedia.org/wiki/Geographic_coordinate_conversion
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3762 of file jurassic.c.

3766 {
3767
3768 const double radius = z + RE;
3769
3770 const double latrad = lat / 180. * M_PI;
3771 const double lonrad = lon / 180. * M_PI;
3772
3773 const double coslat = cos(latrad);
3774
3775 x[0] = radius * coslat * cos(lonrad);
3776 x[1] = radius * coslat * sin(lonrad);
3777 x[2] = radius * sin(latrad);
3778}

◆ hydrostatic()

void hydrostatic ( const ctl_t ctl,
atm_t atm 
)

Adjust pressure profile using the hydrostatic equation.

Recomputes the atmospheric pressure field to ensure hydrostatic equilibrium with respect to altitude and temperature. Starting from a reference altitude (ctl_t::hydz), the routine integrates the hydrostatic balance equation both upward and downward through the profile using small interpolation steps.

The air density is corrected for humidity using the mean molecular mass of dry air and water vapor.

Parameters
[in]ctlControl structure providing model constants and reference altitude (ctl_t::hydz) and H₂O index (ctl_t::ig_h2o).
[in,out]atmAtmospheric state; input temperatures, heights, and humidities are used to update pressure [hPa].
Note
The integration is performed in log-pressure space assuming hydrostatic balance: \( \frac{dp}{dz} = -\rho g \),
using 20 linear substeps between adjacent levels.
See also
ctl_t, atm_t, LIN, G0, RI
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3782 of file jurassic.c.

3784 {
3785
3786 const double mmair = 28.96456e-3, mmh2o = 18.0153e-3;
3787
3788 const int ipts = 20;
3789
3790 double dzmin = 1e99, e = 0;
3791
3792 int ipref = 0;
3793
3794 /* Check reference height... */
3795 if (ctl->hydz < 0)
3796 return;
3797
3798 /* Find air parcel next to reference height... */
3799 for (int ip = 0; ip < atm->np; ip++)
3800 if (fabs(atm->z[ip] - ctl->hydz) < dzmin) {
3801 dzmin = fabs(atm->z[ip] - ctl->hydz);
3802 ipref = ip;
3803 }
3804
3805 /* Upper part of profile... */
3806 for (int ip = ipref + 1; ip < atm->np; ip++) {
3807 double mean = 0;
3808 for (int i = 0; i < ipts; i++) {
3809 if (ctl->ig_h2o >= 0)
3810 e = LIN(0.0, atm->q[ctl->ig_h2o][ip - 1],
3811 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3812 mean += (e * mmh2o + (1 - e) * mmair)
3813 * G0 / RI
3814 / LIN(0.0, atm->t[ip - 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3815 }
3816
3817 /* Compute p(z,T)... */
3818 atm->p[ip] =
3819 exp(log(atm->p[ip - 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip - 1]));
3820 }
3821
3822 /* Lower part of profile... */
3823 for (int ip = ipref - 1; ip >= 0; ip--) {
3824 double mean = 0;
3825 for (int i = 0; i < ipts; i++) {
3826 if (ctl->ig_h2o >= 0)
3827 e = LIN(0.0, atm->q[ctl->ig_h2o][ip + 1],
3828 ipts - 1.0, atm->q[ctl->ig_h2o][ip], (double) i);
3829 mean += (e * mmh2o + (1 - e) * mmair)
3830 * G0 / RI
3831 / LIN(0.0, atm->t[ip + 1], ipts - 1.0, atm->t[ip], (double) i) / ipts;
3832 }
3833
3834 /* Compute p(z,T)... */
3835 atm->p[ip] =
3836 exp(log(atm->p[ip + 1]) - mean * 1000 * (atm->z[ip] - atm->z[ip + 1]));
3837 }
3838}
#define G0
Standard gravity [m/s^2].
Definition: jurassic.h:147
#define RI
Ideal gas constant [J/(mol K)].
Definition: jurassic.h:192
double hydz
Reference height for hydrostatic pressure profile (-999 to skip) [km].
Definition: jurassic.h:1024

◆ idx2name()

void idx2name ( const ctl_t ctl,
const int  idx,
char *  quantity 
)

Convert a quantity index to a descriptive name string.

Translates a model quantity index (e.g., pressure, temperature, gas mixing ratio, extinction, or surface parameter) into a human-readable name. The function uses the index mapping defined in the control structure to assign appropriate labels.

Parameters
[in]ctlControl structure containing gas, window, cloud, and surface setup information.
[in]idxQuantity index (see IDXP, IDXT, IDXQ, IDXK, etc.).
[out]quantityCharacter buffer to receive the descriptive quantity name (e.g., "PRESSURE", "H2O", "CLOUD_HEIGHT", "SURFACE_EMISSIVITY_1000.0").
Note
The function writes directly to quantity using sprintf(). The caller must ensure sufficient buffer size (≥ LEN).
See also
ctl_t, IDXP, IDXT, IDXQ, IDXK, IDXCLZ, IDXCLDZ, IDXCLK, IDXSFT, IDXSFEPS
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3842 of file jurassic.c.

3845 {
3846
3847 if (idx == IDXP)
3848 sprintf(quantity, "PRESSURE");
3849
3850 if (idx == IDXT)
3851 sprintf(quantity, "TEMPERATURE");
3852
3853 for (int ig = 0; ig < ctl->ng; ig++)
3854 if (idx == IDXQ(ig))
3855 sprintf(quantity, "%s", ctl->emitter[ig]);
3856
3857 for (int iw = 0; iw < ctl->nw; iw++)
3858 if (idx == IDXK(iw))
3859 sprintf(quantity, "EXTINCT_WINDOW_%d", iw);
3860
3861 if (idx == IDXCLZ)
3862 sprintf(quantity, "CLOUD_HEIGHT");
3863
3864 if (idx == IDXCLDZ)
3865 sprintf(quantity, "CLOUD_DEPTH");
3866
3867 for (int icl = 0; icl < ctl->ncl; icl++)
3868 if (idx == IDXCLK(icl))
3869 sprintf(quantity, "CLOUD_EXTINCT_%.4f", ctl->clnu[icl]);
3870
3871 if (idx == IDXSFT)
3872 sprintf(quantity, "SURFACE_TEMPERATURE");
3873
3874 for (int isf = 0; isf < ctl->nsf; isf++)
3875 if (idx == IDXSFEPS(isf))
3876 sprintf(quantity, "SURFACE_EMISSIVITY_%.4f", ctl->sfnu[isf]);
3877}
double sfnu[NSF]
Surface layer wavenumber [cm^-1].
Definition: jurassic.h:1009
double clnu[NCL]
Cloud layer wavenumber [cm^-1].
Definition: jurassic.h:1003

◆ init_srcfunc()

void init_srcfunc ( const ctl_t ctl,
tbl_t tbl 
)

Initialize the source-function (Planck radiance) lookup table.

Computes channel-averaged Planck radiances for a range of temperatures and stores them in the source-function table. For each spectral channel, the Planck function is integrated over the instrument filter function defined in the corresponding filter file (*.filt).

Parameters
[in]ctlControl structure defining spectral channels and table base name.
[out]tblEmissivity and source-function lookup table to populate.
Note
The source function is tabulated for TBLNS temperature levels uniformly distributed between TMIN and TMAX. Integration over the spectral response is performed using linear interpolation and uniform grid spacing.
See also
ctl_t, tbl_t, read_shape, locate_irr, LIN, PLANCK, TBLNS, TMIN, TMAX
Parallelization
Implemented with OpenMP to compute each temperature level concurrently.
Output
Writes diagnostic information via LOG at verbosity levels 1 and 2.
Warning
Requires valid filter files named <tblbase>_<wavenumber>.filt.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3881 of file jurassic.c.

3883 {
3884
3885 char filename[2 * LEN];
3886
3887 double f[NSHAPE], nu[NSHAPE];
3888
3889 int n;
3890
3891 /* Write info... */
3892 LOG(1, "Initialize source function table...");
3893 LOG(2, "Number of data points: %d", TBLNS);
3894
3895 /* Loop over channels... */
3896 for (int id = 0; id < ctl->nd; id++) {
3897
3898 /* Read filter function... */
3899 sprintf(filename, "%s_%.4f.filt", ctl->tblbase, ctl->nu[id]);
3900 read_shape(filename, nu, f, &n);
3901
3902 /* Get minimum grid spacing... */
3903 double dnu = 1.0;
3904 for (int i = 1; i < n; i++)
3905 dnu = MIN(dnu, nu[i] - nu[i - 1]);
3906
3907 /* Compute source function table... */
3908#pragma omp parallel for default(none) shared(ctl,tbl,id,nu,f,n,dnu)
3909 for (int it = 0; it < TBLNS; it++) {
3910
3911 /* Set temperature... */
3912 tbl->st[it] = LIN(0.0, TMIN, TBLNS - 1.0, TMAX, (double) it);
3913
3914 /* Integrate Planck function... */
3915 double fsum = tbl->sr[it][id] = 0;
3916 for (double fnu = nu[0]; fnu <= nu[n - 1]; fnu += dnu) {
3917 const int i = locate_irr(nu, n, fnu);
3918 const double ff = LIN(nu[i], f[i], nu[i + 1], f[i + 1], fnu);
3919 fsum += ff;
3920 tbl->sr[it][id] += ff * PLANCK(tbl->st[it], fnu);
3921 }
3922 tbl->sr[it][id] /= fsum;
3923 }
3924
3925 /* Write info... */
3926 LOG(2,
3927 "channel= %.4f cm^-1 | T= %g ... %g K | B= %g ... %g W/(m^2 sr cm^-1)",
3928 ctl->nu[id], tbl->st[0], tbl->st[TBLNS - 1], tbl->sr[0][id],
3929 tbl->sr[TBLNS - 1][id]);
3930 }
3931}
#define LOG(level,...)
Print a log message with a specified logging level.
Definition: jurassic.h:794
#define TMAX
Maximum temperature for source function [K].
Definition: jurassic.h:207
#define TMIN
Minimum temperature for source function [K].
Definition: jurassic.h:202
Here is the call graph for this function:

◆ intpol_atm()

void intpol_atm ( const ctl_t ctl,
const atm_t atm,
const double  z,
double *  p,
double *  t,
double *  q,
double *  k 
)

Interpolate atmospheric state variables at a given altitude.

Computes pressure, temperature, volume mixing ratios, and extinction coefficients at the specified altitude by interpolating between adjacent model levels in the atmospheric profile.

Parameters
[in]ctlControl structure defining the number of gases (ctl_t::ng) and spectral windows (ctl_t::nw).
[in]atmAtmospheric profile providing altitude, pressure, temperature, gas mixing ratios, and extinction data.
[in]zTarget altitude [km].
[out]pInterpolated pressure [hPa].
[out]tInterpolated temperature [K].
[out]qInterpolated gas volume mixing ratios [ppv], length ctl_t::ng.
[out]kInterpolated extinction coefficients [km⁻¹], length ctl_t::nw.
Note
Pressure is interpolated logarithmically using LOGY, while other quantities use linear interpolation (LIN).
See also
ctl_t, atm_t, locate_irr, LIN, LOGY
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3935 of file jurassic.c.

3942 {
3943
3944 /* Get array index... */
3945 const int ip = locate_irr(atm->z, atm->np, z);
3946
3947 /* Interpolate... */
3948 *p = LOGY(atm->z[ip], atm->p[ip], atm->z[ip + 1], atm->p[ip + 1], z);
3949 *t = LIN(atm->z[ip], atm->t[ip], atm->z[ip + 1], atm->t[ip + 1], z);
3950 for (int ig = 0; ig < ctl->ng; ig++)
3951 q[ig] =
3952 LIN(atm->z[ip], atm->q[ig][ip], atm->z[ip + 1], atm->q[ig][ip + 1], z);
3953 for (int iw = 0; iw < ctl->nw; iw++)
3954 k[iw] =
3955 LIN(atm->z[ip], atm->k[iw][ip], atm->z[ip + 1], atm->k[iw][ip + 1], z);
3956}
Here is the call graph for this function:

◆ intpol_tbl_cga()

void intpol_tbl_cga ( const ctl_t ctl,
const tbl_t tbl,
const los_t los,
const int  ip,
double  tau_path[ND][NG],
double  tau_seg[ND] 
)

Interpolate emissivities and transmittances using the Curtis–Godson approximation (CGA).

Computes gas transmittance along a line-of-sight segment by interpolating precomputed emissivity values from lookup tables. The interpolation is performed in pressure, temperature, and column density space using bilinear (in p, T) and logarithmic (in p) interpolation.

Parameters
[in]ctlControl structure defining number of gases (ctl_t::ng) and channels (ctl_t::nd).
[in]tblEmissivity lookup tables (tbl_t) containing tabulated pressure, temperature, and column density grids.
[in]losLine-of-sight structure providing Curtis–Godson mean parameters and column densities.
[in]ipIndex of the current LOS point.
[in,out]tau_pathPath transmittance array [nd][ng]; updated cumulatively for each gas.
[out]tau_segTotal segment transmittance per channel [nd].
  • Uses pretabulated emissivity data (tbl->eps) for each gas and channel.
  • Applies logarithmic interpolation in pressure (LOGX) and linear interpolation in temperature (LIN).
  • Enforces emissivity limits in the range [0, 1].
  • Returns unity transmittance if data are missing or column density ≤ 0.
See also
ctl_t, tbl_t, los_t, intpol_tbl_eps, LIN, LOGX, locate_irr, locate_reg
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 3960 of file jurassic.c.

3966 {
3967
3968 double eps;
3969
3970 /* Loop over channels... */
3971 for (int id = 0; id < ctl->nd; id++) {
3972
3973 /* Initialize... */
3974 tau_seg[id] = 1;
3975
3976 /* Loop over emitters.... */
3977 for (int ig = 0; ig < ctl->ng; ig++) {
3978
3979 /* Check size of table (pressure) and column density... */
3980 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
3981 eps = 0;
3982
3983 /* Check transmittance... */
3984 else if (tau_path[id][ig] < 1e-9)
3985 eps = 1;
3986
3987 /* Interpolate... */
3988 else {
3989
3990 /* Determine pressure and temperature indices... */
3991 const int ipr =
3992 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->cgp[ip][ig]);
3993 const int it0 = locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr],
3994 los->cgt[ip][ig]);
3995 const int it1 =
3996 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
3997 los->cgt[ip][ig]);
3998
3999 /* Check size of table (temperature and column density)... */
4000 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4001 || tbl->nu[id][ig][ipr][it0] < 2
4002 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4003 || tbl->nu[id][ig][ipr + 1][it1] < 2
4004 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4005 eps = 0;
4006
4007 else {
4008
4009 /* Get emissivities of extended path... */
4010 double eps00
4011 = intpol_tbl_eps(tbl, ig, id, ipr, it0, los->cgu[ip][ig]);
4012 double eps01 =
4013 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, los->cgu[ip][ig]);
4014 double eps10 =
4015 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, los->cgu[ip][ig]);
4016 double eps11 =
4017 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, los->cgu[ip][ig]);
4018
4019 /* Interpolate with respect to temperature... */
4020 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4021 tbl->t[id][ig][ipr][it0 + 1], eps01, los->cgt[ip][ig]);
4022 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4023 tbl->t[id][ig][ipr + 1][it1 + 1],
4024 eps11, los->cgt[ip][ig]);
4025
4026 /* Interpolate with respect to pressure... */
4027 eps00 = LOGX(tbl->p[id][ig][ipr], eps00,
4028 tbl->p[id][ig][ipr + 1], eps11, los->cgp[ip][ig]);
4029
4030 /* Check emissivity range... */
4031 eps00 = MAX(MIN(eps00, 1), 0);
4032
4033 /* Determine segment emissivity... */
4034 eps = 1 - (1 - eps00) / tau_path[id][ig];
4035 }
4036 }
4037
4038 /* Get transmittance of extended path... */
4039 tau_path[id][ig] *= (1 - eps);
4040
4041 /* Get segment transmittance... */
4042 tau_seg[id] *= (1 - eps);
4043 }
4044 }
4045}
double intpol_tbl_eps(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double u)
Interpolate emissivity from lookup tables as a function of column density.
Definition: jurassic.c:4145
#define LOGX(x0, y0, x1, y1, x)
Compute logarithmic interpolation in x.
Definition: jurassic.h:594
double cgu[NLOS][NG]
Curtis-Godson column density [molecules/cm^2].
Definition: jurassic.h:1170
double cgt[NLOS][NG]
Curtis-Godson temperature [K].
Definition: jurassic.h:1167
double cgp[NLOS][NG]
Curtis-Godson pressure [hPa].
Definition: jurassic.h:1164
double p[ND][NG][TBLNP]
Pressure [hPa].
Definition: jurassic.h:1333
int nu[ND][NG][TBLNP][TBLNT]
Number of column densities.
Definition: jurassic.h:1330
int nt[ND][NG][TBLNP]
Number of temperatures.
Definition: jurassic.h:1327
double t[ND][NG][TBLNP][TBLNT]
Temperature [K].
Definition: jurassic.h:1336
int np[ND][NG]
Number of pressure levels.
Definition: jurassic.h:1324
Here is the call graph for this function:

◆ intpol_tbl_ega()

void intpol_tbl_ega ( const ctl_t ctl,
const tbl_t tbl,
const los_t los,
const int  ip,
double  tau_path[ND][NG],
double  tau_seg[ND] 
)

Interpolate emissivities and transmittances using the Emissivity Growth Approximation (EGA).

Computes gas transmittance along a line-of-sight segment by interpolating emissivity values from lookup tables based on the Emissivity Growth Approximation (EGA). The interpolation is performed in pressure, temperature, and effective column density space derived from the local LOS properties.

Parameters
[in]ctlControl structure defining number of gases (ctl_t::ng) and channels (ctl_t::nd).
[in]tblEmissivity lookup tables (tbl_t) containing tabulated pressure, temperature, and column density grids.
[in]losLine-of-sight structure providing local pressure, temperature, and column density data.
[in]ipIndex of the current LOS point.
[in,out]tau_pathPath transmittance array [nd][ng]; updated cumulatively for each gas.
[out]tau_segTotal segment transmittance per channel [nd].
  • Uses pretabulated emissivity data (tbl->eps) and performs bilinear interpolation in pressure and temperature.
  • Column density interpolation is handled by intpol_tbl_u according to the emissivity growth relation.
  • Enforces emissivity limits within [0, 1].
  • Returns unity transmittance if lookup data are invalid or column density ≤ 0.
See also
ctl_t, tbl_t, los_t, intpol_tbl_u, intpol_tbl_eps, LIN, locate_irr, locate_reg
Note
Implements the EGA variant of the forward model, selected when ctl_t::formod = 1.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4049 of file jurassic.c.

4055 {
4056
4057 double eps, u;
4058
4059 /* Loop over channels... */
4060 for (int id = 0; id < ctl->nd; id++) {
4061
4062 /* Initialize... */
4063 tau_seg[id] = 1;
4064
4065 /* Loop over emitters.... */
4066 for (int ig = 0; ig < ctl->ng; ig++) {
4067
4068 /* Check size of table (pressure) and column density... */
4069 if (tbl->np[id][ig] < 30 || los->cgu[ip][ig] <= 0)
4070 eps = 0;
4071
4072 /* Check transmittance... */
4073 else if (tau_path[id][ig] < 1e-9)
4074 eps = 1;
4075
4076 /* Interpolate... */
4077 else {
4078
4079 /* Determine pressure and temperature indices... */
4080 const int ipr =
4081 locate_irr(tbl->p[id][ig], tbl->np[id][ig], los->p[ip]);
4082 const int it0 =
4083 locate_reg(tbl->t[id][ig][ipr], tbl->nt[id][ig][ipr], los->t[ip]);
4084 const int it1 =
4085 locate_reg(tbl->t[id][ig][ipr + 1], tbl->nt[id][ig][ipr + 1],
4086 los->t[ip]);
4087
4088 /* Check size of table (temperature and column density)... */
4089 if (tbl->nt[id][ig][ipr] < 2 || tbl->nt[id][ig][ipr + 1] < 2
4090 || tbl->nu[id][ig][ipr][it0] < 2
4091 || tbl->nu[id][ig][ipr][it0 + 1] < 2
4092 || tbl->nu[id][ig][ipr + 1][it1] < 2
4093 || tbl->nu[id][ig][ipr + 1][it1 + 1] < 2)
4094 eps = 0;
4095
4096 else {
4097
4098 /* Get emissivities of extended path... */
4099 u = intpol_tbl_u(tbl, ig, id, ipr, it0, 1 - tau_path[id][ig]);
4100 double eps00
4101 = intpol_tbl_eps(tbl, ig, id, ipr, it0, u + los->u[ip][ig]);
4102
4103 u = intpol_tbl_u(tbl, ig, id, ipr, it0 + 1, 1 - tau_path[id][ig]);
4104 double eps01 =
4105 intpol_tbl_eps(tbl, ig, id, ipr, it0 + 1, u + los->u[ip][ig]);
4106
4107 u = intpol_tbl_u(tbl, ig, id, ipr + 1, it1, 1 - tau_path[id][ig]);
4108 double eps10 =
4109 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1, u + los->u[ip][ig]);
4110
4111 u =
4112 intpol_tbl_u(tbl, ig, id, ipr + 1, it1 + 1, 1 - tau_path[id][ig]);
4113 double eps11 =
4114 intpol_tbl_eps(tbl, ig, id, ipr + 1, it1 + 1, u + los->u[ip][ig]);
4115
4116 /* Interpolate with respect to temperature... */
4117 eps00 = LIN(tbl->t[id][ig][ipr][it0], eps00,
4118 tbl->t[id][ig][ipr][it0 + 1], eps01, los->t[ip]);
4119 eps11 = LIN(tbl->t[id][ig][ipr + 1][it1], eps10,
4120 tbl->t[id][ig][ipr + 1][it1 + 1], eps11, los->t[ip]);
4121
4122 /* Interpolate with respect to pressure... */
4123 eps00 = LIN(tbl->p[id][ig][ipr], eps00,
4124 tbl->p[id][ig][ipr + 1], eps11, los->p[ip]);
4125
4126 /* Check emissivity range... */
4127 eps00 = MAX(MIN(eps00, 1), 0);
4128
4129 /* Determine segment emissivity... */
4130 eps = 1 - (1 - eps00) / tau_path[id][ig];
4131 }
4132 }
4133
4134 /* Get transmittance of extended path... */
4135 tau_path[id][ig] *= (1 - eps);
4136
4137 /* Get segment transmittance... */
4138 tau_seg[id] *= (1 - eps);
4139 }
4140 }
4141}
double intpol_tbl_u(const tbl_t *tbl, const int ig, const int id, const int ip, const int it, const double eps)
Interpolate column density from lookup tables as a function of emissivity.
Definition: jurassic.c:4177
Here is the call graph for this function:

◆ intpol_tbl_eps()

double intpol_tbl_eps ( const tbl_t tbl,
const int  ig,
const int  id,
const int  ip,
const int  it,
const double  u 
)
inline

Interpolate emissivity from lookup tables as a function of column density.

Retrieves the emissivity corresponding to a given column density u for a specific gas, channel, pressure level, and temperature index from the precomputed emissivity tables.

Parameters
[in]tblEmissivity lookup tables (tbl_t).
[in]igGas index.
[in]idChannel index.
[in]ipPressure level index.
[in]itTemperature level index.
[in]uColumn density [molecules/cm²].
Returns
Interpolated emissivity value in the range [0, 1].
  • Performs linear interpolation in column density between adjacent grid points using LIN.
  • Applies lower-bound extrapolation proportional to u for u < u_min.
  • Applies exponential upper-bound extrapolation ensuring asymptotic emissivity growth (eps → 1 as u → ∞).
  • The input arrays are taken from tbl->u and tbl->eps.
See also
tbl_t, LIN, locate_tbl
Note
Used by both the Curtis–Godson (CGA) and Emissivity Growth Approximation (EGA) interpolation schemes.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4145 of file jurassic.c.

4151 {
4152
4153 const int nu = tbl->nu[id][ig][ip][it];
4154 const float *u_arr = tbl->u[id][ig][ip][it];
4155 const float *eps_arr = tbl->eps[id][ig][ip][it];
4156
4157 const double u_min = u_arr[0];
4158 const double u_max = u_arr[nu - 1];
4159
4160 /* Lower boundary extrapolation... */
4161 if (u < u_min)
4162 return eps_arr[0] * u / u_min;
4163
4164 /* Upper boundary extrapolation... */
4165 if (u > u_max) {
4166 const double a = log(1.0 - eps_arr[nu - 1]) / u_max;
4167 return 1.0 - exp(a * u);
4168 }
4169
4170 /* Interpolation... */
4171 const int idx = locate_tbl(u_arr, nu, u);
4172 return LIN(u_arr[idx], eps_arr[idx], u_arr[idx + 1], eps_arr[idx + 1], u);
4173}
int locate_tbl(const float *xx, const int n, const double x)
Locate index for interpolation within emissivity table grids.
Definition: jurassic.c:4386
float eps[ND][NG][TBLNP][TBLNT][TBLNU]
Emissivity.
Definition: jurassic.h:1342
float u[ND][NG][TBLNP][TBLNT][TBLNU]
Column density [molecules/cm^2].
Definition: jurassic.h:1339
Here is the call graph for this function:

◆ intpol_tbl_u()

double intpol_tbl_u ( const tbl_t tbl,
const int  ig,
const int  id,
const int  ip,
const int  it,
const double  eps 
)
inline

Interpolate column density from lookup tables as a function of emissivity.

Returns the column density corresponding to a given emissivity eps for a specific gas, channel, pressure level, and temperature index from the precomputed emissivity tables.

Parameters
[in]tblEmissivity lookup tables (tbl_t).
[in]igGas index.
[in]idChannel index.
[in]ipPressure level index.
[in]itTemperature level index.
[in]epsEmissivity value (0–1).
Returns
Interpolated column density [molecules/cm²].
  • Performs linear interpolation in emissivity between adjacent table entries using LIN.
  • For eps < eps_min, applies linear extrapolation proportional to emissivity.
  • For eps > eps_max, applies exponential extrapolation following the emissivity growth law.
  • The lookup is performed using tbl->eps and tbl->u.
See also
tbl_t, LIN, locate_tbl
Note
Used in the Emissivity Growth Approximation (EGA) to determine effective column density from transmittance.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4177 of file jurassic.c.

4183 {
4184
4185 const int nu = tbl->nu[id][ig][ip][it];
4186 const float *eps_arr = tbl->eps[id][ig][ip][it];
4187 const float *u_arr = tbl->u[id][ig][ip][it];
4188
4189 const double eps_min = eps_arr[0];
4190 const double eps_max = eps_arr[nu - 1];
4191
4192 /* Lower boundary extrapolation... */
4193 if (eps < eps_min)
4194 return u_arr[0] * eps / eps_min;
4195
4196 /* Upper boundary extrapolation... */
4197 if (eps > eps_max) {
4198 const double a = log(1.0 - eps_max) / u_arr[nu - 1];
4199 return log(1.0 - eps) / a;
4200 }
4201
4202 /* Interpolation... */
4203 const int idx = locate_tbl(eps_arr, nu, eps);
4204 return LIN(eps_arr[idx], u_arr[idx], eps_arr[idx + 1], u_arr[idx + 1], eps);
4205}
Here is the call graph for this function:

◆ jsec2time()

void jsec2time ( const double  jsec,
int *  year,
int *  mon,
int *  day,
int *  hour,
int *  min,
int *  sec,
double *  remain 
)

Converts Julian seconds to calendar date and time components.

This function converts Julian seconds to calendar date and time components, including year, month, day, hour, minute, and second. It also calculates the fractional part of the seconds.

Parameters
jsecJulian seconds to convert.
yearPointer to store the year.
monPointer to store the month.
dayPointer to store the day.
hourPointer to store the hour.
minPointer to store the minute.
secPointer to store the second.
remainPointer to store the fractional part of seconds.

The function initializes a time structure t0 with a fixed starting date and time. It then converts the Julian seconds to a time_t type by adding the seconds to the epoch time. Next, it converts the time_t value to a UTC time structure t1. Finally, it extracts the year, month, day, hour, minute, and second components from t1 and calculates the fractional part of seconds, which is stored in remain.

Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4209 of file jurassic.c.

4217 {
4218
4219 struct tm t0, *t1;
4220
4221 t0.tm_year = 100;
4222 t0.tm_mon = 0;
4223 t0.tm_mday = 1;
4224 t0.tm_hour = 0;
4225 t0.tm_min = 0;
4226 t0.tm_sec = 0;
4227
4228 time_t jsec0 = (time_t) jsec + timegm(&t0);
4229 t1 = gmtime(&jsec0);
4230
4231 *year = t1->tm_year + 1900;
4232 *mon = t1->tm_mon + 1;
4233 *day = t1->tm_mday;
4234 *hour = t1->tm_hour;
4235 *min = t1->tm_min;
4236 *sec = t1->tm_sec;
4237 *remain = jsec - floor(jsec);
4238}

◆ kernel()

void kernel ( const ctl_t ctl,
const tbl_t tbl,
atm_t atm,
obs_t obs,
gsl_matrix *  k 
)

Compute the Jacobian (kernel) matrix by finite differences.

Evaluates the sensitivity of the simulated radiances to each element of the atmospheric state vector by perturbing one parameter at a time and re-running the forward model. The result is the Jacobian matrix \( K = \partial y / \partial x \), where y is the measurement vector and x is the state vector.

Parameters
[in]ctlControl structure defining retrieval configuration and model setup.
[in]tblEmissivity lookup tables used by the forward model.
[in]atmAtmospheric state vector and profile data.
[in]obsObservation geometry and radiance data.
[out]kJacobian matrix [m×n], where m is the number of measurements and n the number of state variables.
  • The undisturbed forward model is first computed to obtain the reference measurement vector.
  • Each state vector element is perturbed by an adaptive step h depending on its physical type (pressure, temperature, VMR, etc.).
  • For each perturbation, the forward model is re-evaluated, and the corresponding column of K is estimated using finite differences.
  • Parallelized over state vector elements using OpenMP.
Note
Typical perturbation sizes:
  • Pressure: 1 % or ≥ 1e–7 hPa
  • Temperature: 1 K
  • VMR: 1 % or ≥ 1e–15
  • Extinction: 1e–4 km⁻¹
  • Cloud and surface parameters: 1 K or 1e–2 as appropriate.
See also
ctl_t, tbl_t, atm_t, obs_t, formod, x2atm, atm2x, obs2y, copy_atm, copy_obs
Warning
Computationally intensive; requires one forward model evaluation per state vector element.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4242 of file jurassic.c.

4247 {
4248
4249 int *iqa;
4250
4251 /* Get sizes... */
4252 const size_t m = k->size1;
4253 const size_t n = k->size2;
4254
4255 /* Allocate... */
4256 gsl_vector *x0 = gsl_vector_alloc(n);
4257 gsl_vector *yy0 = gsl_vector_alloc(m);
4258 ALLOC(iqa, int,
4259 N);
4260
4261 /* Compute radiance for undisturbed atmospheric data... */
4262 formod(ctl, tbl, atm, obs);
4263
4264 /* Compose vectors... */
4265 atm2x(ctl, atm, x0, iqa, NULL);
4266 obs2y(ctl, obs, yy0, NULL, NULL);
4267
4268 /* Initialize kernel matrix... */
4269 gsl_matrix_set_zero(k);
4270
4271 /* Loop over state vector elements... */
4272#pragma omp parallel for default(none) shared(ctl,tbl,atm,obs,k,x0,yy0,n,m,iqa)
4273 for (size_t j = 0; j < n; j++) {
4274
4275 /* Allocate... */
4276 atm_t *atm1;
4277 obs_t *obs1;
4278 ALLOC(atm1, atm_t, 1);
4279 ALLOC(obs1, obs_t, 1);
4280 gsl_vector *x1 = gsl_vector_alloc(n);
4281 gsl_vector *yy1 = gsl_vector_alloc(m);
4282
4283 /* Set perturbation size... */
4284 double h;
4285 if (iqa[j] == IDXP)
4286 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-7);
4287 else if (iqa[j] == IDXT)
4288 h = 1.0;
4289 else if (iqa[j] >= IDXQ(0) && iqa[j] < IDXQ(ctl->ng))
4290 h = MAX(fabs(0.01 * gsl_vector_get(x0, j)), 1e-15);
4291 else if (iqa[j] >= IDXK(0) && iqa[j] < IDXK(ctl->nw))
4292 h = 1e-4;
4293 else if (iqa[j] == IDXCLZ || iqa[j] == IDXCLDZ)
4294 h = 1.0;
4295 else if (iqa[j] >= IDXCLK(0) && iqa[j] < IDXCLK(ctl->ncl))
4296 h = 1e-4;
4297 else if (iqa[j] == IDXSFT)
4298 h = 1.0;
4299 else if (iqa[j] >= IDXSFEPS(0) && iqa[j] < IDXSFEPS(ctl->nsf))
4300 h = 1e-2;
4301 else
4302 ERRMSG("Cannot set perturbation size!");
4303
4304 /* Disturb state vector element... */
4305 gsl_vector_memcpy(x1, x0);
4306 gsl_vector_set(x1, j, gsl_vector_get(x1, j) + h);
4307 copy_atm(ctl, atm1, atm, 0);
4308 copy_obs(ctl, obs1, obs, 0);
4309 x2atm(ctl, x1, atm1);
4310
4311 /* Compute radiance for disturbed atmospheric data... */
4312 formod(ctl, tbl, atm1, obs1);
4313
4314 /* Compose measurement vector for disturbed radiance data... */
4315 obs2y(ctl, obs1, yy1, NULL, NULL);
4316
4317 /* Compute derivatives... */
4318 for (size_t i = 0; i < m; i++)
4319 gsl_matrix_set(k, i, j,
4320 (gsl_vector_get(yy1, i) - gsl_vector_get(yy0, i)) / h);
4321
4322 /* Free... */
4323 gsl_vector_free(x1);
4324 gsl_vector_free(yy1);
4325 free(atm1);
4326 free(obs1);
4327 }
4328
4329 /* Free... */
4330 gsl_vector_free(x0);
4331 gsl_vector_free(yy0);
4332 free(iqa);
4333}
void x2atm(const ctl_t *ctl, const gsl_vector *x, atm_t *atm)
Definition: jurassic.c:6460
void formod(const ctl_t *ctl, const tbl_t *tbl, atm_t *atm, obs_t *obs)
Execute the selected forward model.
Definition: jurassic.c:3318
size_t obs2y(const ctl_t *ctl, const obs_t *obs, gsl_vector *y, int *ida, int *ira)
Convert observation radiances into a measurement vector.
Definition: jurassic.c:4483
size_t atm2x(const ctl_t *ctl, const atm_t *atm, gsl_vector *x, int *iqa, int *ipa)
Convert atmospheric data to state vector elements.
Definition: jurassic.c:110
Here is the call graph for this function:

◆ locate_irr()

int locate_irr ( const double *  xx,
const int  n,
const double  x 
)

Locate index for interpolation on an irregular grid.

Finds the lower index ilo such that \( xx[ilo] \le x < xx[ilo+1] \) for monotonically increasing or decreasing grids.
Used in interpolation routines for altitude, pressure, temperature, or wavenumber profiles that are not evenly spaced.

Parameters
[in]xxArray of monotonic grid values (increasing or decreasing).
[in]nNumber of grid points.
[in]xTarget value to locate within the grid range.
Returns
Index ilo of the lower grid point surrounding x.
  • Uses a binary search algorithm with \( O(\log n) \) complexity.
  • Handles both increasing and decreasing grids automatically.
  • Returns the index of the lower neighbor suitable for use in interpolation routines such as LIN, LOGX, or LOGY.
See also
LIN, LOGX, LOGY, locate_reg, locate_tbl
Warning
Assumes x lies within the range of xx; no bounds checking beyond the first and last grid points is performed.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4337 of file jurassic.c.

4340 {
4341
4342 int ilo = 0;
4343 int ihi = n - 1;
4344 int i = (ihi + ilo) >> 1;
4345
4346 if (xx[i] < xx[i + 1])
4347 while (ihi > ilo + 1) {
4348 i = (ihi + ilo) >> 1;
4349 if (xx[i] > x)
4350 ihi = i;
4351 else
4352 ilo = i;
4353 } else
4354 while (ihi > ilo + 1) {
4355 i = (ihi + ilo) >> 1;
4356 if (xx[i] <= x)
4357 ihi = i;
4358 else
4359 ilo = i;
4360 }
4361
4362 return ilo;
4363}

◆ locate_reg()

int locate_reg ( const double *  xx,
const int  n,
const double  x 
)

Locate index for interpolation on a regular (uniform) grid.

Computes the lower index i such that \( xx[i] \le x < xx[i+1] \) for evenly spaced grid points. Used for quick index lookup when the grid spacing is constant.

Parameters
[in]xxArray of regularly spaced grid values.
[in]nNumber of grid points.
[in]xTarget value to locate within the grid range.
Returns
Index i of the lower grid point surrounding x.
  • Computes the index directly from the grid spacing using \( i = (x - xx_0) / (xx_1 - xx_0) \).
  • Clamps the result to [0, n - 2] to avoid out-of-bounds indices.
  • Suitable for use with uniform grids such as pressure, temperature, or wavelength tables.
See also
locate_irr, locate_tbl, LIN, LOGX, LOGY
Warning
Assumes uniform grid spacing; results are invalid for irregularly spaced arrays.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4367 of file jurassic.c.

4370 {
4371
4372 /* Calculate index... */
4373 const int i = (int) ((x - xx[0]) / (xx[1] - xx[0]));
4374
4375 /* Check range... */
4376 if (i < 0)
4377 return 0;
4378 else if (i > n - 2)
4379 return n - 2;
4380 else
4381 return i;
4382}

◆ locate_tbl()

int locate_tbl ( const float *  xx,
const int  n,
const double  x 
)
inline

Locate index for interpolation within emissivity table grids.

Finds the lower index ilo such that \( xx[ilo] \le x < xx[ilo+1] \) in a monotonically increasing single-precision grid.
Used for emissivity and column density interpolation in table-based routines such as intpol_tbl_eps and intpol_tbl_u.

Parameters
[in]xxMonotonic (increasing) single-precision grid array.
[in]nNumber of grid points.
[in]xTarget value to locate within the grid range.
Returns
Index ilo of the lower grid point surrounding x.
  • Implements a binary search with \( O(\log n) \) complexity.
  • Optimized for lookup tables stored in float to minimize memory use.
  • Returns an index suitable for linear interpolation with LIN.
See also
intpol_tbl_eps, intpol_tbl_u, LIN, locate_irr, locate_reg
Warning
Assumes monotonic grid input (increasing order) and that x lies within the table range.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4386 of file jurassic.c.

4389 {
4390
4391 int ilo = 0;
4392 int ihi = n - 1;
4393 int i = (ihi + ilo) >> 1;
4394
4395 while (ihi > ilo + 1) {
4396 i = (ihi + ilo) >> 1;
4397 if (xx[i] > x)
4398 ihi = i;
4399 else
4400 ilo = i;
4401 }
4402
4403 return ilo;
4404}

◆ matrix_invert()

void matrix_invert ( gsl_matrix *  a)
Examples
/github/workspace/src/jurassic.h.

Definition at line 4408 of file jurassic.c.

4409 {
4410
4411 size_t diag = 1;
4412
4413 /* Get size... */
4414 const size_t n = a->size1;
4415
4416 /* Check if matrix is diagonal... */
4417 for (size_t i = 0; i < n && diag; i++)
4418 for (size_t j = i + 1; j < n; j++)
4419 if (gsl_matrix_get(a, i, j) != 0) {
4420 diag = 0;
4421 break;
4422 }
4423
4424 /* Quick inversion of diagonal matrix... */
4425 if (diag)
4426 for (size_t i = 0; i < n; i++)
4427 gsl_matrix_set(a, i, i, 1 / gsl_matrix_get(a, i, i));
4428
4429 /* Matrix inversion by means of Cholesky decomposition... */
4430 else {
4431 gsl_linalg_cholesky_decomp(a);
4432 gsl_linalg_cholesky_invert(a);
4433 }
4434}

◆ matrix_product()

void matrix_product ( gsl_matrix *  a,
gsl_vector *  b,
int  transpose,
gsl_matrix *  c 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 4438 of file jurassic.c.

4442 {
4443
4444 /* Set sizes... */
4445 const size_t m = a->size1;
4446 const size_t n = a->size2;
4447
4448 /* Allocate... */
4449 gsl_matrix *aux = gsl_matrix_alloc(m, n);
4450
4451 /* Compute A^T B A... */
4452 if (transpose == 1) {
4453
4454 /* Compute B^1/2 A... */
4455 for (size_t i = 0; i < m; i++)
4456 for (size_t j = 0; j < n; j++)
4457 gsl_matrix_set(aux, i, j,
4458 gsl_vector_get(b, i) * gsl_matrix_get(a, i, j));
4459
4460 /* Compute A^T B A = (B^1/2 A)^T (B^1/2 A)... */
4461 gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0, aux, aux, 0.0, c);
4462 }
4463
4464 /* Compute A B A^T... */
4465 else if (transpose == 2) {
4466
4467 /* Compute A B^1/2... */
4468 for (size_t i = 0; i < m; i++)
4469 for (size_t j = 0; j < n; j++)
4470 gsl_matrix_set(aux, i, j,
4471 gsl_matrix_get(a, i, j) * gsl_vector_get(b, j));
4472
4473 /* Compute A B A^T = (A B^1/2) (A B^1/2)^T... */
4474 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1.0, aux, aux, 0.0, c);
4475 }
4476
4477 /* Free... */
4478 gsl_matrix_free(aux);
4479}

◆ obs2y()

size_t obs2y ( const ctl_t ctl,
const obs_t obs,
gsl_vector *  y,
int *  ida,
int *  ira 
)

Convert observation radiances into a measurement vector.

Extracts all finite radiance values from the observation structure and stores them sequentially in a GSL vector.
Optionally records detector (id) and ray path (ir) indices for each measurement element.

Parameters
[in]ctlControl structure containing observation setup (e.g. number of detectors).
[in]obsObservation data structure containing radiances.
[out]yMeasurement vector to store radiances (may be NULL).
[out]idaOptional array to store detector indices (may be NULL).
[out]iraOptional array to store ray path indices (may be NULL).
Returns
Number of valid (finite) radiance values added to the vector.
  • Loops over all detector channels (nd) and ray paths (nr).
  • Skips non-finite (NaN or Inf) radiance values.
  • Produces a compact measurement vector for use in retrievals and Jacobian computations.
See also
atm2x, x2atm, kernel, formod
Warning
Arrays ida and ira must be preallocated with sufficient size to hold all finite radiances if provided.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4483 of file jurassic.c.

4488 {
4489
4490 size_t m = 0;
4491
4492 /* Determine measurement vector... */
4493 for (int ir = 0; ir < obs->nr; ir++)
4494 for (int id = 0; id < ctl->nd; id++)
4495 if (isfinite(obs->rad[id][ir])) {
4496 if (y != NULL)
4497 gsl_vector_set(y, m, obs->rad[id][ir]);
4498 if (ida != NULL)
4499 ida[m] = id;
4500 if (ira != NULL)
4501 ira[m] = ir;
4502 m++;
4503 }
4504
4505 return m;
4506}

◆ raytrace()

void raytrace ( const ctl_t ctl,
const atm_t atm,
obs_t obs,
los_t los,
const int  ir 
)

Perform line-of-sight (LOS) ray tracing through the atmosphere.

Computes the geometric path of a viewing ray from the observer to the atmosphere (and possibly the surface), accounting for spherical geometry, optional refraction, and cloud or surface interactions.
Fills the LOS structure with pressure, temperature, gas concentrations, extinction, and path length at each step.

Parameters
[in]ctlControl structure containing model and numerical settings.
[in]atmAtmospheric state structure (profiles of p, T, q, k, etc.).
[in,out]obsObservation geometry and radiance data; updated tangent point.
[out]losLine-of-sight structure to be populated with sampled quantities.
[in]irIndex of the current ray path in the observation set.
  • Integrates along the viewing ray starting at the observer position.
  • Performs stepwise propagation with step length ds determined by altitude and user-specified controls (rayds, raydz).
  • Interpolates atmospheric variables at each step using intpol_atm.
  • Detects surface intersection or top-of-atmosphere exit and terminates accordingly.
  • Optionally accounts for refraction via the refractive index n(p, T).
  • Accumulates column densities and Curtis–Godson means for each gas.
  • Supports cloud extinction and surface emissivity interpolation.
Note
The routine enforces that atmospheric grids include the surface (z = 0 km). Rays starting above the atmosphere are propagated downward until entry.
See also
intpol_atm, tangent_point, formod_pencil, hydrostatic
Warning
  • Fails if the observer is below the surface or the atmosphere lacks z = 0.
  • Aborts if the number of LOS points exceeds NLOS.
  • Assumes monotonic altitude ordering in atmospheric data.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4510 of file jurassic.c.

4515 {
4516
4517 const double h = 0.02, zrefrac = 60;
4518
4519 double ex0[3], ex1[3], k[NW], lat, lon, n, ng[3], norm, p, q[NG], t,
4520 x[3], xh[3], xobs[3], xvp[3], z = 1e99, zmax, zmin;
4521
4522 int stop = 0;
4523
4524 /* Initialize... */
4525 los->np = 0;
4526 los->sft = -999;
4527 obs->tpz[ir] = obs->vpz[ir];
4528 obs->tplon[ir] = obs->vplon[ir];
4529 obs->tplat[ir] = obs->vplat[ir];
4530
4531 /* Get altitude range of atmospheric data... */
4532 gsl_stats_minmax(&zmin, &zmax, atm->z, 1, (size_t) atm->np);
4533
4534 /* Ensure that altitude grid includes the local geometric surface... */
4535 if (zmin > 1e-3 || zmin < -1e-3)
4536 ERRMSG("Atmospheric profiles must include surface level (z = 0 km)!");
4537
4538 /* Check observer altitude... */
4539 if (obs->obsz[ir] < zmin)
4540 ERRMSG("Observer below surface!");
4541
4542 /* Check view point altitude... */
4543 if (obs->vpz[ir] > zmax)
4544 return;
4545
4546 /* Determine Cartesian coordinates for observer and view point... */
4547 geo2cart(obs->obsz[ir], obs->obslon[ir], obs->obslat[ir], xobs);
4548 geo2cart(obs->vpz[ir], obs->vplon[ir], obs->vplat[ir], xvp);
4549
4550 /* Determine initial tangent vector... */
4551 for (int i = 0; i < 3; i++)
4552 ex0[i] = xvp[i] - xobs[i];
4553 norm = NORM(ex0);
4554 for (int i = 0; i < 3; i++)
4555 ex0[i] /= norm;
4556
4557 /* Observer within atmosphere... */
4558 for (int i = 0; i < 3; i++)
4559 x[i] = xobs[i];
4560
4561 /* Observer above atmosphere (search entry point)... */
4562 if (obs->obsz[ir] > zmax) {
4563 double dmax = norm, dmin = 0;
4564 while (fabs(dmin - dmax) > 0.001) {
4565 const double d = (dmax + dmin) / 2;
4566 for (int i = 0; i < 3; i++)
4567 x[i] = xobs[i] + d * ex0[i];
4568 cart2geo(x, &z, &lon, &lat);
4569 if (z <= zmax && z > zmax - 0.001)
4570 break;
4571 if (z < zmax - 0.0005)
4572 dmax = d;
4573 else
4574 dmin = d;
4575 }
4576 }
4577
4578 /* Ray-tracing... */
4579 while (1) {
4580
4581 /* Set step length... */
4582 double ds = ctl->rayds;
4583 if (ctl->raydz > 0) {
4584 norm = NORM(x);
4585 for (int i = 0; i < 3; i++)
4586 xh[i] = x[i] / norm;
4587 const double cosa = fabs(DOTP(ex0, xh));
4588 if (cosa != 0)
4589 ds = MIN(ctl->rayds, ctl->raydz / cosa);
4590 }
4591
4592 /* Determine geolocation... */
4593 cart2geo(x, &z, &lon, &lat);
4594
4595 /* Check if LOS hits the ground or has left atmosphere... */
4596 if (z < zmin || z > zmax) {
4597 stop = (z < zmin ? 2 : 1);
4598 const double frac =
4599 ((z <
4600 zmin ? zmin : zmax) - los->z[los->np - 1]) / (z - los->z[los->np -
4601 1]);
4602 geo2cart(los->z[los->np - 1], los->lon[los->np - 1],
4603 los->lat[los->np - 1], xh);
4604 for (int i = 0; i < 3; i++)
4605 x[i] = xh[i] + frac * (x[i] - xh[i]);
4606 cart2geo(x, &z, &lon, &lat);
4607 los->ds[los->np - 1] = ds * frac;
4608 ds = 0;
4609 }
4610
4611 /* Interpolate atmospheric data... */
4612 intpol_atm(ctl, atm, z, &p, &t, q, k);
4613
4614 /* Save data... */
4615 los->lon[los->np] = lon;
4616 los->lat[los->np] = lat;
4617 los->z[los->np] = z;
4618 los->p[los->np] = p;
4619 los->t[los->np] = t;
4620 for (int ig = 0; ig < ctl->ng; ig++)
4621 los->q[los->np][ig] = q[ig];
4622 for (int id = 0; id < ctl->nd; id++)
4623 los->k[los->np][id] = k[ctl->window[id]];
4624 los->ds[los->np] = ds;
4625
4626 /* Add cloud extinction... */
4627 if (ctl->ncl > 0 && atm->cldz > 0) {
4628 const double aux = exp(-0.5 * POW2((z - atm->clz) / atm->cldz));
4629 for (int id = 0; id < ctl->nd; id++) {
4630 const int icl = locate_irr(ctl->clnu, ctl->ncl, ctl->nu[id]);
4631 los->k[los->np][id]
4632 += aux * LIN(ctl->clnu[icl], atm->clk[icl],
4633 ctl->clnu[icl + 1], atm->clk[icl + 1], ctl->nu[id]);
4634 }
4635 }
4636
4637 /* Increment and check number of LOS points... */
4638 if ((++los->np) > NLOS)
4639 ERRMSG("Too many LOS points!");
4640
4641 /* Check stop flag... */
4642 if (stop) {
4643
4644 /* Set surface temperature... */
4645 if (ctl->nsf > 0 && atm->sft > 0)
4646 t = atm->sft;
4647 los->sft = (stop == 2 ? t : -999);
4648
4649 /* Set surface emissivity... */
4650 for (int id = 0; id < ctl->nd; id++) {
4651 los->sfeps[id] = 1.0;
4652 if (ctl->nsf > 0) {
4653 const int isf = locate_irr(ctl->sfnu, ctl->nsf, ctl->nu[id]);
4654 los->sfeps[id] = LIN(ctl->sfnu[isf], atm->sfeps[isf],
4655 ctl->sfnu[isf + 1], atm->sfeps[isf + 1],
4656 ctl->nu[id]);
4657 }
4658 }
4659
4660 /* Leave raytracer... */
4661 break;
4662 }
4663
4664 /* Determine refractivity... */
4665 if (ctl->refrac && z <= zrefrac)
4666 n = 1 + REFRAC(p, t);
4667 else
4668 n = 1;
4669
4670 /* Construct new tangent vector (first term)... */
4671 for (int i = 0; i < 3; i++)
4672 ex1[i] = ex0[i] * n;
4673
4674 /* Compute gradient of refractivity... */
4675 if (ctl->refrac && z <= zrefrac) {
4676 for (int i = 0; i < 3; i++)
4677 xh[i] = x[i] + 0.5 * ds * ex0[i];
4678 cart2geo(xh, &z, &lon, &lat);
4679 intpol_atm(ctl, atm, z, &p, &t, q, k);
4680 n = REFRAC(p, t);
4681 for (int i = 0; i < 3; i++) {
4682 xh[i] += h;
4683 cart2geo(xh, &z, &lon, &lat);
4684 intpol_atm(ctl, atm, z, &p, &t, q, k);
4685 ng[i] = (REFRAC(p, t) - n) / h;
4686 xh[i] -= h;
4687 }
4688 } else
4689 for (int i = 0; i < 3; i++)
4690 ng[i] = 0;
4691
4692 /* Construct new tangent vector (second term)... */
4693 for (int i = 0; i < 3; i++)
4694 ex1[i] += ds * ng[i];
4695
4696 /* Normalize new tangent vector... */
4697 norm = NORM(ex1);
4698 for (int i = 0; i < 3; i++)
4699 ex1[i] /= norm;
4700
4701 /* Determine next point of LOS... */
4702 for (int i = 0; i < 3; i++)
4703 x[i] += 0.5 * ds * (ex0[i] + ex1[i]);
4704
4705 /* Copy tangent vector... */
4706 for (int i = 0; i < 3; i++)
4707 ex0[i] = ex1[i];
4708 }
4709
4710 /* Get tangent point (to be done before changing segment lengths!)... */
4711 tangent_point(los, &obs->tpz[ir], &obs->tplon[ir], &obs->tplat[ir]);
4712
4713 /* Change segment lengths according to trapezoid rule... */
4714 for (int ip = los->np - 1; ip >= 1; ip--)
4715 los->ds[ip] = 0.5 * (los->ds[ip - 1] + los->ds[ip]);
4716 los->ds[0] *= 0.5;
4717
4718 /* Compute column density... */
4719 for (int ip = 0; ip < los->np; ip++)
4720 for (int ig = 0; ig < ctl->ng; ig++)
4721 los->u[ip][ig] = 10 * los->q[ip][ig] * los->p[ip]
4722 / (KB * los->t[ip]) * los->ds[ip];
4723
4724 /* Compute Curtis-Godson means... */
4725 for (int ig = 0; ig < ctl->ng; ig++) {
4726 los->cgu[0][ig] = los->u[0][ig];
4727 los->cgp[0][ig] = los->u[0][ig] * los->p[0];
4728 los->cgt[0][ig] = los->u[0][ig] * los->t[0];
4729 }
4730 for (int ip = 1; ip < los->np; ip++)
4731 for (int ig = 0; ig < ctl->ng; ig++) {
4732 los->cgu[ip][ig] = los->cgu[ip - 1][ig] + los->u[ip][ig];
4733 los->cgp[ip][ig] = los->cgp[ip - 1][ig] + los->u[ip][ig] * los->p[ip];
4734 los->cgt[ip][ig] = los->cgt[ip - 1][ig] + los->u[ip][ig] * los->t[ip];
4735 }
4736 for (int ip = 0; ip < los->np; ip++)
4737 for (int ig = 0; ig < ctl->ng; ig++)
4738 if (los->cgu[ip][ig] != 0) {
4739 los->cgp[ip][ig] /= los->cgu[ip][ig];
4740 los->cgt[ip][ig] /= los->cgu[ip][ig];
4741 }
4742}
void intpol_atm(const ctl_t *ctl, const atm_t *atm, const double z, double *p, double *t, double *q, double *k)
Interpolate atmospheric state variables at a given altitude.
Definition: jurassic.c:3935
void tangent_point(const los_t *los, double *tpz, double *tplon, double *tplat)
Determine the tangent point along a line of sight (LOS).
Definition: jurassic.c:5755
void cart2geo(const double *x, double *z, double *lon, double *lat)
Converts Cartesian coordinates to geographic coordinates.
Definition: jurassic.c:185
#define KB
Boltzmann constant [kg m^2/(K s^2)].
Definition: jurassic.h:157
#define REFRAC(p, T)
Compute air refractivity (n - 1).
Definition: jurassic.h:714
#define NLOS
Maximum number of LOS points.
Definition: jurassic.h:286
#define NW
Maximum number of spectral windows.
Definition: jurassic.h:261
int window[ND]
Window index of each channel.
Definition: jurassic.h:997
double rayds
Maximum step length for raytracing [km].
Definition: jurassic.h:1042
double raydz
Vertical step length for raytracing [km].
Definition: jurassic.h:1045
Here is the call graph for this function:

◆ read_atm()

void read_atm ( const char *  dirname,
const char *  filename,
const ctl_t ctl,
atm_t atm 
)

Read atmospheric profile data from an ASCII file.

Loads an atmospheric state profile into the atm_t structure from a text file containing altitude-dependent quantities such as pressure, temperature, volume mixing ratios, and extinction coefficients.
Optionally reads cloud and surface parameters for the first level.

Parameters
[in]dirnameDirectory containing the input file (may be NULL).
[in]filenameAtmospheric profile filename.
[in]ctlControl structure defining number of gases, windows, etc.
[out]atmAtmospheric data structure to be filled with profile data.
  • Each line of the input file must contain, in order:
    • time [s since 2000-01-01T00:00Z],
    • altitude [km],
    • longitude [deg],
    • latitude [deg],
    • pressure [hPa],
    • temperature [K],
    • gas volume mixing ratios [ppv] for ng emitters,
    • extinction coefficients [km⁻¹] for nw windows.
  • The first line may additionally contain cloud (clz, cldz, clk) and surface (sft, sfeps) parameters if enabled in ctl.
  • Performs consistency checks and logs value ranges for diagnostic output.
  • Fails if the number of profile points exceeds NP.
See also
atm_t, ctl_t, hydrostatic, formod, copy_atm
Warning
  • Expects monotonic altitude ordering (increasing z).
  • Cloud and surface parameters are only read for the first profile level.
  • Aborts if the file cannot be opened or parsed correctly.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4746 of file jurassic.c.

4750 {
4751
4752 FILE *in;
4753
4754 char file[LEN], line[LEN], *tok;
4755
4756 /* Init... */
4757 atm->np = 0;
4758
4759 /* Set filename... */
4760 if (dirname != NULL)
4761 sprintf(file, "%s/%s", dirname, filename);
4762 else
4763 sprintf(file, "%s", filename);
4764
4765 /* Write info... */
4766 LOG(1, "Read atmospheric data: %s", file);
4767
4768 /* Open file... */
4769 if (!(in = fopen(file, "r")))
4770 ERRMSG("Cannot open file!");
4771
4772 /* Read line... */
4773 while (fgets(line, LEN, in)) {
4774
4775 /* Read data... */
4776 TOK(line, tok, "%lg", atm->time[atm->np]);
4777 TOK(NULL, tok, "%lg", atm->z[atm->np]);
4778 TOK(NULL, tok, "%lg", atm->lon[atm->np]);
4779 TOK(NULL, tok, "%lg", atm->lat[atm->np]);
4780 TOK(NULL, tok, "%lg", atm->p[atm->np]);
4781 TOK(NULL, tok, "%lg", atm->t[atm->np]);
4782 for (int ig = 0; ig < ctl->ng; ig++)
4783 TOK(NULL, tok, "%lg", atm->q[ig][atm->np]);
4784 for (int iw = 0; iw < ctl->nw; iw++)
4785 TOK(NULL, tok, "%lg", atm->k[iw][atm->np]);
4786 if (ctl->ncl > 0 && atm->np == 0) {
4787 TOK(NULL, tok, "%lg", atm->clz);
4788 TOK(NULL, tok, "%lg", atm->cldz);
4789 for (int icl = 0; icl < ctl->ncl; icl++)
4790 TOK(NULL, tok, "%lg", atm->clk[icl]);
4791 }
4792 if (ctl->nsf > 0 && atm->np == 0) {
4793 TOK(NULL, tok, "%lg", atm->sft);
4794 for (int isf = 0; isf < ctl->nsf; isf++)
4795 TOK(NULL, tok, "%lg", atm->sfeps[isf]);
4796 }
4797
4798 /* Increment data point counter... */
4799 if ((++atm->np) > NP)
4800 ERRMSG("Too many data points!");
4801 }
4802
4803 /* Close file... */
4804 fclose(in);
4805
4806 /* Check number of points... */
4807 if (atm->np < 1)
4808 ERRMSG("Could not read any data!");
4809
4810 /* Write info... */
4811 double mini, maxi;
4812 LOG(2, "Number of data points: %d", atm->np);
4813 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
4814 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
4815 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
4816 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
4817 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
4818 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
4819 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
4820 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
4821 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
4822 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
4823 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
4824 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
4825 for (int ig = 0; ig < ctl->ng; ig++) {
4826 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
4827 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
4828 }
4829 for (int iw = 0; iw < ctl->nw; iw++) {
4830 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
4831 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
4832 }
4833 if (ctl->ncl > 0 && atm->np == 0) {
4834 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
4835 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
4836 } else
4837 LOG(2, "Cloud layer: none");
4838 if (ctl->nsf > 0 && atm->np == 0) {
4839 LOG(2,
4840 "Surface layer: T_s = %g K | eps= %g ... %g",
4841 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
4842 } else
4843 LOG(2, "Surface layer: none");
4844}
#define TOK(line, tok, format, var)
Tokenize a string and parse a variable.
Definition: jurassic.h:750
#define NP
Maximum number of atmospheric data points.
Definition: jurassic.h:246

◆ read_ctl()

void read_ctl ( int  argc,
char *  argv[],
ctl_t ctl 
)

Read model control parameters from command-line and configuration input.

Parses all numerical and string parameters required to initialize a JURASSIC simulation, including atmospheric composition, radiative channels, cloud and surface options, continua, ray-tracing setup, retrieval parameters, and output settings.
Populates the ctl_t structure with all configuration values.

Parameters
[in]argcArgument count from the command line.
[in]argvArgument vector containing user-specified options.
[out]ctlControl structure to be filled with parsed settings.
  • Uses scan_ctl to extract key–value pairs from the command line or control file.
  • Initializes:
    • Emitters and gases (NG, EMITTER),
    • Spectral channels (ND, NU, WINDOW),
    • Cloud parameters (NCL, CLNU),
    • Surface parameters (NSF, SFNU, SFTYPE, SFSZA),
    • Hydrostatic reference height (HYDZ),
    • Continuum flags (CTM_CO2, CTM_H2O, CTM_N2, CTM_O2),
    • Ray-tracing options (REFRAC, RAYDS, RAYDZ),
    • Field-of-view (FOV),
    • Retrieval limits (RETP_ZMIN, RETQ_ZMAX, etc.),
    • Output flags (WRITE_BBT, WRITE_MATRIX),
    • External forward model paths (RFMBIN, RFMHIT, RFMXSC).
  • Validates array bounds and logical parameter ranges.
  • Automatically detects major gas species indices (e.g. CO₂, H₂O, N₂, O₂).
  • Logs the executable name, version, and compilation time at startup.
See also
ctl_t, scan_ctl, find_emitter, read_shape, formod
Warning
  • Aborts if mandatory keys are missing or exceed defined limits (e.g. NG > NG_MAX).
  • Requires consistent index ordering (e.g. NCL > 1, NSF > 1).
  • Undefined or invalid parameters trigger ERRMSG() aborts.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4848 of file jurassic.c.

4851 {
4852
4853 /* Write info... */
4854 LOG(1, "\nJuelich Rapid Spectral Simulation Code (JURASSIC)\n"
4855 "(executable: %s | version: %s | compiled: %s, %s)\n",
4856 argv[0], VERSION, __DATE__, __TIME__);
4857
4858 /* Emitters... */
4859 ctl->ng = (int) scan_ctl(argc, argv, "NG", -1, "0", NULL);
4860 if (ctl->ng < 0 || ctl->ng > NG)
4861 ERRMSG("Set 0 <= NG <= MAX!");
4862 for (int ig = 0; ig < ctl->ng; ig++)
4863 scan_ctl(argc, argv, "EMITTER", ig, "", ctl->emitter[ig]);
4864 ctl->ig_co2 = find_emitter(ctl, "CO2");
4865 ctl->ig_h2o = find_emitter(ctl, "H2O");
4866 ctl->ig_n2 = find_emitter(ctl, "N2");
4867 ctl->ig_o2 = find_emitter(ctl, "O2");
4868
4869 /* Radiance channels... */
4870 ctl->nd = (int) scan_ctl(argc, argv, "ND", -1, "0", NULL);
4871 if (ctl->nd < 0 || ctl->nd > ND)
4872 ERRMSG("Set 0 <= ND <= MAX!");
4873 for (int id = 0; id < ctl->nd; id++)
4874 ctl->nu[id] = scan_ctl(argc, argv, "NU", id, "", NULL);
4875
4876 /* Spectral windows... */
4877 ctl->nw = (int) scan_ctl(argc, argv, "NW", -1, "1", NULL);
4878 if (ctl->nw < 0 || ctl->nw > NW)
4879 ERRMSG("Set 0 <= NW <= MAX!");
4880 for (int id = 0; id < ctl->nd; id++)
4881 ctl->window[id] = (int) scan_ctl(argc, argv, "WINDOW", id, "0", NULL);
4882
4883 /* Cloud data... */
4884 ctl->ncl = (int) scan_ctl(argc, argv, "NCL", -1, "0", NULL);
4885 if (ctl->ncl < 0 || ctl->ncl > NCL)
4886 ERRMSG("Set 0 <= NCL <= MAX!");
4887 if (ctl->ncl == 1)
4888 ERRMSG("Set NCL > 1!");
4889 for (int icl = 0; icl < ctl->ncl; icl++)
4890 ctl->clnu[icl] = scan_ctl(argc, argv, "CLNU", icl, "", NULL);
4891
4892 /* Surface data... */
4893 ctl->nsf = (int) scan_ctl(argc, argv, "NSF", -1, "0", NULL);
4894 if (ctl->nsf < 0 || ctl->nsf > NSF)
4895 ERRMSG("Set 0 <= NSF <= MAX!");
4896 if (ctl->nsf == 1)
4897 ERRMSG("Set NSF > 1!");
4898 for (int isf = 0; isf < ctl->nsf; isf++)
4899 ctl->sfnu[isf] = scan_ctl(argc, argv, "SFNU", isf, "", NULL);
4900 ctl->sftype = (int) scan_ctl(argc, argv, "SFTYPE", -1, "2", NULL);
4901 if (ctl->sftype < 0 || ctl->sftype > 3)
4902 ERRMSG("Set 0 <= SFTYPE <= 3!");
4903 ctl->sfsza = scan_ctl(argc, argv, "SFSZA", -1, "-999", NULL);
4904
4905 /* Emissivity look-up tables... */
4906 scan_ctl(argc, argv, "TBLBASE", -1, "-", ctl->tblbase);
4907 ctl->tblfmt = (int) scan_ctl(argc, argv, "TBLFMT", -1, "1", NULL);
4908
4909 /* Hydrostatic equilibrium... */
4910 ctl->hydz = scan_ctl(argc, argv, "HYDZ", -1, "-999", NULL);
4911
4912 /* Continua... */
4913 ctl->ctm_co2 = (int) scan_ctl(argc, argv, "CTM_CO2", -1, "1", NULL);
4914 ctl->ctm_h2o = (int) scan_ctl(argc, argv, "CTM_H2O", -1, "1", NULL);
4915 ctl->ctm_n2 = (int) scan_ctl(argc, argv, "CTM_N2", -1, "1", NULL);
4916 ctl->ctm_o2 = (int) scan_ctl(argc, argv, "CTM_O2", -1, "1", NULL);
4917
4918 /* Ray-tracing... */
4919 ctl->refrac = (int) scan_ctl(argc, argv, "REFRAC", -1, "1", NULL);
4920 ctl->rayds = scan_ctl(argc, argv, "RAYDS", -1, "10", NULL);
4921 ctl->raydz = scan_ctl(argc, argv, "RAYDZ", -1, "0.1", NULL);
4922
4923 /* Field of view... */
4924 scan_ctl(argc, argv, "FOV", -1, "-", ctl->fov);
4925 if (ctl->fov[0] != '-')
4926 read_shape(ctl->fov, ctl->fov_dz, ctl->fov_w, &ctl->fov_n);
4927
4928 /* Retrieval interface... */
4929 ctl->retp_zmin = scan_ctl(argc, argv, "RETP_ZMIN", -1, "-999", NULL);
4930 ctl->retp_zmax = scan_ctl(argc, argv, "RETP_ZMAX", -1, "-999", NULL);
4931 ctl->rett_zmin = scan_ctl(argc, argv, "RETT_ZMIN", -1, "-999", NULL);
4932 ctl->rett_zmax = scan_ctl(argc, argv, "RETT_ZMAX", -1, "-999", NULL);
4933 for (int ig = 0; ig < ctl->ng; ig++) {
4934 ctl->retq_zmin[ig] = scan_ctl(argc, argv, "RETQ_ZMIN", ig, "-999", NULL);
4935 ctl->retq_zmax[ig] = scan_ctl(argc, argv, "RETQ_ZMAX", ig, "-999", NULL);
4936 }
4937 for (int iw = 0; iw < ctl->nw; iw++) {
4938 ctl->retk_zmin[iw] = scan_ctl(argc, argv, "RETK_ZMIN", iw, "-999", NULL);
4939 ctl->retk_zmax[iw] = scan_ctl(argc, argv, "RETK_ZMAX", iw, "-999", NULL);
4940 }
4941 ctl->ret_clz = (int) scan_ctl(argc, argv, "RET_CLZ", -1, "0", NULL);
4942 ctl->ret_cldz = (int) scan_ctl(argc, argv, "RET_CLDZ", -1, "0", NULL);
4943 ctl->ret_clk = (int) scan_ctl(argc, argv, "RET_CLK", -1, "0", NULL);
4944 ctl->ret_sft = (int) scan_ctl(argc, argv, "RET_SFT", -1, "0", NULL);
4945 ctl->ret_sfeps = (int) scan_ctl(argc, argv, "RET_SFEPS", -1, "0", NULL);
4946
4947 /* Output flags... */
4948 ctl->write_bbt = (int) scan_ctl(argc, argv, "WRITE_BBT", -1, "0", NULL);
4949 ctl->write_matrix =
4950 (int) scan_ctl(argc, argv, "WRITE_MATRIX", -1, "0", NULL);
4951
4952 /* External forward models... */
4953 ctl->formod = (int) scan_ctl(argc, argv, "FORMOD", -1, "1", NULL);
4954 scan_ctl(argc, argv, "RFMBIN", -1, "-", ctl->rfmbin);
4955 scan_ctl(argc, argv, "RFMHIT", -1, "-", ctl->rfmhit);
4956 for (int ig = 0; ig < ctl->ng; ig++)
4957 scan_ctl(argc, argv, "RFMXSC", ig, "-", ctl->rfmxsc[ig]);
4958}
int find_emitter(const ctl_t *ctl, const char *emitter)
Find gas species index by name.
Definition: jurassic.c:3305
double scan_ctl(int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Scan control file or command-line arguments for a configuration variable.
Definition: jurassic.c:5491
#define NSF
Maximum number of surface layer spectral grid points.
Definition: jurassic.h:256
#define NCL
Maximum number of cloud layer spectral grid points.
Definition: jurassic.h:231
int write_matrix
Write matrix file (0=no, 1=yes).
Definition: jurassic.h:1102
int tblfmt
Look-up table file format (1=ASCII, 2=binary).
Definition: jurassic.h:1021
Here is the call graph for this function:

◆ read_matrix()

void read_matrix ( const char *  dirname,
const char *  filename,
gsl_matrix *  matrix 
)

Read a numerical matrix from an ASCII file.

Loads values into a GSL matrix from a text file containing sparse or indexed entries in tabular format.
Each valid line is parsed for row and column indices and the corresponding value.

Parameters
[in]dirnameDirectory path containing the matrix file (may be NULL).
[in]filenameName of the matrix file to read.
[out]matrixPointer to the GSL matrix to be filled with values.
  • Opens the specified file and scans it line by line.
  • Initializes the matrix to zero before filling.
  • Each line is expected to contain at least 13 formatted fields, where:
    • The first integer gives the row index,
    • The seventh integer gives the column index,
    • The thirteenth floating-point number is the matrix element value.
  • All successfully parsed entries are written to the corresponding positions in the GSL matrix using gsl_matrix_set().
  • Non-matching lines are ignored.
See also
gsl_matrix, read_ctl, read_atm
Warning
  • Aborts if the file cannot be opened.
  • Expects 0-based integer indices consistent with matrix dimensions.
  • Lines not matching the expected 13-field format are skipped silently.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 4962 of file jurassic.c.

4965 {
4966
4967 FILE *in;
4968
4969 char dum[LEN], file[LEN], line[LEN];
4970
4971 double value;
4972
4973 int i, j;
4974
4975 /* Set filename... */
4976 if (dirname != NULL)
4977 sprintf(file, "%s/%s", dirname, filename);
4978 else
4979 sprintf(file, "%s", filename);
4980
4981 /* Write info... */
4982 LOG(1, "Read matrix: %s", file);
4983
4984 /* Open file... */
4985 if (!(in = fopen(file, "r")))
4986 ERRMSG("Cannot open file!");
4987
4988 /* Read data... */
4989 gsl_matrix_set_zero(matrix);
4990 while (fgets(line, LEN, in))
4991 if (sscanf(line, "%d %s %s %s %s %s %d %s %s %s %s %s %lg",
4992 &i, dum, dum, dum, dum, dum,
4993 &j, dum, dum, dum, dum, dum, &value) == 13)
4994 gsl_matrix_set(matrix, (size_t) i, (size_t) j, value);
4995
4996 /* Close file... */
4997 fclose(in);
4998}

◆ read_obs()

void read_obs ( const char *  dirname,
const char *  filename,
const ctl_t ctl,
obs_t obs 
)

Read observation geometry and radiance data from an ASCII file.

Loads line-of-sight (LOS) and radiance information into the obs_t structure from a text file. Each record represents one observation ray with associated geometry (observer, view point, tangent point) and optionally measured radiances and transmittances for multiple spectral channels.

Parameters
[in]dirnameDirectory containing the input file (may be NULL).
[in]filenameObservation data filename.
[in]ctlControl structure defining number of radiance channels.
[out]obsObservation data structure to be populated.
  • Each input line must contain, in order:
    • time [s since 2000-01-01T00:00Z],
    • observer altitude [km], longitude [°], latitude [°],
    • view-point altitude [km], longitude [°], latitude [°],
    • tangent-point altitude [km], longitude [°], latitude [°],
    • followed by radiances \( R_\nu \) for nd channels,
    • and transmittances \( \tau_\nu \) for the same channels.
  • Performs range checks, counts valid ray paths, and logs data ranges.
  • Radiances are interpreted as \( W/(m^2·sr·cm^{-1}) \) or converted to brightness temperatures depending on the WRITE_BBT flag.
  • Aborts if the number of rays exceeds NR or no data are read.
See also
obs_t, ctl_t, read_atm, formod_fov, gsl_stats_minmax
Warning
  • Expects consistent column ordering and sufficient numeric fields.
  • Tangent-point and view-point coordinates must be provided even if redundant.
  • Lines with parsing errors are ignored; missing fields trigger abort.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5002 of file jurassic.c.

5006 {
5007
5008 FILE *in;
5009
5010 char file[LEN], line[LEN], *tok;
5011
5012 /* Init... */
5013 obs->nr = 0;
5014
5015 /* Set filename... */
5016 if (dirname != NULL)
5017 sprintf(file, "%s/%s", dirname, filename);
5018 else
5019 sprintf(file, "%s", filename);
5020
5021 /* Write info... */
5022 LOG(1, "Read observation data: %s", file);
5023
5024 /* Open file... */
5025 if (!(in = fopen(file, "r")))
5026 ERRMSG("Cannot open file!");
5027
5028 /* Read line... */
5029 while (fgets(line, LEN, in)) {
5030
5031 /* Read data... */
5032 TOK(line, tok, "%lg", obs->time[obs->nr]);
5033 TOK(NULL, tok, "%lg", obs->obsz[obs->nr]);
5034 TOK(NULL, tok, "%lg", obs->obslon[obs->nr]);
5035 TOK(NULL, tok, "%lg", obs->obslat[obs->nr]);
5036 TOK(NULL, tok, "%lg", obs->vpz[obs->nr]);
5037 TOK(NULL, tok, "%lg", obs->vplon[obs->nr]);
5038 TOK(NULL, tok, "%lg", obs->vplat[obs->nr]);
5039 TOK(NULL, tok, "%lg", obs->tpz[obs->nr]);
5040 TOK(NULL, tok, "%lg", obs->tplon[obs->nr]);
5041 TOK(NULL, tok, "%lg", obs->tplat[obs->nr]);
5042 for (int id = 0; id < ctl->nd; id++)
5043 TOK(NULL, tok, "%lg", obs->rad[id][obs->nr]);
5044 for (int id = 0; id < ctl->nd; id++)
5045 TOK(NULL, tok, "%lg", obs->tau[id][obs->nr]);
5046
5047 /* Increment counter... */
5048 if ((++obs->nr) > NR)
5049 ERRMSG("Too many rays!");
5050 }
5051
5052 /* Close file... */
5053 fclose(in);
5054
5055 /* Check number of points... */
5056 if (obs->nr < 1)
5057 ERRMSG("Could not read any data!");
5058
5059 /* Write info... */
5060 double mini, maxi;
5061 LOG(2, "Number of ray paths: %d", obs->nr);
5062 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
5063 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5064 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
5065 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
5066 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
5067 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
5068 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
5069 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
5070 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
5071 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
5072 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
5073 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
5074 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
5075 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
5076 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
5077 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
5078 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
5079 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
5080 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
5081 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
5082 for (int id = 0; id < ctl->nd; id++) {
5083 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
5084 if (ctl->write_bbt) {
5085 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
5086 ctl->nu[id], mini, maxi);
5087 } else {
5088 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
5089 ctl->nu[id], mini, maxi);
5090 }
5091 }
5092 for (int id = 0; id < ctl->nd; id++) {
5093 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
5094 if (ctl->write_bbt) {
5095 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
5096 ctl->nu[id], mini, maxi);
5097 }
5098 }
5099}

◆ read_obs_rfm()

double read_obs_rfm ( const char *  basename,
const double  z,
double *  nu,
double *  f,
int  n 
)

Read and spectrally convolve an RFM output spectrum.

Opens the appropriate RFM ASCII spectrum file for a given tangent or observation altitude and convolves the high-resolution spectrum with a provided instrument filter function.
Returns the integrated (filtered) radiance value.

Parameters
[in]basenameBase filename of the RFM output (e.g. "rad" or "tra").
[in]zAltitude [km] used to select the corresponding RFM file.
[in]nuWavenumber grid [cm⁻¹] of the filter function.
[in]fFilter transmission values corresponding to nu.
[in]nNumber of points in nu and f arrays.
Returns
Filtered radiance value integrated over the instrument bandpass.
  • The routine looks for an RFM output file named basename_<altitude_in_meters>.asc (e.g. rad_04500.asc).
  • If not found, it retries with altitude+1 meter to tolerate rounding.
  • The file is read using read_rfm_spec() into arrays of wavenumbers (nurfm) and radiances (rad).
  • The input filter function \( f(\nu) \) is linearly interpolated onto the RFM wavenumber grid, and the spectrum is convolved as

    \[ R = \frac{\int f(\nu) \, I(\nu) \, d\nu}{\int f(\nu) \, d\nu} \]

  • Linear interpolation is used for both spectral alignment and filter sampling.
  • Returns the resulting band-averaged radiance in the same units as the input.
See also
read_rfm_spec, locate_irr, LIN, formod_rfm
Warning
  • Aborts if the corresponding RFM file cannot be found.
  • Assumes nu and f arrays are monotonic and have at least two points.
  • Files must contain RFM ASCII spectra in expected column format.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5103 of file jurassic.c.

5108 {
5109
5110 FILE *in;
5111
5112 char filename[LEN];
5113
5114 double filt, fsum = 0, nu2[NSHAPE], *nurfm, *rad, radsum = 0;
5115
5116 int npts;
5117
5118 /* Allocate... */
5119 ALLOC(nurfm, double,
5120 RFMNPTS);
5121 ALLOC(rad, double,
5122 RFMNPTS);
5123
5124 /* Search RFM spectrum... */
5125 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000));
5126 if (!(in = fopen(filename, "r"))) {
5127 sprintf(filename, "%s_%05d.asc", basename, (int) (z * 1000) + 1);
5128 if (!(in = fopen(filename, "r")))
5129 ERRMSG("Cannot find RFM data file!");
5130 }
5131 fclose(in);
5132
5133 /* Read RFM spectrum... */
5134 read_rfm_spec(filename, nurfm, rad, &npts);
5135
5136 /* Set wavenumbers... */
5137 nu2[0] = nu[0];
5138 nu2[n - 1] = nu[n - 1];
5139 for (int i = 1; i < n - 1; i++)
5140 nu2[i] = LIN(0.0, nu2[0], n - 1.0, nu2[n - 1], i);
5141
5142 /* Convolute... */
5143 for (int ipts = 0; ipts < npts; ipts++)
5144 if (nurfm[ipts] >= nu2[0] && nurfm[ipts] <= nu2[n - 1]) {
5145 const int idx = locate_irr(nu2, n, nurfm[ipts]);
5146 filt = LIN(nu2[idx], f[idx], nu2[idx + 1], f[idx + 1], nurfm[ipts]);
5147 fsum += filt;
5148 radsum += filt * rad[ipts];
5149 }
5150
5151 /* Free... */
5152 free(nurfm);
5153 free(rad);
5154
5155 /* Return radiance... */
5156 return radsum / fsum;
5157}
void read_rfm_spec(const char *filename, double *nu, double *rad, int *npts)
Read a Reference Forward Model (RFM) ASCII spectrum.
Definition: jurassic.c:5214
#define RFMNPTS
Maximum number of RFM spectral grid points.
Definition: jurassic.h:321
Here is the call graph for this function:

◆ read_ret()

void read_ret ( int  argc,
char *  argv[],
ctl_t ctl,
ret_t ret 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5161 of file jurassic.c.

5165 {
5166
5167 /* Iteration control... */
5168 ret->kernel_recomp =
5169 (int) scan_ctl(argc, argv, "KERNEL_RECOMP", -1, "3", NULL);
5170 ret->conv_itmax = (int) scan_ctl(argc, argv, "CONV_ITMAX", -1, "30", NULL);
5171 ret->conv_dmin = scan_ctl(argc, argv, "CONV_DMIN", -1, "0.1", NULL);
5172
5173 /* Error analysis... */
5174 ret->err_ana = (int) scan_ctl(argc, argv, "ERR_ANA", -1, "1", NULL);
5175
5176 for (int id = 0; id < ctl->nd; id++)
5177 ret->err_formod[id] = scan_ctl(argc, argv, "ERR_FORMOD", id, "0", NULL);
5178
5179 for (int id = 0; id < ctl->nd; id++)
5180 ret->err_noise[id] = scan_ctl(argc, argv, "ERR_NOISE", id, "0", NULL);
5181
5182 ret->err_press = scan_ctl(argc, argv, "ERR_PRESS", -1, "0", NULL);
5183 ret->err_press_cz = scan_ctl(argc, argv, "ERR_PRESS_CZ", -1, "-999", NULL);
5184 ret->err_press_ch = scan_ctl(argc, argv, "ERR_PRESS_CH", -1, "-999", NULL);
5185
5186 ret->err_temp = scan_ctl(argc, argv, "ERR_TEMP", -1, "0", NULL);
5187 ret->err_temp_cz = scan_ctl(argc, argv, "ERR_TEMP_CZ", -1, "-999", NULL);
5188 ret->err_temp_ch = scan_ctl(argc, argv, "ERR_TEMP_CH", -1, "-999", NULL);
5189
5190 for (int ig = 0; ig < ctl->ng; ig++) {
5191 ret->err_q[ig] = scan_ctl(argc, argv, "ERR_Q", ig, "0", NULL);
5192 ret->err_q_cz[ig] = scan_ctl(argc, argv, "ERR_Q_CZ", ig, "-999", NULL);
5193 ret->err_q_ch[ig] = scan_ctl(argc, argv, "ERR_Q_CH", ig, "-999", NULL);
5194 }
5195
5196 for (int iw = 0; iw < ctl->nw; iw++) {
5197 ret->err_k[iw] = scan_ctl(argc, argv, "ERR_K", iw, "0", NULL);
5198 ret->err_k_cz[iw] = scan_ctl(argc, argv, "ERR_K_CZ", iw, "-999", NULL);
5199 ret->err_k_ch[iw] = scan_ctl(argc, argv, "ERR_K_CH", iw, "-999", NULL);
5200 }
5201
5202 ret->err_clz = scan_ctl(argc, argv, "ERR_CLZ", -1, "0", NULL);
5203 ret->err_cldz = scan_ctl(argc, argv, "ERR_CLDZ", -1, "0", NULL);
5204 for (int icl = 0; icl < ctl->ncl; icl++)
5205 ret->err_clk[icl] = scan_ctl(argc, argv, "ERR_CLK", icl, "0", NULL);
5206
5207 ret->err_sft = scan_ctl(argc, argv, "ERR_SFT", -1, "0", NULL);
5208 for (int isf = 0; isf < ctl->nsf; isf++)
5209 ret->err_sfeps[isf] = scan_ctl(argc, argv, "ERR_SFEPS", isf, "0", NULL);
5210}
double err_press_cz
Vertical correlation length for pressure error [km].
Definition: jurassic.h:1266
double err_press
Pressure error [%].
Definition: jurassic.h:1263
double err_k_cz[NW]
Vertical correlation length for extinction error [km].
Definition: jurassic.h:1293
int err_ana
Carry out error analysis (0=no, 1=yes).
Definition: jurassic.h:1254
double err_k_ch[NW]
Horizontal correlation length for extinction error [km].
Definition: jurassic.h:1296
double err_temp_cz
Vertical correlation length for temperature error [km].
Definition: jurassic.h:1275
double err_formod[ND]
Forward model error [%].
Definition: jurassic.h:1257
double conv_dmin
Minimum normalized step size in state space.
Definition: jurassic.h:1251
double err_temp
Temperature error [K].
Definition: jurassic.h:1272
double err_q_cz[NG]
Vertical correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1284
double err_noise[ND]
Noise error [W/(m^2 sr cm^-1)].
Definition: jurassic.h:1260
double err_clz
Cloud height error [km].
Definition: jurassic.h:1299
double err_sft
Surface temperature error [K].
Definition: jurassic.h:1308
double err_clk[NCL]
Cloud extinction error [km^-1].
Definition: jurassic.h:1305
double err_temp_ch
Horizontal correlation length for temperature error [km].
Definition: jurassic.h:1278
int kernel_recomp
Re-computation of kernel matrix (number of iterations).
Definition: jurassic.h:1245
int conv_itmax
Maximum number of iterations.
Definition: jurassic.h:1248
double err_cldz
Cloud depth error [km].
Definition: jurassic.h:1302
double err_press_ch
Horizontal correlation length for pressure error [km].
Definition: jurassic.h:1269
double err_q_ch[NG]
Horizontal correlation length for volume mixing ratio error [km].
Definition: jurassic.h:1287
double err_q[NG]
Volume mixing ratio error [%].
Definition: jurassic.h:1281
double err_sfeps[NSF]
Surface emissivity error.
Definition: jurassic.h:1311
double err_k[NW]
Extinction error [km^-1].
Definition: jurassic.h:1290
Here is the call graph for this function:

◆ read_rfm_spec()

void read_rfm_spec ( const char *  filename,
double *  nu,
double *  rad,
int *  npts 
)

Read a Reference Forward Model (RFM) ASCII spectrum.

Parses an RFM output file containing high-resolution spectral radiances and fills the provided arrays with wavenumber and radiance values.

Parameters
[in]filenameName of the RFM ASCII spectrum file (e.g. "rad_04500.asc").
[out]nuArray to receive the spectral wavenumber grid [cm⁻¹].
[out]radArray to receive the corresponding radiances.
[out]nptsPointer to integer receiving the number of spectral points.
  • Expects the RFM file to begin with a four-line header. The final header line must contain, in order:
    • the number of spectral points (npts),
    • starting wavenumber nu0 [cm⁻¹],
    • spectral increment dnu [cm⁻¹],
    • ending wavenumber nu1 [cm⁻¹].
  • Radiance data follow as a sequence of floating-point values, separated by spaces, tabs, or line breaks.
  • The wavenumber grid is reconstructed using linear interpolation between nu0 and nu1:

    \[ \nu_i = \nu_0 + i \, \frac{\nu_1 - \nu_0}{N - 1}, \quad i = 0,\dots,N-1 \]

  • Uses dynamic line buffering and token-based parsing for efficiency.
See also
read_obs_rfm, locate_irr, LIN, formod_rfm
Warning
  • Aborts if the file cannot be opened or has an invalid header format.
  • Aborts if the number of grid points exceeds RFMNPTS.
  • Assumes ASCII format consistent with standard RFM .asc output.
Note
This routine reads only the spectral intensity data — additional metadata (e.g., gas profiles, geometry) must be handled separately.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5214 of file jurassic.c.

5218 {
5219
5220 FILE *in;
5221
5222 char *line = NULL, *tok;
5223
5224 size_t line_buf_size = 0;
5225
5226 double dnu, nu0, nu1;
5227
5228 int ipts = 0;
5229
5230 /* Write info... */
5231 LOG(1, "Read RFM data: %s", filename);
5232
5233 /* Open file... */
5234 if (!(in = fopen(filename, "r")))
5235 ERRMSG("Cannot open file!");
5236
5237 /* Read header... */
5238 for (int i = 0; i < 4; i++)
5239 if (getline(&line, &line_buf_size, in) == -1)
5240 ERRMSG("Error while reading file header!");
5241 if (sscanf(line, "%d %lg %lg %lg", npts, &nu0, &dnu, &nu1) != 4)
5242 ERRMSG("Invalid spectrum header format!");
5243
5244 /* Check number of spectral grid points... */
5245 if (*npts > RFMNPTS)
5246 ERRMSG("Too many spectral grid points!");
5247
5248 /* Read radiance data... */
5249 while (getline(&line, &line_buf_size, in) != -1 && ipts < *npts) {
5250 tok = strtok(line, " \t\n");
5251 while (tok != NULL && ipts < *npts) {
5252 if (sscanf(tok, "%lg", &rad[ipts]) == 1)
5253 ipts++;
5254 tok = strtok(NULL, " \t\n");
5255 }
5256 }
5257
5258 /* Check number of spectral grid points... */
5259 if (ipts != *npts)
5260 ERRMSG("Error while reading RFM data!");
5261
5262 /* Compute wavenumbers... */
5263 for (ipts = 0; ipts < *npts; ipts++)
5264 nu[ipts] = LIN(0.0, nu0, (double) (*npts - 1), nu1, (double) ipts);
5265
5266 /* Close file... */
5267 fclose(in);
5268
5269 /* Free.. */
5270 free(line);
5271}

◆ read_shape()

void read_shape ( const char *  filename,
double *  x,
double *  y,
int *  n 
)

Read a two-column shape function from an ASCII file.

Loads tabulated x–y data pairs (e.g., filter transmission or field-of-view weighting function) into the provided arrays.

Parameters
[in]filenameName of the ASCII file containing the shape function.
[out]xArray to receive the abscissa values.
[out]yArray to receive the ordinate values.
[out]nPointer to integer receiving the number of data points read.
  • The input file must contain at least two whitespace-separated columns:
    • Column 1: abscissa (x), typically wavenumber [cm⁻¹] or angular offset [deg].
    • Column 2: ordinate (y), typically transmission or weighting value.
  • Comment lines or malformed entries are ignored.
  • The routine logs the number of data points and their value ranges.
  • Data are stored directly in the provided arrays for subsequent interpolation or convolution.
See also
gsl_stats_minmax, formod_fov, init_srcfunc, read_obs_rfm
Warning
  • Aborts if the file cannot be opened or if fewer than two valid points are read.
  • Aborts if the number of data points exceeds NSHAPE.
  • Assumes numeric ASCII format and monotonic ordering of x values.
Note
This generic shape reader is used for both spectral filter functions and angular field-of-view profiles.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5275 of file jurassic.c.

5279 {
5280
5281 FILE *in;
5282
5283 char line[LEN];
5284
5285 /* Write info... */
5286 LOG(1, "Read shape function: %s", filename);
5287
5288 /* Open file... */
5289 if (!(in = fopen(filename, "r")))
5290 ERRMSG("Cannot open file!");
5291
5292 /* Read data... */
5293 *n = 0;
5294 while (fgets(line, LEN, in))
5295 if (sscanf(line, "%lg %lg", &x[*n], &y[*n]) == 2)
5296 if ((++(*n)) > NSHAPE)
5297 ERRMSG("Too many data points!");
5298
5299 /* Close file... */
5300 fclose(in);
5301
5302 /* Check number of data points... */
5303 if (*n < 2)
5304 ERRMSG("Could not read any data!");
5305
5306 /* Write info... */
5307 double mini, maxi;
5308 LOG(2, "Number of data points: %d", *n);
5309 gsl_stats_minmax(&mini, &maxi, x, 1, (size_t) *n);
5310 LOG(2, "Range of x values: %.4f ... %.4f", mini, maxi);
5311 gsl_stats_minmax(&mini, &maxi, y, 1, (size_t) *n);
5312 LOG(2, "Range of y values: %g ... %g", mini, maxi);
5313}

◆ read_tbl()

tbl_t * read_tbl ( const ctl_t ctl)

Read gas emissivity look-up tables for all channels and emitters.

Loads precomputed emissivity tables from disk into a newly allocated tbl_t structure. Each table contains gas emissivity data as a function of pressure, temperature, and column density, required for radiative transfer using the CGA (Curtis–Godson Approximation) or EGA (Emissivity Growth Approximation).

Parameters
[in]ctlPointer to the control structure containing configuration and table file parameters.
Returns
Pointer to the allocated and initialized tbl_t structure.
  • For each radiance channel (id) and each trace gas (ig), the routine attempts to open a table file named:
    <TBLBASE>_<NU>_<EMITTER>.<TAB/BIN>
    where:
    • <TBLBASE> is ctl->tblbase
    • <NU> is the channel wavenumber [cm⁻¹]
    • <EMITTER> is the gas name (e.g. "CO2", "H2O")
    • The extension is .tab for ASCII or .bin for binary format.
  • The table format is selected via ctl->tblfmt:
    • 1 → ASCII tables (four columns: pressure, temperature, u, eps)
    • 2 → Binary tables written by JURASSIC’s preprocessing tools
  • Data are stored in hierarchical arrays: \( \varepsilon(p, T, u) \) = emissivity
    where p = pressure [hPa], T = temperature [K], u = column density [molec/cm²].
  • Invalid or out-of-range entries (outside [UMIN,UMAX] or [EPSMIN,EPSMAX]) are skipped with a warning.
  • The routine automatically counts levels in pressure, temperature, and column density dimensions, checking against limits TBLNP, TBLNT, and TBLNU.
  • After loading all tables, it calls init_srcfunc() to initialize the source function table.
See also
init_srcfunc, intpol_tbl_cga, intpol_tbl_ega, ctl_t, tbl_t
Warning
  • Aborts if the number of levels exceeds compile-time limits (TBLNP, TBLNT, TBLNU).
  • Emits warnings if emissivity or column density values are outside physical range.
  • Missing tables are skipped with a warning.
Note
Binary table reading uses FREAD macros to ensure platform-independent precision and array sizes.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5317 of file jurassic.c.

5318 {
5319
5320 FILE *in;
5321
5322 char filename[2 * LEN], line[LEN];
5323
5324 double eps, press, temp, u;
5325
5326 /* Allocate... */
5327 tbl_t *tbl;
5328 ALLOC(tbl, tbl_t, 1);
5329
5330 /* Loop over trace gases and channels... */
5331 for (int id = 0; id < ctl->nd; id++)
5332 for (int ig = 0; ig < ctl->ng; ig++) {
5333
5334 /* Initialize... */
5335 tbl->np[id][ig] = -1;
5336 double eps_old = -999;
5337 double press_old = -999;
5338 double temp_old = -999;
5339 double u_old = -999;
5340 int nrange = 0;
5341
5342 /* Set filename... */
5343 sprintf(filename, "%s_%.4f_%s.%s", ctl->tblbase,
5344 ctl->nu[id], ctl->emitter[ig],
5345 ctl->tblfmt == 1 ? "tab" : "bin");
5346
5347 /* Write info... */
5348 LOG(1, "Read emissivity table: %s", filename);
5349
5350 /* Try to open file... */
5351 if (!(in = fopen(filename, "r"))) {
5352 WARN("Missing emissivity table: %s", filename);
5353 continue;
5354 }
5355
5356 /* Read ASCII tables... */
5357 if (ctl->tblfmt == 1) {
5358
5359 /* Read data... */
5360 while (fgets(line, LEN, in)) {
5361
5362 /* Parse line... */
5363 if (sscanf(line, "%lg %lg %lg %lg", &press, &temp, &u, &eps) != 4)
5364 continue;
5365
5366 /* Check ranges... */
5367 if (u < UMIN || u > UMAX || eps < EPSMIN || eps > EPSMAX) {
5368 nrange++;
5369 continue;
5370 }
5371
5372 /* Determine pressure index... */
5373 if (press != press_old) {
5374 press_old = press;
5375 if ((++tbl->np[id][ig]) >= TBLNP)
5376 ERRMSG("Too many pressure levels!");
5377 tbl->nt[id][ig][tbl->np[id][ig]] = -1;
5378 }
5379
5380 /* Determine temperature index... */
5381 if (temp != temp_old) {
5382 temp_old = temp;
5383 if ((++tbl->nt[id][ig][tbl->np[id][ig]]) >= TBLNT)
5384 ERRMSG("Too many temperatures!");
5385 tbl->nu[id][ig][tbl->np[id][ig]]
5386 [tbl->nt[id][ig][tbl->np[id][ig]]] = -1;
5387 }
5388
5389 /* Determine column density index... */
5390 if ((eps > eps_old && u > u_old) || tbl->nu[id][ig][tbl->np[id][ig]]
5391 [tbl->nt[id][ig][tbl->np[id][ig]]] < 0) {
5392 eps_old = eps;
5393 u_old = u;
5394 if ((++tbl->nu[id][ig][tbl->np[id][ig]]
5395 [tbl->nt[id][ig][tbl->np[id][ig]]]) >= TBLNU)
5396 ERRMSG("Too many column densities!");
5397 }
5398
5399 /* Store data... */
5400 tbl->p[id][ig][tbl->np[id][ig]] = press;
5401 tbl->t[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5402 = temp;
5403 tbl->u[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5404 [tbl->nu[id][ig][tbl->np[id][ig]]
5405 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) u;
5406 tbl->eps[id][ig][tbl->np[id][ig]][tbl->nt[id][ig][tbl->np[id][ig]]]
5407 [tbl->nu[id][ig][tbl->np[id][ig]]
5408 [tbl->nt[id][ig][tbl->np[id][ig]]]] = (float) eps;
5409 }
5410
5411 /* Increment counters... */
5412 tbl->np[id][ig]++;
5413 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
5414 tbl->nt[id][ig][ip]++;
5415 for (int it = 0; it < tbl->nt[id][ig][ip]; it++)
5416 tbl->nu[id][ig][ip][it]++;
5417 }
5418 }
5419
5420 /* Read binary data... */
5421 else if (ctl->tblfmt == 2) {
5422
5423 /* Read data... */
5424 FREAD(&tbl->np[id][ig], int,
5425 1,
5426 in);
5427 if (tbl->np[id][ig] > TBLNP)
5428 ERRMSG("Too many pressure levels!");
5429 FREAD(tbl->p[id][ig], double,
5430 (size_t) tbl->np[id][ig],
5431 in);
5432 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
5433 FREAD(&tbl->nt[id][ig][ip], int,
5434 1,
5435 in);
5436 if (tbl->nt[id][ig][ip] > TBLNT)
5437 ERRMSG("Too many temperatures!");
5438 FREAD(tbl->t[id][ig][ip], double,
5439 (size_t) tbl->nt[id][ig][ip],
5440 in);
5441 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
5442 FREAD(&tbl->nu[id][ig][ip][it], int,
5443 1,
5444 in);
5445 if (tbl->nu[id][ig][ip][it] > TBLNU)
5446 ERRMSG("Too many column densities!");
5447 FREAD(tbl->u[id][ig][ip][it], float,
5448 (size_t) tbl->nu[id][ig][ip][it],
5449 in);
5450 FREAD(tbl->eps[id][ig][ip][it], float,
5451 (size_t) tbl->nu[id][ig][ip][it],
5452 in);
5453 }
5454 }
5455 }
5456
5457 /* Error message... */
5458 else
5459 ERRMSG("Unknown look-up table format!");
5460
5461 /* Check ranges... */
5462 if (nrange > 0)
5463 WARN("Column density or emissivity out of range (%d data points)!",
5464 nrange);
5465
5466 /* Close file... */
5467 fclose(in);
5468
5469 /* Write info... */
5470 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
5471 LOG(2,
5472 "p[%2d]= %.5e hPa | T[0:%2d]= %.2f ... %.2f K | u[0:%3d]= %.5e ... %.5e molec/cm^2 | eps[0:%3d]= %.5e ... %.5e",
5473 ip, tbl->p[id][ig][ip], tbl->nt[id][ig][ip] - 1,
5474 tbl->t[id][ig][ip][0],
5475 tbl->t[id][ig][ip][tbl->nt[id][ig][ip] - 1],
5476 tbl->nu[id][ig][ip][0] - 1, tbl->u[id][ig][ip][0][0],
5477 tbl->u[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1],
5478 tbl->nu[id][ig][ip][0] - 1, tbl->eps[id][ig][ip][0][0],
5479 tbl->eps[id][ig][ip][0][tbl->nu[id][ig][ip][0] - 1]);
5480 }
5481
5482 /* Initialize source function... */
5483 init_srcfunc(ctl, tbl);
5484
5485 /* Return pointer... */
5486 return tbl;
5487}
void init_srcfunc(const ctl_t *ctl, tbl_t *tbl)
Initialize the source-function (Planck radiance) lookup table.
Definition: jurassic.c:3881
#define UMAX
Maximum column density [molecules/cm^2].
Definition: jurassic.h:222
#define WARN(...)
Print a warning message with contextual information.
Definition: jurassic.h:831
#define TBLNU
Maximum number of column densities in emissivity tables.
Definition: jurassic.h:311
#define TBLNT
Maximum number of temperatures in emissivity tables.
Definition: jurassic.h:306
#define EPSMAX
Maximum emissivity.
Definition: jurassic.h:142
#define TBLNP
Maximum number of pressure levels in emissivity tables.
Definition: jurassic.h:301
#define FREAD(ptr, type, size, out)
Read binary data from a file.
Definition: jurassic.h:491
Emissivity look-up tables.
Definition: jurassic.h:1321
Here is the call graph for this function:

◆ scan_ctl()

double scan_ctl ( int  argc,
char *  argv[],
const char *  varname,
const int  arridx,
const char *  defvalue,
char *  value 
)

Scan control file or command-line arguments for a configuration variable.

Searches for a named variable in the JURASSIC control file or command-line arguments, returning its value as a double. Optionally stores the value as a string and supports array-style parameters (e.g., EMITTER[0], NU[5]).

Parameters
[in]argcNumber of command-line arguments.
[in]argvCommand-line argument vector.
[in]varnameName of the control variable to read.
[in]arridxArray index (use -1 for scalar variables).
[in]defvalueDefault value if variable is not found (can be empty).
[out]valueOptional pointer to a string buffer receiving the value (may be NULL if only numeric output is required).
Returns
The variable value converted to double.
  • The routine first attempts to open the control file provided as the first command-line argument (argv[1]), unless it starts with ‘’-'`.
  • Variable names may appear as either:
    • VAR (scalar)
    • VAR[index] (explicit array index)
    • VAR[*] (wildcard entry applying to all indices)
  • The search order is:
    1. Control file lines of the form:
      VAR[index] = VALUE
      VAR[*] = VALUE
    2. Command-line arguments: ``` ./jurassic ctlfile VAR[index] VALUE
      - If no match is found:
      - The default value `defvalue` is used (if non-empty).
      - Otherwise, the routine aborts with an error.
      - The variable value is printed to the log at verbosity level 1.
      @warning
      - Aborts if the control file cannot be opened (unless skipped with `'-'`).
      - Aborts if a required variable is missing and no default is provided.
      - Array bounds are not validated against internal limits; use `ctl_t` checks
      to ensure consistency.
      @note
      - This utility simplifies control input parsing by supporting both command-line
      overrides and configuration files with the same syntax.
      - String comparisons are case-insensitive.
      @example
      ```text
      EMITTER[0] = CO2
      EMITTER[1] = H2O
      NU[0] = 667.0
      void read_ctl(int argc, char *argv[], ctl_t *ctl)
      Read model control parameters from command-line and configuration input.
      Definition: jurassic.c:4848
      Control parameters.
      Definition: jurassic.h:967
      or equivalently:
      ./jurassic config.ctl NU[0] 667.0
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5491 of file jurassic.c.

5497 {
5498
5499 FILE *in = NULL;
5500
5501 char dummy[LEN], fullname1[LEN], fullname2[LEN], line[LEN],
5502 rvarname[LEN], rval[LEN];
5503
5504 int contain = 0;
5505
5506 /* Open file... */
5507 if (argv[1][0] != '-')
5508 if (!(in = fopen(argv[1], "r")))
5509 ERRMSG("Cannot open file!");
5510
5511 /* Set full variable name... */
5512 if (arridx >= 0) {
5513 sprintf(fullname1, "%s[%d]", varname, arridx);
5514 sprintf(fullname2, "%s[*]", varname);
5515 } else {
5516 sprintf(fullname1, "%s", varname);
5517 sprintf(fullname2, "%s", varname);
5518 }
5519
5520 /* Read data... */
5521 if (in != NULL)
5522 while (fgets(line, LEN, in))
5523 if (sscanf(line, "%s %s %s", rvarname, dummy, rval) == 3)
5524 if (strcasecmp(rvarname, fullname1) == 0 ||
5525 strcasecmp(rvarname, fullname2) == 0) {
5526 contain = 1;
5527 break;
5528 }
5529 for (int i = 1; i < argc - 1; i++)
5530 if (strcasecmp(argv[i], fullname1) == 0 ||
5531 strcasecmp(argv[i], fullname2) == 0) {
5532 sprintf(rval, "%s", argv[i + 1]);
5533 contain = 1;
5534 break;
5535 }
5536
5537 /* Close file... */
5538 if (in != NULL)
5539 fclose(in);
5540
5541 /* Check for missing variables... */
5542 if (!contain) {
5543 if (strlen(defvalue) > 0)
5544 sprintf(rval, "%s", defvalue);
5545 else
5546 ERRMSG("Missing variable %s!\n", fullname1);
5547 }
5548
5549 /* Write info... */
5550 LOG(1, "%s = %s", fullname1, rval);
5551
5552 /* Return values... */
5553 if (value != NULL)
5554 sprintf(value, "%s", rval);
5555 return atof(rval);
5556}

◆ sza()

double sza ( double  sec,
double  lon,
double  lat 
)

Compute the solar zenith angle for a given time and location.

Calculates the apparent solar zenith angle (SZA) [deg] based on the observer’s longitude, latitude, and time since 2000-01-01 T00:00 Z.

Parameters
[in]secSeconds since 2000-01-01 T00:00 Z.
[in]lonObserver longitude [deg].
[in]latObserver latitude [deg].
Returns
Solar zenith angle [deg].
  • Implements a simplified astronomical model based on the Sun’s apparent ecliptic longitude and the Earth’s mean obliquity.
  • Uses the following steps:
    1. Compute the number of days since J2000 noon epoch.
    2. Determine the Sun’s apparent ecliptic longitude and declination.
    3. Compute the local hour angle from Greenwich Mean Sidereal Time.
    4. Derive the solar zenith angle via spherical trigonometry:

      \[ \cos(\theta) = \sin(\varphi)\sin(\delta) + \cos(\varphi)\cos(\delta)\cos(h) \]

      where \(\varphi\) = latitude, \(\delta\) = declination, \(h\) = hour angle.
See also
formod_pencil, ctl_t::sfsza
Note
  • Neglects atmospheric refraction and seasonal perturbations.
  • Accuracy is sufficient for radiative transfer applications (<0.1°).
  • Longitude positive eastward, latitude positive northward.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5560 of file jurassic.c.

5563 {
5564
5565 /* Number of days and fraction with respect to 2000-01-01T12:00Z... */
5566 const double D = sec / 86400 - 0.5;
5567
5568 /* Geocentric apparent ecliptic longitude [rad]... */
5569 const double g = DEG2RAD(357.529 + 0.98560028 * D);
5570 const double q = 280.459 + 0.98564736 * D;
5571 const double L = DEG2RAD(q + 1.915 * sin(g) + 0.020 * sin(2 * g));
5572
5573 /* Mean obliquity of the ecliptic [rad]... */
5574 const double e = DEG2RAD(23.439 - 0.00000036 * D);
5575
5576 /* Declination [rad]... */
5577 const double dec = asin(sin(e) * sin(L));
5578
5579 /* Right ascension [rad]... */
5580 const double ra = atan2(cos(e) * sin(L), cos(L));
5581
5582 /* Greenwich Mean Sidereal Time [h]... */
5583 const double GMST = 18.697374558 + 24.06570982441908 * D;
5584
5585 /* Local Sidereal Time [h]... */
5586 const double LST = GMST + lon / 15;
5587
5588 /* Hour angle [rad]... */
5589 const double h = LST / 12 * M_PI - ra;
5590
5591 /* Convert latitude... */
5592 const double latr = DEG2RAD(lat);
5593
5594 /* Return solar zenith angle [deg]... */
5595 return RAD2DEG(acos(sin(latr) * sin(dec) + cos(latr) * cos(dec) * cos(h)));
5596}

◆ set_cov_apr()

void set_cov_apr ( ret_t ret,
ctl_t ctl,
atm_t atm,
int *  iqa,
int *  ipa,
gsl_matrix *  s_a 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5600 of file jurassic.c.

5606 {
5607
5608 /* Get sizes... */
5609 const size_t n = s_a->size1;
5610
5611 /* Allocate... */
5612 gsl_vector *x_a = gsl_vector_alloc(n);
5613
5614 /* Get sigma vector... */
5615 atm2x(ctl, atm, x_a, NULL, NULL);
5616 for (size_t i = 0; i < n; i++) {
5617 if (iqa[i] == IDXP)
5618 gsl_vector_set(x_a, i, ret->err_press / 100 * gsl_vector_get(x_a, i));
5619 if (iqa[i] == IDXT)
5620 gsl_vector_set(x_a, i, ret->err_temp);
5621 for (int ig = 0; ig < ctl->ng; ig++)
5622 if (iqa[i] == IDXQ(ig))
5623 gsl_vector_set(x_a, i, ret->err_q[ig] / 100 * gsl_vector_get(x_a, i));
5624 for (int iw = 0; iw < ctl->nw; iw++)
5625 if (iqa[i] == IDXK(iw))
5626 gsl_vector_set(x_a, i, ret->err_k[iw]);
5627 if (iqa[i] == IDXCLZ)
5628 gsl_vector_set(x_a, i, ret->err_clz);
5629 if (iqa[i] == IDXCLDZ)
5630 gsl_vector_set(x_a, i, ret->err_cldz);
5631 for (int icl = 0; icl < ctl->ncl; icl++)
5632 if (iqa[i] == IDXCLK(icl))
5633 gsl_vector_set(x_a, i, ret->err_clk[icl]);
5634 if (iqa[i] == IDXSFT)
5635 gsl_vector_set(x_a, i, ret->err_sft);
5636 for (int isf = 0; isf < ctl->nsf; isf++)
5637 if (iqa[i] == IDXSFEPS(isf))
5638 gsl_vector_set(x_a, i, ret->err_sfeps[isf]);
5639 }
5640
5641 /* Check standard deviations... */
5642 for (size_t i = 0; i < n; i++)
5643 if (POW2(gsl_vector_get(x_a, i)) <= 0)
5644 ERRMSG("Check a priori data (zero standard deviation)!");
5645
5646 /* Initialize diagonal covariance... */
5647 gsl_matrix_set_zero(s_a);
5648 for (size_t i = 0; i < n; i++)
5649 gsl_matrix_set(s_a, i, i, POW2(gsl_vector_get(x_a, i)));
5650
5651 /* Loop over matrix elements... */
5652 for (size_t i = 0; i < n; i++)
5653 for (size_t j = 0; j < n; j++)
5654 if (i != j && iqa[i] == iqa[j]) {
5655
5656 /* Initialize... */
5657 double cz = 0;
5658 double ch = 0;
5659
5660 /* Set correlation lengths for pressure... */
5661 if (iqa[i] == IDXP) {
5662 cz = ret->err_press_cz;
5663 ch = ret->err_press_ch;
5664 }
5665
5666 /* Set correlation lengths for temperature... */
5667 if (iqa[i] == IDXT) {
5668 cz = ret->err_temp_cz;
5669 ch = ret->err_temp_ch;
5670 }
5671
5672 /* Set correlation lengths for volume mixing ratios... */
5673 for (int ig = 0; ig < ctl->ng; ig++)
5674 if (iqa[i] == IDXQ(ig)) {
5675 cz = ret->err_q_cz[ig];
5676 ch = ret->err_q_ch[ig];
5677 }
5678
5679 /* Set correlation lengths for extinction... */
5680 for (int iw = 0; iw < ctl->nw; iw++)
5681 if (iqa[i] == IDXK(iw)) {
5682 cz = ret->err_k_cz[iw];
5683 ch = ret->err_k_ch[iw];
5684 }
5685
5686 /* Compute correlations... */
5687 if (cz > 0 && ch > 0) {
5688
5689 /* Get Cartesian coordinates... */
5690 double x0[3], x1[3];
5691 geo2cart(0, atm->lon[ipa[i]], atm->lat[ipa[i]], x0);
5692 geo2cart(0, atm->lon[ipa[j]], atm->lat[ipa[j]], x1);
5693
5694 /* Compute correlations... */
5695 const double rho =
5696 exp(-DIST(x0, x1) / ch -
5697 fabs(atm->z[ipa[i]] - atm->z[ipa[j]]) / cz);
5698
5699 /* Set covariance... */
5700 gsl_matrix_set(s_a, i, j, gsl_vector_get(x_a, i)
5701 * gsl_vector_get(x_a, j) * rho);
5702 }
5703 }
5704
5705 /* Free... */
5706 gsl_vector_free(x_a);
5707}
#define DIST(a, b)
Compute Cartesian distance between two 3D vectors.
Definition: jurassic.h:436
Here is the call graph for this function:

◆ set_cov_meas()

void set_cov_meas ( ret_t ret,
ctl_t ctl,
obs_t obs,
gsl_vector *  sig_noise,
gsl_vector *  sig_formod,
gsl_vector *  sig_eps_inv 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5711 of file jurassic.c.

5717 {
5718
5719 static obs_t obs_err;
5720
5721 /* Get size... */
5722 const size_t m = sig_eps_inv->size;
5723
5724 /* Noise error (always considered in retrieval fit)... */
5725 copy_obs(ctl, &obs_err, obs, 1);
5726 for (int ir = 0; ir < obs_err.nr; ir++)
5727 for (int id = 0; id < ctl->nd; id++)
5728 obs_err.rad[id][ir]
5729 = (isfinite(obs->rad[id][ir]) ? ret->err_noise[id] : NAN);
5730 obs2y(ctl, &obs_err, sig_noise, NULL, NULL);
5731
5732 /* Forward model error (always considered in retrieval fit)... */
5733 copy_obs(ctl, &obs_err, obs, 1);
5734 for (int ir = 0; ir < obs_err.nr; ir++)
5735 for (int id = 0; id < ctl->nd; id++)
5736 obs_err.rad[id][ir]
5737 = fabs(ret->err_formod[id] / 100 * obs->rad[id][ir]);
5738 obs2y(ctl, &obs_err, sig_formod, NULL, NULL);
5739
5740 /* Total error... */
5741 for (size_t i = 0; i < m; i++)
5742 gsl_vector_set(sig_eps_inv, i, 1 / sqrt(POW2(gsl_vector_get(sig_noise, i))
5743 +
5744 POW2(gsl_vector_get
5745 (sig_formod, i))));
5746
5747 /* Check standard deviations... */
5748 for (size_t i = 0; i < m; i++)
5749 if (gsl_vector_get(sig_eps_inv, i) <= 0)
5750 ERRMSG("Check measurement errors (zero standard deviation)!");
5751}
Here is the call graph for this function:

◆ tangent_point()

void tangent_point ( const los_t los,
double *  tpz,
double *  tplon,
double *  tplat 
)

Determine the tangent point along a line of sight (LOS).

Computes the location of the tangent point — the point of minimum altitude — along the current line of sight, based on the LOS geometry stored in los_t.

Parameters
[in]losPointer to the line-of-sight (LOS) structure containing altitude, longitude, latitude, and segment length data.
[out]tpzPointer to variable receiving tangent point altitude [km].
[out]tplonPointer to variable receiving tangent point longitude [deg].
[out]tplatPointer to variable receiving tangent point latitude [deg].
  • For limb or occultation geometry, the routine:
    1. Identifies the LOS grid point with minimum altitude.
    2. Fits a quadratic interpolation polynomial: \( z = a x^2 + b x + c \) through the altitudes of the three neighboring LOS points.
    3. Solves analytically for the vertex position \( x = -b / (2a) \), corresponding to the tangent point.
    4. Converts this interpolated position back to geographic coordinates.
  • For nadir or zenith viewing (minimum altitude at the LOS endpoint), the tangent point defaults to the last grid point.
See also
raytrace, geo2cart, cart2geo, los_t
Note
  • The LOS segment lengths (ds) must be consistent with the geometric spacing between altitude points for the interpolation to be accurate.
  • The quadratic interpolation provides sub-kilometer precision for smooth limb rays.
  • Longitude and latitude are returned in degrees.
Warning
  • If the LOS contains fewer than three valid points, or the geometry is strongly curved, the tangent point estimate may be unreliable.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5755 of file jurassic.c.

5759 {
5760
5761 double dummy, v[3], v0[3], v2[3];
5762
5763 /* Find minimum altitude... */
5764 const size_t ip = gsl_stats_min_index(los->z, 1, (size_t) los->np);
5765
5766 /* Nadir or zenith... */
5767 if (ip <= 0 || ip >= (size_t) los->np - 1) {
5768 *tpz = los->z[los->np - 1];
5769 *tplon = los->lon[los->np - 1];
5770 *tplat = los->lat[los->np - 1];
5771 }
5772
5773 /* Limb... */
5774 else {
5775
5776 /* Determine interpolating polynomial y=a*x^2+b*x+c... */
5777 const double yy0 = los->z[ip - 1];
5778 const double yy1 = los->z[ip];
5779 const double yy2 = los->z[ip + 1];
5780 const double x1 = sqrt(POW2(los->ds[ip]) - POW2(yy1 - yy0));
5781 const double x2 = x1 + sqrt(POW2(los->ds[ip + 1]) - POW2(yy2 - yy1));
5782 const double a = 1 / (x1 - x2) * (-(yy0 - yy1) / x1 + (yy0 - yy2) / x2);
5783 const double b = -(yy0 - yy1) / x1 - a * x1;
5784 const double c = yy0;
5785
5786 /* Get tangent point location... */
5787 const double x = -b / (2 * a);
5788 *tpz = a * x * x + b * x + c;
5789 geo2cart(los->z[ip - 1], los->lon[ip - 1], los->lat[ip - 1], v0);
5790 geo2cart(los->z[ip + 1], los->lon[ip + 1], los->lat[ip + 1], v2);
5791 for (int i = 0; i < 3; i++)
5792 v[i] = LIN(0.0, v0[i], x2, v2[i], x);
5793 cart2geo(v, &dummy, tplon, tplat);
5794 }
5795}
Here is the call graph for this function:

◆ time2jsec()

void time2jsec ( const int  year,
const int  mon,
const int  day,
const int  hour,
const int  min,
const int  sec,
const double  remain,
double *  jsec 
)

Converts time components to seconds since January 1, 2000, 12:00:00 UTC.

This function calculates the number of seconds elapsed since January 1, 2000, 12:00:00 UTC, based on the provided year, month, day, hour, minute, and second. It also includes a fractional part to represent the remaining seconds.

Parameters
yearThe year.
monThe month (1-12).
dayThe day of the month (1-31).
hourThe hour of the day (0-23).
minThe minute (0-59).
secThe second (0-59).
remainThe fractional part of seconds.
jsecPointer to store the calculated number of seconds since January 1, 2000, 12:00:00 UTC.

The function calculates the time elapsed since January 1, 2000, 12:00:00 UTC, up to the specified time and includes any fractional seconds indicated by the "remain" parameter.

Note
The function uses the timegm function, which is similar to mktime but operates in UTC.
Author
Lars Hoffmann
Examples
/github/workspace/src/jurassic.h.

Definition at line 5799 of file jurassic.c.

5807 {
5808
5809 struct tm t0, t1;
5810
5811 t0.tm_year = 100;
5812 t0.tm_mon = 0;
5813 t0.tm_mday = 1;
5814 t0.tm_hour = 0;
5815 t0.tm_min = 0;
5816 t0.tm_sec = 0;
5817
5818 t1.tm_year = year - 1900;
5819 t1.tm_mon = mon - 1;
5820 t1.tm_mday = day;
5821 t1.tm_hour = hour;
5822 t1.tm_min = min;
5823 t1.tm_sec = sec;
5824
5825 *jsec = (double) timegm(&t1) - (double) timegm(&t0) + remain;
5826}

◆ timer()

void timer ( const char *  name,
const char *  file,
const char *  func,
int  line,
int  mode 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5830 of file jurassic.c.

5835 {
5836
5837 static double w0[10];
5838
5839 static int l0[10], nt;
5840
5841 /* Start new timer... */
5842 if (mode == 1) {
5843 w0[nt] = omp_get_wtime();
5844 l0[nt] = line;
5845 if ((++nt) >= 10)
5846 ERRMSG("Too many timers!");
5847 }
5848
5849 /* Write elapsed time... */
5850 else {
5851
5852 /* Check timer index... */
5853 if (nt - 1 < 0)
5854 ERRMSG("Coding error!");
5855
5856 /* Write elapsed time... */
5857 LOG(1, "Timer '%s' (%s, %s, l%d-%d): %.3f sec",
5858 name, file, func, l0[nt - 1], line, omp_get_wtime() - w0[nt - 1]);
5859 }
5860
5861 /* Stop timer... */
5862 if (mode == 3)
5863 nt--;
5864}

◆ write_atm()

void write_atm ( const char *  dirname,
const char *  filename,
const ctl_t ctl,
const atm_t atm 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5868 of file jurassic.c.

5872 {
5873
5874 FILE *out;
5875
5876 char file[LEN];
5877
5878 int n = 6;
5879
5880 /* Set filename... */
5881 if (dirname != NULL)
5882 sprintf(file, "%s/%s", dirname, filename);
5883 else
5884 sprintf(file, "%s", filename);
5885
5886 /* Write info... */
5887 LOG(1, "Write atmospheric data: %s", file);
5888
5889 /* Create file... */
5890 if (!(out = fopen(file, "w")))
5891 ERRMSG("Cannot create file!");
5892
5893 /* Write header... */
5894 fprintf(out,
5895 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
5896 "# $2 = altitude [km]\n"
5897 "# $3 = longitude [deg]\n"
5898 "# $4 = latitude [deg]\n"
5899 "# $5 = pressure [hPa]\n" "# $6 = temperature [K]\n");
5900 for (int ig = 0; ig < ctl->ng; ig++)
5901 fprintf(out, "# $%d = %s volume mixing ratio [ppv]\n",
5902 ++n, ctl->emitter[ig]);
5903 for (int iw = 0; iw < ctl->nw; iw++)
5904 fprintf(out, "# $%d = extinction (window %d) [km^-1]\n", ++n, iw);
5905 if (ctl->ncl > 0) {
5906 fprintf(out, "# $%d = cloud layer height [km]\n", ++n);
5907 fprintf(out, "# $%d = cloud layer depth [km]\n", ++n);
5908 for (int icl = 0; icl < ctl->ncl; icl++)
5909 fprintf(out, "# $%d = cloud layer extinction (%.4f cm^-1) [km^-1]\n",
5910 ++n, ctl->clnu[icl]);
5911 }
5912 if (ctl->nsf > 0) {
5913 fprintf(out, "# $%d = surface layer height [km]\n", ++n);
5914 fprintf(out, "# $%d = surface layer pressure [hPa]\n", ++n);
5915 fprintf(out, "# $%d = surface layer temperature [K]\n", ++n);
5916 for (int isf = 0; isf < ctl->nsf; isf++)
5917 fprintf(out, "# $%d = surface layer emissivity (%.4f cm^-1)\n",
5918 ++n, ctl->sfnu[isf]);
5919 }
5920
5921 /* Write data... */
5922 for (int ip = 0; ip < atm->np; ip++) {
5923 if (ip == 0 || atm->time[ip] != atm->time[ip - 1])
5924 fprintf(out, "\n");
5925 fprintf(out, "%.2f %g %g %g %g %g", atm->time[ip], atm->z[ip],
5926 atm->lon[ip], atm->lat[ip], atm->p[ip], atm->t[ip]);
5927 for (int ig = 0; ig < ctl->ng; ig++)
5928 fprintf(out, " %g", atm->q[ig][ip]);
5929 for (int iw = 0; iw < ctl->nw; iw++)
5930 fprintf(out, " %g", atm->k[iw][ip]);
5931 if (ctl->ncl > 0) {
5932 fprintf(out, " %g %g", atm->clz, atm->cldz);
5933 for (int icl = 0; icl < ctl->ncl; icl++)
5934 fprintf(out, " %g", atm->clk[icl]);
5935 }
5936 if (ctl->nsf > 0) {
5937 fprintf(out, " %g", atm->sft);
5938 for (int isf = 0; isf < ctl->nsf; isf++)
5939 fprintf(out, " %g", atm->sfeps[isf]);
5940 }
5941 fprintf(out, "\n");
5942 }
5943
5944 /* Close file... */
5945 fclose(out);
5946
5947 /* Write info... */
5948 double mini, maxi;
5949 LOG(2, "Number of data points: %d", atm->np);
5950 gsl_stats_minmax(&mini, &maxi, atm->time, 1, (size_t) atm->np);
5951 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
5952 gsl_stats_minmax(&mini, &maxi, atm->z, 1, (size_t) atm->np);
5953 LOG(2, "Altitude range: %g ... %g km", mini, maxi);
5954 gsl_stats_minmax(&mini, &maxi, atm->lon, 1, (size_t) atm->np);
5955 LOG(2, "Longitude range: %g ... %g deg", mini, maxi);
5956 gsl_stats_minmax(&mini, &maxi, atm->lat, 1, (size_t) atm->np);
5957 LOG(2, "Latitude range: %g ... %g deg", mini, maxi);
5958 gsl_stats_minmax(&mini, &maxi, atm->p, 1, (size_t) atm->np);
5959 LOG(2, "Pressure range: %g ... %g hPa", maxi, mini);
5960 gsl_stats_minmax(&mini, &maxi, atm->t, 1, (size_t) atm->np);
5961 LOG(2, "Temperature range: %g ... %g K", mini, maxi);
5962 for (int ig = 0; ig < ctl->ng; ig++) {
5963 gsl_stats_minmax(&mini, &maxi, atm->q[ig], 1, (size_t) atm->np);
5964 LOG(2, "Emitter %s range: %g ... %g ppv", ctl->emitter[ig], mini, maxi);
5965 }
5966 for (int iw = 0; iw < ctl->nw; iw++) {
5967 gsl_stats_minmax(&mini, &maxi, atm->k[iw], 1, (size_t) atm->np);
5968 LOG(2, "Extinction range (window %d): %g ... %g km^-1", iw, mini, maxi);
5969 }
5970 if (ctl->ncl > 0 && atm->np == 0) {
5971 LOG(2, "Cloud layer: z= %g km | dz= %g km | k= %g ... %g km^-1",
5972 atm->clz, atm->cldz, atm->clk[0], atm->clk[ctl->ncl - 1]);
5973 } else
5974 LOG(2, "Cloud layer: none");
5975 if (ctl->nsf > 0 && atm->np == 0) {
5976 LOG(2,
5977 "Surface layer: T_s = %g K | eps= %g ... %g",
5978 atm->sft, atm->sfeps[0], atm->sfeps[ctl->nsf - 1]);
5979 } else
5980 LOG(2, "Surface layer: none");
5981}

◆ write_atm_rfm()

void write_atm_rfm ( const char *  filename,
const ctl_t ctl,
const atm_t atm 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 5985 of file jurassic.c.

5988 {
5989
5990 FILE *out;
5991
5992 /* Write info... */
5993 LOG(1, "Write RFM data: %s", filename);
5994
5995 /* Create file... */
5996 if (!(out = fopen(filename, "w")))
5997 ERRMSG("Cannot create file!");
5998
5999 /* Write data... */
6000 fprintf(out, "%d\n", atm->np);
6001 fprintf(out, "*HGT [km]\n");
6002 for (int ip = 0; ip < atm->np; ip++)
6003 fprintf(out, "%g\n", atm->z[ip]);
6004 fprintf(out, "*PRE [mb]\n");
6005 for (int ip = 0; ip < atm->np; ip++)
6006 fprintf(out, "%g\n", atm->p[ip]);
6007 fprintf(out, "*TEM [K]\n");
6008 for (int ip = 0; ip < atm->np; ip++)
6009 fprintf(out, "%g\n", atm->t[ip]);
6010 for (int ig = 0; ig < ctl->ng; ig++) {
6011 fprintf(out, "*%s [ppmv]\n", ctl->emitter[ig]);
6012 for (int ip = 0; ip < atm->np; ip++)
6013 fprintf(out, "%g\n", atm->q[ig][ip] * 1e6);
6014 }
6015 fprintf(out, "*END\n");
6016
6017 /* Close file... */
6018 fclose(out);
6019}

◆ write_matrix()

void write_matrix ( const char *  dirname,
const char *  filename,
const ctl_t ctl,
const gsl_matrix *  matrix,
const atm_t atm,
const obs_t obs,
const char *  rowspace,
const char *  colspace,
const char *  sort 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6023 of file jurassic.c.

6032 {
6033
6034 FILE *out;
6035
6036 char file[LEN], quantity[LEN];
6037
6038 int *cida, *ciqa, *cipa, *cira, *rida, *riqa, *ripa, *rira;
6039
6040 size_t i, j, nc, nr;
6041
6042 /* Check output flag... */
6043 if (!ctl->write_matrix)
6044 return;
6045
6046 /* Allocate... */
6047 ALLOC(cida, int,
6048 M);
6049 ALLOC(ciqa, int,
6050 N);
6051 ALLOC(cipa, int,
6052 N);
6053 ALLOC(cira, int,
6054 M);
6055 ALLOC(rida, int,
6056 M);
6057 ALLOC(riqa, int,
6058 N);
6059 ALLOC(ripa, int,
6060 N);
6061 ALLOC(rira, int,
6062 M);
6063
6064 /* Set filename... */
6065 if (dirname != NULL)
6066 sprintf(file, "%s/%s", dirname, filename);
6067 else
6068 sprintf(file, "%s", filename);
6069
6070 /* Write info... */
6071 LOG(1, "Write matrix: %s", file);
6072
6073 /* Create file... */
6074 if (!(out = fopen(file, "w")))
6075 ERRMSG("Cannot create file!");
6076
6077 /* Write header (row space)... */
6078 if (rowspace[0] == 'y') {
6079
6080 fprintf(out,
6081 "# $1 = Row: index (measurement space)\n"
6082 "# $2 = Row: channel wavenumber [cm^-1]\n"
6083 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
6084 "# $4 = Row: view point altitude [km]\n"
6085 "# $5 = Row: view point longitude [deg]\n"
6086 "# $6 = Row: view point latitude [deg]\n");
6087
6088 /* Get number of rows... */
6089 nr = obs2y(ctl, obs, NULL, rida, rira);
6090
6091 } else {
6092
6093 fprintf(out,
6094 "# $1 = Row: index (state space)\n"
6095 "# $2 = Row: name of quantity\n"
6096 "# $3 = Row: time (seconds since 2000-01-01T00:00Z)\n"
6097 "# $4 = Row: altitude [km]\n"
6098 "# $5 = Row: longitude [deg]\n" "# $6 = Row: latitude [deg]\n");
6099
6100 /* Get number of rows... */
6101 nr = atm2x(ctl, atm, NULL, riqa, ripa);
6102 }
6103
6104 /* Write header (column space)... */
6105 if (colspace[0] == 'y') {
6106
6107 fprintf(out,
6108 "# $7 = Col: index (measurement space)\n"
6109 "# $8 = Col: channel wavenumber [cm^-1]\n"
6110 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
6111 "# $10 = Col: view point altitude [km]\n"
6112 "# $11 = Col: view point longitude [deg]\n"
6113 "# $12 = Col: view point latitude [deg]\n");
6114
6115 /* Get number of columns... */
6116 nc = obs2y(ctl, obs, NULL, cida, cira);
6117
6118 } else {
6119
6120 fprintf(out,
6121 "# $7 = Col: index (state space)\n"
6122 "# $8 = Col: name of quantity\n"
6123 "# $9 = Col: time (seconds since 2000-01-01T00:00Z)\n"
6124 "# $10 = Col: altitude [km]\n"
6125 "# $11 = Col: longitude [deg]\n" "# $12 = Col: latitude [deg]\n");
6126
6127 /* Get number of columns... */
6128 nc = atm2x(ctl, atm, NULL, ciqa, cipa);
6129 }
6130
6131 /* Write header entry... */
6132 fprintf(out, "# $13 = Matrix element\n\n");
6133
6134 /* Write matrix data... */
6135 i = j = 0;
6136 while (i < nr && j < nc) {
6137
6138 /* Write info about the row... */
6139 if (rowspace[0] == 'y')
6140 fprintf(out, "%d %.4f %.2f %g %g %g",
6141 (int) i, ctl->nu[rida[i]],
6142 obs->time[rira[i]], obs->vpz[rira[i]],
6143 obs->vplon[rira[i]], obs->vplat[rira[i]]);
6144 else {
6145 idx2name(ctl, riqa[i], quantity);
6146 fprintf(out, "%d %s %.2f %g %g %g", (int) i, quantity,
6147 atm->time[ripa[i]], atm->z[ripa[i]],
6148 atm->lon[ripa[i]], atm->lat[ripa[i]]);
6149 }
6150
6151 /* Write info about the column... */
6152 if (colspace[0] == 'y')
6153 fprintf(out, " %d %.4f %.2f %g %g %g",
6154 (int) j, ctl->nu[cida[j]],
6155 obs->time[cira[j]], obs->vpz[cira[j]],
6156 obs->vplon[cira[j]], obs->vplat[cira[j]]);
6157 else {
6158 idx2name(ctl, ciqa[j], quantity);
6159 fprintf(out, " %d %s %.2f %g %g %g", (int) j, quantity,
6160 atm->time[cipa[j]], atm->z[cipa[j]],
6161 atm->lon[cipa[j]], atm->lat[cipa[j]]);
6162 }
6163
6164 /* Write matrix entry... */
6165 fprintf(out, " %g\n", gsl_matrix_get(matrix, i, j));
6166
6167 /* Set matrix indices... */
6168 if (sort[0] == 'r') {
6169 j++;
6170 if (j >= nc) {
6171 j = 0;
6172 i++;
6173 fprintf(out, "\n");
6174 }
6175 } else {
6176 i++;
6177 if (i >= nr) {
6178 i = 0;
6179 j++;
6180 fprintf(out, "\n");
6181 }
6182 }
6183 }
6184
6185 /* Close file... */
6186 fclose(out);
6187
6188 /* Free... */
6189 free(cida);
6190 free(ciqa);
6191 free(cipa);
6192 free(cira);
6193 free(rida);
6194 free(riqa);
6195 free(ripa);
6196 free(rira);
6197}
void idx2name(const ctl_t *ctl, const int idx, char *quantity)
Convert a quantity index to a descriptive name string.
Definition: jurassic.c:3842
#define M
Maximum size of measurement vector.
Definition: jurassic.h:271
Here is the call graph for this function:

◆ write_obs()

void write_obs ( const char *  dirname,
const char *  filename,
const ctl_t ctl,
const obs_t obs 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6201 of file jurassic.c.

6205 {
6206
6207 FILE *out;
6208
6209 char file[LEN];
6210
6211 int n = 10;
6212
6213 /* Set filename... */
6214 if (dirname != NULL)
6215 sprintf(file, "%s/%s", dirname, filename);
6216 else
6217 sprintf(file, "%s", filename);
6218
6219 /* Write info... */
6220 LOG(1, "Write observation data: %s", file);
6221
6222 /* Create file... */
6223 if (!(out = fopen(file, "w")))
6224 ERRMSG("Cannot create file!");
6225
6226 /* Write header... */
6227 fprintf(out,
6228 "# $1 = time (seconds since 2000-01-01T00:00Z)\n"
6229 "# $2 = observer altitude [km]\n"
6230 "# $3 = observer longitude [deg]\n"
6231 "# $4 = observer latitude [deg]\n"
6232 "# $5 = view point altitude [km]\n"
6233 "# $6 = view point longitude [deg]\n"
6234 "# $7 = view point latitude [deg]\n"
6235 "# $8 = tangent point altitude [km]\n"
6236 "# $9 = tangent point longitude [deg]\n"
6237 "# $10 = tangent point latitude [deg]\n");
6238 for (int id = 0; id < ctl->nd; id++)
6239 if (ctl->write_bbt)
6240 fprintf(out, "# $%d = brightness temperature (%.4f cm^-1) [K]\n",
6241 ++n, ctl->nu[id]);
6242 else
6243 fprintf(out, "# $%d = radiance (%.4f cm^-1) [W/(m^2 sr cm^-1)]\n",
6244 ++n, ctl->nu[id]);
6245 for (int id = 0; id < ctl->nd; id++)
6246 fprintf(out, "# $%d = transmittance (%.4f cm^-1) [-]\n", ++n,
6247 ctl->nu[id]);
6248
6249 /* Write data... */
6250 for (int ir = 0; ir < obs->nr; ir++) {
6251 if (ir == 0 || obs->time[ir] != obs->time[ir - 1])
6252 fprintf(out, "\n");
6253 fprintf(out, "%.2f %g %g %g %g %g %g %g %g %g", obs->time[ir],
6254 obs->obsz[ir], obs->obslon[ir], obs->obslat[ir],
6255 obs->vpz[ir], obs->vplon[ir], obs->vplat[ir],
6256 obs->tpz[ir], obs->tplon[ir], obs->tplat[ir]);
6257 for (int id = 0; id < ctl->nd; id++)
6258 fprintf(out, " %g", obs->rad[id][ir]);
6259 for (int id = 0; id < ctl->nd; id++)
6260 fprintf(out, " %g", obs->tau[id][ir]);
6261 fprintf(out, "\n");
6262 }
6263
6264 /* Close file... */
6265 fclose(out);
6266
6267 /* Write info... */
6268 double mini, maxi;
6269 LOG(2, "Number of ray paths: %d", obs->nr);
6270 gsl_stats_minmax(&mini, &maxi, obs->time, 1, (size_t) obs->nr);
6271 LOG(2, "Time range: %.2f ... %.2f s", mini, maxi);
6272 gsl_stats_minmax(&mini, &maxi, obs->obsz, 1, (size_t) obs->nr);
6273 LOG(2, "Observer altitude range: %g ... %g km", mini, maxi);
6274 gsl_stats_minmax(&mini, &maxi, obs->obslon, 1, (size_t) obs->nr);
6275 LOG(2, "Observer longitude range: %g ... %g deg", mini, maxi);
6276 gsl_stats_minmax(&mini, &maxi, obs->obslat, 1, (size_t) obs->nr);
6277 LOG(2, "Observer latitude range: %g ... %g deg", mini, maxi);
6278 gsl_stats_minmax(&mini, &maxi, obs->vpz, 1, (size_t) obs->nr);
6279 LOG(2, "View point altitude range: %g ... %g km", mini, maxi);
6280 gsl_stats_minmax(&mini, &maxi, obs->vplon, 1, (size_t) obs->nr);
6281 LOG(2, "View point longitude range: %g ... %g deg", mini, maxi);
6282 gsl_stats_minmax(&mini, &maxi, obs->vplat, 1, (size_t) obs->nr);
6283 LOG(2, "View point latitude range: %g ... %g deg", mini, maxi);
6284 gsl_stats_minmax(&mini, &maxi, obs->tpz, 1, (size_t) obs->nr);
6285 LOG(2, "Tangent point altitude range: %g ... %g km", mini, maxi);
6286 gsl_stats_minmax(&mini, &maxi, obs->tplon, 1, (size_t) obs->nr);
6287 LOG(2, "Tangent point longitude range: %g ... %g deg", mini, maxi);
6288 gsl_stats_minmax(&mini, &maxi, obs->tplat, 1, (size_t) obs->nr);
6289 LOG(2, "Tangent point latitude range: %g ... %g deg", mini, maxi);
6290 for (int id = 0; id < ctl->nd; id++) {
6291 gsl_stats_minmax(&mini, &maxi, obs->rad[id], 1, (size_t) obs->nr);
6292 if (ctl->write_bbt) {
6293 LOG(2, "Brightness temperature (%.4f cm^-1) range: %g ... %g K",
6294 ctl->nu[id], mini, maxi);
6295 } else {
6296 LOG(2, "Radiance (%.4f cm^-1) range: %g ... %g W/(m^2 sr cm^-1)",
6297 ctl->nu[id], mini, maxi);
6298 }
6299 }
6300 for (int id = 0; id < ctl->nd; id++) {
6301 gsl_stats_minmax(&mini, &maxi, obs->tau[id], 1, (size_t) obs->nr);
6302 if (ctl->write_bbt) {
6303 LOG(2, "Transmittance (%.4f cm^-1) range: %g ... %g",
6304 ctl->nu[id], mini, maxi);
6305 }
6306 }
6307}

◆ write_shape()

void write_shape ( const char *  filename,
const double *  x,
const double *  y,
const int  n 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6311 of file jurassic.c.

6315 {
6316
6317 FILE *out;
6318
6319 /* Write info... */
6320 LOG(1, "Write shape function: %s", filename);
6321
6322 /* Create file... */
6323 if (!(out = fopen(filename, "w")))
6324 ERRMSG("Cannot create file!");
6325
6326 /* Write header... */
6327 fprintf(out,
6328 "# $1 = shape function x-value [-]\n"
6329 "# $2 = shape function y-value [-]\n\n");
6330
6331 /* Write data... */
6332 for (int i = 0; i < n; i++)
6333 fprintf(out, "%.10g %.10g\n", x[i], y[i]);
6334
6335 /* Close file... */
6336 fclose(out);
6337}

◆ write_stddev()

void write_stddev ( const char *  quantity,
ret_t ret,
ctl_t ctl,
atm_t atm,
gsl_matrix *  s 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6341 of file jurassic.c.

6346 {
6347
6348 static atm_t atm_aux;
6349
6350 char filename[LEN];
6351
6352 /* Get sizes... */
6353 const size_t n = s->size1;
6354
6355 /* Allocate... */
6356 gsl_vector *x_aux = gsl_vector_alloc(n);
6357
6358 /* Compute standard deviation... */
6359 for (size_t i = 0; i < n; i++)
6360 gsl_vector_set(x_aux, i, sqrt(gsl_matrix_get(s, i, i)));
6361
6362 /* Write to disk... */
6363 copy_atm(ctl, &atm_aux, atm, 1);
6364 x2atm(ctl, x_aux, &atm_aux);
6365 sprintf(filename, "atm_err_%s.tab", quantity);
6366 write_atm(ret->dir, filename, ctl, &atm_aux);
6367
6368 /* Free... */
6369 gsl_vector_free(x_aux);
6370}
Here is the call graph for this function:

◆ write_tbl()

void write_tbl ( const ctl_t ctl,
const tbl_t tbl 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6374 of file jurassic.c.

6376 {
6377
6378 FILE *out;
6379
6380 char filename[2 * LEN];
6381
6382 /* Loop over emitters and detectors... */
6383 for (int ig = 0; ig < ctl->ng; ig++)
6384 for (int id = 0; id < ctl->nd; id++) {
6385
6386 /* Set filename... */
6387 sprintf(filename, "%s_%.4f_%s.%s", ctl->tblbase,
6388 ctl->nu[id], ctl->emitter[ig],
6389 ctl->tblfmt == 1 ? "tab" : "bin");
6390
6391 /* Write info... */
6392 LOG(1, "Write emissivity table: %s", filename);
6393
6394 /* Create file... */
6395 if (!(out = fopen(filename, "w")))
6396 ERRMSG("Cannot create file!");
6397
6398 /* Write ASCII data... */
6399 if (ctl->tblfmt == 1) {
6400
6401 /* Write header... */
6402 fprintf(out,
6403 "# $1 = pressure [hPa]\n"
6404 "# $2 = temperature [K]\n"
6405 "# $3 = column density [molecules/cm^2]\n"
6406 "# $4 = emissivity [-]\n");
6407
6408 /* Save table file... */
6409 for (int ip = 0; ip < tbl->np[id][ig]; ip++)
6410 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6411 fprintf(out, "\n");
6412 for (int iu = 0; iu < tbl->nu[id][ig][ip][it]; iu++)
6413 fprintf(out, "%g %g %e %e\n",
6414 tbl->p[id][ig][ip], tbl->t[id][ig][ip][it],
6415 tbl->u[id][ig][ip][it][iu],
6416 tbl->eps[id][ig][ip][it][iu]);
6417 }
6418 }
6419
6420 /* Write binary data... */
6421 else if (ctl->tblfmt == 2) {
6422 FWRITE(&tbl->np[id][ig], int,
6423 1,
6424 out);
6425 FWRITE(tbl->p[id][ig], double,
6426 (size_t) tbl->np[id][ig],
6427 out);
6428 for (int ip = 0; ip < tbl->np[id][ig]; ip++) {
6429 FWRITE(&tbl->nt[id][ig][ip], int,
6430 1,
6431 out);
6432 FWRITE(tbl->t[id][ig][ip], double,
6433 (size_t) tbl->nt[id][ig][ip],
6434 out);
6435 for (int it = 0; it < tbl->nt[id][ig][ip]; it++) {
6436 FWRITE(&tbl->nu[id][ig][ip][it], int,
6437 1,
6438 out);
6439 FWRITE(tbl->u[id][ig][ip][it], float,
6440 (size_t) tbl->nu[id][ig][ip][it],
6441 out);
6442 FWRITE(tbl->eps[id][ig][ip][it], float,
6443 (size_t) tbl->nu[id][ig][ip][it],
6444 out);
6445 }
6446 }
6447 }
6448
6449 /* Error message... */
6450 else
6451 ERRMSG("Unknown look-up table format!");
6452
6453 /* Close file... */
6454 fclose(out);
6455 }
6456}
#define FWRITE(ptr, type, size, out)
Write binary data to a file.
Definition: jurassic.h:514

◆ x2atm()

void x2atm ( const ctl_t ctl,
const gsl_vector *  x,
atm_t atm 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6460 of file jurassic.c.

6463 {
6464
6465 size_t n = 0;
6466
6467 /* Get pressure... */
6468 for (int ip = 0; ip < atm->np; ip++)
6469 if (atm->z[ip] >= ctl->retp_zmin && atm->z[ip] <= ctl->retp_zmax)
6470 x2atm_help(&atm->p[ip], x, &n);
6471
6472 /* Get temperature... */
6473 for (int ip = 0; ip < atm->np; ip++)
6474 if (atm->z[ip] >= ctl->rett_zmin && atm->z[ip] <= ctl->rett_zmax)
6475 x2atm_help(&atm->t[ip], x, &n);
6476
6477 /* Get volume mixing ratio... */
6478 for (int ig = 0; ig < ctl->ng; ig++)
6479 for (int ip = 0; ip < atm->np; ip++)
6480 if (atm->z[ip] >= ctl->retq_zmin[ig]
6481 && atm->z[ip] <= ctl->retq_zmax[ig])
6482 x2atm_help(&atm->q[ig][ip], x, &n);
6483
6484 /* Get extinction... */
6485 for (int iw = 0; iw < ctl->nw; iw++)
6486 for (int ip = 0; ip < atm->np; ip++)
6487 if (atm->z[ip] >= ctl->retk_zmin[iw]
6488 && atm->z[ip] <= ctl->retk_zmax[iw])
6489 x2atm_help(&atm->k[iw][ip], x, &n);
6490
6491 /* Get cloud data... */
6492 if (ctl->ret_clz)
6493 x2atm_help(&atm->clz, x, &n);
6494 if (ctl->ret_cldz)
6495 x2atm_help(&atm->cldz, x, &n);
6496 if (ctl->ret_clk)
6497 for (int icl = 0; icl < ctl->ncl; icl++)
6498 x2atm_help(&atm->clk[icl], x, &n);
6499
6500 /* Get surface data... */
6501 if (ctl->ret_sft)
6502 x2atm_help(&atm->sft, x, &n);
6503 if (ctl->ret_sfeps)
6504 for (int isf = 0; isf < ctl->nsf; isf++)
6505 x2atm_help(&atm->sfeps[isf], x, &n);
6506}
void x2atm_help(double *value, const gsl_vector *x, size_t *n)
Definition: jurassic.c:6510
Here is the call graph for this function:

◆ x2atm_help()

void x2atm_help ( double *  value,
const gsl_vector *  x,
size_t *  n 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6510 of file jurassic.c.

6513 {
6514
6515 /* Get state vector element... */
6516 *value = gsl_vector_get(x, *n);
6517 (*n)++;
6518}

◆ y2obs()

void y2obs ( const ctl_t ctl,
const gsl_vector *  y,
obs_t obs 
)
Examples
/github/workspace/src/jurassic.h.

Definition at line 6522 of file jurassic.c.

6525 {
6526
6527 size_t m = 0;
6528
6529 /* Decompose measurement vector... */
6530 for (int ir = 0; ir < obs->nr; ir++)
6531 for (int id = 0; id < ctl->nd; id++)
6532 if (isfinite(obs->rad[id][ir])) {
6533 obs->rad[id][ir] = gsl_vector_get(y, m);
6534 m++;
6535 }
6536}