source: CONFIG/UNIFORM/v6/IPSLCM6/SOURCES/NEMO/dom_xios.F90 @ 3344

Last change on this file since 3344 was 3344, checked in by cetlod, 7 years ago

CM6.0.12: Adding modified NEMO routines to properly handle outputs when removing land processors

File size: 4.4 KB
Line 
1MODULE dom_xios
2# if defined key_iomput
3   USE dom_oce
4
5   IMPLICIT NONE
6
7   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  lon_grid_T, lat_grid_T, area_grid_T
8   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  lon_grid_U, lat_grid_U, area_grid_U
9   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  lon_grid_V, lat_grid_V, area_grid_V
10   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  lon_grid_W, lat_grid_W, area_grid_W
11
12   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  bounds_lon_grid_T, bounds_lat_grid_T
13   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  bounds_lon_grid_U, bounds_lat_grid_U
14   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  bounds_lon_grid_V, bounds_lat_grid_V
15   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  bounds_lon_grid_W, bounds_lat_grid_W
16
17   INTEGER, PUBLIC, SAVE :: n_ibegin, n_ni
18   INTEGER, PUBLIC, SAVE :: n_jbegin, n_nj
19   INTEGER, PUBLIC, SAVE :: n_data_ibegin, n_data_ni
20   INTEGER, PUBLIC, SAVE :: n_data_jbegin, n_data_nj
21   LOGICAL, PUBLIC, SAVE :: using_xios_coordinates=.FALSE.
22
23CONTAINS
24
25
26  SUBROUTINE init_dom_xios(iin,ijn,iimppt,ijmppt,ildi,ildj,ilei,ilej)
27    INTEGER,INTENT(IN) :: iin(jpnij), ijn(jpnij)
28    INTEGER,INTENT(IN) :: iimppt(jpni,jpnj), ijmppt(jpni,jpnj)
29    INTEGER,INTENT(IN) :: ildi(jpni,jpnj), ildj(jpni,jpnj)     
30    INTEGER,INTENT(IN) :: ilei(jpni,jpnj), ilej(jpni,jpnj)
31    INTEGER :: rank(jpni,jpnj)
32    LOGICAL :: tag_x(jpni,jpnj)
33    LOGICAL :: tag_y(jpni,jpnj)
34    INTEGER :: jproc,i,j
35    INTEGER :: iend,jend
36   
37    rank(:,:)=-1
38    tag_x(:,:)=.FALSE.
39    tag_y(:,:)=.FALSE.
40   
41    DO jproc = 1, jpnij   
42      rank(iin(jproc),ijn(jproc))=jproc
43    ENDDO
44   
45
46!! Distribute holes to neighbour domains
47 
48    DO j=2,jpnj
49      DO i=1,jpni
50        IF (rank(i,j)==-1 .AND. rank(i,j-1)/=-1 .AND. .NOT. tag_x(i,j-1)) THEN
51          rank(i,j)=rank(i,j-1)
52          tag_y(i,j)=.TRUE.     
53          tag_y(i,j-1)=.TRUE.     
54        ENDIF
55      ENDDO
56    ENDDO
57
58    DO j=jpnj-1,1,-1
59      DO i=1,jpni
60        IF (rank(i,j)==-1 .AND. rank(i,j+1)/=-1 .AND. .NOT. tag_x(i,j+1)) THEN
61          rank(i,j)=rank(i,j+1)     
62          tag_y(i,j)=.TRUE.     
63          tag_y(i,j+1)=.TRUE.     
64        ENDIF
65      ENDDO
66    ENDDO
67
68    DO j=1,jpnj
69      DO i=2,jpni
70        IF (rank(i,j)==-1 .AND. rank(i-1,j)/=-1 .AND. .NOT. tag_y(i-1,j)) THEN
71          rank(i,j)=rank(i-1,j)     
72          tag_x(i,j)=.TRUE. 
73          tag_x(i-1,j)=.TRUE.
74        ENDIF
75      ENDDO
76    ENDDO
77
78    DO j=1,jpnj
79      DO i=jpni-1,1,-1
80        IF (rank(i,j)==-1 .AND. rank(i+1,j)/=-1 .AND. .NOT. tag_y(i+1,j)) THEN
81          rank(i,j)=rank(i+1,j)     
82          tag_x(i,j)=.TRUE. 
83          tag_x(i+1,j)=.TRUE.
84        ENDIF
85      ENDDO
86    ENDDO
87   
88   
89
90!!!! compute new domain decomposition for xios
91    n_ibegin=jpiglo
92    n_jbegin=jpjglo
93    iend=-1
94    jend=-1
95    DO j=1,jpnj
96      DO i=1,jpni
97        IF (rank(i,j)==narea) THEN
98          n_ibegin=min(n_ibegin,iimppt(i,j)+ildi(i,j)-1)
99          iend=max(iend,iimppt(i,j)+ilei(i,j)-1)
100          n_jbegin=min(n_jbegin,ijmppt(i,j)+ildj(i,j)-1)
101          jend=max(jend,ijmppt(i,j)+ilej(i,j)-1)
102        ENDIF 
103      ENDDO
104    ENDDO
105   
106    n_ni=iend-n_ibegin+1
107    n_nj=jend-n_jbegin+1
108   
109    n_data_ibegin=nimpp-n_ibegin
110    n_data_ni=jpi
111   
112    n_data_jbegin=njmpp-n_jbegin
113    n_data_nj=jpj
114
115    ALLOCATE(lon_grid_T(n_ni,n_nj), lat_grid_T(n_ni,n_nj),area_grid_T(n_ni,n_nj))
116    ALLOCATE(lon_grid_U(n_ni,n_nj), lat_grid_U(n_ni,n_nj),area_grid_U(n_ni,n_nj))
117    ALLOCATE(lon_grid_V(n_ni,n_nj), lat_grid_V(n_ni,n_nj),area_grid_V(n_ni,n_nj))
118    ALLOCATE(lon_grid_W(n_ni,n_nj), lat_grid_W(n_ni,n_nj),area_grid_W(n_ni,n_nj))
119    ALLOCATE(bounds_lon_grid_T(4,n_ni,n_nj), bounds_lat_grid_T(4,n_ni,n_nj))
120    ALLOCATE(bounds_lon_grid_U(4,n_ni,n_nj), bounds_lat_grid_U(4,n_ni,n_nj))
121    ALLOCATE(bounds_lon_grid_V(4,n_ni,n_nj), bounds_lat_grid_V(4,n_ni,n_nj))
122    ALLOCATE(bounds_lon_grid_W(4,n_ni,n_nj), bounds_lat_grid_W(4,n_ni,n_nj))
123     
124  END SUBROUTINE init_dom_xios
125
126#else
127
128CONTAINS
129   USE par_oce
130   SUBROUTINE init_dom_xios(iin,ijn,iimppt,ijmppt,ildi,ildj,ilei,ilej)
131    INTEGER,INTENT(IN) :: iin(jpnij), ijn(jpnij)
132    INTEGER,INTENT(IN) :: iimppt(jpni,jpnj), ijmppt(jpni,jpnj)
133    INTEGER,INTENT(IN) :: ildi(jpni,jpnj), ildj(jpni,jpnj)     
134    INTEGER,INTENT(IN) :: ilei(jpni,jpnj), ilej(jpni,jpnj)
135   END SUBROUTINE init_dom_xios
136   
137#endif
138 
139END MODULE dom_xios
Note: See TracBrowser for help on using the repository browser.