[8] | 1 | MODULE mod_grid |
---|
| 2 | USE mod_xmlio_parameters |
---|
| 3 | USE mod_sorted_list |
---|
| 4 | USE mod_domain |
---|
[29] | 5 | USE mod_zoom |
---|
| 6 | |
---|
[8] | 7 | IMPLICIT NONE |
---|
| 8 | |
---|
| 9 | TYPE, PUBLIC :: grid |
---|
| 10 | CHARACTER(len=str_len) :: id |
---|
| 11 | LOGICAL :: has_id |
---|
| 12 | CHARACTER(len=str_len) :: name |
---|
| 13 | LOGICAL :: has_name |
---|
| 14 | CHARACTER(len=str_len) :: description |
---|
| 15 | LOGICAL :: has_description |
---|
| 16 | TYPE(domain),POINTER :: domain |
---|
| 17 | TYPE(vector_domain),POINTER :: subdomain |
---|
| 18 | TYPE(sorted_list),POINTER :: rank_ids |
---|
| 19 | INTEGER,POINTER :: ranks(:) |
---|
| 20 | INTEGER :: ni |
---|
| 21 | INTEGER :: nj |
---|
| 22 | LOGICAL :: has_dimension |
---|
[29] | 23 | TYPE(vector_zoom),POINTER :: associated_zoom |
---|
| 24 | TYPE(zoom),POINTER :: global_zoom |
---|
[8] | 25 | END TYPE grid |
---|
| 26 | |
---|
| 27 | INCLUDE 'vector_grid_def.inc' |
---|
| 28 | |
---|
| 29 | TYPE(vector_grid),POINTER,SAVE :: grid_Ids |
---|
| 30 | TYPE(sorted_list),POINTER,SAVE,PRIVATE :: Ids |
---|
| 31 | |
---|
| 32 | CONTAINS |
---|
| 33 | INCLUDE 'vector_grid_contains.inc' |
---|
| 34 | |
---|
[26] | 35 | SUBROUTINE grid__swap_context(saved_grid_Ids,saved_Ids) |
---|
| 36 | IMPLICIT NONE |
---|
| 37 | TYPE(vector_grid),POINTER :: saved_grid_Ids |
---|
| 38 | TYPE(sorted_list),POINTER :: saved_Ids |
---|
| 39 | |
---|
| 40 | grid_ids=>saved_grid_ids |
---|
| 41 | ids=>saved_ids |
---|
| 42 | END SUBROUTINE grid__swap_context |
---|
| 43 | |
---|
| 44 | |
---|
[8] | 45 | SUBROUTINE grid__init |
---|
| 46 | IMPLICIT NONE |
---|
| 47 | |
---|
| 48 | CALL vector_grid__new(grid_Ids) |
---|
| 49 | CALL sorted_list__new(Ids) |
---|
| 50 | |
---|
| 51 | END SUBROUTINE grid__init |
---|
| 52 | |
---|
| 53 | SUBROUTINE grid__get(Id,Pt_grid) |
---|
| 54 | USE string_function |
---|
| 55 | IMPLICIT NONE |
---|
| 56 | CHARACTER(LEN=*),INTENT(IN) :: Id |
---|
| 57 | TYPE(grid),POINTER :: Pt_grid |
---|
| 58 | |
---|
| 59 | INTEGER :: Pos |
---|
| 60 | LOGICAL :: success |
---|
| 61 | |
---|
| 62 | CALL sorted_list__find(Ids,hash(Id),Pos,success) |
---|
| 63 | IF (success) THEN |
---|
| 64 | Pt_grid=>grid_ids%at(Pos)%Pt |
---|
| 65 | ELSE |
---|
| 66 | Pt_grid=>NULL() |
---|
| 67 | ENDIF |
---|
| 68 | |
---|
| 69 | END SUBROUTINE grid__get |
---|
| 70 | |
---|
| 71 | SUBROUTINE grid__new(pt_grid,Id) |
---|
| 72 | USE string_function |
---|
| 73 | IMPLICIT NONE |
---|
| 74 | TYPE(grid), POINTER :: pt_grid |
---|
| 75 | CHARACTER(LEN=*),OPTIONAL :: Id |
---|
| 76 | INTEGER :: Pos |
---|
| 77 | |
---|
| 78 | ALLOCATE(pt_grid%domain) |
---|
| 79 | ALLOCATE(pt_grid%subdomain) |
---|
| 80 | ALLOCATE(pt_grid%rank_ids) |
---|
[29] | 81 | ALLOCATE(pt_grid%associated_zoom) |
---|
| 82 | |
---|
[8] | 83 | CALL domain__new(pt_grid%domain) |
---|
| 84 | CALL vector_domain__new(pt_grid%subdomain) |
---|
| 85 | CALL sorted_list__new(pt_grid%rank_ids) |
---|
[29] | 86 | CALL vector_zoom__new(pt_grid%associated_zoom) |
---|
[8] | 87 | |
---|
| 88 | pt_grid%has_id = .FALSE. |
---|
| 89 | pt_grid%has_name = .FALSE. |
---|
| 90 | pt_grid%has_description = .FALSE. |
---|
| 91 | pt_grid%has_dimension = .FALSE. |
---|
| 92 | |
---|
| 93 | IF (PRESENT(Id)) THEN |
---|
| 94 | Pt_grid%id=TRIM(ADJUSTL(Id)) |
---|
| 95 | Pt_grid%has_id=.TRUE. |
---|
| 96 | CALL vector_grid__set_new(grid_Ids,Pt_grid,Pos) |
---|
| 97 | CALL sorted_list__Add(Ids,hash(id),Pos) |
---|
| 98 | ENDIF |
---|
[29] | 99 | |
---|
| 100 | CALL grid__get_new_zoom(pt_grid,pt_grid%global_zoom,id) |
---|
[8] | 101 | |
---|
| 102 | END SUBROUTINE grid__new |
---|
| 103 | |
---|
| 104 | SUBROUTINE grid__set(pt_grid, name, description) |
---|
| 105 | IMPLICIT NONE |
---|
| 106 | TYPE(grid), POINTER :: pt_grid |
---|
| 107 | CHARACTER(len=*) ,OPTIONAL :: name |
---|
| 108 | CHARACTER(len=*) ,OPTIONAL :: description |
---|
| 109 | |
---|
| 110 | IF (PRESENT(name)) THEN |
---|
| 111 | pt_grid%name=TRIM(ADJUSTL(name)) |
---|
| 112 | pt_grid%has_name = .TRUE. |
---|
| 113 | ENDIF |
---|
| 114 | |
---|
| 115 | IF (PRESENT(description)) THEN |
---|
| 116 | pt_grid%description=TRIM(ADJUSTL(description)) |
---|
| 117 | pt_grid%has_description = .TRUE. |
---|
| 118 | ENDIF |
---|
| 119 | |
---|
| 120 | END SUBROUTINE grid__set |
---|
| 121 | |
---|
| 122 | SUBROUTINE grid__set_dimension(pt_grid, ni, nj) |
---|
| 123 | IMPLICIT NONE |
---|
| 124 | TYPE(grid), POINTER :: pt_grid |
---|
| 125 | INTEGER,INTENT(IN) :: ni |
---|
| 126 | INTEGER,INTENT(IN) :: nj |
---|
| 127 | |
---|
| 128 | pt_grid%ni=ni |
---|
| 129 | pt_grid%nj=nj |
---|
| 130 | pt_grid%has_dimension=.TRUE. |
---|
| 131 | |
---|
| 132 | END SUBROUTINE grid__set_dimension |
---|
| 133 | |
---|
| 134 | |
---|
| 135 | SUBROUTINE grid__get_new_subdomain(Pt_grid,rank,pt_domain) |
---|
| 136 | IMPLICIT NONE |
---|
| 137 | TYPE(grid), POINTER :: pt_grid |
---|
| 138 | INTEGER,INTENT(IN) :: rank |
---|
| 139 | TYPE(domain), POINTER :: Pt_domain |
---|
| 140 | |
---|
| 141 | INTEGER :: Pos |
---|
| 142 | |
---|
| 143 | CALL vector_domain__get_new(pt_grid%subdomain,pt_domain,Pos) |
---|
| 144 | CALL sorted_list__add(pt_grid%rank_ids,rank,Pos) |
---|
| 145 | CALL domain__new(pt_domain) |
---|
| 146 | |
---|
| 147 | END SUBROUTINE grid__get_new_subdomain |
---|
| 148 | |
---|
| 149 | SUBROUTINE grid__get_subdomain(Pt_grid,rank,pt_domain) |
---|
| 150 | IMPLICIT NONE |
---|
| 151 | TYPE(grid), POINTER :: pt_grid |
---|
| 152 | INTEGER,INTENT(IN) :: rank |
---|
| 153 | TYPE(domain), POINTER :: Pt_domain |
---|
| 154 | |
---|
| 155 | INTEGER :: rank_id |
---|
| 156 | LOGICAL :: success |
---|
| 157 | |
---|
| 158 | CALL sorted_list__find(pt_grid%rank_ids,rank,rank_id,success) |
---|
| 159 | IF (success) THEN |
---|
| 160 | pt_domain=>pt_grid%subdomain%at(rank_id)%pt |
---|
| 161 | ELSE |
---|
| 162 | !! message d'erreur |
---|
| 163 | ENDIF |
---|
| 164 | |
---|
| 165 | END SUBROUTINE grid__get_subdomain |
---|
| 166 | |
---|
| 167 | SUBROUTINE grid__process_domain(Pt_grid) |
---|
| 168 | IMPLICIT NONE |
---|
| 169 | TYPE(grid), POINTER :: pt_grid |
---|
| 170 | TYPE(domain),POINTER :: subdomain |
---|
[29] | 171 | TYPE(zoom),POINTER :: pt_zoom |
---|
[8] | 172 | |
---|
| 173 | REAL,ALLOCATABLE :: lon(:,:) |
---|
| 174 | REAL,ALLOCATABLE :: lat(:,:) |
---|
[29] | 175 | INTEGER :: ib,ie,jb,je,ni,nj,ibegin,jbegin,iend,jend |
---|
[8] | 176 | INTEGER :: i |
---|
| 177 | |
---|
[17] | 178 | ALLOCATE(pt_grid%ranks(1:pt_grid%subdomain%size)) |
---|
[8] | 179 | |
---|
| 180 | DO i=1,pt_grid%subdomain%size |
---|
| 181 | subdomain=>pt_grid%subdomain%at(i)%pt |
---|
| 182 | IF (i==1) THEN |
---|
| 183 | ib=subdomain%ibegin |
---|
| 184 | ie=subdomain%iend |
---|
| 185 | jb=subdomain%jbegin |
---|
| 186 | je=subdomain%jend |
---|
| 187 | ELSE |
---|
| 188 | IF (subdomain%ibegin<ib) ib=subdomain%ibegin |
---|
| 189 | IF (subdomain%iend>ie) ie=subdomain%iend |
---|
| 190 | IF (subdomain%jbegin<jb) jb=subdomain%jbegin |
---|
| 191 | IF (subdomain%jend>je) je=subdomain%jend |
---|
| 192 | ENDIF |
---|
| 193 | pt_grid%ranks(subdomain%rank)=i |
---|
| 194 | ENDDO |
---|
| 195 | |
---|
| 196 | ni=ie-ib+1 |
---|
| 197 | nj=je-jb+1 |
---|
| 198 | ibegin=ib |
---|
| 199 | jbegin=jb |
---|
| 200 | |
---|
| 201 | ALLOCATE(lon(ni,nj)) |
---|
| 202 | ALLOCATE(lat(ni,nj)) |
---|
| 203 | |
---|
| 204 | DO i=1,pt_grid%subdomain%size |
---|
| 205 | subdomain=>pt_grid%subdomain%at(i)%pt |
---|
| 206 | ib=subdomain%ibegin-ibegin+1 |
---|
| 207 | ie=subdomain%iend-ibegin+1 |
---|
| 208 | jb=subdomain%jbegin-jbegin+1 |
---|
| 209 | je=subdomain%jend-jbegin+1 |
---|
| 210 | lon(ib:ie,jb:je)=subdomain%lon(:,:) |
---|
| 211 | lat(ib:ie,jb:je)=subdomain%lat(:,:) |
---|
| 212 | ENDDO |
---|
| 213 | |
---|
| 214 | CALL domain__set(pt_grid%domain,0,ni,nj,ibegin,jbegin,lon,lat) |
---|
[29] | 215 | iend=ibegin+ni-1 |
---|
| 216 | jend=jbegin+nj-1 |
---|
| 217 | |
---|
| 218 | |
---|
| 219 | pt_grid%global_zoom%ni_glo=pt_grid%ni |
---|
| 220 | pt_grid%global_zoom%nj_glo=pt_grid%nj |
---|
| 221 | pt_grid%global_zoom%ibegin_glo=1 |
---|
| 222 | pt_grid%global_zoom%jbegin_glo=1 |
---|
| 223 | |
---|
| 224 | DO i=1,pt_grid%associated_zoom%size |
---|
| 225 | pt_zoom=>pt_grid%associated_zoom%at(i)%pt |
---|
| 226 | |
---|
| 227 | ib=MAX(pt_zoom%ibegin_glo-ibegin+1,1) |
---|
| 228 | ie=MIN(pt_zoom%ibegin_glo+pt_zoom%ni_glo-ibegin,ni) |
---|
| 229 | pt_zoom%ni_loc=MAX(ie-ib+1,0) |
---|
| 230 | pt_zoom%ibegin_loc=ib |
---|
[8] | 231 | |
---|
[29] | 232 | jb=MAX(pt_zoom%jbegin_glo-jbegin+1,1) |
---|
| 233 | je=MIN(pt_zoom%jbegin_glo+pt_zoom%nj_glo-jbegin,nj) |
---|
| 234 | pt_zoom%nj_loc=MAX(je-jb+1,0) |
---|
| 235 | pt_zoom%jbegin_loc=jb |
---|
| 236 | ENDDO |
---|
| 237 | |
---|
| 238 | |
---|
[8] | 239 | DEALLOCATE(lon) |
---|
| 240 | DEALLOCATE(lat) |
---|
| 241 | |
---|
| 242 | END SUBROUTINE grid__process_domain |
---|
| 243 | |
---|
| 244 | |
---|
[29] | 245 | SUBROUTINE grid__get_new_zoom(pt_grid,pt_zoom,zoom_id) |
---|
| 246 | USE string_function |
---|
| 247 | IMPLICIT NONE |
---|
| 248 | TYPE(grid), POINTER :: pt_grid |
---|
| 249 | TYPE(zoom),POINTER :: pt_zoom |
---|
| 250 | CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: zoom_id |
---|
| 251 | LOGICAL :: success |
---|
| 252 | |
---|
| 253 | CALL vector_zoom__get_new(pt_grid%associated_zoom,Pt_zoom) |
---|
| 254 | CALL zoom__new(Pt_zoom,zoom_id) |
---|
| 255 | |
---|
| 256 | END SUBROUTINE grid__get_new_zoom |
---|
| 257 | |
---|
[8] | 258 | SUBROUTINE grid__print(pt_grid) |
---|
| 259 | IMPLICIT NONE |
---|
| 260 | TYPE(grid), POINTER :: pt_grid |
---|
| 261 | INTEGER :: i |
---|
| 262 | |
---|
| 263 | PRINT *,"---- GRID ----" |
---|
| 264 | |
---|
| 265 | IF (pt_grid%has_id) THEN |
---|
| 266 | PRINT *,"id = ",TRIM(pt_grid%id) |
---|
| 267 | ELSE |
---|
| 268 | PRINT *,"id undefined" |
---|
| 269 | ENDIF |
---|
| 270 | |
---|
| 271 | IF (pt_grid%has_name) THEN |
---|
| 272 | PRINT *,"name = ",TRIM(pt_grid%name) |
---|
| 273 | ELSE |
---|
| 274 | PRINT *,"name undefined" |
---|
| 275 | ENDIF |
---|
| 276 | |
---|
| 277 | IF (pt_grid%has_description) THEN |
---|
| 278 | PRINT *,"description = ",TRIM(pt_grid%description) |
---|
| 279 | ELSE |
---|
| 280 | PRINT *,"description undefined" |
---|
| 281 | ENDIF |
---|
| 282 | |
---|
| 283 | IF (pt_grid%has_dimension) THEN |
---|
| 284 | PRINT *,"Global grid dimension :" |
---|
| 285 | PRINT *," ni =",pt_grid%ni |
---|
| 286 | PRINT *," nj =",pt_grid%nj |
---|
| 287 | ELSE |
---|
| 288 | PRINT *,"Global dimension ni, nj undefined" |
---|
| 289 | ENDIF |
---|
| 290 | |
---|
| 291 | PRINT *,"grid domain :" |
---|
| 292 | CALL domain__print(pt_grid%domain) |
---|
| 293 | |
---|
| 294 | PRINT *,"grid subdomain :",pt_grid%subdomain%size |
---|
| 295 | |
---|
| 296 | DO i=1,pt_grid%subdomain%size |
---|
| 297 | CALL domain__print(pt_grid%subdomain%at(i)%pt) |
---|
| 298 | ENDDO |
---|
| 299 | |
---|
| 300 | PRINT *,"--------------" |
---|
| 301 | |
---|
| 302 | END SUBROUTINE grid__print |
---|
| 303 | |
---|
| 304 | SUBROUTINE grid__apply_default(pt_grid_default, pt_grid_in, pt_grid_out) |
---|
| 305 | |
---|
| 306 | TYPE(grid), POINTER :: pt_grid_default, pt_grid_in, pt_grid_out |
---|
| 307 | |
---|
| 308 | IF (pt_grid_in%has_name) THEN |
---|
| 309 | pt_grid_out%name=pt_grid_in%name |
---|
| 310 | pt_grid_out%has_name=.TRUE. |
---|
| 311 | ELSE IF ( pt_grid_default%has_name) THEN |
---|
| 312 | pt_grid_out%name=pt_grid_default%name |
---|
| 313 | pt_grid_out%has_name=.TRUE. |
---|
| 314 | ELSE |
---|
| 315 | pt_grid_out%has_name=.FALSE. |
---|
| 316 | ENDIF |
---|
| 317 | |
---|
| 318 | IF (pt_grid_in%has_description) THEN |
---|
| 319 | pt_grid_out%description=pt_grid_in%description |
---|
| 320 | pt_grid_out%has_description=.TRUE. |
---|
| 321 | ELSE IF ( pt_grid_default%has_description ) THEN |
---|
| 322 | pt_grid_out%description=pt_grid_default%description |
---|
| 323 | pt_grid_out%has_description=.TRUE. |
---|
| 324 | ELSE |
---|
| 325 | pt_grid_out%has_description=.FALSE. |
---|
| 326 | ENDIF |
---|
| 327 | |
---|
| 328 | END SUBROUTINE grid__apply_default |
---|
| 329 | |
---|
| 330 | END MODULE mod_grid |
---|