FMS  2025.04
Flexible Modeling System
mpp_transmit.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 Routines for data transmission between PE's
22 
23 !> @addtogroup mpp_mod
24 !> @{
25 
26 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
27 ! !
28 ! MPP_TRANSMIT !
29 ! !
30 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
31 
32  subroutine mpp_transmit_scalar_( put_data, to_pe, get_data, from_pe, plen, glen, block, tag, &
33  recv_request, send_request)
34  integer, intent(in) :: to_pe, from_pe
35  mpp_type_, intent(in) :: put_data
36  mpp_type_, intent(out) :: get_data
37  integer, optional, intent(in) :: plen, glen
38  logical, intent(in), optional :: block
39  integer, intent(in), optional :: tag
40  integer, intent(out), optional :: recv_request, send_request
41  integer :: put_len, get_len
42  mpp_type_ :: put_data1d(1), get_data1d(1)
43  pointer( ptrp, put_data1d )
44  pointer( ptrg, get_data1d )
45 
46  get_data = mpp_type_init_value
47 
48  ptrp = loc(put_data)
49  ptrg = loc(get_data)
50  put_len=1; if(PRESENT(plen))put_len=plen
51  get_len=1; if(PRESENT(glen))get_len=glen
52  call mpp_transmit_ ( put_data1d, put_len, to_pe, get_data1d, get_len, from_pe, block, tag, &
53  recv_request=recv_request, send_request=send_request )
54 
55  return
56  end subroutine mpp_transmit_scalar_
57 
58  subroutine mpp_transmit_2d_( put_data, put_len, to_pe, get_data, get_len, from_pe, block, tag, &
59  recv_request, send_request )
60  integer, intent(in) :: put_len, to_pe, get_len, from_pe
61  mpp_type_, intent(in) :: put_data(:,:)
62  mpp_type_, intent(out) :: get_data(:,:)
63  logical, intent(in), optional :: block
64  integer, intent(in), optional :: tag
65  integer, intent(out), optional :: recv_request, send_request
66  mpp_type_ :: put_data1d(put_len), get_data1d(get_len)
67 
68  pointer( ptrp, put_data1d )
69  pointer( ptrg, get_data1d )
70  get_data = mpp_type_init_value
71 
72  ptrp = loc(put_data)
73  ptrg = loc(get_data)
74  call mpp_transmit( put_data1d, put_len, to_pe, get_data1d, get_len, from_pe, block, tag, &
75  recv_request=recv_request, send_request=send_request )
76 
77  return
78  end subroutine mpp_transmit_2d_
79 
80  subroutine mpp_transmit_3d_( put_data, put_len, to_pe, get_data, get_len, from_pe, block, tag, &
81  recv_request, send_request )
82  integer, intent(in) :: put_len, to_pe, get_len, from_pe
83  mpp_type_, intent(in) :: put_data(:,:,:)
84  mpp_type_, intent(out) :: get_data(:,:,:)
85  logical, intent(in), optional :: block
86  integer, intent(in), optional :: tag
87  integer, intent(out), optional :: recv_request, send_request
88  mpp_type_ :: put_data1d(put_len), get_data1d(get_len)
89 
90  pointer( ptrp, put_data1d )
91  pointer( ptrg, get_data1d )
92  get_data = mpp_type_init_value
93 
94  ptrp = loc(put_data)
95  ptrg = loc(get_data)
96  call mpp_transmit( put_data1d, put_len, to_pe, get_data1d, get_len, from_pe, block, tag, &
97  recv_request=recv_request, send_request=send_request )
98 
99  return
100  end subroutine mpp_transmit_3d_
101 
102  subroutine mpp_transmit_4d_( put_data, put_len, to_pe, get_data, get_len, from_pe, block, tag, &
103  recv_request, send_request )
104  integer, intent(in) :: put_len, to_pe, get_len, from_pe
105  mpp_type_, intent(in) :: put_data(:,:,:,:)
106  mpp_type_, intent(out) :: get_data(:,:,:,:)
107  logical, intent(in), optional :: block
108  integer, intent(in), optional :: tag
109  integer, intent(out), optional :: recv_request, send_request
110  mpp_type_ :: put_data1d(put_len), get_data1d(get_len)
111 
112  pointer( ptrp, put_data1d )
113  pointer( ptrg, get_data1d )
114  get_data = mpp_type_init_value
115 
116  ptrp = loc(put_data)
117  ptrg = loc(get_data)
118  call mpp_transmit( put_data1d, put_len, to_pe, get_data1d, get_len, from_pe, block, tag, &
119  recv_request=recv_request, send_request=send_request )
120 
121  return
122  end subroutine mpp_transmit_4d_
123 
124  subroutine mpp_transmit_5d_( put_data, put_len, to_pe, get_data, get_len, from_pe, block, tag, &
125  recv_request, send_request )
126  integer, intent(in) :: put_len, to_pe, get_len, from_pe
127  mpp_type_, intent(in) :: put_data(:,:,:,:,:)
128  mpp_type_, intent(out) :: get_data(:,:,:,:,:)
129  logical, intent(in), optional :: block
130  integer, intent(in), optional :: tag
131  integer, intent(out), optional :: recv_request, send_request
132  mpp_type_ :: put_data1d(put_len), get_data1d(get_len)
133 
134  pointer( ptrp, put_data1d )
135  pointer( ptrg, get_data1d )
136  get_data = mpp_type_init_value
137 
138  ptrp = loc(put_data)
139  ptrg = loc(get_data)
140  call mpp_transmit( put_data1d, put_len, to_pe, get_data1d, get_len, from_pe, block, tag, &
141  recv_request=recv_request, send_request=send_request )
142 
143  return
144  end subroutine mpp_transmit_5d_
145 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
146 ! !
147 ! MPP_SEND and RECV !
148 ! !
149 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
150 
151  subroutine mpp_recv_( get_data, get_len, from_pe, block, tag, request )
152 !a mpp_transmit with null arguments on the put side
153  integer, intent(in) :: get_len, from_pe
154  mpp_type_, intent(out) :: get_data(*)
155  logical, intent(in), optional :: block
156  integer, intent(in), optional :: tag
157  integer, intent(out), optional :: request
158 
159  mpp_type_ :: dummy(1)
160  call mpp_transmit( dummy, 1, null_pe, get_data, get_len, from_pe, block, tag, recv_request=request )
161  end subroutine mpp_recv_
162 
163  subroutine mpp_send_( put_data, put_len, to_pe, tag, request )
164 !a mpp_transmit with null arguments on the get side
165  integer, intent(in) :: put_len, to_pe
166  mpp_type_, intent(in) :: put_data(*)
167  integer, intent(in), optional :: tag
168  integer, intent(out), optional :: request
169  mpp_type_ :: dummy(1)
170  call mpp_transmit( put_data, put_len, to_pe, dummy, 1, null_pe, tag=tag, send_request=request )
171  end subroutine mpp_send_
172 
173  subroutine mpp_recv_scalar_( get_data, from_pe, glen, block, tag, request )
174 !a mpp_transmit with null arguments on the put side
175  integer, intent(in) :: from_pe
176  mpp_type_, intent(out) :: get_data
177  logical, intent(in), optional :: block
178  integer, intent(in), optional :: tag
179  integer, intent(out), optional :: request
180 
181  integer, optional, intent(in) :: glen
182  integer :: get_len
183  mpp_type_ :: get_data1d(1)
184  mpp_type_ :: dummy(1)
185 
186  pointer( ptr, get_data1d )
187  get_data = mpp_type_init_value
188 
189  ptr = loc(get_data)
190  get_len=1; if(PRESENT(glen))get_len=glen
191  call mpp_transmit( dummy, 1, null_pe, get_data1d, get_len, from_pe, block, tag, recv_request=request )
192 
193  end subroutine mpp_recv_scalar_
194 
195  subroutine mpp_send_scalar_( put_data, to_pe, plen, tag, request)
196 !a mpp_transmit with null arguments on the get side
197  integer, intent(in) :: to_pe
198  mpp_type_, intent(in) :: put_data
199  integer, optional, intent(in) :: plen
200  integer, intent(in), optional :: tag
201  integer, intent(out), optional :: request
202  integer :: put_len
203  mpp_type_ :: put_data1d(1)
204  mpp_type_ :: dummy(1)
205 
206  pointer( ptr, put_data1d )
207  ptr = loc(put_data)
208  put_len=1; if(PRESENT(plen))put_len=plen
209  call mpp_transmit( put_data1d, put_len, to_pe, dummy, 1, null_pe, tag = tag, send_request=request )
210 
211  end subroutine mpp_send_scalar_
212 
213  subroutine mpp_recv_2d_( get_data, get_len, from_pe, block, tag, request )
214 !a mpp_transmit with null arguments on the put side
215  integer, intent(in) :: get_len, from_pe
216  mpp_type_, intent(out) :: get_data(:,:)
217  logical, intent(in), optional :: block
218  integer, intent(in), optional :: tag
219  integer, intent(out), optional :: request
220 
221  mpp_type_ :: dummy(1,1)
222  call mpp_transmit( dummy, 1, null_pe, get_data, get_len, from_pe, block, tag, recv_request=request )
223  end subroutine mpp_recv_2d_
224 
225  subroutine mpp_send_2d_( put_data, put_len, to_pe, tag, request )
226 !a mpp_transmit with null arguments on the get side
227  integer, intent(in) :: put_len, to_pe
228  mpp_type_, intent(in) :: put_data(:,:)
229  integer, intent(in), optional :: tag
230  integer, intent(out), optional :: request
231  mpp_type_ :: dummy(1,1)
232  call mpp_transmit( put_data, put_len, to_pe, dummy, 1, null_pe, tag = tag, send_request=request )
233  end subroutine mpp_send_2d_
234 
235  subroutine mpp_recv_3d_( get_data, get_len, from_pe, block, tag, request )
236 !a mpp_transmit with null arguments on the put side
237  integer, intent(in) :: get_len, from_pe
238  mpp_type_, intent(out) :: get_data(:,:,:)
239  logical, intent(in), optional :: block
240  integer, intent(in), optional :: tag
241  integer, intent(out), optional :: request
242 
243  mpp_type_ :: dummy(1,1,1)
244  call mpp_transmit( dummy, 1, null_pe, get_data, get_len, from_pe, block, tag, recv_request=request )
245  end subroutine mpp_recv_3d_
246 
247  subroutine mpp_send_3d_( put_data, put_len, to_pe, tag, request )
248 !a mpp_transmit with null arguments on the get side
249  integer, intent(in) :: put_len, to_pe
250  mpp_type_, intent(in) :: put_data(:,:,:)
251  integer, intent(in), optional :: tag
252  integer, intent(out), optional :: request
253  mpp_type_ :: dummy(1,1,1)
254  call mpp_transmit( put_data, put_len, to_pe, dummy, 1, null_pe, tag = tag, send_request=request )
255  end subroutine mpp_send_3d_
256 
257  subroutine mpp_recv_4d_( get_data, get_len, from_pe, block, tag, request )
258 !a mpp_transmit with null arguments on the put side
259  integer, intent(in) :: get_len, from_pe
260  mpp_type_, intent(out) :: get_data(:,:,:,:)
261  logical, intent(in), optional :: block
262  integer, intent(in), optional :: tag
263  integer, intent(out), optional :: request
264 
265  mpp_type_ :: dummy(1,1,1,1)
266  call mpp_transmit( dummy, 1, null_pe, get_data, get_len, from_pe, block, tag, recv_request=request )
267  end subroutine mpp_recv_4d_
268 
269  subroutine mpp_send_4d_( put_data, put_len, to_pe, tag, request )
270 !a mpp_transmit with null arguments on the get side
271  integer, intent(in) :: put_len, to_pe
272  mpp_type_, intent(in) :: put_data(:,:,:,:)
273  integer, intent(in), optional :: tag
274  integer, intent(out), optional :: request
275  mpp_type_ :: dummy(1,1,1,1)
276  call mpp_transmit( put_data, put_len, to_pe, dummy, 1, null_pe, tag = tag, send_request=request )
277  end subroutine mpp_send_4d_
278 
279  subroutine mpp_recv_5d_( get_data, get_len, from_pe, block, tag, request)
280 !a mpp_transmit with null arguments on the put side
281  integer, intent(in) :: get_len, from_pe
282  mpp_type_, intent(out) :: get_data(:,:,:,:,:)
283  logical, intent(in), optional :: block
284  integer, intent(in), optional :: tag
285  integer, intent(out), optional :: request
286 
287  mpp_type_ :: dummy(1,1,1,1,1)
288  call mpp_transmit( dummy, 1, null_pe, get_data, get_len, from_pe, block, tag, recv_request=request )
289  end subroutine mpp_recv_5d_
290 
291  subroutine mpp_send_5d_( put_data, put_len, to_pe, tag, request )
292 !a mpp_transmit with null arguments on the get side
293  integer, intent(in) :: put_len, to_pe
294  mpp_type_, intent(in) :: put_data(:,:,:,:,:)
295  integer, intent(in), optional :: tag
296  integer, intent(out), optional :: request
297  mpp_type_ :: dummy(1,1,1,1,1)
298  call mpp_transmit( put_data, put_len, to_pe, dummy, 1, null_pe, tag = tag, send_request=request )
299  end subroutine mpp_send_5d_
300 
301 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
302 ! !
303 ! MPP_BROADCAST !
304 ! !
305 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
306 
307  subroutine mpp_broadcast_scalar_( broadcast_data, from_pe, pelist )
308  mpp_type_, intent(inout) :: broadcast_data
309  integer, intent(in) :: from_pe
310  integer, intent(in), optional :: pelist(:)
311  mpp_type_ :: data1d(1)
312 
313  pointer( ptr, data1d )
314 
315  ptr = loc(broadcast_data)
316  call mpp_broadcast_( data1d, 1, from_pe, pelist )
317 
318  return
319  end subroutine mpp_broadcast_scalar_
320 
321  subroutine mpp_broadcast_2d_( broadcast_data, length, from_pe, pelist )
322 !this call was originally bundled in with mpp_transmit, but that doesn't allow
323 !broadcast to a subset of PEs. This version will, and mpp_transmit will remain
324 !backward compatible.
325  mpp_type_, intent(inout) :: broadcast_data(:,:)
326  integer, intent(in) :: length, from_pe
327  integer, intent(in), optional :: pelist(:)
328  mpp_type_ :: data1d(length)
329 
330  pointer( ptr, data1d )
331  ptr = loc(broadcast_data)
332  call mpp_broadcast( data1d, length, from_pe, pelist )
333 
334  return
335  end subroutine mpp_broadcast_2d_
336 
337  subroutine mpp_broadcast_3d_( broadcast_data, length, from_pe, pelist )
338 !this call was originally bundled in with mpp_transmit, but that doesn't allow
339 !broadcast to a subset of PEs. This version will, and mpp_transmit will remain
340 !backward compatible.
341  mpp_type_, intent(inout) :: broadcast_data(:,:,:)
342  integer, intent(in) :: length, from_pe
343  integer, intent(in), optional :: pelist(:)
344  mpp_type_ :: data1d(length)
345 
346  pointer( ptr, data1d )
347  ptr = loc(broadcast_data)
348  call mpp_broadcast( data1d, length, from_pe, pelist )
349 
350  return
351  end subroutine mpp_broadcast_3d_
352 
353  subroutine mpp_broadcast_4d_( broadcast_data, length, from_pe, pelist )
354 !this call was originally bundled in with mpp_transmit, but that doesn't allow
355 !broadcast to a subset of PEs. This version will, and mpp_transmit will remain
356 !backward compatible.
357  mpp_type_, intent(inout) :: broadcast_data(:,:,:,:)
358  integer, intent(in) :: length, from_pe
359  integer, intent(in), optional :: pelist(:)
360  mpp_type_ :: data1d(length)
361 
362  pointer( ptr, data1d )
363  ptr = loc(broadcast_data)
364  call mpp_broadcast( data1d, length, from_pe, pelist )
365 
366  return
367  end subroutine mpp_broadcast_4d_
368 
369  subroutine mpp_broadcast_5d_( broadcast_data, length, from_pe, pelist )
370 !this call was originally bundled in with mpp_transmit, but that doesn't allow
371 !broadcast to a subset of PEs. This version will, and mpp_transmit will remain
372 !backward compatible.
373  mpp_type_, intent(inout) :: broadcast_data(:,:,:,:,:)
374  integer, intent(in) :: length, from_pe
375  integer, intent(in), optional :: pelist(:)
376  mpp_type_ :: data1d(length)
377 
378  pointer( ptr, data1d )
379  ptr = loc(broadcast_data)
380  call mpp_broadcast( data1d, length, from_pe, pelist )
381 
382  return
383  end subroutine mpp_broadcast_5d_
384 !> @}