[3344] | 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 |
---|