35#define MAXNPTS 10000000 
   47  static char *line = NULL;
 
   50    nu, nu0, nu1, nuf[
MAXNF], press, temp, u;
 
   52  static int i, idx, nf, npts;
 
   54  size_t line_buf_size = 0;
 
   58    ERRMSG(
"Give parameters: <press> <temp> <spec> <filter>");
 
   59  sscanf(argv[1], 
"%lg", &press);
 
   60  sscanf(argv[2], 
"%lg", &temp);
 
   63  u = 1e-6 * press * 100 / (1.380658e-23 * temp) * 1000 / 1e4;
 
   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)
 
   71        ERRMSG(
"Too many points in filter function");
 
   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);
 
   82    ERRMSG(
"Too many points in optical depth spectrum!");
 
   84  while (getline(&line, &line_buf_size, in) != -1) {
 
   85    char *tok = strtok(line, 
" \t\n");
 
   88        ERRMSG(
"Too many data points in spectrum file!");
 
   89      sscanf(tok, 
"%lg", &abs[i]);
 
   92      tok = strtok(NULL, 
" \t\n");
 
   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;
 
  103  for (u = 1.0; u <= 1e30; u *= 1.122) {
 
  106    double epssum = 0, fsum = 0;
 
  107    for (i = i0; i < npts; i++) {
 
  108      nu = nu0 + dnu * (double) i;
 
  111      else if (nu > nuf[nf - 1])
 
  114        if (nu < nuf[idx] || nu > nuf[idx + 1])
 
  116        f = 
LIN(nuf[idx], filt[idx], nuf[idx + 1], filt[idx + 1], nu);
 
  118        epssum += f * exp(-abs[i] * u);
 
  121    epssum = 1 - epssum / fsum;
 
  124    if (epssum >= 1e-6 && epssum <= 0.999999 && epssum > epsold)
 
  125      printf(
"%g %g %g %g\n", press, temp, u, epssum);
 
  129    if (epssum > 0.999999)
 
int locate_irr(const double *xx, const int n, const double x)
Find array index for irregular grid.
 
JURASSIC library declarations.
 
#define ERRMSG(...)
Print error message and quit program.
 
#define LIN(x0, y0, x1, y1, x)
Compute linear interpolation.
 
int main(int argc, char *argv[])