source: palm/trunk/SOURCE/pmc_mpi_wrapper_mod.f90 @ 2000

Last change on this file since 2000 was 2000, checked in by knoop, 8 years ago

Forced header and separation lines into 80 columns

  • Property svn:keywords set to Id
File size: 18.9 KB
RevLine 
[1900]1 MODULE pmc_mpi_wrapper
[1762]2
[2000]3!------------------------------------------------------------------------------!
[1762]4! This file is part of PALM.
5!
[2000]6! PALM is free software: you can redistribute it and/or modify it under the
7! terms of the GNU General Public License as published by the Free Software
8! Foundation, either version 3 of the License, or (at your option) any later
9! version.
[1762]10!
11! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
12! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
14!
15! You should have received a copy of the GNU General Public License along with
16! PALM. If not, see <http://www.gnu.org/licenses/>.
17!
[1818]18! Copyright 1997-2016 Leibniz Universitaet Hannover
[2000]19!------------------------------------------------------------------------------!
[1762]20!
21! Current revisions:
22! ------------------
[2000]23! Forced header and separation lines into 80 columns
[1851]24!
[1762]25! Former revisions:
26! -----------------
27! $Id: pmc_mpi_wrapper_mod.f90 2000 2016-08-20 18:09:15Z knoop $
28!
[1933]29! 1901 2016-05-04 15:39:38Z raasch
30! Code clean up. The words server/client changed to parent/child.
31!
[1901]32! 1900 2016-05-04 15:27:53Z raasch
33! re-formatted to match PALM style
34!
[1851]35! 1850 2016-04-08 13:29:27Z maronga
36! Module renamed
37!
38!
[1809]39! 1808 2016-04-05 19:44:00Z raasch
40! MPI module used by default on all machines
41!
[1780]42! 1779 2016-03-03 08:01:28Z raasch
43! kind=dp replaced by wp
44!
[1765]45! 1764 2016-02-28 12:45:19Z raasch
46! cpp-statement added (nesting can only be used in parallel mode),
47! kind-parameters adjusted to PALM-kinds
48!
[1763]49! 1762 2016-02-25 12:31:13Z hellstea
50! Initial revision by K. Ketelsen
[1762]51!
52! Description:
53! ------------
54!
55! MPI Wrapper of Palm Model Coupler
[1933]56!-------------------------------------------------------------------------------!
[1762]57
[1764]58#if defined( __parallel )
[1900]59    USE, INTRINSIC ::  ISO_C_BINDING
[1762]60
[1808]61#if defined( __mpifh )
62    INCLUDE "mpif.h"
63#else
[1764]64    USE MPI
65#endif
[1762]66
[1900]67    USE kinds
[1933]68    USE pmc_handle_communicator,                                                &
69        ONLY: m_model_comm, m_model_rank, m_to_parent_comm, m_to_child_comm
[1762]70
[1900]71    IMPLICIT NONE
[1762]72
[1900]73    PRIVATE
74    SAVE
[1762]75
[1933]76    INTERFACE pmc_send_to_parent
77       MODULE PROCEDURE pmc_send_to_parent_integer
78       MODULE PROCEDURE pmc_send_to_parent_integer_2
79       MODULE PROCEDURE pmc_send_to_parent_real_r1
80       MODULE PROCEDURE pmc_send_to_parent_real_r2
81       MODULE PROCEDURE pmc_send_to_parent_real_r3
82    END INTERFACE pmc_send_to_parent
[1762]83
[1933]84    INTERFACE pmc_recv_from_parent
85       MODULE PROCEDURE pmc_recv_from_parent_integer
86       MODULE PROCEDURE pmc_recv_from_parent_real_r1
87       MODULE PROCEDURE pmc_recv_from_parent_real_r2
88       MODULE PROCEDURE pmc_recv_from_parent_real_r3
89    END INTERFACE pmc_recv_from_parent
[1762]90
[1933]91    INTERFACE pmc_send_to_child
92       MODULE PROCEDURE pmc_send_to_child_integer
93       MODULE PROCEDURE pmc_send_to_child_real_r1
94       MODULE PROCEDURE pmc_send_to_child_real_r2
95       MODULE PROCEDURE pmc_send_to_child_real_r3
96    END INTERFACE pmc_send_to_child
[1762]97
[1933]98    INTERFACE pmc_recv_from_child
99       MODULE PROCEDURE pmc_recv_from_child_integer
100       MODULE PROCEDURE pmc_recv_from_child_integer_2
101       MODULE PROCEDURE pmc_recv_from_child_real_r1
102       MODULE PROCEDURE pmc_recv_from_child_real_r2
103       MODULE PROCEDURE pmc_recv_from_child_real_r3
104    END INTERFACE pmc_recv_from_child
[1762]105
[1900]106    INTERFACE pmc_bcast
107       MODULE PROCEDURE pmc_bcast_integer
108       MODULE PROCEDURE pmc_bcast_character
109    END INTERFACE pmc_bcast
[1762]110
[1900]111    INTERFACE pmc_inter_bcast
112       MODULE PROCEDURE pmc_inter_bcast_integer_1
113    END INTERFACE pmc_inter_bcast
[1762]114
[1900]115    INTERFACE pmc_alloc_mem
116       MODULE PROCEDURE pmc_alloc_mem_integer_1
117       MODULE PROCEDURE pmc_alloc_mem_Real_1
118    END INTERFACE pmc_alloc_mem
[1762]119
[1900]120    INTERFACE pmc_time
121       MODULE PROCEDURE pmc_time
122    END INTERFACE pmc_time
[1762]123
[1933]124    PUBLIC pmc_alloc_mem, pmc_bcast, pmc_inter_bcast, pmc_recv_from_child,      &
125           pmc_recv_from_parent, pmc_send_to_child, pmc_send_to_parent,         &
[1900]126           pmc_time
[1762]127
[1900]128 CONTAINS
[1762]129
130
[1933]131 SUBROUTINE pmc_send_to_parent_integer( buf, n, parent_rank, tag, ierr )
[1762]132
[1900]133    IMPLICIT NONE
[1762]134
[1900]135    INTEGER, DIMENSION(:), INTENT(IN) ::  buf          !<
136    INTEGER, INTENT(IN)               ::  n            !<
[1933]137    INTEGER, INTENT(IN)               ::  parent_rank  !<
[1900]138    INTEGER, INTENT(IN)               ::  tag          !<
139    INTEGER, INTENT(OUT)              ::  ierr         !<
[1762]140
[1900]141    ierr = 0
[1933]142    CALL MPI_SEND( buf, n, MPI_INTEGER, parent_rank, tag, m_to_parent_comm,     &
[1900]143                   ierr)
[1779]144
[1933]145 END SUBROUTINE pmc_send_to_parent_integer
[1762]146
[1779]147
[1762]148
[1933]149 SUBROUTINE pmc_recv_from_parent_integer( buf, n, parent_rank, tag, ierr )
[1762]150
[1900]151    IMPLICIT NONE
[1779]152
[1900]153    INTEGER, DIMENSION(:), INTENT(OUT) ::  buf          !<
154    INTEGER, INTENT(IN)                ::  n            !<
[1933]155    INTEGER, INTENT(IN)                ::  parent_rank  !<
[1900]156    INTEGER, INTENT(IN)                ::  tag          !<
157    INTEGER, INTENT(OUT)               ::  ierr         !<
[1762]158
[1900]159    ierr = 0
[1933]160    CALL MPI_RECV( buf, n, MPI_INTEGER, parent_rank, tag, m_to_parent_comm,     &
[1900]161                   MPI_STATUS_IGNORE, ierr )
[1779]162
[1933]163 END SUBROUTINE pmc_recv_from_parent_integer
[1762]164
165
[1779]166
[1933]167 SUBROUTINE pmc_send_to_parent_integer_2( buf, n, parent_rank, tag, ierr )
[1762]168
[1900]169    IMPLICIT NONE
[1779]170
[1900]171    INTEGER, DIMENSION(:,:), INTENT(IN) :: buf          !<
172    INTEGER, INTENT(IN)                 :: n            !<
[1933]173    INTEGER, INTENT(IN)                 :: parent_rank  !<
[1900]174    INTEGER, INTENT(IN)                 :: tag          !<
175    INTEGER, INTENT(OUT)                :: ierr         !<
[1762]176
[1900]177    ierr = 0
[1933]178    CALL MPI_SEND( buf, n, MPI_INTEGER, parent_rank, tag, m_to_parent_comm,     &
[1900]179                   ierr )
[1762]180
[1933]181 END SUBROUTINE pmc_send_to_parent_integer_2
[1779]182
[1762]183
[1779]184
[1933]185 SUBROUTINE pmc_send_to_parent_real_r1( buf, n, parent_rank, tag, ierr )
[1762]186
[1900]187    IMPLICIT NONE
[1762]188
[1900]189    REAL(wp), DIMENSION(:), INTENT(IN) ::  buf          !<
190    INTEGER, INTENT(IN)                ::  n            !<
[1933]191    INTEGER, INTENT(IN)                ::  parent_rank  !<
[1900]192    INTEGER, INTENT(IN)                ::  tag          !<
193    INTEGER, INTENT(OUT)               ::  ierr         !<
[1779]194
[1900]195    ierr = 0
[1933]196    CALL MPI_SEND( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm, ierr )
[1762]197
[1933]198 END SUBROUTINE pmc_send_to_parent_real_r1
[1779]199
[1762]200
201
[1933]202 SUBROUTINE pmc_recv_from_parent_real_r1( buf, n, parent_rank, tag, ierr )
[1779]203
[1900]204    IMPLICIT NONE
[1762]205
[1900]206    REAL(wp), DIMENSION(:), INTENT(OUT) ::  buf          !<
207    INTEGER, INTENT(IN)                 ::  n            !<
[1933]208    INTEGER, INTENT(IN)                 ::  parent_rank  !<
[1900]209    INTEGER, INTENT(IN)                 ::  tag          !<
210    INTEGER, INTENT(OUT)                ::  ierr         !<
[1779]211
[1900]212    ierr = 0
[1933]213    CALL MPI_RECV( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm,        &
[1900]214                   MPI_STATUS_IGNORE, ierr )
[1762]215
[1933]216 END SUBROUTINE pmc_recv_from_parent_real_r1
[1762]217
218
219
[1933]220 SUBROUTINE pmc_send_to_parent_real_r2( buf, n, parent_rank, tag, ierr )
[1762]221
[1900]222    IMPLICIT NONE
[1762]223
[1900]224    REAL(wp), DIMENSION(:,:), INTENT(IN) ::  buf          !<
225    INTEGER, INTENT(IN)                  ::  n            !<
[1933]226    INTEGER, INTENT(IN)                  ::  parent_rank  !<
[1900]227    INTEGER, INTENT(IN)                  ::  tag          !<
228    INTEGER, INTENT(OUT)                 ::  ierr         !<
[1762]229
[1900]230    ierr = 0
[1933]231    CALL MPI_SEND( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm, ierr )
[1762]232
[1933]233 END SUBROUTINE pmc_send_to_parent_real_r2
[1762]234
235
[1933]236 SUBROUTINE pmc_recv_from_parent_real_r2( buf, n, parent_rank, tag, ierr )
[1762]237
[1900]238    IMPLICIT NONE
[1762]239
[1900]240    REAL(wp), DIMENSION(:,:), INTENT(OUT) ::  buf          !<
241    INTEGER, INTENT(IN)                   ::  n            !<
[1933]242    INTEGER, INTENT(IN)                   ::  parent_rank  !<
[1900]243    INTEGER, INTENT(IN)                   ::  tag          !<
244    INTEGER, INTENT(OUT)                  ::  ierr         !<
[1779]245
[1900]246    ierr = 0
[1933]247    CALL MPI_RECV( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm,        &
[1900]248                   MPI_STATUS_IGNORE, ierr )
[1762]249
[1933]250 END SUBROUTINE pmc_recv_from_parent_real_r2
[1779]251
[1762]252
253
[1933]254 SUBROUTINE pmc_send_to_parent_real_r3( buf, n, parent_rank, tag, ierr )
[1779]255
[1900]256    IMPLICIT NONE
[1762]257
[1900]258    REAL(wp), DIMENSION(:,:,:), INTENT(IN) ::  buf          !<
259    INTEGER, INTENT(IN)                    ::  n            !<
[1933]260    INTEGER, INTENT(IN)                    ::  parent_rank  !<
[1900]261    INTEGER, INTENT(IN)                    ::  tag          !<
262    INTEGER, INTENT(OUT)                   ::  ierr         !<
[1779]263
[1900]264    ierr = 0
[1933]265    CALL MPI_SEND( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm, ierr )
[1762]266
[1933]267 END SUBROUTINE pmc_send_to_parent_real_r3
[1762]268
[1779]269
[1762]270
[1933]271 SUBROUTINE pmc_recv_from_parent_real_r3( buf, n, parent_rank, tag, ierr )
[1779]272
[1900]273    IMPLICIT NONE
[1762]274
[1900]275    REAL(wp), DIMENSION(:,:,:), INTENT(OUT) ::  buf          !<
276    INTEGER, INTENT(IN)                     ::  n            !<
[1933]277    INTEGER, INTENT(IN)                     ::  parent_rank  !<
[1900]278    INTEGER, INTENT(IN)                     ::  tag          !<
279    INTEGER, INTENT(OUT)                    ::  ierr         !<
[1762]280
[1900]281    ierr = 0
[1933]282    CALL MPI_RECV( buf, n, MPI_REAL, parent_rank, tag, m_to_parent_comm,        &
[1900]283                   MPI_STATUS_IGNORE, ierr )
[1779]284
[1933]285 END SUBROUTINE pmc_recv_from_parent_real_r3
[1762]286
[1779]287
[1762]288
[1933]289 SUBROUTINE pmc_send_to_child_integer( child_id, buf, n, child_rank, tag,       &
290                                       ierr )
[1762]291
[1900]292    IMPLICIT NONE
[1779]293
[1933]294    INTEGER, INTENT(IN)               ::  child_id     !<
[1900]295    INTEGER, DIMENSION(:), INTENT(IN) ::  buf          !<
296    INTEGER, INTENT(IN)               ::  n            !<
[1933]297    INTEGER, INTENT(IN)               ::  child_rank   !<
[1900]298    INTEGER, INTENT(IN)               ::  tag          !<
299    INTEGER, INTENT(OUT)              ::  ierr         !<
[1762]300
[1900]301    ierr = 0
[1933]302    CALL MPI_SEND( buf, n, MPI_INTEGER, child_rank, tag,                        &
303                   m_to_child_comm(child_id), ierr )
[1779]304
[1933]305 END SUBROUTINE pmc_send_to_child_integer
[1762]306
307
[1779]308
[1933]309 SUBROUTINE pmc_recv_from_child_integer( child_id, buf, n, child_rank, tag,     &
310                                         ierr )
[1762]311
[1900]312    IMPLICIT NONE
[1779]313
[1933]314    INTEGER, INTENT(IN)                  ::  child_id     !<
[1900]315    INTEGER, DIMENSION(:), INTENT(INOUT) ::  buf          !<
316    INTEGER, INTENT(IN)                  ::  n            !<
[1933]317    INTEGER, INTENT(IN)                  ::  child_rank   !<
[1900]318    INTEGER, INTENT(IN)                  ::  tag          !<
319    INTEGER, INTENT(OUT)                 ::  ierr         !<
[1762]320
[1900]321    ierr = 0
[1933]322    CALL MPI_RECV( buf, n, MPI_INTEGER, child_rank, tag,                        &
323                   m_to_child_comm(child_id), MPI_STATUS_IGNORE, ierr )
[1762]324
[1933]325 END SUBROUTINE pmc_recv_from_child_integer
[1762]326
327
328
[1933]329 SUBROUTINE pmc_recv_from_child_integer_2( child_id, buf, n, child_rank,        &
330                                           tag, ierr )
[1762]331
[1900]332    IMPLICIT NONE
[1762]333
[1933]334    INTEGER, INTENT(IN)                  ::  child_id     !<
[1900]335    INTEGER, DIMENSION(:,:), INTENT(OUT) ::  buf          !<
336    INTEGER, INTENT(IN)                  ::  n            !<
[1933]337    INTEGER, INTENT(IN)                  ::  child_rank   !<
[1900]338    INTEGER, INTENT(IN)                  ::  tag          !<
339    INTEGER, INTENT(OUT)                 ::  ierr         !<
[1762]340
[1900]341    ierr = 0
[1933]342    CALL MPI_RECV( buf, n, MPI_INTEGER, child_rank, tag,                        &
343                   m_to_child_comm(child_id), MPI_STATUS_IGNORE, ierr )
[1762]344
[1933]345 END SUBROUTINE pmc_recv_from_child_integer_2
[1762]346
347
348
[1933]349 SUBROUTINE pmc_send_to_child_real_r1( child_id, buf, n, child_rank, tag,       &
350                                       ierr )
[1762]351
[1900]352    IMPLICIT NONE
[1762]353
[1933]354    INTEGER, INTENT(IN)                ::  child_id     !<
[1900]355    REAL(wp), DIMENSION(:), INTENT(IN) ::  buf          !<
356    INTEGER, INTENT(IN)                ::  n            !<
[1933]357    INTEGER, INTENT(IN)                ::  child_rank   !<
[1900]358    INTEGER, INTENT(IN)                ::  tag          !<
359    INTEGER, INTENT(OUT)               ::  ierr         !<
[1762]360
[1900]361    ierr = 0
[1933]362    CALL MPI_SEND( buf, n, MPI_REAL, child_rank, tag,                           &
363                   m_to_child_comm(child_id), ierr )
[1762]364
[1933]365 END SUBROUTINE pmc_send_to_child_real_r1
[1762]366
367
368
[1933]369 SUBROUTINE pmc_recv_from_child_real_r1( child_id, buf, n, child_rank, tag,     &
370                                         ierr )
[1762]371
[1900]372    IMPLICIT NONE
[1762]373
[1933]374    INTEGER, INTENT(IN)                   ::  child_id     !<
[1900]375    REAL(wp), DIMENSION(:), INTENT(INOUT) ::  buf          !<
376    INTEGER, INTENT(IN)                   ::  n            !<
[1933]377    INTEGER, INTENT(IN)                   ::  child_rank   !<
[1900]378    INTEGER, INTENT(IN)                   ::  tag          !<
379    INTEGER, INTENT(OUT)                  ::  ierr         !<
[1762]380
[1900]381    ierr = 0
[1933]382    CALL MPI_RECV( buf, n, MPI_REAL, child_rank, tag,                           &
383                   m_to_child_comm(child_id), MPI_STATUS_IGNORE, ierr )
[1762]384
[1933]385 END SUBROUTINE pmc_recv_from_child_real_r1
[1762]386
387
388
[1933]389 SUBROUTINE pmc_send_to_child_real_r2( child_id, buf, n, child_rank, tag,       &
390                                       ierr )
[1762]391
[1900]392    IMPLICIT NONE
[1762]393
[1933]394    INTEGER, INTENT(IN)                  ::  child_id     !<
[1900]395    REAL(wp), DIMENSION(:,:), INTENT(IN) ::  buf          !<
396    INTEGER, INTENT(IN)                  ::  n            !<
[1933]397    INTEGER, INTENT(IN)                  ::  child_rank   !<
[1900]398    INTEGER, INTENT(IN)                  ::  tag          !<
399    INTEGER, INTENT(OUT)                 ::  ierr         !<
[1762]400
[1900]401    ierr = 0
[1933]402    CALL MPI_SEND( buf, n, MPI_REAL, child_rank, tag,                           &
403                   m_to_child_comm(child_id), ierr )
[1762]404
[1933]405 END SUBROUTINE pmc_send_to_child_real_r2
[1762]406
407
408
[1933]409 SUBROUTINE pmc_recv_from_child_real_r2( child_id, buf, n, child_rank, tag,     &
410                                         ierr )
[1762]411
[1900]412    IMPLICIT NONE
[1762]413
[1933]414    INTEGER, INTENT(IN)                   ::  child_id     !<
[1900]415    REAL(wp), DIMENSION(:,:), INTENT(OUT) ::  buf          !<
416    INTEGER, INTENT(IN)                   ::  n            !<
[1933]417    INTEGER, INTENT(IN)                   ::  child_rank   !<
[1900]418    INTEGER, INTENT(IN)                   ::  tag          !<
419    INTEGER, INTENT(OUT)                  ::  ierr         !<
420
421    ierr = 0
[1933]422    CALL MPI_RECV( buf, n, MPI_REAL, child_rank, tag,                           &
423                   m_to_child_comm(child_id), MPI_STATUS_IGNORE, ierr )
[1900]424
[1933]425 END SUBROUTINE pmc_recv_from_child_real_r2
[1900]426
427
428
[1933]429 SUBROUTINE pmc_send_to_child_real_r3( child_id, buf, n, child_rank, tag,       &
430                                       ierr)
[1900]431
432    IMPLICIT NONE
433
[1933]434    INTEGER, INTENT(IN)                    ::  child_id     !<
[1900]435    REAL(wp), DIMENSION(:,:,:), INTENT(IN) ::  buf          !<
436    INTEGER, INTENT(IN)                    ::  n            !<
[1933]437    INTEGER, INTENT(IN)                    ::  child_rank   !<
[1900]438    INTEGER, INTENT(IN)                    ::  tag          !<
439    INTEGER, INTENT(OUT)                   ::  ierr         !<
440
441    ierr = 0
[1933]442    CALL MPI_SEND( buf, n, MPI_REAL, child_rank, tag,                           &
443                   m_to_child_comm(child_id), ierr )
[1900]444
[1933]445 END SUBROUTINE pmc_send_to_child_real_r3
[1900]446
447
448
[1933]449 SUBROUTINE pmc_recv_from_child_real_r3( child_id, buf, n, child_rank, tag,     &
450                                         ierr )
[1900]451
452    IMPLICIT NONE
453
[1933]454    INTEGER, INTENT(IN)                     ::  child_id     !<
[1900]455    REAL(wp), DIMENSION(:,:,:), INTENT(OUT) ::  buf          !<
456    INTEGER, INTENT(IN)                     ::  n            !<
[1933]457    INTEGER, INTENT(IN)                     ::  child_rank   !<
[1900]458    INTEGER, INTENT(IN)                     ::  tag          !<
459    INTEGER, INTENT(OUT)                    ::  ierr         !<
460
461    ierr = 0
[1933]462    CALL MPI_RECV( buf, n, MPI_REAL, child_rank, tag,                           & 
463                   m_to_child_comm(child_id), MPI_STATUS_IGNORE, ierr )
[1900]464
[1933]465 END SUBROUTINE pmc_recv_from_child_real_r3
[1900]466
467
468
469 SUBROUTINE pmc_bcast_integer( buf, root_pe, comm, ierr )
470
471    IMPLICIT NONE
472
473    INTEGER, INTENT(INOUT)         ::  buf      !<
474    INTEGER, INTENT(IN)            ::  root_pe  !<
475    INTEGER, INTENT(IN), OPTIONAL  ::  comm     !<
476    INTEGER, INTENT(OUT), OPTIONAL ::  ierr     !<
477
478    INTEGER ::  mycomm  !<
479    INTEGER ::  myerr   !<
480
481
482    IF ( PRESENT( comm ) )  THEN
483       mycomm = comm
484    ELSE
485       mycomm = m_model_comm
486    ENDIF
487
488    CALL MPI_BCAST( buf, 1, MPI_INTEGER, root_pe, mycomm, myerr )
489
490    IF ( PRESENT( ierr ) )  THEN
491       ierr = myerr
492    ENDIF
493
494 END SUBROUTINE pmc_bcast_integer
495
496
497
498 SUBROUTINE pmc_bcast_character( buf, root_pe, comm, ierr )
499
500    IMPLICIT NONE
501
502    CHARACTER(LEN=*), INTENT(INOUT) ::  buf      !<
503    INTEGER, INTENT(IN)             ::  root_pe  !<
504    INTEGER, INTENT(IN), OPTIONAL   ::  comm     !<
505    INTEGER, INTENT(OUT), OPTIONAL  ::  ierr     !<
506
507    INTEGER ::  mycomm  !<
508    INTEGER ::  myerr   !<
509
510    IF ( PRESENT( comm ) )  THEN
511       mycomm = comm
512    ELSE
513       mycomm = m_model_comm
514    ENDIF
515
516    CALL MPI_BCAST( buf, LEN(buf), MPI_CHARACTER, root_pe, mycomm, myerr )
517
518    IF ( PRESENT( ierr ) )  THEN
519       ierr = myerr
520    ENDIF
521
522 END SUBROUTINE pmc_bcast_character
523
524
525
[1933]526 SUBROUTINE pmc_inter_bcast_integer_1( buf, child_id, ierr )
[1900]527
528    IMPLICIT NONE
529
530    INTEGER, INTENT(INOUT),DIMENSION(:) ::  buf        !<
[1933]531    INTEGER, INTENT(IN),optional        ::  child_id   !<
[1900]532    INTEGER, INTENT(OUT),optional       ::  ierr       !<
533
534    INTEGER ::  mycomm   !<
535    INTEGER ::  myerr    !<
536    INTEGER ::  root_pe  !<
537
538!
[1933]539!-- PE 0 on parent broadcast to all child PEs
540    IF ( PRESENT( child_id ) )  THEN
[1900]541
[1933]542       mycomm = m_to_child_comm(child_id)
[1900]543
544       IF ( m_model_rank == 0 )  THEN
545          root_pe = MPI_ROOT
546       ELSE
547          root_pe = MPI_PROC_NULL
548       ENDIF
549
550    ELSE
[1933]551       mycomm  = m_to_parent_comm
[1900]552       root_pe = 0
553    ENDIF
554
555    CALL MPI_BCAST( buf, SIZE( buf ), MPI_INTEGER, root_pe, mycomm, myerr )
556
557    IF ( PRESENT( ierr ) )  THEN
558       ierr = myerr
559    ENDIF
560
561 END SUBROUTINE pmc_inter_bcast_integer_1
562
563
564
565 SUBROUTINE pmc_alloc_mem_integer_1( iarray, idim1 )
566!
567!-- Allocate memory with MPI_ALLOC_MEM using intermediate C-pointer
568
569    IMPLICIT NONE
570
571    INTEGER, DIMENSION(:), POINTER, INTENT(INOUT) ::  iarray  !<
572    INTEGER, INTENT(IN)                           ::  idim1   !<
573
574    INTEGER, DIMENSION(1)          ::  ashape   !<
575    INTEGER(KIND=MPI_ADDRESS_KIND) ::  winsize  !<
576    INTEGER                        ::  ierr     !<
577
578    TYPE(C_PTR)                    ::  p_myind  !<
579
580    winsize = idim1 * C_SIZEOF( ierr )
581
582    CALL MPI_ALLOC_MEM( winsize, MPI_INFO_NULL, p_myind, ierr )
583    ashape(1) = idim1
584    CALL C_F_POINTER( p_myind, iarray, ashape )
585
586 END SUBROUTINE pmc_alloc_mem_integer_1
587
588
589
590 SUBROUTINE pmc_alloc_mem_real_1( array, idim1, base_ptr )
591
592    IMPLICIT NONE
593
594    INTEGER(idp), INTENT(IN)                            ::  idim1     !<
595    REAL(KIND=wp), DIMENSION(:), POINTER, INTENT(INOUT) ::  array     !<
596    TYPE(C_PTR), INTENT(OUT), OPTIONAL                  ::  base_ptr  !<
597
598    INTEGER, DIMENSION(1)          :: ashape   !<
599    INTEGER(KIND=MPI_ADDRESS_KIND) :: winsize  !<
600    INTEGER                        :: ierr     !<
601
602    TYPE(C_PTR)                    :: p_myind  !<
603
604    winsize = idim1 * wp
605
606    CALL MPI_ALLOC_MEM( winsize , MPI_INFO_NULL, p_myind, ierr )
607    ashape(1) = idim1
608    CALL C_F_POINTER( p_myind, array, ashape )
609
610    IF ( PRESENT( base_ptr ) )  THEN
611       base_ptr = p_myind
612    ENDIF
613
614 END SUBROUTINE pmc_alloc_mem_Real_1
615
616
617
618 FUNCTION pmc_time()
619
620    REAL(kind=wp) :: pmc_time  !<
621
622    pmc_time = MPI_WTIME()
623
624  END FUNCTION pmc_time
625
[1764]626#endif
[1762]627 END MODULE pmc_mpi_wrapper
Note: See TracBrowser for help on using the repository browser.