source: XMLIO_SERVER/trunk/src/XMLIO/mod_grid.f90 @ 29

Last change on this file since 29 was 29, checked in by ymipsl, 15 years ago

New Features :

  • Les zoom sont maintenant utilisables.
  • Lorsqu'un serveur ne sort pas de données dans un fichier, le fichier n'est pas crée.
  • Lorsqu'un serveur est le seul a sortir un fichier, l'indexation par numero de process est supprimé.
  • Les axes verticaux ont maintenant un attribut << positive [TRUE/FALSE]>>
File size: 9.0 KB
Line 
1MODULE mod_grid
2  USE mod_xmlio_parameters
3  USE mod_sorted_list
4  USE mod_domain
5  USE mod_zoom
6
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
23    TYPE(vector_zoom),POINTER   :: associated_zoom
24    TYPE(zoom),POINTER          :: global_zoom
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
32CONTAINS
33  INCLUDE 'vector_grid_contains.inc'
34
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 
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)
81   ALLOCATE(pt_grid%associated_zoom)
82   
83   CALL domain__new(pt_grid%domain)
84   CALL vector_domain__new(pt_grid%subdomain)
85   CALL sorted_list__new(pt_grid%rank_ids)
86   CALL vector_zoom__new(pt_grid%associated_zoom)
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
99   
100   CALL grid__get_new_zoom(pt_grid,pt_grid%global_zoom,id)
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
171    TYPE(zoom),POINTER :: pt_zoom
172   
173    REAL,ALLOCATABLE :: lon(:,:)
174    REAL,ALLOCATABLE :: lat(:,:)
175    INTEGER :: ib,ie,jb,je,ni,nj,ibegin,jbegin,iend,jend
176    INTEGER :: i
177   
178      ALLOCATE(pt_grid%ranks(1:pt_grid%subdomain%size))
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)
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
231
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           
239      DEALLOCATE(lon)
240      DEALLOCATE(lat)
241     
242    END SUBROUTINE grid__process_domain
243     
244           
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     
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
330END MODULE mod_grid
Note: See TracBrowser for help on using the repository browser.