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/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/CONFIG/ORCA2_LIM_CRS_AGE/MY_SRC – NEMO

source: branches/2013/dev_r3411_CNRS4_IOCRS/NEMOGCM/CONFIG/ORCA2_LIM_CRS_AGE/MY_SRC/mppini.F90 @ 3897

Last change on this file since 3897 was 3897, checked in by cetlod, 11 years ago

2013/dev_r3411_CNRS4_IOCRS: 2nd step create a new configuration with age tracer ; starting point for TOP coarsening

File size: 17.8 KB
Line 
1
2MODULE mppini
3   !!==============================================================================
4   !!                       ***  MODULE mppini   ***
5   !! Ocean initialization : distributed memory computing initialization
6   !!==============================================================================
7
8   !!----------------------------------------------------------------------
9   !!   mpp_init       : Lay out the global domain over processors
10   !!   mpp_init2      : Lay out the global domain over processors
11   !!                    with land processor elimination
12   !!   mpp_init_ioispl: IOIPSL initialization in mpp
13   !!----------------------------------------------------------------------
14   !! * Modules used
15   USE dom_oce         ! ocean space and time domain
16   USE in_out_manager  ! I/O Manager
17   USE lib_mpp         ! distribued memory computing library
18   USE ioipsl
19
20   IMPLICIT NONE
21   PRIVATE
22
23   PUBLIC mpp_init       ! called by opa.F90
24   PUBLIC mpp_init2      ! called by opa.F90
25
26   !! * Substitutions
27#  include "domzgr_substitute.h90"
28   !!----------------------------------------------------------------------
29   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
30   !! $Id: mppini.F90 3294 2012-01-28 16:44:18Z rblod $
31   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
32   !!----------------------------------------------------------------------
33CONTAINS
34
35#if ! defined key_mpp_mpi
36   !!----------------------------------------------------------------------
37   !!   Default option :                            shared memory computing
38   !!----------------------------------------------------------------------
39
40   SUBROUTINE mpp_init
41      !!----------------------------------------------------------------------
42      !!                  ***  ROUTINE mpp_init  ***
43      !!
44      !! ** Purpose :   Lay out the global domain over processors.
45      !!
46      !! ** Method  :   Shared memory computing, set the local processor
47      !!      variables to the value of the global domain
48      !!
49      !! History :
50      !!   9.0  !  04-01  (G. Madec, J.M. Molines)  F90 : free form, north fold jpni >1
51      !!----------------------------------------------------------------------
52
53      ! No mpp computation
54      nimpp  = 1
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
65      nidom  = FLIO_DOM_NONE
66      npolj = jperio
67
68      IF(lwp) THEN
69         WRITE(numout,*)
70         WRITE(numout,*) 'mpp_init(2) : NO massively parallel processing'
71         WRITE(numout,*) '~~~~~~~~~~~: '
72         WRITE(numout,*) '         nperio = ', nperio
73         WRITE(numout,*) '         npolj  = ', npolj
74         WRITE(numout,*) '         nimpp  = ', nimpp
75         WRITE(numout,*) '         njmpp  = ', njmpp
76      ENDIF
77
78      IF(  jpni /= 1 .OR. jpnj /= 1 .OR. jpnij /= 1 ) &
79          CALL ctl_stop( 'equality  jpni = jpnj = jpnij = 1 is not satisfied',   &
80          &              'the domain is lay out for distributed memory computing! ' )
81
82   END SUBROUTINE mpp_init
83
84
85   SUBROUTINE mpp_init2 
86      CALL mpp_init                             ! same routine as mpp_init
87   END SUBROUTINE mpp_init2
88
89#else
90   !!----------------------------------------------------------------------
91   !!   'key_mpp_mpi'          OR         MPI massively parallel processing
92   !!----------------------------------------------------------------------
93
94   SUBROUTINE mpp_init
95      !!----------------------------------------------------------------------
96      !!                  ***  ROUTINE mpp_init  ***
97      !!                   
98      !! ** Purpose :   Lay out the global domain over processors.
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      !!
107      !! ** Action  : - set domain parameters
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      !!
122      !! History :
123      !!        !  94-11  (M. Guyon)  Original code
124      !!        !  95-04  (J. Escobar, M. Imbard)
125      !!        !  98-02  (M. Guyon)  FETI method
126      !!        !  98-05  (M. Imbard, J. Escobar, L. Colombet )  SHMEM and MPI versions
127      !!   8.5  !  02-08  (G. Madec)  F90 : free form
128      !!   3.4  !  11-11  (C. Harris) decomposition changes for running with CICE
129      !!----------------------------------------------------------------------
130      INTEGER  ::   ji, jj, jn   ! dummy loop indices
131      INTEGER  ::   ii, ij, ifreq, il1, il2            ! local integers
132      INTEGER  ::   iresti, irestj, ijm1, imil, inum   !   -      -
133      REAL(wp) ::   zidom, zjdom                       ! local scalars
134      INTEGER, DIMENSION(jpni,jpnj) ::   iimppt, ijmppt, ilcit, ilcjt   ! local workspace
135      !!----------------------------------------------------------------------
136
137      IF(lwp) WRITE(numout,*)
138      IF(lwp) WRITE(numout,*) 'mpp_init : Message Passing MPI'
139      IF(lwp) WRITE(numout,*) '~~~~~~~~'
140
141
142      !  1. Dimension arrays for subdomains
143      ! -----------------------------------
144      !  Computation of local domain sizes ilcit() ilcjt()
145      !  These dimensions depend on global sizes jpni,jpnj and jpiglo,jpjglo
146      !  The subdomains are squares leeser than or equal to the global
147      !  dimensions divided by the number of processors minus the overlap
148      !  array (cf. par_oce.F90).
149     
150      nreci  = 2 * jpreci
151      nrecj  = 2 * jprecj
152      iresti = MOD( jpiglo - nreci , jpni )
153      irestj = MOD( jpjglo - nrecj , jpnj )
154
155      IF(  iresti == 0 )   iresti = jpni
156
157#if defined key_nemocice_decomp
158      ! In order to match CICE the size of domains in NEMO has to be changed
159      ! The last line of blocks (west) will have fewer points
160
161      DO jj = 1, jpnj
162         DO ji=1, jpni-1
163            ilcit(ji,jj) = jpi
164         END DO
165         ilcit(jpni,jj) = jpiglo - (jpni - 1) * (jpi - nreci)
166      END DO
167
168#else
169
170      DO jj = 1, jpnj
171         DO ji = 1, iresti
172            ilcit(ji,jj) = jpi
173         END DO
174         DO ji = iresti+1, jpni
175            ilcit(ji,jj) = jpi -1
176         END DO
177      END DO
178     
179#endif
180      IF( irestj == 0 )   irestj = jpnj
181
182#if defined key_nemocice_decomp
183      ! Same change to domains in North-South direction as in East-West.
184      DO ji=1,jpni
185         DO jj=1,jpnj-1
186            ilcjt(ji,jj) = jpj
187         END DO
188         ilcjt(ji,jpnj) = jpjglo - (jpnj - 1) * (jpj - nrecj)
189      END DO
190
191#else
192
193      DO ji = 1, jpni
194         DO jj = 1, irestj
195            ilcjt(ji,jj) = jpj
196         END DO
197         DO jj = irestj+1, jpnj
198            ilcjt(ji,jj) = jpj -1
199         END DO
200      END DO
201     
202#endif
203      IF(lwp) THEN
204         WRITE(numout,*)
205         WRITE(numout,*) '           defines mpp subdomains'
206         WRITE(numout,*) '           ----------------------'
207         WRITE(numout,*) '           iresti=',iresti,' irestj=',irestj
208         WRITE(numout,*) '           jpni  =',jpni  ,' jpnj  =',jpnj
209         ifreq = 4
210         il1   = 1
211         DO jn = 1, (jpni-1)/ifreq+1
212            il2 = MIN( jpni, il1+ifreq-1 )
213            WRITE(numout,*)
214            WRITE(numout,9200) ('***',ji = il1,il2-1)
215            DO jj = jpnj, 1, -1
216               WRITE(numout,9203) ('   ',ji = il1,il2-1)
217               WRITE(numout,9202) jj, ( ilcit(ji,jj),ilcjt(ji,jj),ji = il1,il2 )
218               WRITE(numout,9203) ('   ',ji = il1,il2-1)
219               WRITE(numout,9200) ('***',ji = il1,il2-1)
220            END DO
221            WRITE(numout,9201) (ji,ji = il1,il2)
222            il1 = il1+ifreq
223         END DO
224 9200    FORMAT('     ***',20('*************',a3))
225 9203    FORMAT('     *     ',20('         *   ',a3))
226 9201    FORMAT('        ',20('   ',i3,'          '))
227 9202    FORMAT(' ',i3,' *  ',20(i3,'  x',i3,'   *   '))
228      ENDIF
229
230      zidom = nreci
231      DO ji = 1, jpni
232         zidom = zidom + ilcit(ji,1) - nreci
233      END DO
234      IF(lwp) WRITE(numout,*)
235      IF(lwp) WRITE(numout,*)' sum ilcit(i,1) = ', zidom, ' jpiglo = ', jpiglo
236     
237      zjdom = nrecj
238      DO jj = 1, jpnj
239         zjdom = zjdom + ilcjt(1,jj) - nrecj
240      END DO
241      IF(lwp) WRITE(numout,*)' sum ilcit(1,j) = ', zjdom, ' jpjglo = ', jpjglo
242      IF(lwp) WRITE(numout,*)
243     
244
245      !  2. Index arrays for subdomains
246      ! -------------------------------
247     
248      iimppt(:,:) = 1
249      ijmppt(:,:) = 1
250     
251      IF( jpni > 1 ) THEN
252         DO jj = 1, jpnj
253            DO ji = 2, jpni
254               iimppt(ji,jj) = iimppt(ji-1,jj) + ilcit(ji-1,jj) - nreci
255            END DO
256         END DO
257      ENDIF
258
259      IF( jpnj > 1 ) THEN
260         DO jj = 2, jpnj
261            DO ji = 1, jpni
262               ijmppt(ji,jj) = ijmppt(ji,jj-1)+ilcjt(ji,jj-1)-nrecj
263            END DO
264         END DO
265      ENDIF
266     
267      ! 3. Subdomain description
268      ! ------------------------
269
270      DO jn = 1, jpnij
271         ii = 1 + MOD( jn-1, jpni )
272         ij = 1 + (jn-1) / jpni
273         nimppt(jn) = iimppt(ii,ij)
274         njmppt(jn) = ijmppt(ii,ij)
275         nlcit (jn) = ilcit (ii,ij)     
276         nlci       = nlcit (jn)     
277         nlcjt (jn) = ilcjt (ii,ij)     
278         nlcj       = nlcjt (jn)
279         nbondj = -1                                   ! general case
280         IF( jn   >  jpni          )   nbondj = 0      ! first row of processor
281         IF( jn   >  (jpnj-1)*jpni )   nbondj = 1      ! last  row of processor
282         IF( jpnj == 1             )   nbondj = 2      ! one processor only in j-direction
283         ibonjt(jn) = nbondj
284         
285         nbondi = 0                                    !
286         IF( MOD( jn, jpni ) == 1 )   nbondi = -1      !
287         IF( MOD( jn, jpni ) == 0 )   nbondi =  1      !
288         IF( jpni            == 1 )   nbondi =  2      ! one processor only in i-direction
289         ibonit(jn) = nbondi
290         
291         nldi =  1   + jpreci
292         nlei = nlci - jpreci
293         IF( nbondi == -1 .OR. nbondi == 2 )   nldi = 1
294         IF( nbondi ==  1 .OR. nbondi == 2 )   nlei = nlci
295         nldj =  1   + jprecj
296         nlej = nlcj - jprecj
297         IF( nbondj == -1 .OR. nbondj == 2 )   nldj = 1
298         IF( nbondj ==  1 .OR. nbondj == 2 )   nlej = nlcj
299         nldit(jn) = nldi
300         nleit(jn) = nlei
301         nldjt(jn) = nldj
302         nlejt(jn) = nlej
303   !      if(lwp) then
304            write(numout,*) ' proc : ', jn, ' nlcjt/njmppt : ', nlcjt(jn),njmppt(jn)
305   !      endif
306      END DO
307     
308
309      ! 4. From global to local
310      ! -----------------------
311
312      nperio = 0
313      IF( jperio == 2 .AND. nbondj == -1 )   nperio = 2
314
315
316      ! 5. Subdomain neighbours
317      ! ----------------------
318
319      nproc = narea - 1
320      noso  = nproc - jpni
321      nowe  = nproc - 1
322      noea  = nproc + 1
323      nono  = nproc + jpni
324      ! great neighbours
325      npnw = nono - 1
326      npne = nono + 1
327      npsw = noso - 1
328      npse = noso + 1
329      nbsw = 1
330      nbnw = 1
331      IF( MOD( nproc, jpni ) == 0 ) THEN
332         nbsw = 0
333         nbnw = 0
334      ENDIF
335      nbse = 1
336      nbne = 1
337      IF( MOD( nproc, jpni ) == jpni-1 ) THEN
338         nbse = 0
339         nbne = 0
340      ENDIF
341      IF(nproc < jpni) THEN
342         nbsw = 0
343         nbse = 0
344      ENDIF
345      IF( nproc >= (jpnj-1)*jpni ) THEN
346         nbnw = 0
347         nbne = 0
348      ENDIF
349      nlcj = nlcjt(narea) 
350      nlci = nlcit(narea) 
351      nldi = nldit(narea)
352      nlei = nleit(narea)
353      nldj = nldjt(narea)
354      nlej = nlejt(narea)
355      nbondi = ibonit(narea)
356      nbondj = ibonjt(narea)
357      nimpp  = nimppt(narea) 
358      njmpp  = njmppt(narea) 
359
360     ! Save processor layout in layout.dat file
361       IF (lwp) THEN
362        CALL ctl_opn( inum, 'layout.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea )
363        WRITE(inum,'(a)') '   jpnij     jpi     jpj     jpk  jpiglo  jpjglo'
364        WRITE(inum,'(6i8)') jpnij,jpi,jpj,jpk,jpiglo,jpjglo
365        WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimpp njmpp'
366
367        DO  jn = 1, jpnij
368         WRITE(inum,'(9i5)') jn, nlcit(jn), nlcjt(jn), &
369                                      nldit(jn), nldjt(jn), &
370                                      nleit(jn), nlejt(jn), &
371                                      nimppt(jn), njmppt(jn)
372        END DO
373        CLOSE(inum)   
374      END IF
375
376
377      ! w a r n i n g  narea (zone) /= nproc (processors)!
378
379      IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN
380         IF( jpni == 1 )THEN
381            nbondi = 2
382            nperio = 1
383         ELSE
384            nbondi = 0
385         ENDIF
386         IF( MOD( narea, jpni ) == 0 ) THEN
387            noea = nproc-(jpni-1)
388            npne = npne-jpni
389            npse = npse-jpni
390         ENDIF
391         IF( MOD( narea, jpni ) == 1 ) THEN
392            nowe = nproc+(jpni-1)
393            npnw = npnw+jpni
394            npsw = npsw+jpni
395         ENDIF
396         nbsw = 1
397         nbnw = 1
398         nbse = 1
399         nbne = 1
400         IF( nproc < jpni ) THEN
401            nbsw = 0
402            nbse = 0
403         ENDIF
404         IF( nproc >= (jpnj-1)*jpni ) THEN
405            nbnw = 0
406            nbne = 0
407         ENDIF
408      ENDIF
409      npolj = 0
410      IF( jperio == 3 .OR. jperio == 4 ) THEN
411         ijm1 = jpni*(jpnj-1)
412         imil = ijm1+(jpni+1)/2
413         IF( narea > ijm1 ) npolj = 3
414         IF( MOD(jpni,2) == 1 .AND. narea == imil ) npolj = 4
415         IF( npolj == 3 ) nono = jpni*jpnj-narea+ijm1
416      ENDIF
417      IF( jperio == 5 .OR. jperio == 6 ) THEN
418          ijm1 = jpni*(jpnj-1)
419          imil = ijm1+(jpni+1)/2
420          IF( narea > ijm1) npolj = 5
421          IF( MOD(jpni,2) == 1 .AND. narea == imil ) npolj = 6
422          IF( npolj == 5 ) nono = jpni*jpnj-narea+ijm1
423      ENDIF
424
425      ! Periodicity : no corner if nbondi = 2 and nperio != 1
426
427      IF(lwp) THEN
428         WRITE(numout,*) ' nproc  = ', nproc
429         WRITE(numout,*) ' nowe   = ', nowe  , ' noea   =  ', noea
430         WRITE(numout,*) ' nono   = ', nono  , ' noso   =  ', noso
431         WRITE(numout,*) ' nbondi = ', nbondi
432         WRITE(numout,*) ' nbondj = ', nbondj
433         WRITE(numout,*) ' npolj  = ', npolj
434         WRITE(numout,*) ' nperio = ', nperio
435         WRITE(numout,*) ' nlci   = ', nlci
436         WRITE(numout,*) ' nlcj   = ', nlcj
437         WRITE(numout,*) ' nimpp  = ', nimpp
438         WRITE(numout,*) ' njmpp  = ', njmpp
439         WRITE(numout,*) ' nbse   = ', nbse  , ' npse   = ', npse
440         WRITE(numout,*) ' nbsw   = ', nbsw  , ' npsw   = ', npsw
441         WRITE(numout,*) ' nbne   = ', nbne  , ' npne   = ', npne
442         WRITE(numout,*) ' nbnw   = ', nbnw  , ' npnw   = ', npnw
443      ENDIF
444
445      IF( nperio == 1 .AND. jpni /= 1 ) CALL ctl_stop( ' mpp_init: error on cyclicity' )
446
447      ! Prepare mpp north fold
448
449      IF (jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN
450         CALL mpp_ini_north
451      END IF
452
453      ! Prepare NetCDF output file (if necessary)
454      CALL mpp_init_ioipsl
455
456   END SUBROUTINE mpp_init
457
458#  include "mppini_2.h90"
459
460# if defined key_dimgout
461   !!----------------------------------------------------------------------
462   !!   'key_dimgout'                  NO use of NetCDF files
463   !!----------------------------------------------------------------------
464   SUBROUTINE mpp_init_ioipsl       ! Dummy routine
465   END SUBROUTINE mpp_init_ioipsl 
466# else
467   SUBROUTINE mpp_init_ioipsl
468      !!----------------------------------------------------------------------
469      !!                  ***  ROUTINE mpp_init_ioipsl  ***
470      !!
471      !! ** Purpose :   
472      !!
473      !! ** Method  :   
474      !!
475      !! History :
476      !!   9.0  !  04-03  (G. Madec )  MPP-IOIPSL
477      !!   " "  !  08-12  (A. Coward)  addition in case of jpni*jpnj < jpnij
478      !!----------------------------------------------------------------------
479      INTEGER, DIMENSION(2) ::   iglo, iloc, iabsf, iabsl, ihals, ihale, idid
480      !!----------------------------------------------------------------------
481
482      ! The domain is split only horizontally along i- or/and j- direction
483      ! So we need at the most only 1D arrays with 2 elements.
484      ! Set idompar values equivalent to the jpdom_local_noextra definition
485      ! used in IOM. This works even if jpnij .ne. jpni*jpnj.
486      iglo(1) = jpiglo
487      iglo(2) = jpjglo
488      iloc(1) = nlci
489      iloc(2) = nlcj
490      iabsf(1) = nimppt(narea)
491      iabsf(2) = njmppt(narea)
492      iabsl(:) = iabsf(:) + iloc(:) - 1
493      ihals(1) = nldi - 1
494      ihals(2) = nldj - 1
495      ihale(1) = nlci - nlei
496      ihale(2) = nlcj - nlej
497      idid(1) = 1
498      idid(2) = 2
499
500      IF(lwp) THEN
501          WRITE(numout,*)
502          WRITE(numout,*) 'mpp_init_ioipsl :   iloc  = ', iloc (1), iloc (2)
503          WRITE(numout,*) '~~~~~~~~~~~~~~~     iabsf = ', iabsf(1), iabsf(2)
504          WRITE(numout,*) '                    ihals = ', ihals(1), ihals(2)
505          WRITE(numout,*) '                    ihale = ', ihale(1), ihale(2)
506      ENDIF
507      !
508      CALL flio_dom_set ( jpnij, nproc, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom)
509      !
510   END SUBROUTINE mpp_init_ioipsl 
511
512# endif
513#endif
514
515   !!======================================================================
516END MODULE mppini
Note: See TracBrowser for help on using the repository browser.