New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
mppini.F90 in branches/2017/dev_r8126_ROBUST08_no_ghost/NEMOGCM/NEMO/OPA_SRC/LBC – NEMO

source: branches/2017/dev_r8126_ROBUST08_no_ghost/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90 @ 8375

Last change on this file since 8375 was 8375, checked in by acc, 7 years ago

Branch 2017/dev_r8126_ROBUST08_no_ghost. Style changes to mppini.F90 following a review by Gurvan (actually a review of branches/2017/dev_r8126_ROBUST10_MPPINI which this branch now supersedes). Cosmetic changes only; compiled and SETTE tested with ORCA2LIMPISCES.

  • Property svn:keywords set to Id
File size: 25.7 KB
RevLine 
[3]1MODULE mppini
[8375]2   !!======================================================================
[3]3   !!                       ***  MODULE mppini   ***
4   !! Ocean initialization : distributed memory computing initialization
[8375]5   !!======================================================================
6   !! History :  6.0  !  1994-11  (M. Guyon)  Original code
7   !!  OPA       7.0  !  1995-04  (J. Escobar, M. Imbard)
8   !!            8.0  !  1998-05  (M. Imbard, J. Escobar, L. Colombet )  SHMEM and MPI versions
9   !!  NEMO      1.0  !  2004-01  (G. Madec, J.M Molines)  F90 : free form , north fold jpni > 1
10   !!            4.0  !  2016-06  (G. Madec)  use domain configuration file instead of bathymetry file
11   !!            4.0  !  2017-06  (J.M. Molines, T. Lovato) merge of mppini and mppini_2
12   !!----------------------------------------------------------------------
[3]13
14   !!----------------------------------------------------------------------
[8375]15   !!  mpp_init       : Lay out the global domain over processors with/without land processor elimination
16   !!  mpp_init_mask  :
17   !!  mpp_init_ioipsl: IOIPSL initialization in mpp
[3]18   !!----------------------------------------------------------------------
[8375]19   USE dom_oce        ! ocean space and time domain
20   USE bdy_oce        ! open BounDarY 
21   !
22   USE lib_mpp        ! distribued memory computing library
23   USE iom            ! nemo I/O library
24   USE ioipsl         ! I/O IPSL library
25   USE in_out_manager ! I/O Manager
[3]26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC mpp_init       ! called by opa.F90
31
32   !!----------------------------------------------------------------------
[8314]33   !! NEMO/OPA 4.0 , NEMO Consortium (2017)
[1152]34   !! $Id$
[2715]35   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]36   !!----------------------------------------------------------------------
37CONTAINS
38
[1556]39#if ! defined key_mpp_mpi
[3]40   !!----------------------------------------------------------------------
41   !!   Default option :                            shared memory computing
42   !!----------------------------------------------------------------------
43
44   SUBROUTINE mpp_init
45      !!----------------------------------------------------------------------
46      !!                  ***  ROUTINE mpp_init  ***
47      !!
48      !! ** Purpose :   Lay out the global domain over processors.
49      !!
50      !! ** Method  :   Shared memory computing, set the local processor
[8375]51      !!              variables to the value of the global domain
[3]52      !!----------------------------------------------------------------------
[8375]53      !
54      nimpp  = 1           !
[3]55      njmpp  = 1
56      nlci   = jpi
57      nlcj   = jpj
58      nldi   = 1
59      nldj   = 1
60      nlei   = jpi
61      nlej   = jpj
62      nperio = jperio
63      nbondi = 2
64      nbondj = 2
[352]65      nidom  = FLIO_DOM_NONE
[1344]66      npolj = jperio
[8375]67      !
[3]68      IF(lwp) THEN
69         WRITE(numout,*)
[8375]70         WRITE(numout,*) 'mpp_init : NO massively parallel processing'
71         WRITE(numout,*) '~~~~~~~~ '
72         WRITE(numout,*) '   nperio = ', nperio, '   nimpp  = ', nimpp
73         WRITE(numout,*) '   npolj  = ', npolj , '   njmpp  = ', njmpp
[3]74      ENDIF
[8375]75      !
76      IF(  jpni /= 1 .OR. jpnj /= 1 .OR. jpnij /= 1 )                                     &
77         CALL ctl_stop( 'mpp_init: equality  jpni = jpnj = jpnij = 1 is not satisfied',   &
78            &           'the domain is lay out for distributed memory computing!' )
79         !
80      IF( jperio == 7 ) CALL ctl_stop( 'mpp_init: jperio = 7 needs distributed memory computing ',       &
81         &                             'with 1 process. Add key_mpp_mpi in the list of active cpp keys ' )
82         !
[3]83   END SUBROUTINE mpp_init
84
85#else
86   !!----------------------------------------------------------------------
[8375]87   !!   'key_mpp_mpi'                     MPI massively parallel processing
[3]88   !!----------------------------------------------------------------------
89
90   SUBROUTINE mpp_init
91      !!----------------------------------------------------------------------
92      !!                  ***  ROUTINE mpp_init  ***
93      !!                   
94      !! ** Purpose :   Lay out the global domain over processors.
[8314]95      !!      If land processors are to be eliminated, this program requires the
96      !!      presence of the domain configuration file. Land processors elimination
97      !!      is performed if jpni x jpnj /= jpnij. In this case, using the MPP_PREP
[8375]98      !!      preprocessing tool, help for defining the best cutting out.
[3]99      !!
100      !! ** Method  :   Global domain is distributed in smaller local domains.
101      !!      Periodic condition is a function of the local domain position
102      !!      (global boundary or neighbouring domain) and of the global
103      !!      periodic
104      !!      Type :         jperio global periodic condition
105      !!                     nperio local  periodic condition
106      !!
[8314]107      !! ** Action : - set domain parameters
[3]108      !!                    nimpp     : longitudinal index
109      !!                    njmpp     : latitudinal  index
110      !!                    nperio    : lateral condition type
111      !!                    narea     : number for local area
112      !!                    nlci      : first dimension
113      !!                    nlcj      : second dimension
114      !!                    nbondi    : mark for "east-west local boundary"
115      !!                    nbondj    : mark for "north-south local boundary"
116      !!                    nproc     : number for local processor
117      !!                    noea      : number for local neighboring processor
118      !!                    nowe      : number for local neighboring processor
119      !!                    noso      : number for local neighboring processor
120      !!                    nono      : number for local neighboring processor
121      !!----------------------------------------------------------------------
[8375]122      INTEGER ::   ji, jj, jn, jproc, jarea   ! dummy loop indices
123      INTEGER ::   inum                       ! local logical unit
124      INTEGER ::   idir, ifreq, icont, isurf  ! local integers
125      INTEGER ::   ii, il1, ili, imil         !   -       -
126      INTEGER ::   ij, il2, ilj, ijm1         !   -       -
127      INTEGER ::   iino, ijno, iiso, ijso     !   -       -
128      INTEGER ::   iiea, ijea, iiwe, ijwe     !   -       -
129      INTEGER ::   iresti, irestj, iproc      !   -       -
130      INTEGER, DIMENSION(jpnij) ::   iin, ii_nono, ii_noea   ! 1D workspace
131      INTEGER, DIMENSION(jpnij) ::   ijn, ii_noso, ii_nowe   !  -     -
132      INTEGER, DIMENSION(jpni,jpnj) ::   iimppt, ilci, ibondi, ipproc   ! 2D workspace
133      INTEGER, DIMENSION(jpni,jpnj) ::   ijmppt, ilcj, ibondj, ipolj    !  -     -
134      INTEGER, DIMENSION(jpni,jpnj) ::   ilei, ildi, iono, ioea         !  -     -
135      INTEGER, DIMENSION(jpni,jpnj) ::   ilej, ildj, ioso, iowe         !  -     -
136      INTEGER, DIMENSION(jpiglo,jpjglo) ::   imask   ! 2D golbal domain workspace
137      REAL(wp) ::   zidom, zjdom   ! local scalars
[3]138      !!----------------------------------------------------------------------
[8375]139      !
140      IF ( jpni * jpnj == jpnij ) THEN    ! regular domain lay out over processors
141         imask(:,:) = 1               
142      ELSEIF ( jpni*jpnj > jpnij ) THEN   ! remove land-only processor (i.e. where imask(:,:)=0)
143         CALL mpp_init_mask( imask )   
144      ELSE                                ! error
145         CALL ctl_stop( 'mpp_init: jpnij > jpni x jpnj. Check namelist setting!' )
[8314]146      ENDIF
[8375]147      !
[3]148      !  1. Dimension arrays for subdomains
149      ! -----------------------------------
[8314]150      !  Computation of local domain sizes ilci() ilcj()
[3]151      !  These dimensions depend on global sizes jpni,jpnj and jpiglo,jpjglo
[8375]152      !  The subdomains are squares lesser than or equal to the global
153      !  dimensions divided by the number of processors minus the overlap array.
154      !
155      nreci = 2 * jpreci
156      nrecj = 2 * jprecj
[8314]157      iresti = 1 + MOD( jpiglo - nreci -1 , jpni )
158      irestj = 1 + MOD( jpjglo - nrecj -1 , jpnj )
[8375]159      !
[3294]160#if defined key_nemocice_decomp
[8314]161      ! Change padding to be consistent with CICE
162      ilci(1:jpni-1      ,:) = jpi
163      ilci(jpni          ,:) = jpiglo - (jpni - 1) * (jpi - nreci)
[8375]164      !
[8314]165      ilcj(:,      1:jpnj-1) = jpj
166      ilcj(:,          jpnj) = jpjglo - (jpnj - 1) * (jpj - nrecj)
[3294]167#else
[8314]168      ilci(1:iresti      ,:) = jpi
169      ilci(iresti+1:jpni ,:) = jpi-1
[3294]170
[8314]171      ilcj(:,      1:irestj) = jpj
172      ilcj(:, irestj+1:jpnj) = jpj-1
[3294]173#endif
[8375]174      !
[8314]175      nfilcit(:,:) = ilci(:,:)
[8375]176      !
177      zidom = nreci + sum(ilci(:,1) - nreci )
178      zjdom = nrecj + sum(ilcj(1,:) - nrecj )
179      !
180      IF(lwp) THEN
181         WRITE(numout,*)
182         WRITE(numout,*) 'mpp_init : MPI Message Passing MPI - domain lay out over processors'
183         WRITE(numout,*) '~~~~~~~~ '
184         WRITE(numout,*) '   defines mpp subdomains'
185         WRITE(numout,*) '      iresti = ', iresti, ' jpni = ', jpni 
186         WRITE(numout,*) '      irestj = ', irestj, ' jpnj = ', jpnj
187         WRITE(numout,*)
188         WRITE(numout,*) '      sum ilci(i,1) = ', zidom, ' jpiglo = ', jpiglo
189         WRITE(numout,*) '      sum ilcj(1,j) = ', zjdom, ' jpjglo = ', jpjglo
190      ENDIF
[3294]191
[3]192      !  2. Index arrays for subdomains
193      ! -------------------------------
[8375]194      iimppt(:,:) =  1
195      ijmppt(:,:) =  1
[8314]196      ipproc(:,:) = -1
[8375]197      !
198      IF( jpni > 1 ) THEN
[3]199         DO jj = 1, jpnj
200            DO ji = 2, jpni
[8314]201               iimppt(ji,jj) = iimppt(ji-1,jj) + ilci(ji-1,jj) - nreci
[3]202            END DO
203         END DO
204      ENDIF
[8314]205      nfiimpp(:,:) = iimppt(:,:)
[8375]206      !
[8314]207      IF( jpnj > 1 )THEN
[3]208         DO jj = 2, jpnj
209            DO ji = 1, jpni
[8314]210               ijmppt(ji,jj) = ijmppt(ji,jj-1) + ilcj(ji,jj-1) - nrecj
[3]211            END DO
212         END DO
213      ENDIF
214
[8314]215      ! 3. Subdomain description in the Regular Case
216      ! --------------------------------------------
217      nperio = 0
218      icont = -1
219      DO jarea = 1, jpni*jpnj
220         ii = 1 + MOD(jarea-1,jpni)
221         ij = 1 +    (jarea-1)/jpni
222         ili = ilci(ii,ij)
223         ilj = ilcj(ii,ij)
224         ibondj(ii,ij) = -1
225         IF( jarea >  jpni          )   ibondj(ii,ij) = 0
226         IF( jarea >  (jpnj-1)*jpni )   ibondj(ii,ij) = 1
227         IF( jpnj  == 1             )   ibondj(ii,ij) = 2
228         ibondi(ii,ij) = 0
229         IF( MOD(jarea,jpni) == 1 )   ibondi(ii,ij) = -1
230         IF( MOD(jarea,jpni) == 0 )   ibondi(ii,ij) =  1
231         IF( jpni            == 1 )   ibondi(ii,ij) =  2
232
[8375]233         ! Subdomain neighbors
[8314]234         iproc = jarea - 1
235         ioso(ii,ij) = iproc - jpni
236         iowe(ii,ij) = iproc - 1
237         ioea(ii,ij) = iproc + 1
238         iono(ii,ij) = iproc + jpni
[8375]239         ildi(ii,ij) =  1  + jpreci
240         ilei(ii,ij) = ili - jpreci
[8314]241
[8375]242         IF( ibondi(ii,ij) == -1 .OR. ibondi(ii,ij) == 2 ) ildi(ii,ij) =  1
[8314]243         IF( ibondi(ii,ij) ==  1 .OR. ibondi(ii,ij) == 2 ) ilei(ii,ij) = ili
244         ildj(ii,ij) =  1  + jprecj
245         ilej(ii,ij) = ilj - jprecj
[8375]246         IF( ibondj(ii,ij) == -1 .OR. ibondj(ii,ij) == 2 ) ildj(ii,ij) =  1
[8314]247         IF( ibondj(ii,ij) ==  1 .OR. ibondj(ii,ij) == 2 ) ilej(ii,ij) = ilj
248
249         ! warning ii*ij (zone) /= nproc (processors)!
250
251         IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN
252            IF( jpni == 1 )THEN
253               ibondi(ii,ij) = 2
254               nperio = 1
255            ELSE
256               ibondi(ii,ij) = 0
257            ENDIF
258            IF( MOD(jarea,jpni) == 0 ) THEN
259               ioea(ii,ij) = iproc - (jpni-1)
260            ENDIF
261            IF( MOD(jarea,jpni) == 1 ) THEN
262               iowe(ii,ij) = iproc + jpni - 1
263            ENDIF
264         ENDIF
265         ipolj(ii,ij) = 0
266         IF( jperio == 3 .OR. jperio == 4 ) THEN
267            ijm1 = jpni*(jpnj-1)
268            imil = ijm1+(jpni+1)/2
269            IF( jarea > ijm1 ) ipolj(ii,ij) = 3
270            IF( MOD(jpni,2) == 1 .AND. jarea == imil ) ipolj(ii,ij) = 4
271            IF( ipolj(ii,ij) == 3 ) iono(ii,ij) = jpni*jpnj-jarea+ijm1   ! MPI rank of northern neighbour
272         ENDIF
273         IF( jperio == 5 .OR. jperio == 6 ) THEN
274            ijm1 = jpni*(jpnj-1)
275            imil = ijm1+(jpni+1)/2
276            IF( jarea > ijm1) ipolj(ii,ij) = 5
277            IF( MOD(jpni,2) == 1 .AND. jarea == imil ) ipolj(ii,ij) = 6
278            IF( ipolj(ii,ij) == 5) iono(ii,ij) = jpni*jpnj-jarea+ijm1    ! MPI rank of northern neighbour
279         ENDIF
[8375]280         !
[8314]281         ! Check wet points over the entire domain to preserve the MPI communication stencil
282         isurf = 0
283         DO jj = 1, ilj
284            DO  ji = 1, ili
285               IF( imask(ji+iimppt(ii,ij)-1, jj+ijmppt(ii,ij)-1) == 1)   isurf = isurf+1
286            END DO
287         END DO
[8375]288         !
289         IF( isurf /= 0 ) THEN
[8314]290            icont = icont + 1
291            ipproc(ii,ij) = icont
292            iin(icont+1) = ii
293            ijn(icont+1) = ij
294         ENDIF
[3]295      END DO
[8375]296      !
[8314]297      nfipproc(:,:) = ipproc(:,:)
298
[8375]299      ! Check potential error
300      IF( icont+1 /= jpnij ) THEN
[8314]301         WRITE(ctmp1,*) ' jpni =',jpni,' jpnj =',jpnj
302         WRITE(ctmp2,*) ' jpnij =',jpnij, '< jpni x jpnj' 
303         WRITE(ctmp3,*) ' ***********, mpp_init2 finds jpnij=',icont+1
[8375]304         CALL ctl_stop( 'mpp_init: Eliminate land processors algorithm', '', ctmp1, ctmp2, '', ctmp3 )
[8314]305      ENDIF
306
[6412]307      ! 4. Subdomain print
308      ! ------------------
309      IF(lwp) THEN
310         ifreq = 4
[8314]311         il1 = 1
[8375]312         DO jn = 1, (jpni-1)/ifreq+1
[8314]313            il2 = MIN(jpni,il1+ifreq-1)
[6412]314            WRITE(numout,*)
[8314]315            WRITE(numout,9400) ('***',ji=il1,il2-1)
[6412]316            DO jj = jpnj, 1, -1
[8314]317               WRITE(numout,9403) ('   ',ji=il1,il2-1)
318               WRITE(numout,9402) jj, (ilci(ji,jj),ilcj(ji,jj),ji=il1,il2)
319               WRITE(numout,9404) (ipproc(ji,jj),ji=il1,il2)
320               WRITE(numout,9403) ('   ',ji=il1,il2-1)
321               WRITE(numout,9400) ('***',ji=il1,il2-1)
[6412]322            END DO
[8314]323            WRITE(numout,9401) (ji,ji=il1,il2)
[6412]324            il1 = il1+ifreq
325         END DO
[8375]326 9400    FORMAT('     ***',20('*************',a3))
327 9403    FORMAT('     *     ',20('         *   ',a3))
328 9401    FORMAT('        ',20('   ',i3,'          '))
329 9402    FORMAT(' ',i3,' *  ',20(i3,'  x',i3,'   *   '))
330 9404    FORMAT('     *  ',20('      ',i3,'   *   '))
[6412]331      ENDIF
332
[8314]333      ! 5. neighbour treatment
334      ! ----------------------
335      DO jarea = 1, jpni*jpnj
336         iproc = jarea-1
[8375]337         ii = 1 + MOD( jarea-1  , jpni )
338         ij = 1 +     (jarea-1) / jpni
339         IF ( ipproc(ii,ij) == -1 .AND. 0 <= iono(ii,ij) .AND. iono(ii,ij) <= jpni*jpnj-1 ) THEN
340            iino = 1 + MOD( iono(ii,ij) , jpni )
341            ijno = 1 +      iono(ii,ij) / jpni
342            ! Need to reverse the logical direction of communication
343            ! for northern neighbours of northern row processors (north-fold)
344            ! i.e. need to check that the northern neighbour only communicates
345            ! to the SOUTH (or not at all) if this area is land-only (#1057)
[8314]346            idir = 1
[8375]347            IF( ij == jpnj .AND. ijno == jpnj )   idir = -1   
348            IF( ibondj(iino,ijno) == idir     )   ibondj(iino,ijno) =   2
349            IF( ibondj(iino,ijno) == 0        )   ibondj(iino,ijno) = -idir
[8314]350         ENDIF
[8375]351         IF( ipproc(ii,ij) == -1 .AND. 0 <= ioso(ii,ij) .AND. ioso(ii,ij) <= jpni*jpnj-1 ) THEN
352            iiso = 1 + MOD( ioso(ii,ij) , jpni )
353            ijso = 1 +      ioso(ii,ij) / jpni
354            IF( ibondj(iiso,ijso) == -1 )   ibondj(iiso,ijso) = 2
355            IF( ibondj(iiso,ijso) ==  0 )   ibondj(iiso,ijso) = 1
[8314]356         ENDIF
[8375]357         IF( ipproc(ii,ij) == -1 .AND. 0 <= ioea(ii,ij) .AND. ioea(ii,ij) <= jpni*jpnj-1 ) THEN
358            iiea = 1 + MOD( ioea(ii,ij) , jpni )
359            ijea = 1 +      ioea(ii,ij) / jpni
360            IF( ibondi(iiea,ijea) == 1 )   ibondi(iiea,ijea) =  2
361            IF( ibondi(iiea,ijea) == 0 )   ibondi(iiea,ijea) = -1
[8314]362         ENDIF
[8375]363         IF( ipproc(ii,ij) == -1 .AND. 0 <= iowe(ii,ij) .AND. iowe(ii,ij) <= jpni*jpnj-1) THEN
364            iiwe = 1 + MOD( iowe(ii,ij) , jpni )
365            ijwe = 1 +      iowe(ii,ij) / jpni
366            IF( ibondi(iiwe,ijwe) == -1 )   ibondi(iiwe,ijwe) = 2
367            IF( ibondi(iiwe,ijwe) ==  0 )   ibondi(iiwe,ijwe) = 1
[8314]368         ENDIF
369      END DO
[3]370
[8375]371      ! just to save nono etc for all proc
372      ii_noso(:) = -1
373      ii_nono(:) = -1
374      ii_noea(:) = -1
375      ii_nowe(:) = -1 
376      nproc = narea-1
377      DO jarea = 1, jpnij
378         ii = iin(jarea)
379         ij = ijn(jarea)
380         IF( 0 <= ioso(ii,ij) .AND. ioso(ii,ij) <= (jpni*jpnj-1) ) THEN
381            iiso = 1 + MOD( ioso(ii,ij) , jpni )
382            ijso = 1 +      ioso(ii,ij) / jpni
383            noso = ipproc(iiso,ijso)
384            ii_noso(jarea)= noso
385         ENDIF
386         IF( 0 <= iowe(ii,ij) .AND. iowe(ii,ij) <= (jpni*jpnj-1) ) THEN
387          iiwe = 1 + MOD( iowe(ii,ij) , jpni )
388          ijwe = 1 +      iowe(ii,ij) / jpni
[8314]389          nowe = ipproc(iiwe,ijwe)
390          ii_nowe(jarea)= nowe
[8375]391         ENDIF
392         IF( 0 <= ioea(ii,ij) .AND. ioea(ii,ij) <= (jpni*jpnj-1) ) THEN
393            iiea = 1 + MOD( ioea(ii,ij) , jpni )
394            ijea = 1 +      ioea(ii,ij) / jpni
395            noea = ipproc(iiea,ijea)
396            ii_noea(jarea)= noea
397         ENDIF
398         IF( 0 <= iono(ii,ij) .AND. iono(ii,ij) <= (jpni*jpnj-1) ) THEN
399            iino = 1 + MOD( iono(ii,ij) , jpni )
400            ijno = 1 +      iono(ii,ij) / jpni
401            nono = ipproc(iino,ijno)
402            ii_nono(jarea)= nono
403         ENDIF
404      END DO
405   
[8314]406      ! 6. Change processor name
407      ! ------------------------
408      nproc = narea-1
409      ii = iin(narea)
410      ij = ijn(narea)
[8375]411      !
[8314]412      ! set default neighbours
413      noso = ii_noso(narea)
414      nowe = ii_nowe(narea)
415      noea = ii_noea(narea)
416      nono = ii_nono(narea)
417      nlcj = ilcj(ii,ij) 
418      nlci = ilci(ii,ij) 
419      nldi = ildi(ii,ij)
420      nlei = ilei(ii,ij)
421      nldj = ildj(ii,ij)
422      nlej = ilej(ii,ij)
423      nbondi = ibondi(ii,ij)
424      nbondj = ibondj(ii,ij)
425      nimpp = iimppt(ii,ij) 
426      njmpp = ijmppt(ii,ij) 
427      DO jproc = 1, jpnij
428         ii = iin(jproc)
429         ij = ijn(jproc)
430         nimppt(jproc) = iimppt(ii,ij) 
431         njmppt(jproc) = ijmppt(ii,ij) 
432         nlcjt(jproc) = ilcj(ii,ij)
433         nlcit(jproc) = ilci(ii,ij)
434         nldit(jproc) = ildi(ii,ij)
435         nleit(jproc) = ilei(ii,ij)
436         nldjt(jproc) = ildj(ii,ij)
437         nlejt(jproc) = ilej(ii,ij)
438      END DO
439
440      ! Save processor layout in ascii file
441      IF (lwp) THEN
[7646]442         CALL ctl_opn( inum, 'layout.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea )
443         WRITE(inum,'(a)') '   jpnij     jpi     jpj     jpk  jpiglo  jpjglo'
444         WRITE(inum,'(6i8)') jpnij,jpi,jpj,jpk,jpiglo,jpjglo
[8314]445         WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimp njmp nono noso nowe noea nbondi nbondj '
446
[8375]447         DO jproc = 1, jpnij
448            ii = iin(jproc)
449            ij = ijn(jproc)
450            WRITE(inum,'(15i5)') jproc-1, nlcit  (jproc), nlcjt  (jproc),   &
451               &                          nldit  (jproc), nldjt  (jproc),   &
452               &                          nleit  (jproc), nlejt  (jproc),   &
453               &                          nimppt (jproc), njmppt (jproc),   & 
454               &                          ii_nono(jproc), ii_noso(jproc),   &
455               &                          ii_nowe(jproc), ii_noea(jproc),   &
456               &                          ibondi (ii,ij), ibondj (ii,ij) 
[7646]457         END DO
458         CLOSE(inum)   
[3]459      END IF
460
[8375]461      !                          ! north fold parameter
[8314]462      ! Defined npolj, either 0, 3 , 4 , 5 , 6
463      ! In this case the important thing is that npolj /= 0
464      ! Because if we go through these line it is because jpni >1 and thus
465      ! we must use lbcnorthmpp, which tests only npolj =0 or npolj /= 0
[3]466      npolj = 0
[8314]467      ij = ijn(narea)
[3]468      IF( jperio == 3 .OR. jperio == 4 ) THEN
[8375]469         IF( ij == jpnj )   npolj = 3
[3]470      ENDIF
471      IF( jperio == 5 .OR. jperio == 6 ) THEN
[8375]472         IF( ij == jpnj )   npolj = 5
[3]473      ENDIF
[8375]474      !
[3]475      IF(lwp) THEN
[8375]476         WRITE(numout,*)
[8314]477         WRITE(numout,*) ' nproc  = ', nproc
478         WRITE(numout,*) ' nowe   = ', nowe  , ' noea   =  ', noea
479         WRITE(numout,*) ' nono   = ', nono  , ' noso   =  ', noso
480         WRITE(numout,*) ' nbondi = ', nbondi
481         WRITE(numout,*) ' nbondj = ', nbondj
482         WRITE(numout,*) ' npolj  = ', npolj
483         WRITE(numout,*) ' nperio = ', nperio
484         WRITE(numout,*) ' nlci   = ', nlci
485         WRITE(numout,*) ' nlcj   = ', nlcj
486         WRITE(numout,*) ' nimpp  = ', nimpp
487         WRITE(numout,*) ' njmpp  = ', njmpp
488         WRITE(numout,*) ' nreci  = ', nreci 
489         WRITE(numout,*) ' nrecj  = ', nrecj 
490         WRITE(numout,*) ' jpreci = ', jpreci 
491         WRITE(numout,*) ' jprecj = ', jprecj 
[3]492      ENDIF
493
[8375]494      IF( nperio == 1 .AND. jpni /= 1 ) CALL ctl_stop( 'mpp_init: error on cyclicity' )
[3]495
[8375]496      !                          ! Prepare mpp north fold
[6412]497      IF( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN
[3]498         CALL mpp_ini_north
[6412]499         IF(lwp) WRITE(numout,*) ' mpp_init : North fold boundary prepared for jpni >1'
500      ENDIF
[8375]501      !
502      CALL mpp_init_ioipsl       ! Prepare NetCDF output file (if necessary)
503      !
504    END SUBROUTINE mpp_init
[3]505
506
[8375]507    SUBROUTINE mpp_init_mask( kmask )
[8314]508      !!----------------------------------------------------------------------
509      !!                  ***  ROUTINE mpp_init_mask  ***
510      !!
511      !! ** Purpose : Read relevant bathymetric information in a global array
512      !!              in order to provide a land/sea mask used for the elimination
513      !!              of land domains, in an mpp computation.
514      !!
515      !! ** Method  : Read the namelist ln_zco and ln_isfcav in namelist namzgr
516      !!              in order to choose the correct bathymetric information
517      !!              (file and variables) 
518      !!----------------------------------------------------------------------
[8375]519      INTEGER, DIMENSION(jpiglo,jpjglo), INTENT(out) ::   kmask   ! global domain
[8314]520 
521      INTEGER :: inum   !: logical unit for configuration file
522      INTEGER :: ios    !: iostat error flag
523      INTEGER ::  ijstartrow                   ! temporary integers
524      REAL(wp), DIMENSION(jpiglo,jpjglo) ::   zbot, zbdy          ! global workspace
525      REAL(wp) ::   zidom , zjdom          ! local scalars
526      NAMELIST/nambdy/ ln_bdy, nb_bdy, ln_coords_file, cn_coords_file,         &
527           &             ln_mask_file, cn_mask_file, cn_dyn2d, nn_dyn2d_dta,     &
528           &             cn_dyn3d, nn_dyn3d_dta, cn_tra, nn_tra_dta,             & 
529           &             ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, rn_time_dmp_out, &
530           &             cn_ice_lim, nn_ice_lim_dta,                           &
531           &             rn_ice_tem, rn_ice_sal, rn_ice_age,                 &
532           &             ln_vol, nn_volctl, nn_rimwidth, nb_jpk_bdy
533      !!----------------------------------------------------------------------
534      ! 0. initialisation
535      ! -----------------
536      CALL iom_open( cn_domcfg, inum )
537      !
538      ! ocean bottom level
539      CALL iom_get( inum, jpdom_unknown, 'bottom_level' , zbot , lrowattr=ln_use_jattr )  ! nb of ocean T-points
540      !
541      CALL iom_close( inum )
542      !
543      ! 2D ocean mask (=1 if at least one level of the water column is ocean, =0 otherwise)
[8375]544      WHERE( zbot(:,:) > 0 )   ;   kmask(:,:) = 1
545      ELSEWHERE                ;   kmask(:,:) = 0
[8314]546      END WHERE
547 
[8375]548      ! Adjust kmask with bdy_msk if it exists
[8314]549 
550      REWIND( numnam_ref )              ! Namelist nambdy in reference namelist : BDY
551      READ  ( numnam_ref, nambdy, IOSTAT = ios, ERR = 903)
552903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist (mppini)', lwp )
553
554      REWIND( numnam_cfg )              ! Namelist nambdy in configuration namelist : BDY
555      READ  ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 904 )
556904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist (mppini)', lwp )
557
558      IF( ln_bdy .AND. ln_mask_file ) THEN
559         CALL iom_open( cn_mask_file, inum )
[8375]560         CALL iom_get ( inum, jpdom_unknown, 'bdy_msk', zbdy )
[8314]561         CALL iom_close( inum )
562         WHERE ( zbdy(:,:) <= 0. ) kmask = 0
563      ENDIF
[8375]564      !
[8314]565   END SUBROUTINE mpp_init_mask
566
[8375]567
[88]568   SUBROUTINE mpp_init_ioipsl
569      !!----------------------------------------------------------------------
570      !!                  ***  ROUTINE mpp_init_ioipsl  ***
571      !!
572      !! ** Purpose :   
573      !!
574      !! ** Method  :   
575      !!
576      !! History :
[1238]577      !!   9.0  !  04-03  (G. Madec )  MPP-IOIPSL
578      !!   " "  !  08-12  (A. Coward)  addition in case of jpni*jpnj < jpnij
[88]579      !!----------------------------------------------------------------------
[2715]580      INTEGER, DIMENSION(2) ::   iglo, iloc, iabsf, iabsl, ihals, ihale, idid
[88]581      !!----------------------------------------------------------------------
[352]582
[1238]583      ! The domain is split only horizontally along i- or/and j- direction
584      ! So we need at the most only 1D arrays with 2 elements.
585      ! Set idompar values equivalent to the jpdom_local_noextra definition
586      ! used in IOM. This works even if jpnij .ne. jpni*jpnj.
[88]587      iglo(1) = jpiglo
588      iglo(2) = jpjglo
589      iloc(1) = nlci
590      iloc(2) = nlcj
591      iabsf(1) = nimppt(narea)
592      iabsf(2) = njmppt(narea)
593      iabsl(:) = iabsf(:) + iloc(:) - 1
[1238]594      ihals(1) = nldi - 1
595      ihals(2) = nldj - 1
596      ihale(1) = nlci - nlei
597      ihale(2) = nlcj - nlej
[352]598      idid(1) = 1
599      idid(2) = 2
600
[88]601      IF(lwp) THEN
[516]602          WRITE(numout,*)
[352]603          WRITE(numout,*) 'mpp_init_ioipsl :   iloc  = ', iloc (1), iloc (2)
604          WRITE(numout,*) '~~~~~~~~~~~~~~~     iabsf = ', iabsf(1), iabsf(2)
605          WRITE(numout,*) '                    ihals = ', ihals(1), ihals(2)
606          WRITE(numout,*) '                    ihale = ', ihale(1), ihale(2)
[88]607      ENDIF
[2715]608      !
[352]609      CALL flio_dom_set ( jpnij, nproc, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom)
[2715]610      !
[88]611   END SUBROUTINE mpp_init_ioipsl 
612
[3]613#endif
[88]614
[3]615   !!======================================================================
616END MODULE mppini
Note: See TracBrowser for help on using the repository browser.