67 #if defined key_mpp_mpi || ! defined in_nemo
68 #if ! defined in_surfex
103 USE parkind1
, ONLY : jpib, jprb
110 USE mpl_allreduce_mod
, ONLY : mpl_allreduce
119 #if ! defined in_surfex
127 #if ! defined in_surfex
135 PUBLIC mppsize, mpprank
150 #if ! defined in_surfex
157 #if ! defined in_surfex
175 LOGICAL,
PUBLIC,
PARAMETER :: lk_mpp = .TRUE.
177 INTEGER,
PARAMETER :: nprocmax = 2**10
182 INTEGER,
PUBLIC :: mpi_comm_opa
188 INTEGER,
PUBLIC :: ncomm_ice
189 INTEGER :: ngrp_iworld
191 INTEGER :: ndim_rank_ice
192 INTEGER :: n_ice_root
193 INTEGER,
DIMENSION(:),
ALLOCATABLE,
SAVE :: nrank_ice
196 INTEGER,
PUBLIC :: ncomm_znl
197 LOGICAL,
PUBLIC :: l_znl_root
199 INTEGER :: ndim_rank_znl
200 INTEGER,
DIMENSION(:),
ALLOCATABLE,
SAVE :: nrank_znl
203 INTEGER,
PUBLIC :: ngrp_world
204 INTEGER,
PUBLIC :: ngrp_opa
205 INTEGER,
PUBLIC :: ngrp_north
206 INTEGER,
PUBLIC :: ncomm_north
207 INTEGER,
PUBLIC :: ndim_rank_north
208 INTEGER,
PUBLIC :: njmppmax
209 INTEGER,
PUBLIC :: north_root
210 INTEGER,
DIMENSION(:),
ALLOCATABLE,
SAVE,
PUBLIC :: nrank_north
213 CHARACTER(len=1),
PUBLIC :: cn_mpi_send =
'S'
214 LOGICAL,
PUBLIC :: l_isend = .FALSE.
215 INTEGER,
PUBLIC :: nn_buffer = 0
217 REAL(wp),
DIMENSION(:),
ALLOCATABLE,
SAVE :: tampon
220 REAL(wp),
DIMENSION(:,:,:,:,:),
ALLOCATABLE,
SAVE :: t4ns, t4sn
221 REAL(wp),
DIMENSION(:,:,:,:,:),
ALLOCATABLE,
SAVE :: t4ew, t4we
222 REAL(wp),
DIMENSION(:,:,:,:,:),
ALLOCATABLE,
SAVE :: t4p1, t4p2
223 REAL(wp),
DIMENSION(:,:,:,:) ,
ALLOCATABLE,
SAVE :: t3ns, t3sn
224 REAL(wp),
DIMENSION(:,:,:,:) ,
ALLOCATABLE,
SAVE :: t3ew, t3we
225 REAL(wp),
DIMENSION(:,:,:,:) ,
ALLOCATABLE,
SAVE :: t3p1, t3p2
226 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: t2ns, t2sn
227 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: t2ew, t2we
228 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: t2p1, t2p2
229 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: tr2ns, tr2sn
230 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: tr2ew, tr2we
233 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: ztab, znorthloc
234 REAL(wp),
DIMENSION(:,:,:,:),
ALLOCATABLE,
SAVE :: znorthgloio
235 REAL(wp),
DIMENSION(:,:,:) ,
ALLOCATABLE,
SAVE :: zfoldwk
238 REAL(wp),
DIMENSION(:,:) ,
ALLOCATABLE,
SAVE :: ztab_2d, znorthloc_2d
239 REAL(wp),
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: znorthgloio_2d
240 REAL(wp),
DIMENSION(:,:) ,
ALLOCATABLE,
SAVE :: zfoldwk_2d
243 REAL(wp),
DIMENSION(:,:) ,
ALLOCATABLE,
SAVE :: ztab_e, znorthloc_e
244 REAL(wp),
DIMENSION(:,:,:),
ALLOCATABLE,
SAVE :: znorthgloio_e
247 INTEGER,
PUBLIC,
PARAMETER :: jpmaxngh = 8
248 INTEGER,
PUBLIC,
PARAMETER :: jptyps = 5
249 INTEGER,
PUBLIC,
DIMENSION (jpmaxngh,jptyps) :: isendto
250 INTEGER,
PUBLIC,
DIMENSION (jptyps) :: nsndto
251 LOGICAL,
PUBLIC :: ln_nnogather = .FALSE.
252 LOGICAL,
PUBLIC :: l_north_nogather = .FALSE.
253 INTEGER,
PUBLIC :: ityp
261 #if ! defined in_surfex
266 INTEGER,
INTENT(in) :: kumout
269 ALLOCATE( t4ns(jpi,jprecj,jpk,2,2) , t4sn(jpi,jprecj,jpk,2,2) , &
270 & t4ew(jpj,jpreci,jpk,2,2) , t4we(jpj,jpreci,jpk,2,2) , &
271 & t4p1(jpi,jprecj,jpk,2,2) , t4p2(jpi,jprecj,jpk,2,2) , &
272 & t3ns(jpi,jprecj,jpk,2) , t3sn(jpi,jprecj,jpk,2) , &
273 & t3ew(jpj,jpreci,jpk,2) , t3we(jpj,jpreci,jpk,2) , &
274 & t3p1(jpi,jprecj,jpk,2) , t3p2(jpi,jprecj,jpk,2) , &
275 & t2ns(jpi,jprecj ,2) , t2sn(jpi,jprecj ,2) , &
276 & t2ew(jpj,jpreci ,2) , t2we(jpj,jpreci ,2) , &
277 & t2p1(jpi,jprecj ,2) , t2p2(jpi,jprecj ,2) , &
279 & tr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , &
280 & tr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) , &
281 & tr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , &
282 & tr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) , &
284 & ztab(jpiglo,4,jpk) , znorthloc(jpi,4,jpk) , znorthgloio(jpi,4,jpk,jpni) , &
285 & zfoldwk(jpi,4,jpk) , &
287 & ztab_2d(jpiglo,4) , znorthloc_2d(jpi,4) , znorthgloio_2d(jpi,4,jpni) , &
288 & zfoldwk_2d(jpi,4) , &
290 & ztab_e(jpiglo,4+2*jpr2dj) , znorthloc_e(jpi,4+2*jpr2dj) , znorthgloio_e(jpi,4+2*jpr2dj,jpni) , &
295 WRITE(kumout,cform_war)
296 WRITE(kumout,*)
'lib_mpp_alloc : failed to allocate arrays'
302 FUNCTION mynode( ldtxt, kumnam, kstop, localComm )
308 CHARACTER(len=*),
DIMENSION(:),
INTENT( out) :: ldtxt
309 INTEGER ,
INTENT(in ) :: kumnam
310 INTEGER ,
INTENT(inout) :: kstop
311 INTEGER,
OPTIONAL ,
INTENT(in ) :: localcomm
313 INTEGER ::
mynode, ierr, code, ji, ii
314 LOGICAL :: mpi_was_called
316 namelist/nammpp/ cn_mpi_send, nn_buffer, jpni, jpnj, jpnij, ln_nnogather
320 WRITE(ldtxt(ii),*) ; ii = ii + 1
321 WRITE(ldtxt(ii),*)
'mynode : mpi initialisation' ; ii = ii + 1
322 WRITE(ldtxt(ii),*)
'~~~~~~ ' ; ii = ii + 1
324 jpni = -1; jpnj = -1; jpnij = -1
326 READ ( kumnam, nammpp )
328 WRITE(ldtxt(ii),*)
' Namelist nammpp' ; ii = ii + 1
329 WRITE(ldtxt(ii),*)
' mpi send type cn_mpi_send = ', cn_mpi_send ; ii = ii + 1
330 WRITE(ldtxt(ii),*)
' size in bytes of exported buffer nn_buffer = ', nn_buffer ; ii = ii + 1
332 #if defined key_agrif
333 IF( .NOT. agrif_root() )
THEN
334 jpni = agrif_parent(jpni )
335 jpnj = agrif_parent(jpnj )
336 jpnij = agrif_parent(jpnij)
346 IF( (jpni < 1) .OR. (jpnj < 1) )
THEN
347 WRITE(ldtxt(ii),*)
' jpni, jpnj and jpnij will be calculated automatically'; ii = ii + 1
349 WRITE(ldtxt(ii),*)
' processor grid extent in i jpni = ',jpni; ii = ii + 1
350 WRITE(ldtxt(ii),*)
' processor grid extent in j jpnj = ',jpnj; ii = ii + 1
351 WRITE(ldtxt(ii),*)
' number of local domains jpnij = ',jpnij; ii = ii +1
354 WRITE(ldtxt(ii),*)
' avoid use of mpi_allgather at the north fold ln_nnogather = ', ln_nnogather ; ii = ii + 1
356 CALL mpi_initialized( mpi_was_called, code )
357 IF( code /= mpi_success )
THEN
358 DO ji = 1,
SIZE(ldtxt)
359 IF( trim(ldtxt(ji)) /=
'' )
WRITE(*,*) ldtxt(ji)
362 WRITE(*, *)
'lib_mpp: Error in routine mpi_initialized'
363 CALL mpi_abort( mpi_comm_world, code, ierr )
366 IF( mpi_was_called )
THEN
368 SELECT CASE ( cn_mpi_send )
370 WRITE(ldtxt(ii),*)
' Standard blocking mpi send (send)' ; ii = ii + 1
372 WRITE(ldtxt(ii),*)
' Buffer blocking mpi send (bsend)' ; ii = ii + 1
375 WRITE(ldtxt(ii),*)
' Immediate non-blocking send (isend)' ; ii = ii + 1
378 WRITE(ldtxt(ii),cform_err) ; ii = ii + 1
379 WRITE(ldtxt(ii),*)
' bad value for cn_mpi_send = ', cn_mpi_send ; ii = ii + 1
382 ELSE IF ( present(localcomm) .and. .not. mpi_was_called )
THEN
383 WRITE(ldtxt(ii),*)
' lib_mpp: You cannot provide a local communicator ' ; ii = ii + 1
384 WRITE(ldtxt(ii),*)
' without calling MPI_Init before ! ' ; ii = ii + 1
387 SELECT CASE ( cn_mpi_send )
389 WRITE(ldtxt(ii),*)
' Standard blocking mpi send (send)' ; ii = ii + 1
390 CALL mpi_init( ierr )
392 WRITE(ldtxt(ii),*)
' Buffer blocking mpi send (bsend)' ; ii = ii + 1
395 WRITE(ldtxt(ii),*)
' Immediate non-blocking send (isend)' ; ii = ii + 1
397 CALL mpi_init( ierr )
399 WRITE(ldtxt(ii),cform_err) ; ii = ii + 1
400 WRITE(ldtxt(ii),*)
' bad value for cn_mpi_send = ', cn_mpi_send ; ii = ii + 1
406 IF( present(localcomm) )
THEN
407 IF( agrif_root() )
THEN
408 mpi_comm_opa = localcomm
411 CALL mpi_comm_dup( mpi_comm_world, mpi_comm_opa, code)
412 IF( code /= mpi_success )
THEN
413 DO ji = 1,
SIZE(ldtxt)
414 IF( trim(ldtxt(ji)) /=
'' )
WRITE(*,*) ldtxt(ji)
417 WRITE(*, *)
' lib_mpp: Error in routine mpi_comm_dup'
418 CALL mpi_abort( mpi_comm_world, code, ierr )
422 CALL mpi_comm_rank( mpi_comm_opa, mpprank, ierr )
423 CALL mpi_comm_size( mpi_comm_opa, mppsize, ierr )
426 CALL mpi_op_create(
ddpdd_mpi, .true., mpi_sumdd, ierr)
452 REAL(wp),
DIMENSION(jpi,jpj,jpk),
INTENT(inout) :: ptab
453 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
455 REAL(wp) ,
INTENT(in ) :: psgn
457 CHARACTER(len=3),
OPTIONAL ,
INTENT(in ) :: cd_mpp
458 REAL(wp) ,
OPTIONAL ,
INTENT(in ) :: pval
460 INTEGER :: ji, jj, jk, jl
461 INTEGER :: imigr, iihom, ijhom
462 INTEGER :: ml_req1, ml_req2, ml_err
464 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ml_stat
467 IF( present( pval ) )
THEN ; zland = pval
473 IF( present( cd_mpp ) )
THEN
478 ptab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk)
479 ptab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk)
480 ptab(nlei+1:nlci , jj ,jk) = ptab( nlei, nlej,jk)
483 ptab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk)
484 ptab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk)
485 ptab(ji ,nlej+1:jpj ,jk) = ptab( nlei, nlej,jk)
493 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) )
THEN
494 ptab( 1 ,:,:) = ptab(jpim1,:,:)
495 ptab(jpi,:,:) = ptab( 2 ,:,:)
497 IF( .NOT. cd_type ==
'F' ) ptab( 1 :jpreci,:,:) = zland
498 ptab(nlci-jpreci+1:jpi ,:,:) = zland
501 IF( .NOT. cd_type ==
'F' ) ptab(:, 1 :jprecj,:) = zland
502 ptab(:,nlcj-jprecj+1:jpj ,:) = zland
510 SELECT CASE ( nbondi )
514 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:)
515 t3we(:,jl,:,1) = ptab(iihom +jl,:,:)
520 imigr = jpreci * jpj * jpk
522 SELECT CASE ( nbondi )
524 CALL
mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 )
525 CALL
mpprecv( 1, t3ew(1,1,1,2), imigr, noea )
526 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
528 CALL
mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )
529 CALL
mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 )
530 CALL
mpprecv( 1, t3ew(1,1,1,2), imigr, noea )
531 CALL
mpprecv( 2, t3we(1,1,1,2), imigr, nowe )
532 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
533 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)
535 CALL
mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 )
536 CALL
mpprecv( 2, t3we(1,1,1,2), imigr, nowe )
537 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
543 SELECT CASE ( nbondi )
546 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)
550 ptab(jl ,:,:) = t3we(:,jl,:,2)
551 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2)
555 ptab(jl ,:,:) = t3we(:,jl,:,2)
564 IF( nbondj /= 2 )
THEN
567 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:)
568 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:)
573 imigr = jprecj * jpi * jpk
575 SELECT CASE ( nbondj )
577 CALL
mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 )
578 CALL
mpprecv( 3, t3ns(1,1,1,2), imigr, nono )
579 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
581 CALL
mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )
582 CALL
mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 )
583 CALL
mpprecv( 3, t3ns(1,1,1,2), imigr, nono )
584 CALL
mpprecv( 4, t3sn(1,1,1,2), imigr, noso )
585 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
586 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)
588 CALL
mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 )
589 CALL
mpprecv( 4, t3sn(1,1,1,2), imigr, noso )
590 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
596 SELECT CASE ( nbondj )
599 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)
603 ptab(:,jl ,:) = t3sn(:,jl,:,2)
604 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2)
608 ptab(:,jl,:) = t3sn(:,jl,:,2)
616 IF( npolj /= 0 .AND. .NOT. present(cd_mpp) )
THEN
619 CASE ( 1 ) ; CALL lbc_nfd( ptab, cd_type, psgn )
647 REAL(wp),
DIMENSION(jpi,jpj),
INTENT(inout) :: pt2d
648 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
650 REAL(wp) ,
INTENT(in ) :: psgn
652 CHARACTER(len=3),
OPTIONAL ,
INTENT(in ) :: cd_mpp
653 REAL(wp) ,
OPTIONAL ,
INTENT(in ) :: pval
655 INTEGER :: ji, jj, jl
656 INTEGER :: imigr, iihom, ijhom
657 INTEGER :: ml_req1, ml_req2, ml_err
659 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ml_stat
662 IF( present( pval ) )
THEN ; zland = pval
669 IF( present( cd_mpp ) )
THEN
673 pt2d(nldi :nlei , jj ) = pt2d(nldi:nlei, nlej)
674 pt2d(1 :nldi-1, jj ) = pt2d(nldi , nlej)
675 pt2d(nlei+1:nlci , jj ) = pt2d( nlei, nlej)
678 pt2d(ji ,nldj :nlej ) = pt2d( nlei,nldj:nlej)
679 pt2d(ji ,1 :nldj-1) = pt2d( nlei,nldj )
680 pt2d(ji ,nlej+1:jpj ) = pt2d( nlei, nlej)
686 IF( nbondi == 2 .AND. &
687 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) )
THEN
688 pt2d( 1 ,:) = pt2d(jpim1,:)
689 pt2d(jpi,:) = pt2d( 2 ,:)
691 IF( .NOT. cd_type ==
'F' ) pt2d( 1 :jpreci,:) = zland
692 pt2d(nlci-jpreci+1:jpi ,:) = zland
695 IF( .NOT. cd_type ==
'F' ) pt2d(:, 1 :jprecj) = zland
696 pt2d(:,nlcj-jprecj+1:jpj ) = zland
704 SELECT CASE ( nbondi )
708 t2ew(:,jl,1) = pt2d(jpreci+jl,:)
709 t2we(:,jl,1) = pt2d(iihom +jl,:)
716 SELECT CASE ( nbondi )
718 CALL
mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 )
719 CALL
mpprecv( 1, t2ew(1,1,2), imigr, noea )
720 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
722 CALL
mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )
723 CALL
mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 )
724 CALL
mpprecv( 1, t2ew(1,1,2), imigr, noea )
725 CALL
mpprecv( 2, t2we(1,1,2), imigr, nowe )
726 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
727 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)
729 CALL
mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )
730 CALL
mpprecv( 2, t2we(1,1,2), imigr, nowe )
731 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
735 iihom = nlci - jpreci
737 SELECT CASE ( nbondi )
740 pt2d(iihom+jl,:) = t2ew(:,jl,2)
744 pt2d(jl ,:) = t2we(:,jl,2)
745 pt2d(iihom+jl,:) = t2ew(:,jl,2)
749 pt2d(jl ,:) = t2we(:,jl,2)
758 IF( nbondj /= 2 )
THEN
761 t2sn(:,jl,1) = pt2d(:,ijhom +jl)
762 t2ns(:,jl,1) = pt2d(:,jprecj+jl)
769 SELECT CASE ( nbondj )
771 CALL
mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 )
772 CALL
mpprecv( 3, t2ns(1,1,2), imigr, nono )
773 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
775 CALL
mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )
776 CALL
mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 )
777 CALL
mpprecv( 3, t2ns(1,1,2), imigr, nono )
778 CALL
mpprecv( 4, t2sn(1,1,2), imigr, noso )
779 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
780 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)
782 CALL
mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )
783 CALL
mpprecv( 4, t2sn(1,1,2), imigr, noso )
784 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
788 ijhom = nlcj - jprecj
790 SELECT CASE ( nbondj )
793 pt2d(:,ijhom+jl) = t2ns(:,jl,2)
797 pt2d(:,jl ) = t2sn(:,jl,2)
798 pt2d(:,ijhom+jl) = t2ns(:,jl,2)
802 pt2d(:,jl ) = t2sn(:,jl,2)
810 IF( npolj /= 0 .AND. .NOT. present(cd_mpp) )
THEN
813 CASE ( 1 ) ; CALL lbc_nfd( pt2d, cd_type, psgn )
843 REAL(wp),
DIMENSION(jpi,jpj,jpk),
INTENT(inout) :: ptab1
844 REAL(wp),
DIMENSION(jpi,jpj,jpk),
INTENT(inout) :: ptab2
845 CHARACTER(len=1) ,
INTENT(in ) :: cd_type1
846 CHARACTER(len=1) ,
INTENT(in ) :: cd_type2
847 REAL(wp) ,
INTENT(in ) :: psgn
850 INTEGER :: imigr, iihom, ijhom
851 INTEGER :: ml_req1, ml_req2, ml_err
852 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ml_stat
859 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) )
THEN
860 ptab1( 1 ,:,:) = ptab1(jpim1,:,:)
861 ptab1(jpi,:,:) = ptab1( 2 ,:,:)
862 ptab2( 1 ,:,:) = ptab2(jpim1,:,:)
863 ptab2(jpi,:,:) = ptab2( 2 ,:,:)
865 IF( .NOT. cd_type1 ==
'F' ) ptab1( 1 :jpreci,:,:) = 0.e0
866 IF( .NOT. cd_type2 ==
'F' ) ptab2( 1 :jpreci,:,:) = 0.e0
867 ptab1(nlci-jpreci+1:jpi ,:,:) = 0.e0
868 ptab2(nlci-jpreci+1:jpi ,:,:) = 0.e0
873 IF( .NOT. cd_type1 ==
'F' ) ptab1(:, 1 :jprecj,:) = 0.e0
874 IF( .NOT. cd_type2 ==
'F' ) ptab2(:, 1 :jprecj,:) = 0.e0
875 ptab1(:,nlcj-jprecj+1:jpj ,:) = 0.e0
876 ptab2(:,nlcj-jprecj+1:jpj ,:) = 0.e0
883 SELECT CASE ( nbondi )
887 t4ew(:,jl,:,1,1) = ptab1(jpreci+jl,:,:)
888 t4we(:,jl,:,1,1) = ptab1(iihom +jl,:,:)
889 t4ew(:,jl,:,2,1) = ptab2(jpreci+jl,:,:)
890 t4we(:,jl,:,2,1) = ptab2(iihom +jl,:,:)
895 imigr = jpreci * jpj * jpk *2
897 SELECT CASE ( nbondi )
899 CALL
mppsend( 2, t4we(1,1,1,1,1), imigr, noea, ml_req1 )
900 CALL
mpprecv( 1, t4ew(1,1,1,1,2), imigr, noea )
901 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
903 CALL
mppsend( 1, t4ew(1,1,1,1,1), imigr, nowe, ml_req1 )
904 CALL
mppsend( 2, t4we(1,1,1,1,1), imigr, noea, ml_req2 )
905 CALL
mpprecv( 1, t4ew(1,1,1,1,2), imigr, noea )
906 CALL
mpprecv( 2, t4we(1,1,1,1,2), imigr, nowe )
907 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
908 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)
910 CALL
mppsend( 1, t4ew(1,1,1,1,1), imigr, nowe, ml_req1 )
911 CALL
mpprecv( 2, t4we(1,1,1,1,2), imigr, nowe )
912 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
916 iihom = nlci - jpreci
918 SELECT CASE ( nbondi )
921 ptab1(iihom+jl,:,:) = t4ew(:,jl,:,1,2)
922 ptab2(iihom+jl,:,:) = t4ew(:,jl,:,2,2)
926 ptab1(jl ,:,:) = t4we(:,jl,:,1,2)
927 ptab1(iihom+jl,:,:) = t4ew(:,jl,:,1,2)
928 ptab2(jl ,:,:) = t4we(:,jl,:,2,2)
929 ptab2(iihom+jl,:,:) = t4ew(:,jl,:,2,2)
933 ptab1(jl ,:,:) = t4we(:,jl,:,1,2)
934 ptab2(jl ,:,:) = t4we(:,jl,:,2,2)
943 IF( nbondj /= 2 )
THEN
946 t4sn(:,jl,:,1,1) = ptab1(:,ijhom +jl,:)
947 t4ns(:,jl,:,1,1) = ptab1(:,jprecj+jl,:)
948 t4sn(:,jl,:,2,1) = ptab2(:,ijhom +jl,:)
949 t4ns(:,jl,:,2,1) = ptab2(:,jprecj+jl,:)
954 imigr = jprecj * jpi * jpk * 2
956 SELECT CASE ( nbondj )
958 CALL
mppsend( 4, t4sn(1,1,1,1,1), imigr, nono, ml_req1 )
959 CALL
mpprecv( 3, t4ns(1,1,1,1,2), imigr, nono )
960 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
962 CALL
mppsend( 3, t4ns(1,1,1,1,1), imigr, noso, ml_req1 )
963 CALL
mppsend( 4, t4sn(1,1,1,1,1), imigr, nono, ml_req2 )
964 CALL
mpprecv( 3, t4ns(1,1,1,1,2), imigr, nono )
965 CALL
mpprecv( 4, t4sn(1,1,1,1,2), imigr, noso )
966 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
967 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err)
969 CALL
mppsend( 3, t4ns(1,1,1,1,1), imigr, noso, ml_req1 )
970 CALL
mpprecv( 4, t4sn(1,1,1,1,2), imigr, noso )
971 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err)
975 ijhom = nlcj - jprecj
977 SELECT CASE ( nbondj )
980 ptab1(:,ijhom+jl,:) = t4ns(:,jl,:,1,2)
981 ptab2(:,ijhom+jl,:) = t4ns(:,jl,:,2,2)
985 ptab1(:,jl ,:) = t4sn(:,jl,:,1,2)
986 ptab1(:,ijhom+jl,:) = t4ns(:,jl,:,1,2)
987 ptab2(:,jl ,:) = t4sn(:,jl,:,2,2)
988 ptab2(:,ijhom+jl,:) = t4ns(:,jl,:,2,2)
992 ptab1(:,jl,:) = t4sn(:,jl,:,1,2)
993 ptab2(:,jl,:) = t4sn(:,jl,:,2,2)
1000 IF( npolj /= 0 )
THEN
1002 SELECT CASE ( jpni )
1004 CALL lbc_nfd( ptab1, cd_type1, psgn )
1005 CALL lbc_nfd( ptab2, cd_type2, psgn )
1037 REAL(wp),
DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj),
INTENT(inout) :: pt2d
1038 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
1040 REAL(wp) ,
INTENT(in ) :: psgn
1043 INTEGER :: imigr, iihom, ijhom
1044 INTEGER :: ipreci, iprecj
1045 INTEGER :: ml_req1, ml_req2, ml_err
1046 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ml_stat
1049 ipreci = jpreci + jpr2di
1050 iprecj = jprecj + jpr2dj
1058 IF( .NOT. cd_type ==
'F' ) pt2d(:, 1-jpr2dj : jprecj ) = 0.e0
1059 pt2d(:,nlcj-jprecj+1:jpj+jpr2dj) = 0.e0
1063 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) )
THEN
1064 pt2d(1-jpr2di: 1 ,:) = pt2d(jpim1-jpr2di: jpim1 ,:)
1065 pt2d( jpi :jpi+jpr2di,:) = pt2d( 2 :2+jpr2di,:)
1068 IF( .NOT. cd_type ==
'F' ) pt2d( 1-jpr2di :jpreci ,:) = 0.e0
1069 pt2d(nlci-jpreci+1:jpi+jpr2di,:) = 0.e0
1075 IF( npolj /= 0 )
THEN
1077 SELECT CASE ( jpni )
1078 CASE ( 1 ) ; CALL lbc_nfd( pt2d(1:jpi,1:jpj+jpr2dj), cd_type, psgn, pr2dj=jpr2dj )
1088 SELECT CASE ( nbondi )
1090 iihom = nlci-nreci-jpr2di
1092 tr2ew(:,jl,1) = pt2d(jpreci+jl,:)
1093 tr2we(:,jl,1) = pt2d(iihom +jl,:)
1098 imigr = ipreci * ( jpj + 2*jpr2dj)
1100 SELECT CASE ( nbondi )
1102 CALL
mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req1 )
1103 CALL
mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea )
1104 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1106 CALL
mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 )
1107 CALL
mppsend( 2, tr2we(1-jpr2dj,1,1), imigr, noea, ml_req2 )
1108 CALL
mpprecv( 1, tr2ew(1-jpr2dj,1,2), imigr, noea )
1109 CALL
mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe )
1110 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1111 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)
1113 CALL
mppsend( 1, tr2ew(1-jpr2dj,1,1), imigr, nowe, ml_req1 )
1114 CALL
mpprecv( 2, tr2we(1-jpr2dj,1,2), imigr, nowe )
1115 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1119 iihom = nlci - jpreci
1121 SELECT CASE ( nbondi )
1124 pt2d(iihom+jl,:) = tr2ew(:,jl,2)
1128 pt2d(jl-jpr2di,:) = tr2we(:,jl,2)
1129 pt2d( iihom+jl,:) = tr2ew(:,jl,2)
1133 pt2d(jl-jpr2di,:) = tr2we(:,jl,2)
1142 IF( nbondj /= 2 )
THEN
1143 ijhom = nlcj-nrecj-jpr2dj
1145 tr2sn(:,jl,1) = pt2d(:,ijhom +jl)
1146 tr2ns(:,jl,1) = pt2d(:,jprecj+jl)
1151 imigr = iprecj * ( jpi + 2*jpr2di )
1153 SELECT CASE ( nbondj )
1155 CALL
mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req1 )
1156 CALL
mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono )
1157 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1159 CALL
mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 )
1160 CALL
mppsend( 4, tr2sn(1-jpr2di,1,1), imigr, nono, ml_req2 )
1161 CALL
mpprecv( 3, tr2ns(1-jpr2di,1,2), imigr, nono )
1162 CALL
mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso )
1163 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1164 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)
1166 CALL
mppsend( 3, tr2ns(1-jpr2di,1,1), imigr, noso, ml_req1 )
1167 CALL
mpprecv( 4, tr2sn(1-jpr2di,1,2), imigr, noso )
1168 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)
1172 ijhom = nlcj - jprecj
1174 SELECT CASE ( nbondj )
1177 pt2d(:,ijhom+jl) = tr2ns(:,jl,2)
1181 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2)
1182 pt2d(:,ijhom+jl ) = tr2ns(:,jl,2)
1186 pt2d(:,jl-jpr2dj) = tr2sn(:,jl,2)
1193 SUBROUTINE mppsend( ktyp, pmess, kbytes, kdest, md_req )
1200 REAL(wp),
INTENT(inout) :: pmess(*)
1201 INTEGER ,
INTENT(in ) :: kbytes
1202 INTEGER ,
INTENT(in ) :: kdest
1203 INTEGER ,
INTENT(in ) :: ktyp
1204 INTEGER ,
INTENT(in ) :: md_req
1209 SELECT CASE ( cn_mpi_send )
1211 CALL mpi_send( pmess, kbytes, mpi_double_precision, kdest , ktyp, mpi_comm_opa , iflag )
1213 CALL mpi_bsend( pmess, kbytes, mpi_double_precision, kdest , ktyp, mpi_comm_opa , iflag )
1216 CALL mpi_isend( pmess, kbytes, mpi_double_precision, kdest , ktyp, mpi_comm_opa, md_req, iflag )
1222 SUBROUTINE mpprecv( ktyp, pmess, kbytes, ksource )
1229 REAL(wp),
INTENT(inout) :: pmess(*)
1230 INTEGER ,
INTENT(in ) :: kbytes
1231 INTEGER ,
INTENT(in ) :: ktyp
1232 INTEGER,
OPTIONAL,
INTENT(in) :: ksource
1234 INTEGER :: istatus(mpi_status_size)
1236 INTEGER :: use_source
1242 use_source=mpi_any_source
1243 if(present(ksource))
then
1247 CALL mpi_recv( pmess, kbytes, mpi_double_precision, use_source, ktyp, mpi_comm_opa, istatus, iflag )
1260 REAL(wp),
DIMENSION(jpi,jpj),
INTENT(in ) :: ptab
1261 INTEGER ,
INTENT(in ) :: kp
1262 REAL(wp),
DIMENSION(jpi,jpj,jpnij),
INTENT( out) :: pio
1264 INTEGER :: itaille, ierror
1268 CALL mpi_gather( ptab, itaille, mpi_double_precision, pio, itaille , &
1269 & mpi_double_precision, kp , mpi_comm_opa, ierror )
1282 REAL(wp),
DIMENSION(jpi,jpj,jpnij) :: pio
1284 REAL(wp),
DIMENSION(jpi,jpj) :: ptab
1286 INTEGER :: itaille, ierror
1291 CALL mpi_scatter( pio, itaille, mpi_double_precision, ptab, itaille , &
1292 & mpi_double_precision, kp , mpi_comm_opa, ierror )
1304 INTEGER ,
INTENT(in ) :: kdim
1305 INTEGER ,
INTENT(inout),
DIMENSION(kdim) :: ktab
1306 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1308 INTEGER :: ierror, localcomm
1309 INTEGER,
DIMENSION(kdim) :: iwork
1312 #if !defined in_surfex || defined SFX_MPI
1313 localcomm = mpi_comm_opa
1314 IF( present(kcom) ) localcomm = kcom
1316 #if !defined in_arpege
1318 CALL mpi_allreduce( ktab, iwork, kdim, mpi_integer, mpi_max, localcomm, ierror )
1323 CALL
abor1_sfx(
"lib_mpp:mmpmax_a_int : Cannot yet sum a real array in Arpege")
1337 INTEGER,
INTENT(inout) :: ktab
1338 INTEGER,
INTENT(in ),
OPTIONAL :: kcom
1340 INTEGER :: ierror, iwork, localcomm
1342 INTEGER(KIND=JPIB) :: jb
1346 #if !defined in_surfex || defined SFX_MPI
1347 localcomm = mpi_comm_opa
1348 IF( present(kcom) ) localcomm = kcom
1350 #if !defined in_arpege
1352 CALL mpi_allreduce( ktab, iwork, 1, mpi_integer, mpi_max, localcomm, ierror)
1374 INTEGER ,
INTENT( in ) :: kdim
1375 INTEGER ,
INTENT(inout),
DIMENSION(kdim) :: ktab
1376 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
1378 INTEGER :: ierror, localcomm
1379 INTEGER,
DIMENSION(kdim) :: iwork
1382 #if !defined in_surfex || defined SFX_MPI
1383 localcomm = mpi_comm_opa
1384 IF( present(kcom) ) localcomm = kcom
1386 #if !defined in_arpege
1388 CALL mpi_allreduce( ktab, iwork, kdim, mpi_integer, mpi_min, localcomm, ierror )
1393 CALL
abor1_sfx(
"lib_mpp:mmpmin_a_int : Cannot yet min a real array in Arpege")
1407 INTEGER,
INTENT(inout) :: ktab
1408 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
1410 INTEGER :: ierror, iwork, localcomm
1412 INTEGER(KIND=JPIB) :: jb
1416 #if !defined in_surfex || defined SFX_MPI
1417 localcomm = mpi_comm_opa
1418 IF( present(kcom) ) localcomm = kcom
1420 #if !defined in_arpege
1422 CALL mpi_allreduce( ktab, iwork, 1, mpi_integer, mpi_min, localcomm, ierror )
1444 INTEGER,
INTENT(in ) :: kdim
1445 INTEGER,
INTENT(inout),
DIMENSION (kdim) :: ktab
1448 INTEGER,
DIMENSION (kdim) :: iwork
1451 #if !defined in_surfex || defined SFX_MPI
1452 #if !defined in_arpege
1454 CALL mpi_allreduce( ktab, iwork, kdim, mpi_integer, mpi_sum, mpi_comm_opa, ierror )
1459 CALL
abor1_sfx(
"lib_mpp:mmpsum_a_int : Cannot yet sum a real array in Arpege")
1473 INTEGER,
INTENT(inout) :: ktab
1475 INTEGER :: ierror, iwork
1477 INTEGER(KIND=JPIB) :: jb
1481 #if !defined in_surfex || defined SFX_MPI
1482 #if !defined in_arpege
1484 CALL mpi_allreduce( ktab, iwork, 1, mpi_integer, mpi_sum, mpi_comm_opa, ierror)
1506 INTEGER ,
INTENT(in ) :: kdim
1507 REAL(wp),
INTENT(inout),
DIMENSION(kdim) :: ptab
1508 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1510 INTEGER :: ierror, localcomm
1511 REAL(wp),
DIMENSION(kdim) :: zwork
1514 #if !defined in_surfex || defined SFX_MPI
1515 localcomm = mpi_comm_opa
1516 IF( present(kcom) ) localcomm = kcom
1518 #if !defined in_arpege
1520 CALL mpi_allreduce( ptab, zwork, kdim, mpi_double_precision, mpi_max, localcomm, ierror )
1525 CALL
abor1_sfx(
"lib_mpp:mmpmax_a_real : Cannot yet make a max on a real array in Arpege")
1538 REAL(wp),
INTENT(inout) :: ptab
1539 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1541 INTEGER :: ierror, localcomm
1544 REAL(KIND=JPRB) :: rb
1548 #if !defined in_surfex || defined SFX_MPI
1549 localcomm = mpi_comm_opa
1550 IF( present(kcom) ) localcomm = kcom
1552 #if !defined in_arpege
1554 CALL mpi_allreduce( ptab, zwork, 1, mpi_double_precision, mpi_max, localcomm, ierror )
1575 INTEGER ,
INTENT(in ) :: kdim
1576 REAL(wp),
INTENT(inout),
DIMENSION(kdim) :: ptab
1577 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1579 INTEGER :: ierror, localcomm
1580 REAL(wp),
DIMENSION(kdim) :: zwork
1583 #if !defined in_surfex || defined SFX_MPI
1584 localcomm = mpi_comm_opa
1585 IF( present(kcom) ) localcomm = kcom
1587 #if !defined in_arpege
1589 CALL mpi_allreduce( ptab, zwork, kdim, mpi_double_precision, mpi_min, localcomm, ierror )
1594 CALL
abor1_sfx(
"lib_mpp:mmpmin_a_real : Cannot yet make a min on a real array in Arpege")
1607 REAL(wp),
INTENT(inout) :: ptab
1608 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1612 INTEGER :: localcomm
1614 REAL(KIND=JPRB) :: rb
1618 #if !defined in_surfex || defined SFX_MPI
1619 localcomm = mpi_comm_opa
1620 IF( present(kcom) ) localcomm = kcom
1622 #if !defined in_arpege
1624 CALL mpi_allreduce( ptab, zwork, 1, mpi_double_precision, mpi_min, localcomm, ierror )
1645 INTEGER ,
INTENT( in ) :: kdim
1646 REAL(wp),
DIMENSION(kdim),
INTENT( inout ) :: ptab
1647 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
1650 INTEGER :: localcomm
1651 REAL(wp),
DIMENSION(kdim) :: zwork
1654 #if !defined in_surfex || defined SFX_MPI
1655 localcomm = mpi_comm_opa
1656 IF( present(kcom) ) localcomm = kcom
1658 #if !defined in_arpege
1660 CALL mpi_allreduce( ptab, zwork, kdim, mpi_double_precision, mpi_sum, localcomm, ierror )
1665 CALL
abor1_sfx(
"lib_mpp:mmpsum_a_real : Cannot yet make a sum on a real array in Arpege")
1678 REAL(wp),
INTENT(inout) :: ptab
1679 INTEGER ,
INTENT(in ),
OPTIONAL :: kcom
1681 INTEGER :: ierror, localcomm
1684 REAL(KIND=JPRB) :: rb
1688 #if !defined in_surfex || defined SFX_MPI
1689 localcomm = mpi_comm_opa
1690 IF( present(kcom) ) localcomm = kcom
1692 #if !defined in_arpege
1694 CALL mpi_allreduce( ptab, zwork, 1, mpi_double_precision, mpi_sum, localcomm, ierror )
1707 #if ! defined in_surfex
1716 COMPLEX(wp),
INTENT(inout) :: ytab
1717 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
1721 INTEGER :: localcomm
1722 COMPLEX(wp) :: zwork
1724 localcomm = mpi_comm_opa
1725 IF( present(kcom) ) localcomm = kcom
1729 CALL mpi_allreduce(ytab, zwork, 1, mpi_double_complex, &
1730 mpi_sumdd,localcomm,ierror)
1745 INTEGER ,
INTENT( in ) :: kdim
1746 COMPLEX(wp),
DIMENSION(kdim),
INTENT( inout ) :: ytab
1747 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
1751 INTEGER :: localcomm
1752 COMPLEX(wp),
DIMENSION(kdim) :: zwork
1754 localcomm = mpi_comm_opa
1755 IF( present(kcom) ) localcomm = kcom
1757 CALL mpi_allreduce(ytab, zwork, kdim, mpi_double_complex, &
1758 mpi_sumdd,localcomm,ierror)
1775 REAL(wp),
DIMENSION (jpi,jpj),
INTENT(in ) :: ptab
1776 REAL(wp),
DIMENSION (jpi,jpj),
INTENT(in ) :: pmask
1777 REAL(wp) ,
INTENT( out) :: pmin
1778 INTEGER ,
INTENT( out) :: ki, kj
1780 INTEGER ,
DIMENSION(2) :: ilocs
1783 REAL(wp),
DIMENSION(2,1) :: zain, zaout
1786 zmin = minval( ptab(:,:) , mask= pmask == 1.e0 )
1787 ilocs = minloc( ptab(:,:) , mask= pmask == 1.e0 )
1789 ki = ilocs(1) + nimpp - 1
1790 kj = ilocs(2) + njmpp - 1
1793 zain(2,:)=ki+10000.*kj
1795 CALL mpi_allreduce( zain,zaout, 1, mpi_2double_precision,mpi_minloc,mpi_comm_opa,ierror)
1798 kj = int(zaout(2,1)/10000.)
1799 ki = int(zaout(2,1) - 10000.*kj )
1814 REAL(wp),
DIMENSION (jpi,jpj,jpk),
INTENT(in ) :: ptab
1815 REAL(wp),
DIMENSION (jpi,jpj,jpk),
INTENT(in ) :: pmask
1816 REAL(wp) ,
INTENT( out) :: pmin
1817 INTEGER ,
INTENT( out) :: ki, kj, kk
1821 INTEGER ,
DIMENSION(3) :: ilocs
1822 REAL(wp),
DIMENSION(2,1) :: zain, zaout
1825 zmin = minval( ptab(:,:,:) , mask= pmask == 1.e0 )
1826 ilocs = minloc( ptab(:,:,:) , mask= pmask == 1.e0 )
1828 ki = ilocs(1) + nimpp - 1
1829 kj = ilocs(2) + njmpp - 1
1833 zain(2,:)=ki+10000.*kj+100000000.*kk
1835 CALL mpi_allreduce( zain,zaout, 1, mpi_2double_precision,mpi_minloc,mpi_comm_opa,ierror)
1838 kk = int( zaout(2,1) / 100000000. )
1839 kj = int( zaout(2,1) - kk * 100000000. ) / 10000
1840 ki = int( zaout(2,1) - kk * 100000000. -kj * 10000. )
1855 REAL(wp),
DIMENSION (jpi,jpj),
INTENT(in ) :: ptab
1856 REAL(wp),
DIMENSION (jpi,jpj),
INTENT(in ) :: pmask
1857 REAL(wp) ,
INTENT( out) :: pmax
1858 INTEGER ,
INTENT( out) :: ki, kj
1861 INTEGER,
DIMENSION (2) :: ilocs
1863 REAL(wp),
DIMENSION(2,1) :: zain, zaout
1866 zmax = maxval( ptab(:,:) , mask= pmask == 1.e0 )
1867 ilocs = maxloc( ptab(:,:) , mask= pmask == 1.e0 )
1869 ki = ilocs(1) + nimpp - 1
1870 kj = ilocs(2) + njmpp - 1
1873 zain(2,:) = ki + 10000. * kj
1875 CALL mpi_allreduce( zain,zaout, 1, mpi_2double_precision,mpi_maxloc,mpi_comm_opa,ierror)
1878 kj = int( zaout(2,1) / 10000. )
1879 ki = int( zaout(2,1) - 10000.* kj )
1894 REAL(wp),
DIMENSION (jpi,jpj,jpk),
INTENT(in ) :: ptab
1895 REAL(wp),
DIMENSION (jpi,jpj,jpk),
INTENT(in ) :: pmask
1896 REAL(wp) ,
INTENT( out) :: pmax
1897 INTEGER ,
INTENT( out) :: ki, kj, kk
1900 REAL(wp),
DIMENSION(2,1) :: zain, zaout
1901 INTEGER ,
DIMENSION(3) :: ilocs
1905 zmax = maxval( ptab(:,:,:) , mask= pmask == 1.e0 )
1906 ilocs = maxloc( ptab(:,:,:) , mask= pmask == 1.e0 )
1908 ki = ilocs(1) + nimpp - 1
1909 kj = ilocs(2) + njmpp - 1
1913 zain(2,:)=ki+10000.*kj+100000000.*kk
1915 CALL mpi_allreduce( zain,zaout, 1, mpi_2double_precision,mpi_maxloc,mpi_comm_opa,ierror)
1918 kk = int( zaout(2,1) / 100000000. )
1919 kj = int( zaout(2,1) - kk * 100000000. ) / 10000
1920 ki = int( zaout(2,1) - kk * 100000000. -kj * 10000. )
1935 CALL mpi_barrier( mpi_comm_opa, ierror )
1951 CALL mpi_finalize( info )
1956 SUBROUTINE mppobc( ptab, kd1, kd2, kl, kk, ktype, kij , kumout)
1978 INTEGER ,
INTENT(in ) :: kd1, kd2
1979 INTEGER ,
INTENT(in ) :: kl
1980 INTEGER ,
INTENT(in ) :: kk
1981 INTEGER ,
INTENT(in ) :: ktype
1983 INTEGER ,
INTENT(in ) :: kij
1984 INTEGER ,
INTENT(in ) :: kumout
1985 REAL(wp),
INTENT(inout),
DIMENSION(kij,kk) :: ptab
1987 INTEGER :: ji, jj, jk, jl
1988 INTEGER :: iipt0, iipt1, ilpt1
1989 INTEGER :: ijpt0, ijpt1
1990 INTEGER :: imigr, iihom, ijhom
1991 INTEGER :: ml_req1, ml_req2, ml_err
1992 INTEGER :: ml_stat(mpi_status_size)
1993 REAL(wp),
POINTER,
DIMENSION(:,:) :: ztab
1996 CALL wrk_alloc( jpi,jpj, ztab )
2003 iipt0 = max( 1, min(kd1 - nimpp+1, nlci ) )
2004 iipt1 = max( 0, min(kd2 - nimpp+1, nlci - 1 ) )
2005 ilpt1 = max( 1, min(kd2 - nimpp+1, nlci ) )
2006 ijpt0 = max( 1, min(kl - njmpp+1, nlcj ) )
2007 ijpt1 = max( 0, min(kl - njmpp+1, nlcj - 1 ) )
2008 ELSEIF( ktype==2 )
THEN
2009 iipt0 = max( 1, min(kl - nimpp+1, nlci ) )
2010 iipt1 = max( 0, min(kl - nimpp+1, nlci - 1 ) )
2011 ijpt0 = max( 1, min(kd1 - njmpp+1, nlcj ) )
2012 ijpt1 = max( 0, min(kd2 - njmpp+1, nlcj - 1 ) )
2013 ilpt1 = max( 1, min(kd2 - njmpp+1, nlcj ) )
2015 WRITE(kumout, cform_err)
2016 WRITE(kumout,*)
'mppobc : bad ktype'
2027 IF( ktype == 1 )
THEN
2028 DO jj = ijpt0, ijpt1
2029 DO ji = iipt0, iipt1
2030 ztab(ji,jj) = ptab(ji,jk)
2033 ELSEIF( ktype == 2 )
THEN
2034 DO jj = ijpt0, ijpt1
2035 DO ji = iipt0, iipt1
2036 ztab(ji,jj) = ptab(jj,jk)
2045 IF( nbondi /= 2 )
THEN
2048 t2ew(:,jl,1) = ztab(jpreci+jl,:)
2049 t2we(:,jl,1) = ztab(iihom +jl,:)
2056 IF( nbondi == -1 )
THEN
2057 CALL
mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 )
2058 CALL
mpprecv( 1, t2ew(1,1,2), imigr, noea )
2059 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2060 ELSEIF( nbondi == 0 )
THEN
2061 CALL
mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )
2062 CALL
mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 )
2063 CALL
mpprecv( 1, t2ew(1,1,2), imigr, noea )
2064 CALL
mpprecv( 2, t2we(1,1,2), imigr, nowe )
2065 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2066 IF(l_isend) CALL mpi_wait( ml_req2, ml_stat, ml_err )
2067 ELSEIF( nbondi == 1 )
THEN
2068 CALL
mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 )
2069 CALL
mpprecv( 2, t2we(1,1,2), imigr, nowe )
2070 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2076 IF( nbondi == 0 .OR. nbondi == 1 )
THEN
2078 ztab(jl,:) = t2we(:,jl,2)
2081 IF( nbondi == -1 .OR. nbondi == 0 )
THEN
2083 ztab(iihom+jl,:) = t2ew(:,jl,2)
2091 IF( nbondj /= 2 )
THEN
2094 t2sn(:,jl,1) = ztab(:,ijhom +jl)
2095 t2ns(:,jl,1) = ztab(:,jprecj+jl)
2100 imigr = jprecj * jpi
2102 IF( nbondj == -1 )
THEN
2103 CALL
mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 )
2104 CALL
mpprecv( 3, t2ns(1,1,2), imigr, nono )
2105 IF(l_isend) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2106 ELSEIF( nbondj == 0 )
THEN
2107 CALL
mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )
2108 CALL
mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 )
2109 CALL
mpprecv( 3, t2ns(1,1,2), imigr, nono )
2110 CALL
mpprecv( 4, t2sn(1,1,2), imigr, noso )
2111 IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2112 IF( l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err )
2113 ELSEIF( nbondj == 1 )
THEN
2114 CALL
mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 )
2115 CALL
mpprecv( 4, t2sn(1,1,2), imigr, noso)
2116 IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err )
2120 ijhom = nlcj - jprecj
2121 IF( nbondj == 0 .OR. nbondj == 1 )
THEN
2123 ztab(:,jl) = t2sn(:,jl,2)
2126 IF( nbondj == 0 .OR. nbondj == -1 )
THEN
2128 ztab(:,ijhom+jl) = t2ns(:,jl,2)
2131 IF( ktype==1 .AND. kd1 <= jpi+nimpp-1 .AND. nimpp <= kd2 )
THEN
2132 DO jj = ijpt0, ijpt1
2134 ptab(ji,jk) = ztab(ji,jj)
2137 ELSEIF( ktype==2 .AND. kd1 <= jpj+njmpp-1 .AND. njmpp <= kd2 )
THEN
2138 DO jj = ijpt0, ilpt1
2140 ptab(jj,jk) = ztab(ji,jj)
2147 CALL wrk_dealloc( jpi,jpj, ztab )
2187 INTEGER,
INTENT(in) :: pindic
2188 INTEGER,
INTENT(in) :: kumout
2192 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kice
2193 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: zwork
2198 ALLOCATE( kice(jpnij), zwork(jpnij), stat=ierr )
2199 IF( ierr /= 0 )
THEN
2200 WRITE(kumout, cform_err)
2201 WRITE(kumout,*)
'mpp_ini_ice : failed to allocate 2, 1D arrays (jpnij in length)'
2208 DO jjproc = 1, jpnij
2209 IF( jjproc == narea .AND. pindic .GT. 0 ) kice(jjproc) = 1
2213 CALL mpi_allreduce( kice, zwork, jpnij, mpi_integer, mpi_sum, mpi_comm_opa, ierr )
2214 ndim_rank_ice = sum( zwork )
2217 IF(
ALLOCATED ( nrank_ice ) )
DEALLOCATE( nrank_ice )
2218 ALLOCATE( nrank_ice(ndim_rank_ice) )
2222 DO jjproc = 1, jpnij
2223 IF( zwork(jjproc) == 1)
THEN
2225 nrank_ice(ii) = jjproc -1
2230 CALL mpi_comm_group( mpi_comm_opa, ngrp_iworld, ierr )
2233 CALL mpi_group_incl( ngrp_iworld, ndim_rank_ice, nrank_ice, ngrp_ice, ierr )
2236 CALL mpi_comm_create( mpi_comm_opa, ngrp_ice, ncomm_ice, ierr )
2242 CALL mpi_group_free(ngrp_ice, ierr)
2243 CALL mpi_group_free(ngrp_iworld, ierr)
2245 DEALLOCATE(kice, zwork)
2269 INTEGER,
INTENT(in) :: kumout
2273 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kwork
2279 ALLOCATE( kwork(jpnij), stat=ierr )
2280 IF( ierr /= 0 )
THEN
2281 WRITE(kumout, cform_err)
2282 WRITE(kumout,*)
'mpp_ini_znl : failed to allocate 1D array of length jpnij'
2286 IF( jpnj == 1 )
THEN
2287 ngrp_znl = ngrp_world
2288 ncomm_znl = mpi_comm_opa
2291 CALL mpi_allgather( njmpp, 1, mpi_integer, kwork, 1, mpi_integer, mpi_comm_opa, ierr )
2298 IF ( kwork(jproc) == njmpp )
THEN
2299 ndim_rank_znl = ndim_rank_znl + 1
2305 IF (
ALLOCATED (nrank_znl))
DEALLOCATE(nrank_znl)
2306 ALLOCATE(nrank_znl(ndim_rank_znl))
2310 IF ( kwork(jproc) == njmpp)
THEN
2312 nrank_znl(ii) = jproc -1
2319 CALL mpi_comm_group(mpi_comm_opa,ngrp_opa,ierr)
2324 CALL mpi_group_incl( ngrp_opa, ndim_rank_znl, nrank_znl, ngrp_znl, ierr )
2329 CALL mpi_comm_create( mpi_comm_opa, ngrp_znl, ncomm_znl, ierr )
2336 IF ( jpni == 1 )
THEN
2339 l_znl_root = .false.
2341 CALL
mpp_min( kwork(1), kcom = ncomm_znl)
2342 IF ( nimpp == kwork(1)) l_znl_root = .true.
2377 njmppmax = maxval( njmppt )
2381 DO jjproc = 1, jpnij
2382 IF( njmppt(jjproc) == njmppmax ) ndim_rank_north = ndim_rank_north + 1
2386 IF (
ALLOCATED (nrank_north))
DEALLOCATE(nrank_north)
2387 ALLOCATE( nrank_north(ndim_rank_north) )
2393 IF ( njmppt(ji) == njmppmax )
THEN
2395 nrank_north(ii)=ji-1
2400 CALL mpi_comm_group( mpi_comm_opa, ngrp_world, ierr )
2403 CALL mpi_group_incl( ngrp_world, ndim_rank_north, nrank_north, ngrp_north, ierr )
2406 CALL mpi_comm_create( mpi_comm_opa, ngrp_north, ncomm_north, ierr )
2425 REAL(wp),
DIMENSION(jpi,jpj,jpk),
INTENT(inout) :: pt3d
2426 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
2428 REAL(wp) ,
INTENT(in ) :: psgn
2430 INTEGER :: ji, jj, jr
2431 INTEGER :: ierr, itaille, ildi, ilei, iilb
2432 INTEGER :: ijpj, ijpjm1, ij, iproc
2433 INTEGER,
DIMENSION (jpmaxngh) :: ml_req_nf
2435 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: ml_stat
2443 DO jj = nlcj - ijpj +1, nlcj
2444 ij = jj - nlcj + ijpj
2445 znorthloc(:,ij,:) = pt3d(:,jj,:)
2449 itaille = jpi * jpk * ijpj
2450 IF ( l_north_nogather )
THEN
2455 DO jj = nlcj-ijpj+1, nlcj
2456 ij = jj - nlcj + ijpj
2458 ztab(ji+nimpp-1,ij,:) = pt3d(ji,jj,:)
2465 SELECT CASE ( cd_type )
2480 IF ( ityp .gt. 0 )
THEN
2482 DO jr = 1,nsndto(ityp)
2483 CALL
mppsend(5, znorthloc, itaille, isendto(jr,ityp), ml_req_nf(jr) )
2485 DO jr = 1,nsndto(ityp)
2486 CALL
mpprecv(5, zfoldwk, itaille, isendto(jr,ityp))
2487 iproc = isendto(jr,ityp) + 1
2490 iilb = nimppt(iproc)
2493 ztab(ji+iilb-1,jj,:) = zfoldwk(ji,jj,:)
2498 DO jr = 1,nsndto(ityp)
2499 CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err)
2507 IF ( ityp .lt. 0 )
THEN
2508 CALL mpi_allgather( znorthloc , itaille, mpi_double_precision, &
2509 & znorthgloio, itaille, mpi_double_precision, ncomm_north, ierr )
2511 DO jr = 1, ndim_rank_north
2512 iproc = nrank_north(jr) + 1
2515 iilb = nimppt(iproc)
2518 ztab(ji+iilb-1,jj,:) = znorthgloio(ji,jj,:,jr)
2531 CALL lbc_nfd( ztab, cd_type, psgn )
2533 DO jj = nlcj-ijpj+1, nlcj
2534 ij = jj - nlcj + ijpj
2536 pt3d(ji,jj,:) = ztab(ji+nimpp-1,ij,:)
2557 REAL(wp),
DIMENSION(jpi,jpj),
INTENT(inout) :: pt2d
2558 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
2560 REAL(wp) ,
INTENT(in ) :: psgn
2562 INTEGER :: ji, jj, jr
2563 INTEGER :: ierr, itaille, ildi, ilei, iilb
2564 INTEGER :: ijpj, ijpjm1, ij, iproc
2565 INTEGER,
DIMENSION (jpmaxngh) :: ml_req_nf
2567 INTEGER,
DIMENSION(MPI_STATUS_SIZE):: ml_stat
2575 DO jj = nlcj-ijpj+1, nlcj
2576 ij = jj - nlcj + ijpj
2577 znorthloc_2d(:,ij) = pt2d(:,jj)
2581 itaille = jpi * ijpj
2582 IF ( l_north_nogather )
THEN
2587 DO jj = nlcj-ijpj+1, nlcj
2588 ij = jj - nlcj + ijpj
2590 ztab_2d(ji+nimpp-1,ij) = pt2d(ji,jj)
2597 SELECT CASE ( cd_type )
2613 IF ( ityp .gt. 0 )
THEN
2615 DO jr = 1,nsndto(ityp)
2616 CALL
mppsend(5, znorthloc_2d, itaille, isendto(jr,ityp), ml_req_nf(jr) )
2618 DO jr = 1,nsndto(ityp)
2619 CALL
mpprecv(5, zfoldwk_2d, itaille, isendto(jr,ityp))
2620 iproc = isendto(jr,ityp) + 1
2623 iilb = nimppt(iproc)
2626 ztab_2d(ji+iilb-1,jj) = zfoldwk_2d(ji,jj)
2631 DO jr = 1,nsndto(ityp)
2632 CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err)
2640 IF ( ityp .lt. 0 )
THEN
2641 CALL mpi_allgather( znorthloc_2d , itaille, mpi_double_precision, &
2642 & znorthgloio_2d, itaille, mpi_double_precision, ncomm_north, ierr )
2644 DO jr = 1, ndim_rank_north
2645 iproc = nrank_north(jr) + 1
2648 iilb = nimppt(iproc)
2651 ztab_2d(ji+iilb-1,jj) = znorthgloio_2d(ji,jj,jr)
2664 CALL lbc_nfd( ztab_2d, cd_type, psgn )
2667 DO jj = nlcj-ijpj+1, nlcj
2668 ij = jj - nlcj + ijpj
2670 pt2d(ji,jj) = ztab_2d(ji+nimpp-1,ij)
2692 REAL(wp),
DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj),
INTENT(inout) :: pt2d
2693 CHARACTER(len=1) ,
INTENT(in ) :: cd_type
2695 REAL(wp) ,
INTENT(in ) :: psgn
2697 INTEGER :: ji, jj, jr
2698 INTEGER :: ierr, itaille, ildi, ilei, iilb
2699 INTEGER :: ijpj, ij, iproc
2707 DO jj = nlcj - ijpj + 1 - jpr2dj, nlcj +jpr2dj
2710 znorthloc_e(ji,ij)=pt2d(ji,jj)
2714 itaille = jpi * ( ijpj + 2 * jpr2dj )
2715 CALL mpi_allgather( znorthloc_e(1,1) , itaille, mpi_double_precision, &
2716 & znorthgloio_e(1,1,1), itaille, mpi_double_precision, ncomm_north, ierr )
2718 DO jr = 1, ndim_rank_north
2719 iproc = nrank_north(jr) + 1
2722 iilb = nimppt(iproc)
2723 DO jj = 1, ijpj+2*jpr2dj
2725 ztab_e(ji+iilb-1,jj) = znorthgloio_e(ji,jj,jr)
2733 CALL lbc_nfd( ztab_e(:,:), cd_type, psgn, pr2dj = jpr2dj )
2737 DO jj = nlcj - ijpj + 1 , nlcj +jpr2dj
2740 pt2d(ji,jj) = ztab_e(ji+nimpp-1,ij)
2759 CHARACTER(len=*),
DIMENSION(:),
INTENT( out) :: ldtxt
2760 INTEGER ,
INTENT(inout) :: ksft
2761 INTEGER ,
INTENT( out) :: code
2763 LOGICAL :: mpi_was_called
2766 CALL mpi_initialized( mpi_was_called, code )
2767 IF ( code /= mpi_success )
THEN
2768 DO ji = 1,
SIZE(ldtxt)
2769 IF( trim(ldtxt(ji)) /=
'' )
WRITE(*,*) ldtxt(ji)
2772 WRITE(*, *)
' lib_mpp: Error in routine mpi_initialized'
2773 CALL mpi_abort( mpi_comm_world, code, ierr )
2776 IF( .NOT. mpi_was_called )
THEN
2777 CALL mpi_init( code )
2778 CALL mpi_comm_dup( mpi_comm_world, mpi_comm_opa, code )
2779 IF ( code /= mpi_success )
THEN
2780 DO ji = 1,
SIZE(ldtxt)
2781 IF( trim(ldtxt(ji)) /=
'' )
WRITE(*,*) ldtxt(ji)
2784 WRITE(*, *)
' lib_mpp: Error in routine mpi_comm_dup'
2785 CALL mpi_abort( mpi_comm_world, code, ierr )
2789 IF( nn_buffer > 0 )
THEN
2790 WRITE(ldtxt(ksft),*)
'mpi_bsend, buffer allocation of : ', nn_buffer ; ksft = ksft + 1
2792 ALLOCATE( tampon(nn_buffer), stat = ierr )
2793 IF( ierr /= 0 )
THEN
2794 DO ji = 1,
SIZE(ldtxt)
2795 IF( trim(ldtxt(ji)) /=
'' )
WRITE(*,*) ldtxt(ji)
2798 WRITE(*, *)
' lib_mpp: Error in ALLOCATE', ierr
2799 CALL mpi_abort( mpi_comm_world, code, ierr )
2801 CALL mpi_buffer_attach( tampon, nn_buffer, code )
2813 INTEGER,
INTENT(in) :: ilen, itype
2814 COMPLEX(wp),
DIMENSION(ilen),
INTENT(in) :: ydda
2815 COMPLEX(wp),
DIMENSION(ilen),
INTENT(inout) :: yddb
2817 REAL(wp) :: zerr, zt1, zt2
2824 zt1 =
real(ydda(ji)) +
real(yddb(ji))
2825 zerr = zt1 -
real(ydda(ji))
2826 zt2 = ((
real(yddb(ji)) - zerr) + (
real(ydda(ji)) - (zt1 - zerr))) &
2827 + aimag(ydda(ji)) + aimag(yddb(ji))
2830 yddb(ji) = cmplx( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1),wp )
2836 #if ! defined in_surfex
2861 LOGICAL,
PUBLIC,
PARAMETER :: lk_mpp = .false.
2862 LOGICAL,
PUBLIC :: ln_nnogather = .false.
2863 INTEGER :: ncomm_ice
2868 INTEGER,
INTENT(in) :: kumout
2872 FUNCTION mynode( ldtxt, kumnam, kstop, localComm ) RESULT (function_value)
2873 INTEGER,
OPTIONAL ,
INTENT(in ) :: localcomm
2874 CHARACTER(len=*),
DIMENSION(:) :: ldtxt
2875 INTEGER :: kumnam, kstop
2876 IF( present( localcomm ) .OR. .NOT.present( localcomm ) ) function_value = 0
2877 IF( .false. ) ldtxt(:) =
'never done'
2884 REAL ,
DIMENSION(:) :: parr
2886 INTEGER,
OPTIONAL :: kcom
2887 WRITE(*,*)
'mpp_sum_as: You should not have seen this print! error?', kdim, parr(1), kcom
2891 REAL ,
DIMENSION(:,:) :: parr
2893 INTEGER,
OPTIONAL :: kcom
2894 WRITE(*,*)
'mpp_sum_a2s: You should not have seen this print! error?', kdim, parr(1,1), kcom
2898 INTEGER,
DIMENSION(:) :: karr
2900 INTEGER,
OPTIONAL :: kcom
2901 WRITE(*,*)
'mpp_sum_ai: You should not have seen this print! error?', kdim, karr(1), kcom
2906 INTEGER,
OPTIONAL :: kcom
2907 WRITE(*,*)
'mpp_sum_s: You should not have seen this print! error?', psca, kcom
2912 INTEGER,
OPTIONAL :: kcom
2913 WRITE(*,*)
'mpp_sum_i: You should not have seen this print! error?', kint, kcom
2917 COMPLEX(wp),
INTENT(inout) :: ytab
2918 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
2919 WRITE(*,*)
'mppsum_realdd: You should not have seen this print! error?', ytab
2923 INTEGER ,
INTENT( in ) :: kdim
2924 COMPLEX(wp),
DIMENSION(kdim),
INTENT( inout ) :: ytab
2925 INTEGER ,
INTENT( in ),
OPTIONAL :: kcom
2926 WRITE(*,*)
'mppsum_a_realdd: You should not have seen this print! error?', kdim, ytab(1), kcom
2930 REAL ,
DIMENSION(:) :: parr
2932 INTEGER,
OPTIONAL :: kcom
2933 WRITE(*,*)
'mppmax_a_real: You should not have seen this print! error?', kdim, parr(1), kcom
2938 INTEGER,
OPTIONAL :: kcom
2939 WRITE(*,*)
'mppmax_real: You should not have seen this print! error?', psca, kcom
2943 REAL ,
DIMENSION(:) :: parr
2945 INTEGER,
OPTIONAL :: kcom
2946 WRITE(*,*)
'mppmin_a_real: You should not have seen this print! error?', kdim, parr(1), kcom
2951 INTEGER,
OPTIONAL :: kcom
2952 WRITE(*,*)
'mppmin_real: You should not have seen this print! error?', psca, kcom
2956 INTEGER,
DIMENSION(:) :: karr
2958 INTEGER,
OPTIONAL :: kcom
2959 WRITE(*,*)
'mppmax_a_int: You should not have seen this print! error?', kdim, karr(1), kcom
2964 INTEGER,
OPTIONAL :: kcom
2965 WRITE(*,*)
'mppmax_int: You should not have seen this print! error?', kint, kcom
2969 INTEGER,
DIMENSION(:) :: karr
2971 INTEGER,
OPTIONAL :: kcom
2972 WRITE(*,*)
'mppmin_a_int: You should not have seen this print! error?', kdim, karr(1), kcom
2977 INTEGER,
OPTIONAL :: kcom
2978 WRITE(*,*)
'mppmin_int: You should not have seen this print! error?', kint, kcom
2981 SUBROUTINE mppobc_1d( parr, kd1, kd2, kl, kk, ktype, kij, knum )
2982 INTEGER :: kd1, kd2, kl , kk, ktype, kij, knum
2983 REAL,
DIMENSION(:) :: parr
2984 WRITE(*,*)
'mppobc: You should not have seen this print! error?', parr(1), kd1, kd2, kl, kk, ktype, kij, knum
2987 SUBROUTINE mppobc_2d( parr, kd1, kd2, kl, kk, ktype, kij, knum )
2988 INTEGER :: kd1, kd2, kl , kk, ktype, kij, knum
2989 REAL,
DIMENSION(:,:) :: parr
2990 WRITE(*,*)
'mppobc: You should not have seen this print! error?', parr(1,1), kd1, kd2, kl, kk, ktype, kij, knum
2993 SUBROUTINE mppobc_3d( parr, kd1, kd2, kl, kk, ktype, kij, knum )
2994 INTEGER :: kd1, kd2, kl , kk, ktype, kij, knum
2995 REAL,
DIMENSION(:,:,:) :: parr
2996 WRITE(*,*)
'mppobc: You should not have seen this print! error?', parr(1,1,1), kd1, kd2, kl, kk, ktype, kij, knum
2999 SUBROUTINE mppobc_4d( parr, kd1, kd2, kl, kk, ktype, kij, knum )
3000 INTEGER :: kd1, kd2, kl , kk, ktype, kij, knum
3001 REAL,
DIMENSION(:,:,:,:) :: parr
3002 WRITE(*,*)
'mppobc: You should not have seen this print! error?', parr(1,1,1,1), kd1, kd2, kl, kk, ktype, kij, knum
3007 REAL ,
DIMENSION (:,:) :: ptab, pmask
3009 WRITE(*,*)
'mpp_minloc2d: You should not have seen this print! error?', pmin, ki, kj, ptab(1,1), pmask(1,1)
3014 REAL ,
DIMENSION (:,:,:) :: ptab, pmask
3015 INTEGER :: ki, kj, kk
3016 WRITE(*,*)
'mpp_minloc3d: You should not have seen this print! error?', pmin, ki, kj, kk, ptab(1,1,1), pmask(1,1,1)
3021 REAL ,
DIMENSION (:,:) :: ptab, pmask
3023 WRITE(*,*)
'mpp_maxloc2d: You should not have seen this print! error?', pmax, ki, kj, ptab(1,1), pmask(1,1)
3028 REAL ,
DIMENSION (:,:,:) :: ptab, pmask
3029 INTEGER :: ki, kj, kk
3030 WRITE(*,*)
'mpp_maxloc3d: You should not have seen this print! error?', pmax, ki, kj, kk, ptab(1,1,1), pmask(1,1,1)
3034 WRITE(*,*)
'mppstop: You should not have seen this print if running in mpp mode! error?...'
3035 WRITE(*,*)
'mppstop: ..otherwise this is a stop condition raised by ctl_stop in single processor mode'
3040 INTEGER :: kcom, knum
3041 WRITE(*,*)
'mpp_ini_ice: You should not have seen this print! error?', kcom, knum
3046 WRITE(*,*)
'mpp_ini_znl: You should not have seen this print! error?', knum
3051 WRITE(*,*)
'mpp_comm_free: You should not have seen this print! error?', kcom
3055 #if ! defined in_surfex
3062 & cd6, cd7, cd8, cd9, cd10 )
3069 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: cd1, cd2, cd3, cd4, cd5
3070 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: cd6, cd7, cd8, cd9, cd10
3075 WRITE(numout,cform_err)
3076 IF( present(cd1 ) )
WRITE(numout,*) cd1
3077 IF( present(cd2 ) )
WRITE(numout,*) cd2
3078 IF( present(cd3 ) )
WRITE(numout,*) cd3
3079 IF( present(cd4 ) )
WRITE(numout,*) cd4
3080 IF( present(cd5 ) )
WRITE(numout,*) cd5
3081 IF( present(cd6 ) )
WRITE(numout,*) cd6
3082 IF( present(cd7 ) )
WRITE(numout,*) cd7
3083 IF( present(cd8 ) )
WRITE(numout,*) cd8
3084 IF( present(cd9 ) )
WRITE(numout,*) cd9
3085 IF( present(cd10) )
WRITE(numout,*) cd10
3088 IF( numstp /= -1 ) CALL flush(numstp )
3089 IF( numsol /= -1 ) CALL flush(numsol )
3090 IF( numevo_ice /= -1 ) CALL flush(numevo_ice)
3092 IF( cd1 ==
'STOP' )
THEN
3093 IF(lwp)
WRITE(numout,*)
'huge E-R-R-O-R : immediate stop'
3101 & cd6, cd7, cd8, cd9, cd10 )
3108 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: cd1, cd2, cd3, cd4, cd5
3109 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: cd6, cd7, cd8, cd9, cd10
3114 WRITE(numout,cform_war)
3115 IF( present(cd1 ) )
WRITE(numout,*) cd1
3116 IF( present(cd2 ) )
WRITE(numout,*) cd2
3117 IF( present(cd3 ) )
WRITE(numout,*) cd3
3118 IF( present(cd4 ) )
WRITE(numout,*) cd4
3119 IF( present(cd5 ) )
WRITE(numout,*) cd5
3120 IF( present(cd6 ) )
WRITE(numout,*) cd6
3121 IF( present(cd7 ) )
WRITE(numout,*) cd7
3122 IF( present(cd8 ) )
WRITE(numout,*) cd8
3123 IF( present(cd9 ) )
WRITE(numout,*) cd9
3124 IF( present(cd10) )
WRITE(numout,*) cd10
3131 SUBROUTINE ctl_opn( knum, cdfile, cdstat, cdform, cdacce, klengh, kout, ldwp, karea )
3139 INTEGER ,
INTENT( out) :: knum
3140 CHARACTER(len=*) ,
INTENT(in ) :: cdfile
3141 CHARACTER(len=*) ,
INTENT(in ) :: cdstat
3142 CHARACTER(len=*) ,
INTENT(in ) :: cdform
3143 CHARACTER(len=*) ,
INTENT(in ) :: cdacce
3144 INTEGER ,
INTENT(in ) :: klengh
3145 INTEGER ,
INTENT(in ) :: kout
3146 LOGICAL ,
INTENT(in ) :: ldwp
3147 INTEGER,
OPTIONAL,
INTENT(in ) :: karea
3149 CHARACTER(len=80) :: clfile
3155 clfile = trim(cdfile)
3156 IF( present( karea ) )
THEN
3157 IF( karea > 1 )
WRITE(clfile,
"(a,'_',i4.4)") trim(clfile), karea-1
3159 #if defined key_agrif
3160 IF( .NOT. agrif_root() ) clfile = trim(agrif_cfixed())//
'_'//trim(clfile)
3161 knum=agrif_get_unit()
3167 IF( cdacce(1:6) ==
'DIRECT' )
THEN
3168 OPEN( unit=knum, file=clfile, form=cdform, access=cdacce, status=cdstat, recl=klengh, err=100, iostat=iost )
3170 OPEN( unit=knum, file=clfile, form=cdform, access=cdacce, status=cdstat , err=100, iostat=iost )
3172 IF( iost == 0 )
THEN
3174 WRITE(kout,*)
' file : ', clfile,
' open ok'
3175 WRITE(kout,*)
' unit = ', knum
3176 WRITE(kout,*)
' status = ', cdstat
3177 WRITE(kout,*)
' form = ', cdform
3178 WRITE(kout,*)
' access = ', cdacce
3183 IF( iost /= 0 )
THEN
3186 WRITE(kout,*)
' ===>>>> : bad opening file: ', clfile
3187 WRITE(kout,*)
' ======= === '
3188 WRITE(kout,*)
' unit = ', knum
3189 WRITE(kout,*)
' status = ', cdstat
3190 WRITE(kout,*)
' form = ', cdform
3191 WRITE(kout,*)
' access = ', cdacce
3192 WRITE(kout,*)
' iostat = ', iost
3193 WRITE(kout,*)
' we stop. verify the file '
3196 stop
'ctl_opn bad opening'
3213 DO WHILE( (
get_unit < 998) .AND. llopn )
3215 INQUIRE( unit =
get_unit, opened = llopn )
3217 IF( (
get_unit == 999) .AND. llopn )
THEN
3218 CALL
ctl_stop(
'get_unit: All logical units until 999 are used...' )
subroutine mpp_lbc_north_3d(pt3d, cd_type, psgn)
subroutine, public mppstop
subroutine, public mppsync()
subroutine mpi_init_opa(ldtxt, ksft, code)
subroutine mpp_sum_i(kint, kcom)
subroutine mppmax_int(kint, kcom)
subroutine, public mppobc(ptab, kd1, kd2, kl, kk, ktype, kij, kumout)
subroutine mppsum_a_real(ptab, kdim, kcom)
subroutine, public mpp_lnk_2d(pt2d, cd_type, psgn, cd_mpp, pval)
subroutine mpp_maxloc2d(ptab, pmask, pmax, ki, kj)
subroutine mpp_minloc3d(ptab, pmask, pmin, ki, kj, kk)
subroutine, public mpp_ini_north
subroutine mppsum_a_realdd(ytab, kdim, kcom)
subroutine mppmin_real(psca, kcom)
subroutine mppsum_a_int(ktab, kdim)
subroutine, public mpp_lbc_north_e(pt2d, cd_type, psgn)
subroutine, public mppscatter(pio, kp, ptab)
subroutine, public mppsend(ktyp, pmess, kbytes, kdest, md_req)
subroutine mppmin_int(kint, kcom)
subroutine mppmax_a_int(karr, kdim, kcom)
subroutine, public mpp_ini_znl(kumout)
subroutine mpp_minloc2d(ptab, pmask, pmin, ki, kj)
subroutine abor1_sfx(YTEXT)
subroutine, public mpp_lnk_3d_gather(ptab1, cd_type1, ptab2, cd_type2, psgn)
subroutine mppobc_3d(parr, kd1, kd2, kl, kk, ktype, kij, knum)
subroutine mppmin_a_int(karr, kdim, kcom)
subroutine, public mppgather(ptab, kp, pio)
subroutine mpp_maxloc3d(ptab, pmask, pmax, ki, kj, kk)
INTEGER function, public lib_mpp_alloc(kumout)
subroutine mppmin_a_real(parr, kdim, kcom)
subroutine, public ctl_opn(knum, cdfile, cdstat, cdform, cdacce, klengh, kout, ldwp, karea)
subroutine mpp_sum_ai(karr, kdim, kcom)
subroutine mppobc_4d(parr, kd1, kd2, kl, kk, ktype, kij, knum)
subroutine, public mpp_lnk_2d_e(pt2d, cd_type, psgn)
subroutine, public mpprecv(ktyp, pmess, kbytes, ksource)
subroutine mpp_comm_free(kcom)
subroutine, public mpp_ini_ice(pindic, kumout)
subroutine mpp_sum_a2s(parr, kdim, kcom)
subroutine mppsum_int(ktab)
subroutine ddpdd_mpi(ydda, yddb, ilen, itype)
subroutine mppmax_real(psca, kcom)
subroutine, public mpp_lnk_3d(ptab, cd_type, psgn, cd_mpp, pval)
integer function, public mynode(ldtxt, kumnam, kstop, localComm)
subroutine mppobc_2d(parr, kd1, kd2, kl, kk, ktype, kij, knum)
subroutine mppsum_realdd(ytab, kcom)
subroutine mpp_sum_s(psca, kcom)
subroutine mppmax_a_real(parr, kdim, kcom)
subroutine mpp_sum_as(parr, kdim, kcom)
INTEGER function, public get_unit()
subroutine mppobc_1d(parr, kd1, kd2, kl, kk, ktype, kij, knum)
subroutine, public ctl_stop(cd1, cd2, cd3, cd4, cd5, cd6, cd7, cd8, cd9, cd10)
subroutine mpp_lbc_north_2d(pt2d, cd_type, psgn)
subroutine mppsum_real(ptab, kcom)
subroutine, public ctl_warn(cd1, cd2, cd3, cd4, cd5, cd6, cd7, cd8, cd9, cd10)