JURASSIC
Macros | Functions
tblgen.c File Reference

Prepapre look-up tables from monochromatic absorption spectra. More...

#include "jurassic.h"

Go to the source code of this file.

Macros

#define MAXNF   20000
 
#define MAXNPTS   10000000
 

Functions

int main (int argc, char *argv[])
 

Detailed Description

Prepapre look-up tables from monochromatic absorption spectra.

Definition in file tblgen.c.

Macro Definition Documentation

◆ MAXNF

#define MAXNF   20000

Definition at line 32 of file tblgen.c.

◆ MAXNPTS

#define MAXNPTS   10000000

Definition at line 35 of file tblgen.c.

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 41 of file tblgen.c.

43 {
44
45 FILE *in;
46
47 static char *line = NULL;
48
49 static double dnu, abs[MAXNPTS], epsold, f, filt[MAXNF],
50 nu, nu0, nu1, nuf[MAXNF], press, temp, u;
51
52 static int i, idx, nf, npts;
53
54 size_t line_buf_size = 0;
55
56 /* Read command line arguments... */
57 if (argc != 5)
58 ERRMSG("Give parameters: <press> <temp> <spec> <filter>");
59 sscanf(argv[1], "%lg", &press);
60 sscanf(argv[2], "%lg", &temp);
61
62 /* Compute column density [molec/cm^2] (1 km path length, 1 ppmv)... */
63 u = 1e-6 * press * 100 / (1.380658e-23 * temp) * 1000 / 1e4;
64
65 /* Read filter function... */
66 if (!(in = fopen(argv[4], "r")))
67 ERRMSG("Cannot open filter file!");
68 while (getline(&line, &line_buf_size, in) != -1)
69 if (sscanf(line, "%lg %lg", &nuf[nf], &filt[nf]) == 2)
70 if (++nf >= MAXNF)
71 ERRMSG("Too many points in filter function");
72 fclose(in);
73
74 /* Read spectrum... */
75 if (!(in = fopen(argv[3], "r")))
76 ERRMSG("Cannot open spectrum!");
77 for (i = 0; i < 4; ++i)
78 if (getline(&line, &line_buf_size, in) == -1)
79 ERRMSG("Error while reading spectrum!");
80 sscanf(line, "%d %lg %lg %lg", &npts, &nu0, &dnu, &nu1);
81 if (npts > MAXNPTS)
82 ERRMSG("Too many points in optical depth spectrum!");
83 i = 0;
84 while (getline(&line, &line_buf_size, in) != -1) {
85 char *tok = strtok(line, " \t\n");
86 while (tok != NULL) {
87 if (i >= MAXNPTS)
88 ERRMSG("Too many data points in spectrum file!");
89 sscanf(tok, "%lg", &abs[i]);
90 abs[i] /= u;
91 ++i;
92 tok = strtok(NULL, " \t\n");
93 }
94 }
95 fclose(in);
96
97 /* Set grid spacing... */
98 dnu = (nu1 - nu0) / ((double) npts - 1.0);
99 const double r0 = (nuf[0] - nu0) / (nu1 - nu0) * (double) npts;
100 const int i0 = (int) r0;
101
102 /* Loop over column densities... */
103 for (u = 1.0; u <= 1e30; u *= 1.122) {
104
105 /* Integrate... */
106 double epssum = 0, fsum = 0;
107 for (i = i0; i < npts; i++) {
108 nu = nu0 + dnu * (double) i;
109 if (nu < nuf[0])
110 continue;
111 else if (nu > nuf[nf - 1])
112 break;
113 else {
114 if (nu < nuf[idx] || nu > nuf[idx + 1])
115 idx = locate_irr(nuf, nf, nu);
116 f = LIN(nuf[idx], filt[idx], nuf[idx + 1], filt[idx + 1], nu);
117 fsum += f;
118 epssum += f * exp(-abs[i] * u);
119 }
120 }
121 epssum = 1 - epssum / fsum;
122
123 /* Write output... */
124 if (epssum >= 1e-6 && epssum <= 0.999999 && epssum > epsold)
125 printf("%g %g %g %g\n", press, temp, u, epssum);
126 epsold = epssum;
127
128 /* Check for termination... */
129 if (epssum > 0.999999)
130 return EXIT_SUCCESS;
131 }
132
133 return EXIT_SUCCESS;
134}
int locate_irr(const double *xx, const int n, const double x)
Find array index for irregular grid.
Definition: jurassic.c:4241
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:238
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
Definition: jurassic.h:165
#define MAXNF
Definition: tblgen.c:32
#define MAXNPTS
Definition: tblgen.c:35
Here is the call graph for this function: