MPTRAC
Loading...
Searching...
No Matches
trac.c
Go to the documentation of this file.
1/*
2 This file is part of MPTRAC.
3
4 MPTRAC is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 MPTRAC is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with MPTRAC. If not, see <http://www.gnu.org/licenses/>.
16
17 Copyright (C) 2013-2026 Forschungszentrum Juelich GmbH
18*/
19
25#include "mptrac.h"
26
27#ifdef KPP
28#include "kpp_chem.h"
29#endif
30
31/* ------------------------------------------------------------
32 Functions...
33 ------------------------------------------------------------ */
34
36void usage(
37 void);
38
39/* ------------------------------------------------------------
40 Main...
41 ------------------------------------------------------------ */
42
43int main(
44 int argc,
45 char *argv[]) {
46
47 ctl_t *ctl;
48
49 atm_t *atm;
50
51 cache_t *cache;
52
53 clim_t *clim;
54
55 depo_t *depo;
56
57 met_t *met0, *met1;
58
59 dd_t *dd;
60
61 FILE *dirlist;
62
63 char dirname[LEN], filename[2 * LEN];
64
65 int ntask = -1, rank = 0, size = 1;
66
67 /* Print usage information... */
68 USAGE;
69
70 /* Initialize MPI... */
71#ifdef MPI
72 MPI_Init(&argc, &argv);
73 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
74 MPI_Comm_size(MPI_COMM_WORLD, &size);
75#ifdef _OPENACC
76 const int num_devices = acc_get_num_devices(acc_device_nvidia);
77 if (num_devices <= 0)
78 ERRMSG("Not running on a GPU device!");
79 acc_set_device_num(rank % num_devices, acc_device_nvidia);
80#endif
81#endif
82
83 /* Check arguments... */
84 if (argc < 4)
85 ERRMSG("Missing or invalid command-line arguments.\n\n"
86 "Usage: trac <dirlist> <ctl> <atm_in> [KEY VALUE ...]\n\n"
87 "Use -h for full help.");
88
89 /* Open directory list... */
90 if (!(dirlist = fopen(argv[1], "r")))
91 ERRMSG("Cannot open directory list!");
92
93 /* Loop over directories... */
94 while (fscanf(dirlist, "%4999s", dirname) != EOF) {
95
96 /* MPI parallelization... */
97 if ((++ntask) % size != rank)
98 continue;
99
100 /* Write info... */
101 LOG(1, "Parallelization: ntask= %d | rank= %d | size= %d",
102 ntask, rank, size);
103
104 /* ------------------------------------------------------------
105 Initialize model run...
106 ------------------------------------------------------------ */
107
108 /* Allocate memory... */
109 mptrac_alloc(&ctl, &cache, &clim, &met0, &met1, &atm, &depo, &dd);
110
111 /* Read control parameters... */
112 sprintf(filename, "%s/%s", dirname, argv[2]);
113 mptrac_read_ctl(filename, argc, argv, ctl);
114
115 /* This tool implements the domain decomposition... */
116 ctl->dd_supported = 1;
117
118 /* Read climatological data... */
119 mptrac_read_clim(ctl, clim);
120
121 /* Read atmospheric data... */
122 sprintf(filename, "%s/%s", dirname, argv[3]);
123 if (!mptrac_read_atm(filename, ctl, atm))
124 ERRMSG("Cannot open file!");
125
126 /* Initialize MPTRAC... */
127 mptrac_init(ctl, cache, clim, atm, depo, ntask);
128#ifdef DD
129 int peak_np = atm->np;
130#endif
131
132 /* ------------------------------------------------------------
133 Loop over timesteps...
134 ------------------------------------------------------------ */
135
136 /* Loop over timesteps... */
137 for (double t = ctl->t_start;
138 ctl->direction * (t - ctl->t_stop) < ctl->dt_mod;
139 t += ctl->direction * ctl->dt_mod) {
140
141 /* Adjust length of final time step... */
142 if (ctl->direction * (t - ctl->t_stop) > 0)
143 t = ctl->t_stop;
144
145 /* Get meteo data... */
146 mptrac_get_met(ctl, clim, t, &met0, &met1, dd);
147
148 /* Recommend time step from horizontal grid spacing... */
149 if (t == ctl->t_start) {
150 double dt_rec;
151 if (met0->coord_type == 0)
152 dt_rec = fabs(met0->lon[1] - met0->lon[0]) * 111132. / 150.;
153 else {
154 double spacing = INFINITY;
155 for (int ix = 1; ix < met0->nx; ix++) {
156 const double dx = fabs(met0->lon[ix] - met0->lon[ix - 1]);
157 if (!isfinite(dx) || dx <= 0) {
158 spacing = NAN;
159 break;
160 }
161 spacing = MIN(spacing, dx);
162 }
163 if (isfinite(spacing))
164 for (int iy = 1; iy < met0->ny; iy++) {
165 const double dy = fabs(met0->lat[iy] - met0->lat[iy - 1]);
166 if (!isfinite(dy) || dy <= 0) {
167 spacing = NAN;
168 break;
169 }
170 spacing = MIN(spacing, dy);
171 }
172 dt_rec = spacing / 50.;
173 }
174 if (!isfinite(dt_rec) || dt_rec <= 0) {
175 WARN
176 ("Cannot recommend DT_MOD: invalid horizontal meteo grid spacing!");
177 } else if (ctl->dt_mod > dt_rec) {
178 WARN
179 ("DT_MOD=%g s may be too large for accurate trajectory integration; "
180 "recommended maximum from horizontal meteo grid resolution is %g s.",
181 ctl->dt_mod, dt_rec);
182 }
183 }
184#ifdef DD
185 /* Set-up domain decomposition... */
186 if ((t == ctl->t_start) && ctl->dd)
187 dd_init(ctl, dd, atm);
188#else
189 /* Catch misconfiguration... */
190 if ((ctl->dd)
192 ERRMSG
193 ("Model configured for domain decomposition, but not compiled for it!");
194#endif
195
196 /* Run a single time step... */
197 mptrac_run_timestep(ctl, cache, clim, &met0, &met1, atm, depo, t, dd);
198#ifdef DD
199 if (ctl->dd && atm->np > peak_np)
200 peak_np = atm->np;
201#endif
202
203 /* Write output... */
204 mptrac_write_output(dirname, ctl, met0, met1, atm, depo, t);
205 }
206
207 /* ------------------------------------------------------------
208 Finalize model run...
209 ------------------------------------------------------------ */
210
211 /* Flush output buffer... */
212 fflush(NULL);
213
214 /* Report problem size... */
215 LOG(1, "SIZE_NP = %d", atm->np);
216#ifdef DD
217 if (ctl->dd)
218 LOG(1, "SIZE_NP_PEAK = %d", peak_np);
219#endif
220 LOG(1, "SIZE_MPI_TASKS = %d", size);
221 LOG(1, "SIZE_OMP_THREADS = %d", omp_get_max_threads());
222
223 /* Report memory usage... */
224 LOG(1, "MEMORY_ATM = %g MByte", sizeof(atm_t) / 1024. / 1024.);
225 LOG(1, "MEMORY_CACHE = %g MByte", sizeof(cache_t) / 1024. / 1024.);
226 LOG(1, "MEMORY_DEPO = %g MByte", sizeof(depo_t) / 1024. / 1024.);
227 LOG(1, "MEMORY_CLIM = %g MByte", sizeof(clim_t) / 1024. / 1024.);
228 LOG(1, "MEMORY_METEO = %g MByte", sizeof(met_t) / 1024. / 1024.);
229
230 /* Free memory... */
231 mptrac_free(ctl, cache, clim, met0, met1, atm, depo, dd);
232
233 /* Report timers... */
235 }
236
237 /* Finalize MPI... */
238#ifdef MPI
239 MPI_Finalize();
240#endif
241
242 return EXIT_SUCCESS;
243}
244
245/*****************************************************************************/
246
248void usage(
249 void) {
250
251 printf("\nMPTRAC trac tool.\n\n");
252 printf("Run forward or backward trajectory calculations.\n");
253 printf("\n");
254 printf("Usage:\n");
255 printf(" trac <dirlist> <ctl> <atm_in> [KEY VALUE ...]\n");
256 printf("\n");
257 printf("Arguments:\n");
258 printf(" <dirlist> Text file containing work directories to process.\n");
259 printf(" <ctl> Control file name relative to each work directory.\n");
260 printf
261 (" <atm_in> Atmospheric input file name relative to each work directory.\n");
262 printf(" [KEY VALUE] Optional control parameters.\n");
263 printf("\nFurther information:\n");
264 printf(" Manual: https://slcs-jsc.github.io/mptrac/\n");
265}
void dd_init(const ctl_t *ctl, dd_t *dd, atm_t *atm)
Initialize the domain decomposition infrastructure.
Definition mptrac.c:2337
int size
Definition mptrac.c:10799
void mptrac_free(ctl_t *ctl, cache_t *cache, clim_t *clim, met_t *met0, met_t *met1, atm_t *atm, depo_t *depo, dd_t *dd)
Frees memory resources allocated for MPTRAC.
Definition mptrac.c:6712
void mptrac_write_output(const char *dirname, const ctl_t *ctl, met_t *met0, met_t *met1, atm_t *atm, depo_t *depo, const double t)
Writes various types of output data to files in a specified directory.
Definition mptrac.c:8806
int rank
Definition mptrac.c:10799
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.
Definition mptrac.c:6790
void mptrac_read_clim(const ctl_t *ctl, clim_t *clim)
Reads various climatological data and populates the given climatology structure.
Definition mptrac.c:7029
void mptrac_init(ctl_t *ctl, cache_t *cache, clim_t *clim, atm_t *atm, depo_t *depo, const int ntask)
Initializes the MPTRAC model and its associated components.
Definition mptrac.c:6924
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.
Definition mptrac.c:6954
void mptrac_alloc(ctl_t **ctl, cache_t **cache, clim_t **clim, met_t **met0, met_t **met1, atm_t **atm, depo_t **depo, dd_t **dd)
Allocates and initializes memory resources for MPTRAC.
Definition mptrac.c:6622
void mptrac_run_timestep(ctl_t *ctl, cache_t *cache, clim_t *clim, met_t **met0, met_t **met1, atm_t *atm, depo_t *depo, double t, dd_t *dd)
Executes a single timestep of the MPTRAC model simulation.
Definition mptrac.c:8426
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.
Definition mptrac.c:7089
MPTRAC library declarations.
#define LEN
Maximum length of ASCII data lines.
Definition mptrac.h:559
#define MIN(a, b)
Macro to determine the minimum of two values.
Definition mptrac.h:1488
#define ERRMSG(...)
Print an error message with contextual information and terminate the program.
Definition mptrac.h:2426
#define USAGE
Print usage information on -h or --help.
Definition mptrac.h:2233
#define WARN(...)
Print a warning message with contextual information.
Definition mptrac.h:2393
#define PRINT_TIMERS
Print the current state of all timers.
Definition mptrac.h:2485
#define LOG(level,...)
Print a log message with a specified logging level.
Definition mptrac.h:2356
Air parcel data.
Definition mptrac.h:3612
int np
Number of air parcels.
Definition mptrac.h:3615
Cache data structure.
Definition mptrac.h:3673
Climatological data.
Definition mptrac.h:3837
Control parameters.
Definition mptrac.h:2514
int direction
Direction flag (1=forward calculation, -1=backward calculation).
Definition mptrac.h:2848
int dd_supported
Whether the executable implements the domain decomposition.
Definition mptrac.h:3600
int dd
Domain decomposition (0=no, 1=yes).
Definition mptrac.h:3577
double t_stop
Stop time of simulation [s].
Definition mptrac.h:2854
double dt_mod
Time step of simulation [s].
Definition mptrac.h:2857
int dd_subdomains_zonal
Domain decomposition zonal subdomain number (defaults to 2 if domain decomposition is used,...
Definition mptrac.h:3581
double t_start
Start time of simulation [s].
Definition mptrac.h:2851
int dd_subdomains_meridional
Domain decomposition meridional subdomain number (defaults to 2 if domain decomposition is used,...
Definition mptrac.h:3585
Domain decomposition data structure.
Definition mptrac.h:4073
Ground inventories of deposited radionuclides.
Definition mptrac.h:3706
Meteo data structure.
Definition mptrac.h:3896
int coord_type
Definition mptrac.h:3902
int nx
Number of longitudes.
Definition mptrac.h:3905
int ny
Number of latitudes.
Definition mptrac.h:3908
double lon[EX]
Longitudes [deg].
Definition mptrac.h:3917
double lat[EY]
Latitudes [deg].
Definition mptrac.h:3920
int main(int argc, char *argv[])
Definition trac.c:43
void usage(void)
Print command-line help.
Definition trac.c:248