Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
MODULE mpp_map
!!======================================================================
!! *** MODULE mpp_mpa ***
!! NEMOVAR: MPP global grid point mapping to processors
!!======================================================================
!! History : 2.0 ! 2007-08 (K. Mogensen) Original code
!!----------------------------------------------------------------------
!!----------------------------------------------------------------------
!! mppmap_init : Initialize mppmap.
!!----------------------------------------------------------------------
USE par_kind, ONLY : wp ! Precision variables
USE par_oce , ONLY : jpi, jpj, Nis0, Nie0, Njs0, Nje0 ! Ocean parameters
USE dom_oce , ONLY : mig, mjg, narea ! Ocean space and time domain variables
#if ! defined key_mpi_off
USE lib_mpp , ONLY : mpi_comm_oce ! MPP library
#endif
USE in_out_manager ! I/O manager
IMPLICIT NONE
PRIVATE
PUBLIC :: mppmap_init, mppmap !: ???
INTEGER, DIMENSION(:,:), ALLOCATABLE :: mppmap ! ???
!!----------------------------------------------------------------------
!! NEMO/OCE 4.0 , NEMO Consortium (2018)
!! $Id: mpp_map.F90 14229 2020-12-20 12:45:55Z smasson $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE mppmap_init
!!----------------------------------------------------------------------
!! *** ROUTINE mppmap_init ***
!!
!! ** Purpose : Setup a global map of processor rank for all gridpoints
!!
!! ** Method : MPI all reduce.
!!
!! ** Action : This does only work for MPI.
!!
!! References : http://www.mpi-forum.org
!!----------------------------------------------------------------------
INTEGER, DIMENSION(:,:), ALLOCATABLE :: imppmap !
#if ! defined key_mpi_off
INTEGER :: ierr
INCLUDE 'mpif.h'
#endif
!!----------------------------------------------------------------------
IF (.NOT. ALLOCATED(mppmap)) THEN
ALLOCATE( &
& mppmap(jpiglo,jpjglo) &
& )
ENDIF
! Initialize local imppmap
ALLOCATE( &
& imppmap(jpiglo,jpjglo) &
& )
imppmap(:,:) = 0
! ! Setup local grid points
imppmap(mig(1):mig(jpi),mjg(1):mjg(jpj)) = narea
! Get global data
#if ! defined key_mpi_off
! Call the MPI library to find the max across processors
CALL mpi_allreduce( imppmap, mppmap, jpiglo*jpjglo, mpi_integer, &
& mpi_max, mpi_comm_oce, ierr )
#else
! No MPP: Just copy the data
mppmap(:,:) = imppmap(:,:)
#endif
!
END SUBROUTINE mppmap_init
!!======================================================================
END MODULE mpp_map