FMS  2025.04
Flexible Modeling System
mpp_comm.inc
1 ! -*-f90-*-
2 
3 !***********************************************************************
4 !* Apache License 2.0
5 !*
6 !* This file is part of the GFDL Flexible Modeling System (FMS).
7 !*
8 !* Licensed under the Apache License, Version 2.0 (the "License");
9 !* you may not use this file except in compliance with the License.
10 !* You may obtain a copy of the License at
11 !*
12 !* http://www.apache.org/licenses/LICENSE-2.0
13 !*
14 !* FMS is distributed in the hope that it will be useful, but WITHOUT
15 !* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied;
16 !* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
17 !* PARTICULAR PURPOSE. See the License for the specific language
18 !* governing permissions and limitations under the License.
19 !***********************************************************************
20 !> @file
21 !> @brief Imports checksum, gather, and scatter routines from other include files used
22 !! for communications and calculations between PE's in @ref mpp_mod
23 
24 !> @addtogroup mpp_mod
25 !> @{
26 
27 #if defined(use_libMPI)
28 #include <mpp_comm_mpi.inc>
29 #else
30 #include <mpp_comm_nocomm.inc>
31 #endif
32 
33 #undef MPP_CHKSUM_INT_
34 #define MPP_CHKSUM_INT_ mpp_chksum_i8_1d
35 #undef MPP_CHKSUM_INT_RMASK_
36 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i8_1d_rmask
37 #undef MPP_TYPE_
38 #define MPP_TYPE_ integer(i8_kind)
39 #undef MPP_RANK_
40 #define MPP_RANK_ (:)
41 #include <mpp_chksum_int.fh>
42 
43 #undef MPP_CHKSUM_INT_
44 #define MPP_CHKSUM_INT_ mpp_chksum_i8_2d
45 #undef MPP_CHKSUM_INT_RMASK_
46 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i8_2d_rmask
47 #undef MPP_TYPE_
48 #define MPP_TYPE_ integer(i8_kind)
49 #undef MPP_RANK_
50 #define MPP_RANK_ (:,:)
51 #include <mpp_chksum_int.fh>
52 
53 #undef MPP_CHKSUM_INT_
54 #define MPP_CHKSUM_INT_ mpp_chksum_i8_3d
55 #undef MPP_CHKSUM_INT_RMASK_
56 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i8_3d_rmask
57 #undef MPP_TYPE_
58 #define MPP_TYPE_ integer(i8_kind)
59 #undef MPP_RANK_
60 #define MPP_RANK_ (:,:,:)
61 #include <mpp_chksum_int.fh>
62 
63 #undef MPP_CHKSUM_INT_
64 #define MPP_CHKSUM_INT_ mpp_chksum_i8_4d
65 #undef MPP_CHKSUM_INT_RMASK_
66 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i8_4d_rmask
67 #undef MPP_TYPE_
68 #define MPP_TYPE_ integer(i8_kind)
69 #undef MPP_RANK_
70 #define MPP_RANK_ (:,:,:,:)
71 #include <mpp_chksum_int.fh>
72 
73 #undef MPP_CHKSUM_INT_
74 #define MPP_CHKSUM_INT_ mpp_chksum_i8_5d
75 #undef MPP_CHKSUM_INT_RMASK_
76 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i8_5d_rmask
77 #undef MPP_TYPE_
78 #define MPP_TYPE_ integer(i8_kind)
79 #undef MPP_RANK_
80 #define MPP_RANK_ (:,:,:,:,:)
81 #include <mpp_chksum_int.fh>
82 
83 #undef MPP_CHKSUM_INT_
84 #define MPP_CHKSUM_INT_ mpp_chksum_i4_1d
85 #undef MPP_CHKSUM_INT_RMASK_
86 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i4_1d_rmask
87 #undef MPP_TYPE_
88 #define MPP_TYPE_ integer(i4_kind)
89 #undef MPP_RANK_
90 #define MPP_RANK_ (:)
91 #include <mpp_chksum_int.fh>
92 
93 #undef MPP_CHKSUM_INT_
94 #define MPP_CHKSUM_INT_ mpp_chksum_i4_2d
95 #undef MPP_CHKSUM_INT_RMASK_
96 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i4_2d_rmask
97 #undef MPP_TYPE_
98 #define MPP_TYPE_ integer(i4_kind)
99 #undef MPP_RANK_
100 #define MPP_RANK_ (:,:)
101 #include <mpp_chksum_int.fh>
102 
103 #undef MPP_CHKSUM_INT_
104 #define MPP_CHKSUM_INT_ mpp_chksum_i4_3d
105 #undef MPP_CHKSUM_INT_RMASK_
106 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i4_3d_rmask
107 #undef MPP_TYPE_
108 #define MPP_TYPE_ integer(i4_kind)
109 #undef MPP_RANK_
110 #define MPP_RANK_ (:,:,:)
111 #include <mpp_chksum_int.fh>
112 
113 #undef MPP_CHKSUM_INT_
114 #define MPP_CHKSUM_INT_ mpp_chksum_i4_4d
115 #undef MPP_CHKSUM_INT_RMASK_
116 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i4_4d_rmask
117 #undef MPP_TYPE_
118 #define MPP_TYPE_ integer(i4_kind)
119 #undef MPP_RANK_
120 #define MPP_RANK_ (:,:,:,:)
121 #include <mpp_chksum_int.fh>
122 
123 #undef MPP_CHKSUM_INT_
124 #define MPP_CHKSUM_INT_ mpp_chksum_i4_5d
125 #undef MPP_CHKSUM_INT_RMASK_
126 #define MPP_CHKSUM_INT_RMASK_ mpp_chksum_i4_5d_rmask
127 #undef MPP_TYPE_
128 #define MPP_TYPE_ integer(i4_kind)
129 #undef MPP_RANK_
130 #define MPP_RANK_ (:,:,:,:,:)
131 #include <mpp_chksum_int.fh>
132 
133 #undef MPP_CHKSUM_
134 #define MPP_CHKSUM_ mpp_chksum_r8_0d
135 #undef MPP_TYPE_
136 #define MPP_TYPE_ real(r8_kind)
137 #undef MPP_RANK_
138 #define MPP_RANK_ !
139 #include <mpp_chksum_scalar.fh>
140 
141 #undef MPP_CHKSUM_
142 #define MPP_CHKSUM_ mpp_chksum_r8_1d
143 #undef MPP_TRANSFER_KIND_
144 #define MPP_TRANSFER_KIND_ i8_kind
145 #undef MPP_TYPE_
146 #define MPP_TYPE_ real(r8_kind)
147 #undef MPP_RANK_
148 #define MPP_RANK_ (:)
149 #include <mpp_chksum.fh>
150 
151 #undef MPP_CHKSUM_
152 #define MPP_CHKSUM_ mpp_chksum_r8_2d
153 #undef MPP_TRANSFER_KIND_
154 #define MPP_TRANSFER_KIND_ i8_kind
155 #undef MPP_TYPE_
156 #define MPP_TYPE_ real(r8_kind)
157 #undef MPP_RANK_
158 #define MPP_RANK_ (:,:)
159 #include <mpp_chksum.fh>
160 
161 #undef MPP_CHKSUM_
162 #define MPP_CHKSUM_ mpp_chksum_r8_3d
163 #undef MPP_TRANSFER_KIND_
164 #define MPP_TRANSFER_KIND_ i8_kind
165 #undef MPP_TYPE_
166 #define MPP_TYPE_ real(r8_kind)
167 #undef MPP_RANK_
168 #define MPP_RANK_ (:,:,:)
169 #include <mpp_chksum.fh>
170 
171 #undef MPP_CHKSUM_
172 #define MPP_CHKSUM_ mpp_chksum_r8_4d
173 #undef MPP_TRANSFER_KIND_
174 #define MPP_TRANSFER_KIND_ i8_kind
175 #undef MPP_TYPE_
176 #define MPP_TYPE_ real(r8_kind)
177 #undef MPP_RANK_
178 #define MPP_RANK_ (:,:,:,:)
179 #include <mpp_chksum.fh>
180 
181 #undef MPP_CHKSUM_
182 #define MPP_CHKSUM_ mpp_chksum_r8_5d
183 #undef MPP_TRANSFER_KIND_
184 #define MPP_TRANSFER_KIND_ i8_kind
185 #undef MPP_TYPE_
186 #define MPP_TYPE_ real(r8_kind)
187 #undef MPP_RANK_
188 #define MPP_RANK_ (:,:,:,:,:)
189 #include <mpp_chksum.fh>
190 
191 #ifdef OVERLOAD_C8
192 #undef MPP_CHKSUM_
193 #define MPP_CHKSUM_ mpp_chksum_c8_0d
194 #undef MPP_TRANSFER_KIND_
195 #define MPP_TRANSFER_KIND_ i8_kind
196 #undef MPP_TYPE_
197 #define MPP_TYPE_ complex(c8_kind)
198 #undef MPP_RANK_
199 #define MPP_RANK_ !
200 #include <mpp_chksum_scalar.fh>
201 
202 #undef MPP_CHKSUM_
203 #define MPP_CHKSUM_ mpp_chksum_c8_1d
204 #undef MPP_TRANSFER_KIND_
205 #define MPP_TRANSFER_KIND_ i8_kind
206 #undef MPP_TYPE_
207 #define MPP_TYPE_ complex(c8_kind)
208 #undef MPP_RANK_
209 #define MPP_RANK_ (:)
210 #include <mpp_chksum.fh>
211 
212 #undef MPP_CHKSUM_
213 #define MPP_CHKSUM_ mpp_chksum_c8_2d
214 #undef MPP_TRANSFER_KIND_
215 #define MPP_TRANSFER_KIND_ i8_kind
216 #undef MPP_TYPE_
217 #define MPP_TYPE_ complex(c8_kind)
218 #undef MPP_RANK_
219 #define MPP_RANK_ (:,:)
220 #include <mpp_chksum.fh>
221 
222 #undef MPP_CHKSUM_
223 #define MPP_CHKSUM_ mpp_chksum_c8_3d
224 #undef MPP_TRANSFER_KIND_
225 #define MPP_TRANSFER_KIND_ i8_kind
226 #undef MPP_TYPE_
227 #define MPP_TYPE_ complex(c8_kind)
228 #undef MPP_RANK_
229 #define MPP_RANK_ (:,:,:)
230 #include <mpp_chksum.fh>
231 
232 #undef MPP_CHKSUM_
233 #define MPP_CHKSUM_ mpp_chksum_c8_4d
234 #undef MPP_TRANSFER_KIND_
235 #define MPP_TRANSFER_KIND_ i8_kind
236 #undef MPP_TYPE_
237 #define MPP_TYPE_ complex(c8_kind)
238 #undef MPP_RANK_
239 #define MPP_RANK_ (:,:,:,:)
240 #include <mpp_chksum.fh>
241 
242 #undef MPP_CHKSUM_
243 #define MPP_CHKSUM_ mpp_chksum_c8_5d
244 #undef MPP_TRANSFER_KIND_
245 #define MPP_TRANSFER_KIND_ i8_kind
246 #undef MPP_TYPE_
247 #define MPP_TYPE_ complex(c8_kind)
248 #undef MPP_RANK_
249 #define MPP_RANK_ (:,:,:,:,:)
250 #include <mpp_chksum.fh>
251 #endif
252 
253 #undef MPP_CHKSUM_
254 #define MPP_CHKSUM_ mpp_chksum_r4_0d
255 #undef MPP_TRANSFER_KIND_
256 #define MPP_TRANSFER_KIND_ i4_kind
257 #undef MPP_TYPE_
258 #define MPP_TYPE_ real(r4_kind)
259 #undef MPP_RANK_
260 #define MPP_RANK_ !
261 #include <mpp_chksum_scalar.fh>
262 
263 #undef MPP_CHKSUM_
264 #define MPP_CHKSUM_ mpp_chksum_r4_1d
265 #undef MPP_TRANSFER_KIND_
266 #define MPP_TRANSFER_KIND_ i4_kind
267 #undef MPP_TYPE_
268 #define MPP_TYPE_ real(r4_kind)
269 #undef MPP_RANK_
270 #define MPP_RANK_ (:)
271 #include <mpp_chksum.fh>
272 
273 #undef MPP_CHKSUM_
274 #define MPP_CHKSUM_ mpp_chksum_r4_2d
275 #undef MPP_TRANSFER_KIND_
276 #define MPP_TRANSFER_KIND_ i4_kind
277 #undef MPP_TYPE_
278 #define MPP_TYPE_ real(r4_kind)
279 #undef MPP_RANK_
280 #define MPP_RANK_ (:,:)
281 #include <mpp_chksum.fh>
282 
283 #undef MPP_CHKSUM_
284 #define MPP_CHKSUM_ mpp_chksum_r4_3d
285 #undef MPP_TRANSFER_KIND_
286 #define MPP_TRANSFER_KIND_ i4_kind
287 #undef MPP_TYPE_
288 #define MPP_TYPE_ real(r4_kind)
289 #undef MPP_RANK_
290 #define MPP_RANK_ (:,:,:)
291 #include <mpp_chksum.fh>
292 
293 #undef MPP_CHKSUM_
294 #define MPP_CHKSUM_ mpp_chksum_r4_4d
295 #undef MPP_TRANSFER_KIND_
296 #define MPP_TRANSFER_KIND_ i4_kind
297 #undef MPP_TYPE_
298 #define MPP_TYPE_ real(r4_kind)
299 #undef MPP_RANK_
300 #define MPP_RANK_ (:,:,:,:)
301 #include <mpp_chksum.fh>
302 
303 #undef MPP_CHKSUM_
304 #define MPP_CHKSUM_ mpp_chksum_r4_5d
305 #undef MPP_TRANSFER_KIND_
306 #define MPP_TRANSFER_KIND_ i4_kind
307 #undef MPP_TYPE_
308 #define MPP_TYPE_ real(r4_kind)
309 #undef MPP_RANK_
310 #define MPP_RANK_ (:,:,:,:,:)
311 #include <mpp_chksum.fh>
312 
313 #ifdef OVERLOAD_C4
314 #undef MPP_CHKSUM_
315 #define MPP_CHKSUM_ mpp_chksum_c4_0d
316 #undef MPP_TRANSFER_KIND_
317 #define MPP_TRANSFER_KIND_ i4_kind
318 #undef MPP_TYPE_
319 #define MPP_TYPE_ complex(c4_kind)
320 #undef MPP_RANK_
321 #define MPP_RANK_ !
322 #include <mpp_chksum_scalar.fh>
323 
324 #undef MPP_CHKSUM_
325 #define MPP_CHKSUM_ mpp_chksum_c4_1d
326 #undef MPP_TRANSFER_KIND_
327 #define MPP_TRANSFER_KIND_ i4_kind
328 #undef MPP_TYPE_
329 #define MPP_TYPE_ complex(c4_kind)
330 #undef MPP_RANK_
331 #define MPP_RANK_ (:)
332 #include <mpp_chksum.fh>
333 
334 #undef MPP_CHKSUM_
335 #define MPP_CHKSUM_ mpp_chksum_c4_2d
336 #undef MPP_TRANSFER_KIND_
337 #define MPP_TRANSFER_KIND_ i4_kind
338 #undef MPP_TYPE_
339 #define MPP_TYPE_ complex(c4_kind)
340 #undef MPP_RANK_
341 #define MPP_RANK_ (:,:)
342 #include <mpp_chksum.fh>
343 
344 #undef MPP_CHKSUM_
345 #define MPP_CHKSUM_ mpp_chksum_c4_3d
346 #undef MPP_TRANSFER_KIND_
347 #define MPP_TRANSFER_KIND_ i4_kind
348 #undef MPP_TYPE_
349 #define MPP_TYPE_ complex(c4_kind)
350 #undef MPP_RANK_
351 #define MPP_RANK_ (:,:,:)
352 #include <mpp_chksum.fh>
353 
354 #undef MPP_CHKSUM_
355 #define MPP_CHKSUM_ mpp_chksum_c4_4d
356 #undef MPP_TRANSFER_KIND_
357 #define MPP_TRANSFER_KIND_ i4_kind
358 #undef MPP_TYPE_
359 #define MPP_TYPE_ complex(c4_kind)
360 #undef MPP_RANK_
361 #define MPP_RANK_ (:,:,:,:)
362 #include <mpp_chksum.fh>
363 
364 #undef MPP_CHKSUM_
365 #define MPP_CHKSUM_ mpp_chksum_c4_5d
366 #undef MPP_TRANSFER_KIND_
367 #define MPP_TRANSFER_KIND_ i4_kind
368 #undef MPP_TYPE_
369 #define MPP_TYPE_ complex(c4_kind)
370 #undef MPP_RANK_
371 #define MPP_RANK_ (:,:,:,:,:)
372 #include <mpp_chksum.fh>
373 #endif
374 
375 !#################################################
376 #undef MPP_GATHER_1D_
377 #undef MPP_GATHER_1DV_
378 #undef MPP_TYPE_
379 #define MPP_TYPE_ logical
380 #define MPP_GATHER_1D_ mpp_gather_logical_1d
381 #define MPP_GATHER_1DV_ mpp_gather_logical_1dv
382 #undef MPP_GATHER_PELIST_2D_
383 #undef MPP_GATHER_PELIST_3D_
384 #define MPP_GATHER_PELIST_2D_ mpp_gather_pelist_logical_2d
385 #define MPP_GATHER_PELIST_3D_ mpp_gather_pelist_logical_3d
386 #undef MPI_TYPE_
387 #define MPI_TYPE_ MPI_LOGICAL
388 #include <mpp_gather.fh>
389 
390 #undef MPP_GATHER_1D_
391 #undef MPP_GATHER_1DV_
392 #undef MPP_TYPE_
393 #define MPP_TYPE_ integer(i4_kind)
394 #define MPP_GATHER_1D_ mpp_gather_int4_1d
395 #define MPP_GATHER_1DV_ mpp_gather_int4_1dv
396 #undef MPP_GATHER_PELIST_2D_
397 #undef MPP_GATHER_PELIST_3D_
398 #define MPP_GATHER_PELIST_2D_ mpp_gather_pelist_int4_2d
399 #define MPP_GATHER_PELIST_3D_ mpp_gather_pelist_int4_3d
400 #undef MPI_TYPE_
401 #define MPI_TYPE_ MPI_INTEGER4
402 #include <mpp_gather.fh>
403 
404 
405 #undef MPP_GATHER_1D_
406 #undef MPP_GATHER_1DV_
407 #undef MPP_TYPE_
408 #define MPP_TYPE_ integer(i8_kind)
409 #define MPP_GATHER_1D_ mpp_gather_int8_1d
410 #define MPP_GATHER_1DV_ mpp_gather_int8_1dv
411 #undef MPP_GATHER_PELIST_2D_
412 #undef MPP_GATHER_PELIST_3D_
413 #define MPP_GATHER_PELIST_2D_ mpp_gather_pelist_int8_2d
414 #define MPP_GATHER_PELIST_3D_ mpp_gather_pelist_int8_3d
415 #undef MPI_TYPE_
416 #define MPI_TYPE_ MPI_INTEGER8
417 #include <mpp_gather.fh>
418 
419 
420 #undef MPP_GATHER_1D_
421 #undef MPP_GATHER_1DV_
422 #undef MPP_TYPE_
423 #define MPP_TYPE_ real(r4_kind)
424 #define MPP_GATHER_1D_ mpp_gather_real4_1d
425 #define MPP_GATHER_1DV_ mpp_gather_real4_1dv
426 #undef MPP_GATHER_PELIST_2D_
427 #undef MPP_GATHER_PELIST_3D_
428 #define MPP_GATHER_PELIST_2D_ mpp_gather_pelist_real4_2d
429 #define MPP_GATHER_PELIST_3D_ mpp_gather_pelist_real4_3d
430 #undef MPI_TYPE_
431 #define MPI_TYPE_ MPI_REAL4
432 #include <mpp_gather.fh>
433 
434 #undef MPP_GATHER_1D_
435 #undef MPP_GATHER_1DV_
436 #undef MPP_TYPE_
437 #define MPP_TYPE_ real(r8_kind)
438 #define MPP_GATHER_1D_ mpp_gather_real8_1d
439 #define MPP_GATHER_1DV_ mpp_gather_real8_1dv
440 #undef MPP_GATHER_PELIST_2D_
441 #undef MPP_GATHER_PELIST_3D_
442 #define MPP_GATHER_PELIST_2D_ mpp_gather_pelist_real8_2d
443 #define MPP_GATHER_PELIST_3D_ mpp_gather_pelist_real8_3d
444 #undef MPI_TYPE_
445 #define MPI_TYPE_ MPI_REAL8
446 #include <mpp_gather.fh>
447 
448 !#################################################
449 #undef MPP_SCATTER_PELIST_2D_
450 #undef MPP_SCATTER_PELIST_3D_
451 #undef MPP_TYPE_
452 #define MPP_TYPE_ integer(i4_kind)
453 #define MPP_SCATTER_PELIST_2D_ mpp_scatter_pelist_int4_2d
454 #define MPP_SCATTER_PELIST_3D_ mpp_scatter_pelist_int4_3d
455 #undef MPI_TYPE_
456 #define MPI_TYPE_ MPI_INTEGER4
457 #include <mpp_scatter.fh>
458 
459 #undef MPP_SCATTER_PELIST_2D_
460 #undef MPP_SCATTER_PELIST_3D_
461 #undef MPP_TYPE_
462 #define MPP_TYPE_ integer(i8_kind)
463 #define MPP_SCATTER_PELIST_2D_ mpp_scatter_pelist_int8_2d
464 #define MPP_SCATTER_PELIST_3D_ mpp_scatter_pelist_int8_3d
465 #undef MPI_TYPE_
466 #define MPI_TYPE_ MPI_INTEGER8
467 #include <mpp_scatter.fh>
468 
469 #undef MPP_SCATTER_PELIST_2D_
470 #undef MPP_SCATTER_PELIST_3D_
471 #undef MPP_TYPE_
472 #define MPP_TYPE_ real(r4_kind)
473 #define MPP_SCATTER_PELIST_2D_ mpp_scatter_pelist_real4_2d
474 #define MPP_SCATTER_PELIST_3D_ mpp_scatter_pelist_real4_3d
475 #undef MPI_TYPE_
476 #define MPI_TYPE_ MPI_REAL4
477 #include <mpp_scatter.fh>
478 
479 #undef MPP_SCATTER_PELIST_2D_
480 #undef MPP_SCATTER_PELIST_3D_
481 #undef MPP_TYPE_
482 #define MPP_TYPE_ real(r8_kind)
483 #define MPP_SCATTER_PELIST_2D_ mpp_scatter_pelist_real8_2d
484 #define MPP_SCATTER_PELIST_3D_ mpp_scatter_pelist_real8_3d
485 #undef MPI_TYPE_
486 #define MPI_TYPE_ MPI_REAL8
487 #include <mpp_scatter.fh>
488 !> @}