1 | MODULE 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 | |
---|
23 | CONTAINS |
---|
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 | |
---|
128 | CONTAINS |
---|
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 | |
---|
139 | END MODULE dom_xios |
---|