AIRS Code Collection
Functions
map_pert.c File Reference

Extract maps of gravity wave perturbations. More...

#include "libairs.h"

Go to the source code of this file.

Functions

double fill_array (double var[PERT_NTRACK][PERT_NXTRACK], int ntrack, int itrack, int ixtrack)
 
int main (int argc, char *argv[])
 

Detailed Description

Extract maps of gravity wave perturbations.

Definition in file map_pert.c.

Function Documentation

◆ fill_array()

double fill_array ( double  var[PERT_NTRACK][PERT_NXTRACK],
int  ntrack,
int  itrack,
int  ixtrack 
)

Definition at line 242 of file map_pert.c.

246 {
247
248 double d1 = 0, d2 = 0, v1 = 0, v2 = 0;
249
250 /* Find nearest neighbours... */
251 for (int i = itrack + 1; i < ntrack; i++)
252 if (gsl_finite(var[i][ixtrack])) {
253 d1 = fabs((double) i - (double) itrack);
254 v1 = var[i][ixtrack];
255 break;
256 }
257 for (int i = itrack - 1; i >= 0; i--)
258 if (gsl_finite(var[i][ixtrack])) {
259 d2 = fabs((double) i - (double) itrack);
260 v2 = var[i][ixtrack];
261 break;
262 }
263
264 /* Interpolate... */
265 if (d1 + d2 > 0)
266 return (d2 * v1 + d1 * v2) / (d1 + d2);
267 else
268 return GSL_NAN;
269}

◆ main()

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

Definition at line 43 of file map_pert.c.

