46 static char filename[
LEN];
48 static int year, mon, day, hour, min, sec;
56 ERRMSG(
"Missing or invalid command-line arguments.\n\n"
57 "Usage: wind <ctl> <metbase> [KEY VALUE ...]\n\n"
58 "Use -h for full help.");
62 const double t0 =
scan_ctl(argv[1], argc, argv,
"WIND_T0", -1,
"0", NULL);
64 (int)
scan_ctl(argv[1], argc, argv,
"WIND_NX", -1,
"360", NULL);
66 (int)
scan_ctl(argv[1], argc, argv,
"WIND_NY", -1,
"181", NULL);
68 (int)
scan_ctl(argv[1], argc, argv,
"WIND_NZ", -1,
"61", NULL);
69 const double z0 =
scan_ctl(argv[1], argc, argv,
"WIND_Z0", -1,
"0", NULL);
70 const double z1 =
scan_ctl(argv[1], argc, argv,
"WIND_Z1", -1,
"60", NULL);
72 scan_ctl(argv[1], argc, argv,
"WIND_U0", -1,
"38.587660177302", NULL);
74 scan_ctl(argv[1], argc, argv,
"WIND_U1", -1,
"38.587660177302", NULL);
75 const double w0 =
scan_ctl(argv[1], argc, argv,
"WIND_W0", -1,
"0", NULL);
77 scan_ctl(argv[1], argc, argv,
"WIND_ALPHA", -1,
"0.0", NULL);
78 const int lat_reverse =
79 (int)
scan_ctl(argv[1], argc, argv,
"WIND_LAT_REVERSE", -1,
"0", NULL);
81 scan_ctl(argv[1], argc, argv,
"WIND_TEMP0", -1,
"280", NULL);
83 scan_ctl(argv[1], argc, argv,
"WIND_TEMP1", -1,
"280", NULL);
85 scan_ctl(argv[1], argc, argv,
"WIND_PS", -1,
"100000", NULL);
86 const double zs =
scan_ctl(argv[1], argc, argv,
"WIND_ZS", -1,
"0", NULL);
88 scan_ctl(argv[1], argc, argv,
"WIND_T2M", -1,
"280", NULL);
90 scan_ctl(argv[1], argc, argv,
"WIND_IEWS", -1,
"0", NULL);
92 scan_ctl(argv[1], argc, argv,
"WIND_INSS", -1,
"0", NULL);
94 scan_ctl(argv[1], argc, argv,
"WIND_ISHF", -1,
"0", NULL);
95 const double lsm =
scan_ctl(argv[1], argc, argv,
"WIND_LSM", -1,
"1", NULL);
97 scan_ctl(argv[1], argc, argv,
"WIND_SST", -1,
"280", NULL);
99 scan_ctl(argv[1], argc, argv,
"WIND_BLH", -1,
"1000", NULL);
100 const double q =
scan_ctl(argv[1], argc, argv,
"WIND_Q", -1,
"0", NULL);
101 const double o3 =
scan_ctl(argv[1], argc, argv,
"WIND_O3", -1,
"0", NULL);
104 if (nx < 2 || nx >
EX)
105 ERRMSG(
"Set 2 <= NX <= MAX!");
106 if (ny < 2 || ny >
EY)
107 ERRMSG(
"Set 2 <= NY <= MAX!");
108 if (nz < 2 || nz >
EP)
109 ERRMSG(
"Set 2 <= NZ <= MAX!");
112 jsec2time(t0, &year, &mon, &day, &hour, &min, &sec, &r);
113 sprintf(filename,
"%s_%d_%02d_%02d_%02d.nc", argv[2], year, mon, day, hour);
124 for (
int ix = 0; ix < nx; ix++)
125 met->
lon[ix] = 360.0 / nx * (
double) ix;
126 for (
int iy = 0; iy < ny; iy++)
127 met->
lat[iy] = (lat_reverse ? -(180.0 / (ny - 1) * (
double) iy - 90.0)
128 : (180.0 / (ny - 1) * (
double) iy - 90.0));
129 for (
int iz = 0; iz < nz; iz++)
130 met->
p[iz] =
P(
LIN(0.0, z0, nz - 1.0, z1, iz));
133 for (
int ix = 0; ix < nx; ix++)
134 for (
int iy = 0; iy < ny; iy++) {
135 const double usfc = u0
142 met->
ps[ix][iy] = (float) (ps / 100.0);
143 met->
zs[ix][iy] = (float) zs;
144 met->
ts[ix][iy] = (float) t2m;
145 met->
us[ix][iy] = (float) usfc;
146 met->
vs[ix][iy] = (float) vsfc;
147 met->
ess[ix][iy] = (float) iews;
148 met->
nss[ix][iy] = (float) inss;
149 met->
shf[ix][iy] = (float) ishf;
150 met->
lsm[ix][iy] = (float) lsm;
151 met->
sst[ix][iy] = (float) sst;
152 met->
pbl[ix][iy] = (float)
P(zs + blh / 1000.0);
154 for (
int iz = 0; iz < nz; iz++) {
155 const double u =
LIN(0.0, u0, nz - 1.0, u1, iz)
159 const double v = -
LIN(0.0, u0, nz - 1.0, u1, iz)
162 met->
t[ix][iy][iz] = (float)
LIN(0.0, temp0, nz - 1.0, temp1, iz);
163 met->
u[ix][iy][iz] = (float) u;
164 met->
v[ix][iy][iz] = (float) v;
165 met->
w[ix][iy][iz] = (float)
DZ2DP(1e-3 * w0, met->
p[iz]);
166 met->
h2o[ix][iy][iz] = (float) (q *
MA /
MH2O);
167 met->
o3[ix][iy][iz] = (float) (o3 *
MA /
MO3);
186 printf(
"\nMPTRAC wind tool.\n\n");
187 printf(
"Create meteorological data with synthetic wind fields.\n");
190 printf(
" wind <ctl> <metbase> [KEY VALUE ...]\n");
192 printf(
"Arguments:\n");
193 printf(
" <ctl> Control file.\n");
194 printf(
" <metbase> Basename of the output meteorological data.\n");
195 printf(
" [KEY VALUE] Optional control parameters.\n");
196 printf(
"\nFurther information:\n");
197 printf(
" Manual: https://slcs-jsc.github.io/mptrac/\n");
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 write_met_nc(const char *filename, const ctl_t *ctl, met_t *met)
Writes meteorological data to a NetCDF file.
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.
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.
MPTRAC library declarations.
#define LEN
Maximum length of ASCII data lines.
#define MA
Molar mass of dry air [g/mol].
#define MH2O
Molar mass of water vapor [g/mol].
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
#define EY
Maximum number of latitudes for meteo data.
#define USAGE
Print usage information on -h or --help.
#define P(z)
Compute pressure at given altitude.
#define EX
Maximum number of longitudes for meteo data.
#define DZ2DP(dz, p)
Convert a change in altitude to a change in pressure.
#define ALLOC(ptr, type, n)
Allocate memory for a pointer with error handling.
#define DEG2RAD(deg)
Converts degrees to radians.
#define MO3
Molar mass of ozone [g/mol].
#define EP
Maximum number of pressure levels for meteo data.
#define LIN(x0, y0, x1, y1, x)
Linear interpolation.
float sst[EX][EY]
Sea surface temperature [K].
float h2o[EX][EY][EP]
Water vapor volume mixing ratio [1].
float w[EX][EY][EP]
Vertical velocity [hPa/s].
int nx
Number of longitudes.
int ny
Number of latitudes.
float shf[EX][EY]
Surface sensible heat flux [W/m^2].
float ps[EX][EY]
Surface pressure [hPa].
float us[EX][EY]
Surface zonal wind [m/s].
float zs[EX][EY]
Surface geopotential height [km].
float o3[EX][EY][EP]
Ozone volume mixing ratio [1].
int np
Number of pressure levels.
float t[EX][EY][EP]
Temperature [K].
float ts[EX][EY]
Surface temperature [K].
float u[EX][EY][EP]
Zonal wind [m/s].
float ess[EX][EY]
Eastward turbulent surface stress [N/m^2].
double lon[EX]
Longitudes [deg].
float pbl[EX][EY]
Boundary layer pressure [hPa].
float vs[EX][EY]
Surface meridional wind [m/s].
float v[EX][EY][EP]
Meridional wind [m/s].
float lsm[EX][EY]
Land-sea mask [1].
float nss[EX][EY]
Northward turbulent surface stress [N/m^2].
double lat[EY]
Latitudes [deg].
double p[EP]
Pressure levels [hPa].
int main(int argc, char *argv[])
void usage(void)
Print command-line help.