1 | MODULE 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 | !!---------------------------------------------------------------------- |
---|
27 | CONTAINS |
---|
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 | !!====================================================================== |
---|
112 | END MODULE domtile |
---|