45 {
46
47 static pert_t *pert, *pert2;
48 static wave_t wave;
49
50 char set[LEN], pertname[LEN];
51
52 double nedt = 0, sza2 = 0;
53
54 int orb = 0;
55
56 FILE *out;
57
58 /* Check arguments... */
59 if (argc < 4)
60 ERRMSG("Give parameters: <ctl> <pert.nc> <map.tab>");
61
62 /* Get control parameters... */
63 scan_ctl(argc, argv, "PERTNAME", -1, "4mu", pertname);
64 const int bg_poly_x =
65 (int) scan_ctl(argc, argv, "BG_POLY_X", -1, "0", NULL);
66 const int bg_poly_y =
67 (int) scan_ctl(argc, argv, "BG_POLY_Y", -1, "0", NULL);
68 const int bg_smooth_x =
69 (int) scan_ctl(argc, argv, "BG_SMOOTH_X", -1, "0", NULL);
70 const int bg_smooth_y =
71 (int) scan_ctl(argc, argv, "BG_SMOOTH_Y", -1, "0", NULL);
72 const double gauss_fwhm = scan_ctl(argc, argv, "GAUSS_FWHM", -1, "0", NULL);
73 const int ham_iter = (int) scan_ctl(argc, argv, "HAM_ITER", -1, "0", NULL);
74 const int med_dx = (int) scan_ctl(argc, argv, "MED_DX", -1, "0", NULL);
75 const double var_dh = scan_ctl(argc, argv, "VAR_DH", -1, "0", NULL);
76 scan_ctl(argc, argv, "SET", -1, "full", set);
77 const int orbit = (int) scan_ctl(argc, argv, "ORBIT", -1, "-999", NULL);
78 const double orblat = scan_ctl(argc, argv, "ORBLAT", -1, "0", NULL);
79 const double t0 = scan_ctl(argc, argv, "T0", -1, "-1e100", NULL);
80 const double t1 = scan_ctl(argc, argv, "T1", -1, "1e100", NULL);
81 const double sza0 = scan_ctl(argc, argv, "SZA0", -1, "-1e100", NULL);
82 const double sza1 = scan_ctl(argc, argv, "SZA1", -1, "1e100", NULL);
83 const double dt230 = scan_ctl(argc, argv, "DT230", -1, "0.16", NULL);
84 const double nu = scan_ctl(argc, argv, "NU", -1, "2345.0", NULL);
85 const int fill = (int) scan_ctl(argc, argv, "FILL", -1, "0", NULL);
86
87 /* Allocate... */
88 ALLOC(pert, pert_t, 1);
89 ALLOC(pert2, pert_t, 1);
90
91 /* Read perturbation data... */
92 read_pert(argv[2], pertname, pert);
93
94 /* Recalculate background and perturbations... */
95 if (bg_poly_x > 0 || bg_poly_y > 0 ||
96 bg_smooth_x > 0 || bg_smooth_y > 0 ||
97 gauss_fwhm > 0 || ham_iter > 0 || med_dx > 0 || var_dh > 0) {
98
99 /* Convert to wave analysis struct... */
100 pert2wave(pert, &wave, 0, pert->ntrack - 1, 0, pert->nxtrack - 1);
101
102 /* Estimate background... */
103 background_poly(&wave, bg_poly_x, bg_poly_y);
104 background_smooth(&wave, bg_smooth_x, bg_smooth_y);
105
106 /* Gaussian filter... */
107 gauss(&wave, gauss_fwhm);
108
109 /* Hamming filter... */
110 hamming(&wave, ham_iter);
111
112 /* Median filter... */
113 median(&wave, med_dx);
114
115 /* Compute variance... */
116 variance(&wave, var_dh);
117
118 /* Copy data... */
119 for (int ix = 0; ix < wave.nx; ix++)
120 for (int iy = 0; iy < wave.ny; iy++) {
121 pert->pt[iy][ix] = wave.pt[ix][iy];
122 pert->var[iy][ix] = wave.var[ix][iy];
123 }
124 }
125
126 /* Fill data gaps... */
127 if (fill)
128 for (int itrack = 0; itrack < pert->ntrack; itrack++)
129 for (int ixtrack = 0; ixtrack < pert->nxtrack; ixtrack++) {
130 if (!gsl_finite(pert->dc[itrack][ixtrack]))
131 pert->dc[itrack][ixtrack]
132 = fill_array(pert->dc, pert->ntrack, itrack, ixtrack);
133 if (!gsl_finite(pert->bt[itrack][ixtrack]))
134 pert->bt[itrack][ixtrack]
135 = fill_array(pert->bt, pert->ntrack, itrack, ixtrack);
136 if (!gsl_finite(pert->pt[itrack][ixtrack]))
137 pert->pt[itrack][ixtrack]
138 = fill_array(pert->pt, pert->ntrack, itrack, ixtrack);
139 if (!gsl_finite(pert->var[itrack][ixtrack]))
140 pert->var[itrack][ixtrack]
141 = fill_array(pert->var, pert->ntrack, itrack, ixtrack);
142 }
143
144 /* Interpolate to fine grid... */
145 memcpy(pert2, pert, sizeof(pert_t));
146
147 /* Create output file... */
148 printf("Write perturbation data: %s\n", argv[3]);
149 if (!(out = fopen(argv[3], "w")))
150 ERRMSG("Cannot create file!");
151
152 /* Write header... */
153 fprintf(out,
154 "# $1 = time (seconds since 01-JAN-2000, 00:00 UTC)\n"
155 "# $2 = solar zenith angle [deg]\n"
156 "# $3 = longitude [deg]\n"
157 "# $4 = latitude [deg]\n"
158 "# $5 = 8mu brightness temperature [K]\n"
159 "# $6 = %s brightness temperature [K]\n"
160 "# $7 = %s brightness temperature perturbation [K]\n"
161 "# $8 = %s brightness temperature variance [K^2]\n"
162 "# $9 = along-track index\n"
163 "# $10 = across-track index\n", pertname, pertname, pertname);
164
165 /* Write data... */
166 for (int itrack = 0; itrack < pert->ntrack; itrack++) {
167
168 /* Count orbits... */
169 if (itrack > 0)
170 if (pert->lat[itrack - 1][pert->nxtrack / 2] <= orblat
171 && pert->lat[itrack][pert->nxtrack / 2] >= orblat)
172 orb++;
173
174 /* Write output... */
175 fprintf(out, "\n");
176
177 /* Check for data gaps... */
178 if (itrack > 0 && pert->time[itrack][pert->nxtrack / 2]
179 - pert->time[itrack - 1][pert->nxtrack / 2] >= 10)
180 fprintf(out, "\n");
181
182 /* Loop over scan... */
183 for (int ixtrack = 0; ixtrack < pert->nxtrack; ixtrack++) {
184
185 /* Check data... */
186 if (pert->lon[itrack][ixtrack] < -180
187 || pert->lon[itrack][ixtrack] > 180
188 || pert->lat[itrack][ixtrack] < -90
189 || pert->lat[itrack][ixtrack] > 90)
190 continue;
191
192 /* Get ascending/descending flag... */
193 int asc =
194 (pert->lat[itrack > 0 ? itrack : itrack + 1][pert->nxtrack / 2]
195 > pert->lat[itrack > 0 ? itrack - 1 : itrack][pert->nxtrack / 2]);
196
197 /* Calculate solar zenith angle... */
198 if (sza0 >= -1e10 && sza0 <= 1e10 && sza1 >= -1e10 && sza1 <= 1e10)
199 sza2 = sza(pert->time[itrack][ixtrack], pert->lon[itrack][ixtrack],
200 pert->lat[itrack][ixtrack]);
201
202 /* Estimate noise... */
203 if (dt230 > 0) {
204 const double nesr = PLANCK(230.0 + dt230, nu) - PLANCK(230.0, nu);
205 const double tbg =
206 pert->bt[itrack][ixtrack] - pert->pt[itrack][ixtrack];
207 nedt = BRIGHT(PLANCK(tbg, nu) + nesr, nu) - tbg;
208 }
209
210 /* Write data... */
211 if (orbit < 0 || orb == orbit)
212 if (set[0] == 'f' || (set[0] == 'a' && asc)
213 || (set[0] == 'd' && !asc))
214 if (pert->time[itrack][ixtrack] >= t0
215 && pert->time[itrack][ixtrack] <= t1
216 && sza2 >= sza0 && sza2 <= sza1)
217 fprintf(out, "%.2f %g %g %g %g %g %g %g %d %d\n",
218 pert->time[itrack][ixtrack],
219 sza(pert->time[itrack][ixtrack],
220 pert->lon[itrack][ixtrack],
221 pert->lat[itrack][ixtrack]),
222 pert->lon[itrack][ixtrack], pert->lat[itrack][ixtrack],
223 pert->dc[itrack][ixtrack], pert->bt[itrack][ixtrack],
224 pert->pt[itrack][ixtrack],
225 pert->var[itrack][ixtrack] - gsl_pow_2(nedt), itrack,
226 ixtrack);
227 }
228 }
229
230 /* Close file... */
231 fclose(out);
232
233 /* Free... */
234 free(pert);
235 free(pert2);
236
237 return EXIT_SUCCESS;
238}
double sza(const double sec, const double lon, const double lat)
Calculate solar zenith angle.
Definition: jurassic.c:5183
double scan_ctl(int argc, char *argv[], const char *varname, int arridx, const char *defvalue, char *value)
Search control parameter file for variable entry.
Definition: jurassic.c:5114
#define LEN
Maximum length of ASCII data lines.
Definition: jurassic.h:383
#define BRIGHT(rad, nu)
Compute brightness temperature.
Definition: jurassic.h:126
#define ERRMSG(...)
Print error message and quit program.
Definition: jurassic.h:237
#define ALLOC(ptr, type, n)
Allocate memory.
Definition: jurassic.h:121
#define PLANCK(T, nu)
Compute Planck function.
Definition: jurassic.h:183
void background_smooth(wave_t *wave, int npts_x, int npts_y)
Smooth background.
Definition: libairs.c:176
void hamming(wave_t *wave, int niter)
Apply Hamming filter to perturbations...
Definition: libairs.c:619
void background_poly(wave_t *wave, int dim_x, int dim_y)
Get background based on polynomial fits.
Definition: libairs.c:126
void variance(wave_t *wave, double dh)
Compute local variance.
Definition: libairs.c:1584
void pert2wave(pert_t *pert, wave_t *wave, int track0, int track1, int xtrack0, int xtrack1)
Convert radiance perturbation data to wave analysis struct.
Definition: libairs.c:999
void read_pert(char *filename, char *pertname, pert_t *pert)
Read radiance perturbation data.
Definition: libairs.c:1137
void gauss(wave_t *wave, double fwhm)
Apply Gaussian filter to perturbations...
Definition: libairs.c:579
void median(wave_t *wave, int dx)
Apply median filter to perturbations...
Definition: libairs.c:726
double fill_array(double var[PERT_NTRACK][PERT_NXTRACK], int ntrack, int itrack, int ixtrack)
Definition: map_pert.c:242
Perturbation data.
Definition: libairs.h:205
double var[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature variance (4 or 15 micron) [K].
Definition: libairs.h:232
double pt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature perturbation (4 or 15 micron) [K].
Definition: libairs.h:229
double time[PERT_NTRACK][PERT_NXTRACK]
Time (seconds since 2000-01-01T00:00Z).
Definition: libairs.h:214
double dc[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (8 micron) [K].
Definition: libairs.h:223
int ntrack
Number of along-track values.
Definition: libairs.h:208
int nxtrack
Number of across-track values.
Definition: libairs.h:211
double lon[PERT_NTRACK][PERT_NXTRACK]
Longitude [deg].
Definition: libairs.h:217
double bt[PERT_NTRACK][PERT_NXTRACK]
Brightness temperature (4 or 15 micron) [K].
Definition: libairs.h:226
double lat[PERT_NTRACK][PERT_NXTRACK]
Latitude [deg].
Definition: libairs.h:220
Wave analysis data.
Definition: libairs.h:287
int nx
Number of across-track values.
Definition: libairs.h:290
int ny
Number of along-track values.
Definition: libairs.h:293
double var[WX][WY]
Variance [K].
Definition: libairs.h:323
double pt[WX][WY]
Perturbation [K].
Definition: libairs.h:320
Here is the call graph for this function: