33 {
34
36
38
40
42
44
45 FILE *out;
46
47 double h2o, h2ot, o3, lwc, rwc, iwc, swc, cc, p0, p1, ps, ts, zs, us, vs,
48 ess, nss, shf, lsm, sst, pbl, pt, pct, pcb, cl, plcl, plfc, pel,
49 cape, cin, o3c, pv, t, tt, u, v, w, z, zm, zref, zt, time_old = -999,
50 p_old = -999, lon_old = -999, lat_old = -999;
51
52
53 if (argc < 3)
54 ERRMSG(
"Give parameters: <ctl> <sample.tab> <atm_in>");
55
56
62
63
65 const int geopot =
66 (int)
scan_ctl(argv[1], argc, argv,
"SAMPLE_GEOPOT", -1,
"0", NULL);
67 const int grid_time =
68 (int)
scan_ctl(argv[1], argc, argv,
"SAMPLE_GRID_TIME", -1,
"0", NULL);
69 const int grid_z =
70 (int)
scan_ctl(argv[1], argc, argv,
"SAMPLE_GRID_Z", -1,
"0", NULL);
71 const int grid_lon =
72 (int)
scan_ctl(argv[1], argc, argv,
"SAMPLE_GRID_LON", -1,
"0", NULL);
73 const int grid_lat =
74 (int)
scan_ctl(argv[1], argc, argv,
"SAMPLE_GRID_LAT", -1,
"0", NULL);
75
76
78
79
81 ERRMSG(
"Cannot open file!");
82
83
84 LOG(1,
"Write meteorological data file: %s", argv[2]);
85 if (!(out = fopen(argv[2], "w")))
86 ERRMSG(
"Cannot create file!");
87
88
90
91
92 for (
int ip = 0; ip < atm->
np; ip++) {
93
94
96
97
99 double pref = atm->
p[ip];
100 if (geopot) {
103 p1 = met0->
p[met0->
np - 1];
104 for (int it = 0; it < 24; it++) {
105 pref = 0.5 * (p0 + p1);
107 atm->
lon[ip], atm->
lat[ip], &zm, ci, cw, 1);
108 if (zref > zm || !isfinite(zm))
109 p0 = pref;
110 else
111 p1 = pref;
112 }
113 pref = 0.5 * (p0 + p1);
114 }
115
116
118
119
120 if (ip == 0 || (grid_time && atm->
time[ip] != time_old)
121 || (grid_z && atm->
p[ip] != p_old)
122 || (grid_lon && atm->
lon[ip] != lon_old)
123 || (grid_lat && atm->
lat[ip] != lat_old))
124 fprintf(out, "\n");
125 time_old = atm->
time[ip];
127 lon_old = atm->
lon[ip];
128 lat_old = atm->
lat[ip];
129
130
131 fprintf(out,
132 "%.2f %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g"
133 " %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g"
134 " %g %g %g %g %g %g %g %g %g %g %g %g %g %g 1 1 1\n",
135 atm->
time[ip],
Z(atm->
p[ip]), atm->
lon[ip], atm->
lat[ip],
136 atm->
p[ip], t, u, v, w, h2o, o3, z, pv, ps, ts, zs, us, vs,
137 ess, nss, shf, lsm,
138 sst, pt, zt, tt, h2ot, lwc, rwc, iwc, swc, cc, cl, pct, pcb, plcl,
139 plfc, pel, cape, cin,
RH(atm->
p[ip], t, h2o),
RHICE(atm->
p[ip], t,
140 h2o),
150 atm->
lat[ip], atm->
p[ip]),
153 o3c);
154 }
155
156
157 fclose(out);
158
159
160 free(clim);
161 free(atm);
162 free(met0);
163 free(met1);
164 free(dd);
165
166 return EXIT_SUCCESS;
167}
double clim_zm(const clim_zm_t *zm, const double t, const double lat, const double p)
Interpolates monthly mean zonal mean climatological variables.
void intpol_met_time_3d(const met_t *met0, float array0[EX][EY][EP], const met_t *met1, float array1[EX][EY][EP], const double ts, const double p, const double lon, const double lat, double *var, int *ci, double *cw, const int init)
Interpolates meteorological data in 3D space and time.
double nat_temperature(const double p, const double h2o, const double hno3)
Calculates the nitric acid trihydrate (NAT) temperature.
double scan_ctl(const char *filename, int argc, char *argv[], const char *varname, const int arridx, const char *defvalue, char *value)
Scans a control file or command-line arguments for a specified variable.
void mptrac_get_met(ctl_t *ctl, clim_t *clim, const double t, met_t **met0, met_t **met1, dd_t *dd)
Retrieves meteorological data for the specified time.
void mptrac_read_clim(const ctl_t *ctl, clim_t *clim)
Reads various climatological data and populates the given climatology structure.
int mptrac_read_atm(const char *filename, const ctl_t *ctl, atm_t *atm)
Reads air parcel data from a specified file into the given atmospheric structure.
double clim_oh(const ctl_t *ctl, const clim_t *clim, const double t, const double lon, const double lat, const double p)
Calculates the hydroxyl radical (OH) concentration from climatology data, with an optional diurnal co...
void mptrac_read_ctl(const char *filename, int argc, char *argv[], ctl_t *ctl)
Reads control parameters from a configuration file and populates the given structure.
#define INTPOL_INIT
Initialize arrays for interpolation.
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
#define Z(p)
Convert pressure to altitude.
#define MET_HEADER
Write header for meteorological data file.
#define TICE(p, h2o)
Calculate frost point temperature (WMO, 2018).
#define RHICE(p, t, h2o)
Compute relative humidity over ice.
#define INTPOL_TIME_ALL(time, p, lon, lat)
Interpolate multiple meteorological variables in time.
#define ALLOC(ptr, type, n)
Allocate memory for a pointer with error handling.
#define RH(p, t, h2o)
Compute relative humidity over water.
#define LOG(level,...)
Print a log message with a specified logging level.
#define TDEW(p, h2o)
Calculate dew point temperature.
double lat[NP]
Latitude [deg].
double lon[NP]
Longitude [deg].
int np
Number of air parcels.
double p[NP]
Pressure [hPa].
clim_zm_t ho2
HO2 zonal means.
clim_zm_t hno3
HNO3 zonal means.
clim_zm_t o1d
O(1D) zonal means.
clim_zm_t h2o2
H2O2 zonal means.
Domain decomposition data structure.
int np
Number of pressure levels.
float z[EX][EY][EP]
Geopotential height [km].
double p[EP]
Pressure levels [hPa].