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.
domtile.F90 in NEMO/trunk/src/OCE/DOM – NEMO

source: NEMO/trunk/src/OCE/DOM/domtile.F90 @ 14210

Last change on this file since 14210 was 14090, checked in by hadcv, 3 years ago

#2365: Move dom_tile into domtile.F90

File size: 4.8 KB
Line 
1MODULE domtile
2   !!======================================================================
3   !!                       ***  MODULE domtile  ***
4   !! Tiling utilities
5   !!======================================================================
6   !! History : 4.2  !  2020-12  (D. Calvert)  Original code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   dom_tile       : Set/initialise the current tile and domain indices
11   !!----------------------------------------------------------------------
12   USE dom_oce        ! ocean space and time domain
13   !
14   USE prtctl         ! Print control (prt_ctl_info routine)
15   USE in_out_manager ! I/O manager
16
17   IMPLICIT NONE
18   PRIVATE
19
20   PUBLIC dom_tile   ! called by step.F90
21
22   !!----------------------------------------------------------------------
23   !! NEMO/OCE 4.2 , NEMO Consortium (2020)
24   !! $Id: domtile.F90 13982 2020-12-04 10:57:05Z hadcv $
25   !! Software governed by the CeCILL license (see ./LICENSE)
26   !!----------------------------------------------------------------------
27CONTAINS
28
29   SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile )
30      !!----------------------------------------------------------------------
31      !!                     ***  ROUTINE dom_tile  ***
32      !!
33      !! ** Purpose :   Set tile domain variables
34      !!
35      !! ** Action  : - ktsi, ktsj     : start of internal part of domain
36      !!              - ktei, ktej     : end of internal part of domain
37      !!              - ntile          : current tile number
38      !!              - nijtile        : total number of tiles
39      !!----------------------------------------------------------------------
40      INTEGER, INTENT(out) :: ktsi, ktsj, ktei, ktej      ! Tile domain indices
41      INTEGER, INTENT(in), OPTIONAL :: ktile              ! Tile number
42      INTEGER ::   jt                                     ! dummy loop argument
43      INTEGER ::   iitile, ijtile                         ! Local integers
44      CHARACTER (len=11) ::   charout
45      !!----------------------------------------------------------------------
46      IF( PRESENT(ktile) .AND. ln_tile ) THEN
47         ntile = ktile                 ! Set domain indices for tile
48         ktsi = ntsi_a(ktile)
49         ktsj = ntsj_a(ktile)
50         ktei = ntei_a(ktile)
51         ktej = ntej_a(ktile)
52
53         IF(sn_cfctl%l_prtctl) THEN
54            WRITE(charout, FMT="('ntile =', I4)") ktile
55            CALL prt_ctl_info( charout )
56         ENDIF
57      ELSE
58         ntile = 0                     ! Initialise to full domain
59         nijtile = 1
60         ktsi = Nis0
61         ktsj = Njs0
62         ktei = Nie0
63         ktej = Nje0
64
65         IF( ln_tile ) THEN            ! Calculate tile domain indices
66            iitile = Ni_0 / nn_ltile_i       ! Number of tiles
67            ijtile = Nj_0 / nn_ltile_j
68            IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1
69            IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1
70
71            nijtile = iitile * ijtile
72            ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile) )
73
74            ntsi_a(0) = ktsi                 ! Full domain
75            ntsj_a(0) = ktsj
76            ntei_a(0) = ktei
77            ntej_a(0) = ktej
78
79            DO jt = 1, nijtile               ! Tile domains
80               ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile)
81               ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile)
82               ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0)
83               ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0)
84            ENDDO
85         ENDIF
86
87         IF(lwp) THEN                  ! control print
88            WRITE(numout,*)
89            WRITE(numout,*) 'dom_tile : Domain tiling decomposition'
90            WRITE(numout,*) '~~~~~~~~'
91            IF( ln_tile ) THEN
92               WRITE(numout,*) iitile, 'tiles in i'
93               WRITE(numout,*) '    Starting indices'
94               WRITE(numout,*) '        ', (ntsi_a(jt), jt=1, iitile)
95               WRITE(numout,*) '    Ending indices'
96               WRITE(numout,*) '        ', (ntei_a(jt), jt=1, iitile)
97               WRITE(numout,*) ijtile, 'tiles in j'
98               WRITE(numout,*) '    Starting indices'
99               WRITE(numout,*) '        ', (ntsj_a(jt), jt=1, nijtile, iitile)
100               WRITE(numout,*) '    Ending indices'
101               WRITE(numout,*) '        ', (ntej_a(jt), jt=1, nijtile, iitile)
102            ELSE
103               WRITE(numout,*) 'No domain tiling'
104               WRITE(numout,*) '    i indices =', ktsi, ':', ktei
105               WRITE(numout,*) '    j indices =', ktsj, ':', ktej
106            ENDIF
107         ENDIF
108      ENDIF
109   END SUBROUTINE dom_tile
110
111   !!======================================================================
112END MODULE domtile
Note: See TracBrowser for help on using the repository browser.