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

Last change on this file since 46 was 46, checked in by ymipsl, 13 years ago

Ligne trop longue sous SX (>132 caractÚres)

YM

File size: 10.6 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
32  INTERFACE grid__set_attribut
33    MODULE PROCEDURE grid__set_attribut_id,grid__set_attribut_pt
34  END INTERFACE
35
36CONTAINS
37  INCLUDE 'vector_grid_contains.inc'
38
39  SUBROUTINE grid__swap_context(saved_grid_Ids,saved_Ids)
40  IMPLICIT NONE
41    TYPE(vector_grid),POINTER          :: saved_grid_Ids
42    TYPE(sorted_list),POINTER          :: saved_Ids 
43   
44    grid_ids=>saved_grid_ids
45    ids=>saved_ids
46  END SUBROUTINE grid__swap_context
47 
48 
49  SUBROUTINE grid__init
50  IMPLICIT NONE
51   
52    CALL vector_grid__new(grid_Ids)
53    CALL sorted_list__new(Ids)
54   
55  END SUBROUTINE grid__init
56 
57  SUBROUTINE grid__get(Id,Pt_grid)
58  USE string_function
59  IMPLICIT NONE
60    CHARACTER(LEN=*),INTENT(IN)     :: Id
61    TYPE(grid),POINTER              :: Pt_grid
62
63    INTEGER                         :: Pos
64    LOGICAL                         :: success
65   
66    CALL sorted_list__find(Ids,hash(Id),Pos,success)
67    IF (success) THEN
68      Pt_grid=>grid_ids%at(Pos)%Pt
69    ELSE
70      Pt_grid=>NULL()
71    ENDIF
72   
73  END SUBROUTINE grid__get
74 
75  SUBROUTINE grid__new(pt_grid,Id)
76  USE string_function
77  IMPLICIT NONE
78   TYPE(grid), POINTER           :: pt_grid
79   CHARACTER(LEN=*),OPTIONAL     :: Id
80   INTEGER                       :: Pos
81   
82   ALLOCATE(pt_grid%domain)
83   ALLOCATE(pt_grid%subdomain)
84   ALLOCATE(pt_grid%rank_ids)
85   ALLOCATE(pt_grid%associated_zoom)
86   
87   CALL domain__new(pt_grid%domain)
88   CALL vector_domain__new(pt_grid%subdomain)
89   CALL sorted_list__new(pt_grid%rank_ids)
90   CALL vector_zoom__new(pt_grid%associated_zoom)
91   
92   pt_grid%has_id          = .FALSE.
93   pt_grid%has_name        = .FALSE.
94   pt_grid%has_description = .FALSE.
95   pt_grid%has_dimension   = .FALSE.
96   
97   IF (PRESENT(Id)) THEN
98     Pt_grid%id=TRIM(ADJUSTL(Id))
99     Pt_grid%has_id=.TRUE.
100     CALL vector_grid__set_new(grid_Ids,Pt_grid,Pos)
101     CALL sorted_list__Add(Ids,hash(id),Pos)
102   ENDIF
103   
104   CALL grid__get_new_zoom(pt_grid,pt_grid%global_zoom,id)
105
106 END SUBROUTINE grid__new
107
108  SUBROUTINE grid__set(pt_grid, name, description)
109  IMPLICIT NONE
110    TYPE(grid), POINTER :: pt_grid
111    CHARACTER(len=*)  ,OPTIONAL :: name
112    CHARACTER(len=*)  ,OPTIONAL :: description
113
114    IF (PRESENT(name)) THEN
115        pt_grid%name=TRIM(ADJUSTL(name))
116        pt_grid%has_name = .TRUE.
117    ENDIF
118
119    IF (PRESENT(description)) THEN
120        pt_grid%description=TRIM(ADJUSTL(description))
121        pt_grid%has_description = .TRUE.
122    ENDIF
123
124  END SUBROUTINE grid__set
125
126
127  SUBROUTINE grid__set_attribut_id(id,attrib,ok)
128  USE mod_attribut
129  USE error_msg
130  IMPLICIT NONE
131    CHARACTER(LEN=*),INTENT(IN)   :: id
132    TYPE(attribut),INTENT(IN)     :: attrib
133    LOGICAL,OPTIONAL,INTENT(OUT)  :: ok
134   
135    TYPE(grid),POINTER              :: Pt_grid
136    INTEGER                         :: Pos
137    LOGICAL                         :: success
138   
139    CALL sorted_list__find(Ids,hash(Id),Pos,success)
140    IF (success) THEN
141      Pt_grid=>grid_ids%at(Pos)%Pt
142      CALL grid__set_attribut_pt(Pt_grid,attrib)
143      IF (PRESENT(OK)) OK=.TRUE.
144    ELSE
145      IF (.NOT.PRESENT(OK)) THEN
146        WRITE(message,*) 'grid id :',id,'is undefined'
147        CALL error('mod_grid::grid__set_attribut')
148      ELSE
149        OK=.FALSE.
150      ENDIF
151    ENDIF 
152 
153  END SUBROUTINE grid__set_attribut_id
154     
155  SUBROUTINE grid__set_attribut_pt(Pt_grid,attrib)
156  USE mod_attribut
157  USE mod_grid_attribut
158  USE error_msg
159  IMPLICIT NONE
160    TYPE(grid),POINTER        :: Pt_grid
161    TYPE(attribut),INTENT(IN) :: attrib
162   
163    SELECT CASE(attrib%name)
164      CASE (grid__name)
165        IF (attrib%type==string0) CALL  grid__set(pt_grid,name=attrib%string0_ptr) ; RETURN
166      CASE (grid__description)
167        IF (attrib%type==string0) CALL  grid__set(pt_grid,description=attrib%string0_ptr) ; RETURN
168     END SELECT
169
170     WRITE(message,*) 'grid attribut ',attrib%name,' : type :',attrib%type,      &
171                      ' : Attribute type is incompatible with the provided value'
172     CALL error('mod_grid::grid__set_attribut')
173   
174  END SUBROUTINE grid__set_attribut_pt
175 
176  SUBROUTINE grid__set_dimension(pt_grid, ni, nj)
177  IMPLICIT NONE
178    TYPE(grid), POINTER   :: pt_grid
179    INTEGER,INTENT(IN)    :: ni
180    INTEGER,INTENT(IN)    :: nj
181   
182    pt_grid%ni=ni
183    pt_grid%nj=nj
184    pt_grid%has_dimension=.TRUE.
185   
186  END SUBROUTINE grid__set_dimension
187   
188
189  SUBROUTINE grid__get_new_subdomain(Pt_grid,rank,pt_domain)
190  IMPLICIT NONE
191    TYPE(grid), POINTER   :: pt_grid
192    INTEGER,INTENT(IN)    :: rank
193    TYPE(domain), POINTER :: Pt_domain
194   
195    INTEGER :: Pos
196   
197    CALL vector_domain__get_new(pt_grid%subdomain,pt_domain,Pos)
198    CALL sorted_list__add(pt_grid%rank_ids,rank,Pos)
199    CALL domain__new(pt_domain)
200   
201  END SUBROUTINE grid__get_new_subdomain   
202
203  SUBROUTINE grid__get_subdomain(Pt_grid,rank,pt_domain)
204  IMPLICIT NONE
205    TYPE(grid), POINTER     :: pt_grid
206    INTEGER,INTENT(IN)      :: rank
207    TYPE(domain), POINTER   :: Pt_domain
208
209    INTEGER    :: rank_id
210    LOGICAL    :: success
211
212    CALL sorted_list__find(pt_grid%rank_ids,rank,rank_id,success)
213    IF (success) THEN
214      pt_domain=>pt_grid%subdomain%at(rank_id)%pt
215    ELSE
216      !! message d'erreur
217   ENDIF
218
219  END SUBROUTINE grid__get_subdomain
220   
221  SUBROUTINE grid__process_domain(Pt_grid)
222  IMPLICIT NONE
223    TYPE(grid), POINTER  :: pt_grid
224    TYPE(domain),POINTER :: subdomain
225    TYPE(zoom),POINTER :: pt_zoom
226   
227    REAL,ALLOCATABLE :: lon(:,:)
228    REAL,ALLOCATABLE :: lat(:,:)
229    INTEGER :: ib,ie,jb,je,ni,nj,ibegin,jbegin,iend,jend
230    INTEGER :: i
231   
232      ALLOCATE(pt_grid%ranks(1:pt_grid%subdomain%size))
233
234      DO i=1,pt_grid%subdomain%size
235        subdomain=>pt_grid%subdomain%at(i)%pt
236        IF (i==1) THEN
237          ib=subdomain%ibegin
238          ie=subdomain%iend   
239          jb=subdomain%jbegin
240          je=subdomain%jend
241        ELSE
242          IF (subdomain%ibegin<ib) ib=subdomain%ibegin
243          IF (subdomain%iend>ie) ie=subdomain%iend
244          IF (subdomain%jbegin<jb) jb=subdomain%jbegin
245          IF (subdomain%jend>je) je=subdomain%jend
246        ENDIF
247        pt_grid%ranks(subdomain%rank)=i
248      ENDDO
249     
250      ni=ie-ib+1
251      nj=je-jb+1
252      ibegin=ib
253      jbegin=jb
254     
255      ALLOCATE(lon(ni,nj))
256      ALLOCATE(lat(ni,nj))
257     
258      DO i=1,pt_grid%subdomain%size
259        subdomain=>pt_grid%subdomain%at(i)%pt
260        ib=subdomain%ibegin-ibegin+1
261        ie=subdomain%iend-ibegin+1   
262        jb=subdomain%jbegin-jbegin+1
263        je=subdomain%jend-jbegin+1
264        lon(ib:ie,jb:je)=subdomain%lon(:,:)
265        lat(ib:ie,jb:je)=subdomain%lat(:,:)
266      ENDDO
267     
268      CALL domain__set(pt_grid%domain,0,ni,nj,ibegin,jbegin,lon,lat)
269      iend=ibegin+ni-1
270      jend=jbegin+nj-1
271     
272     
273      pt_grid%global_zoom%ni_glo=pt_grid%ni
274      pt_grid%global_zoom%nj_glo=pt_grid%nj
275      pt_grid%global_zoom%ibegin_glo=1     
276      pt_grid%global_zoom%jbegin_glo=1
277     
278      DO i=1,pt_grid%associated_zoom%size
279        pt_zoom=>pt_grid%associated_zoom%at(i)%pt
280       
281        ib=MAX(pt_zoom%ibegin_glo-ibegin+1,1)
282        ie=MIN(pt_zoom%ibegin_glo+pt_zoom%ni_glo-ibegin,ni)
283        pt_zoom%ni_loc=MAX(ie-ib+1,0)
284        pt_zoom%ibegin_loc=ib
285
286        jb=MAX(pt_zoom%jbegin_glo-jbegin+1,1)
287        je=MIN(pt_zoom%jbegin_glo+pt_zoom%nj_glo-jbegin,nj)
288        pt_zoom%nj_loc=MAX(je-jb+1,0)
289        pt_zoom%jbegin_loc=jb
290      ENDDO
291                 
292           
293      DEALLOCATE(lon)
294      DEALLOCATE(lat)
295     
296    END SUBROUTINE grid__process_domain
297     
298           
299  SUBROUTINE grid__get_new_zoom(pt_grid,pt_zoom,zoom_id)
300  USE string_function
301  IMPLICIT NONE
302    TYPE(grid), POINTER                      :: pt_grid
303    TYPE(zoom),POINTER                       :: pt_zoom
304    CHARACTER(LEN=*),INTENT(IN),OPTIONAL     :: zoom_id
305    LOGICAL                                  :: success
306   
307     CALL vector_zoom__get_new(pt_grid%associated_zoom,Pt_zoom)
308     CALL zoom__new(Pt_zoom,zoom_id)
309   
310   END SUBROUTINE grid__get_new_zoom
311     
312  SUBROUTINE grid__print(pt_grid)
313  IMPLICIT NONE
314    TYPE(grid), POINTER  :: pt_grid
315    INTEGER              :: i
316   
317    PRINT *,"---- GRID ----"
318   
319    IF (pt_grid%has_id) THEN
320      PRINT *,"id = ",TRIM(pt_grid%id)
321    ELSE
322      PRINT *,"id undefined"
323    ENDIF
324   
325    IF (pt_grid%has_name) THEN
326      PRINT *,"name = ",TRIM(pt_grid%name)
327    ELSE
328      PRINT *,"name undefined"
329    ENDIF
330   
331    IF (pt_grid%has_description) THEN
332      PRINT *,"description = ",TRIM(pt_grid%description)
333    ELSE
334      PRINT *,"description undefined"
335    ENDIF
336   
337    IF (pt_grid%has_dimension) THEN
338      PRINT *,"Global grid dimension :"
339      PRINT *,"   ni =",pt_grid%ni
340      PRINT *,"   nj =",pt_grid%nj
341    ELSE
342      PRINT *,"Global dimension ni, nj undefined"
343    ENDIF
344   
345    PRINT *,"grid domain :"
346    CALL domain__print(pt_grid%domain)
347   
348    PRINT *,"grid subdomain :",pt_grid%subdomain%size
349   
350    DO i=1,pt_grid%subdomain%size
351      CALL domain__print(pt_grid%subdomain%at(i)%pt)
352    ENDDO
353   
354    PRINT *,"--------------"
355   
356  END SUBROUTINE grid__print
357
358  SUBROUTINE grid__apply_default(pt_grid_default, pt_grid_in, pt_grid_out)
359
360    TYPE(grid), POINTER :: pt_grid_default, pt_grid_in, pt_grid_out
361
362    IF (pt_grid_in%has_name) THEN
363        pt_grid_out%name=pt_grid_in%name
364        pt_grid_out%has_name=.TRUE.
365    ELSE IF ( pt_grid_default%has_name) THEN
366        pt_grid_out%name=pt_grid_default%name
367        pt_grid_out%has_name=.TRUE.
368    ELSE
369        pt_grid_out%has_name=.FALSE.
370    ENDIF
371       
372    IF (pt_grid_in%has_description) THEN
373        pt_grid_out%description=pt_grid_in%description
374        pt_grid_out%has_description=.TRUE.
375    ELSE IF ( pt_grid_default%has_description ) THEN
376        pt_grid_out%description=pt_grid_default%description
377        pt_grid_out%has_description=.TRUE.
378    ELSE
379        pt_grid_out%has_description=.FALSE.
380    ENDIF
381 
382  END SUBROUTINE grid__apply_default
383
384END MODULE mod_grid
Note: See TracBrowser for help on using the repository browser.