42  static int init, nx, ny, nt, ncid, varid, dims[3];
 
   44  static size_t count[10], start[10];
 
   53    ERRMSG(
"Give parameters: <ctl> <tropo.nc> <met0> [ <met1> ... ]");
 
   57  double lon0 = 
scan_ctl(argv[1], argc, argv, 
"TROPO_LON0", -1, 
"-180", NULL);
 
   58  double lon1 = 
scan_ctl(argv[1], argc, argv, 
"TROPO_LON1", -1, 
"180", NULL);
 
   59  double dlon = 
scan_ctl(argv[1], argc, argv, 
"TROPO_DLON", -1, 
"-999", NULL);
 
   60  double lat0 = 
scan_ctl(argv[1], argc, argv, 
"TROPO_LAT0", -1, 
"-90", NULL);
 
   61  double lat1 = 
scan_ctl(argv[1], argc, argv, 
"TROPO_LAT1", -1, 
"90", NULL);
 
   62  double dlat = 
scan_ctl(argv[1], argc, argv, 
"TROPO_DLAT", -1, 
"-999", NULL);
 
   63  int h2o = (int) 
scan_ctl(argv[1], argc, argv, 
"TROPO_H2O", -1, 
"1", NULL);
 
   64  int o3 = (int) 
scan_ctl(argv[1], argc, argv, 
"TROPO_O3", -1, 
"1", NULL);
 
   70  for (
int i = 3; i < argc; i++) {
 
   85        dlon = fabs(met->
lon[1] - met->
lon[0]);
 
   87        dlat = fabs(met->
lat[1] - met->
lat[0]);
 
   88      if (lon0 < -360 && lon1 > 360) {
 
   89        lon0 = gsl_stats_min(met->
lon, 1, (
size_t) met->
nx);
 
   90        lon1 = gsl_stats_max(met->
lon, 1, (
size_t) met->
nx);
 
   93      for (lon = lon0; lon <= lon1 + 0.001; lon += dlon) {
 
   94        lons[nx] = round(lon * 1e3) / 1e3;
 
   96          ERRMSG(
"Too many longitudes!");
 
   98      if (lat0 < -90 && lat1 > 90) {
 
   99        lat0 = gsl_stats_min(met->
lat, 1, (
size_t) met->
ny);
 
  100        lat1 = gsl_stats_max(met->
lat, 1, (
size_t) met->
ny);
 
  102      for (lat = lat0; lat <= lat1 + 0.001; lat += dlat) {
 
  103        lats[ny] = round(lat * 1e3) / 1e3;
 
  105          ERRMSG(
"Too many latitudes!");
 
  109      LOG(1, 
"Write tropopause data file: %s", argv[2]);
 
  110      NC(nc_create(argv[2], NC_NETCDF4, &ncid));
 
  113      NC(nc_def_dim(ncid, 
"time", (
size_t) NC_UNLIMITED, &dims[0]));
 
  114      NC(nc_def_dim(ncid, 
"lat", (
size_t) ny, &dims[1]));
 
  115      NC(nc_def_dim(ncid, 
"lon", (
size_t) nx, &dims[2]));
 
  118      NC_DEF_VAR(
"time", NC_DOUBLE, 1, &dims[0], 
"time",
 
  119                 "seconds since 2000-01-01 00:00:00 UTC", 0, 0);
 
  120      NC_DEF_VAR(
"lat", NC_DOUBLE, 1, &dims[1], 
"latitude", 
"degrees_north",
 
  122      NC_DEF_VAR(
"lon", NC_DOUBLE, 1, &dims[2], 
"longitude", 
"degrees_east",
 
  125      NC_DEF_VAR(
"clp_z", NC_FLOAT, 3, &dims[0], 
"cold point height", 
"km", 0,
 
  127      NC_DEF_VAR(
"clp_p", NC_FLOAT, 3, &dims[0], 
"cold point pressure", 
"hPa",
 
  129      NC_DEF_VAR(
"clp_t", NC_FLOAT, 3, &dims[0], 
"cold point temperature",
 
  132        NC_DEF_VAR(
"clp_q", NC_FLOAT, 3, &dims[0], 
"cold point water vapor",
 
  135        NC_DEF_VAR(
"clp_o3", NC_FLOAT, 3, &dims[0], 
"cold point ozone",
 
  139                 "dynamical tropopause height", 
"km", 0, 0);
 
  141                 "dynamical tropopause pressure", 
"hPa", 0, 0);
 
  143                 "dynamical tropopause temperature", 
"K", 0, 0);
 
  146                   "dynamical tropopause water vapor", 
"ppv", 0, 0);
 
  149                   "dynamical tropopause ozone", 
"ppv", 0, 0);
 
  151      NC_DEF_VAR(
"wmo_1st_z", NC_FLOAT, 3, &dims[0],
 
  152                 "WMO 1st tropopause height", 
"km", 0, 0);
 
  153      NC_DEF_VAR(
"wmo_1st_p", NC_FLOAT, 3, &dims[0],
 
  154                 "WMO 1st tropopause pressure", 
"hPa", 0, 0);
 
  155      NC_DEF_VAR(
"wmo_1st_t", NC_FLOAT, 3, &dims[0],
 
  156                 "WMO 1st tropopause temperature", 
"K", 0, 0);
 
  158        NC_DEF_VAR(
"wmo_1st_q", NC_FLOAT, 3, &dims[0],
 
  159                   "WMO 1st tropopause water vapor", 
"ppv", 0, 0);
 
  161        NC_DEF_VAR(
"wmo_1st_o3", NC_FLOAT, 3, &dims[0],
 
  162                   "WMO 1st tropopause ozone", 
"ppv", 0, 0);
 
  164      NC_DEF_VAR(
"wmo_2nd_z", NC_FLOAT, 3, &dims[0],
 
  165                 "WMO 2nd tropopause height", 
"km", 0, 0);
 
  166      NC_DEF_VAR(
"wmo_2nd_p", NC_FLOAT, 3, &dims[0],
 
  167                 "WMO 2nd tropopause pressure", 
"hPa", 0, 0);
 
  168      NC_DEF_VAR(
"wmo_2nd_t", NC_FLOAT, 3, &dims[0],
 
  169                 "WMO 2nd tropopause temperature", 
"K", 0, 0);
 
  171        NC_DEF_VAR(
"wmo_2nd_q", NC_FLOAT, 3, &dims[0],
 
  172                   "WMO 2nd tropopause water vapor", 
"ppv", 0, 0);
 
  174        NC_DEF_VAR(
"wmo_2nd_o3", NC_FLOAT, 3, &dims[0],
 
  175                   "WMO 2nd tropopause ozone", 
"ppv", 0, 0);
 
  177      NC_DEF_VAR(
"ps", NC_FLOAT, 3, &dims[0], 
"surface pressure", 
"hPa", 0,
 
  179      NC_DEF_VAR(
"zs", NC_FLOAT, 3, &dims[0], 
"surface height", 
"km", 0, 0);
 
  190    start[0] = (size_t) nt;
 
  193    count[1] = (size_t) ny;
 
  195    count[2] = (size_t) nx;
 
  199    get_tropo(2, &ctl, clim, met, lons, nx, lats, ny, pt, zt, tt, qt, o3t, ps,
 
  210    get_tropo(5, &ctl, clim, met, lons, nx, lats, ny, pt, zt, tt, qt, o3t, ps,
 
  221    get_tropo(3, &ctl, clim, met, lons, nx, lats, ny, pt, zt, tt, qt, o3t, ps,
 
  232    get_tropo(4, &ctl, clim, met, lons, nx, lats, ny, pt, zt, tt, qt, o3t, ps,
 
void get_tropo(const int met_tropo, ctl_t *ctl, clim_t *clim, met_t *met, const double *lons, const int nx, const double *lats, const int ny, double *pt, double *zt, double *tt, double *qt, double *o3t, double *ps, double *zs)
Calculate tropopause data.
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_read_clim(const ctl_t *ctl, clim_t *clim)
Reads various climatological data and populates the given climatology structure.
int mptrac_read_met(const char *filename, const ctl_t *ctl, const clim_t *clim, met_t *met, dd_t *dd)
Reads meteorological data from a file, supporting multiple formats and MPI broadcasting.
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 NC(cmd)
Execute a NetCDF command and check for errors.
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
#define EY
Maximum number of latitudes for meteo data.
#define EX
Maximum number of longitudes for meteo data.
#define ALLOC(ptr, type, n)
Allocate memory for a pointer with error handling.
#define LOG(level,...)
Print a log message with a specified logging level.
#define NC_DEF_VAR(varname, type, ndims, dims, long_name, units, level, quant)
Define a NetCDF variable with attributes.
#define NC_PUT_DOUBLE(varname, ptr, hyperslab)
Write double precision data to a NetCDF variable.
int met_tropo
Tropopause definition (0=none, 1=clim, 2=cold point, 3=WMO_1st, 4=WMO_2nd, 5=dynamical).
Domain decomposition data structure.
int nx
Number of longitudes.
int ny
Number of latitudes.
double lon[EX]
Longitudes [deg].
double lat[EY]
Latitudes [deg].
int main(int argc, char *argv[])