source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/mod_grid_phy_lmdz.F90 @ 263

Last change on this file since 263 was 227, checked in by milmd, 10 years ago

Last LMDZ version (1315) with OpenMP directives and other stuff

File size: 11.7 KB
Line 
1!
2!$Header$
3!
4MODULE mod_grid_phy_lmdz
5
6  PUBLIC
7  PRIVATE :: grid1dTo2d_glo_igen, grid1dTo2d_glo_rgen, grid1dTo2d_glo_lgen, &
8             grid2dTo1d_glo_igen, grid2dTo1d_glo_rgen, grid2dTo1d_glo_lgen
9
10  INTEGER,SAVE :: nbp_lon  ! == iim
11  INTEGER,SAVE :: nbp_lat  ! == jjmp1
12  INTEGER,SAVE :: nbp_lev  ! == llm
13  INTEGER,SAVE :: klon_glo
14!$OMP THREADPRIVATE(nbp_lon,nbp_lat,nbp_lev,klon_glo)
15
16  INTERFACE grid1dTo2d_glo
17    MODULE PROCEDURE grid1dTo2d_glo_i,grid1dTo2d_glo_i1,grid1dTo2d_glo_i2,grid1dTo2d_glo_i3, &
18                     grid1dTo2d_glo_r,grid1dTo2d_glo_r1,grid1dTo2d_glo_r2,grid1dTo2d_glo_r3, &
19                     grid1dTo2d_glo_l,grid1dTo2d_glo_l1,grid1dTo2d_glo_l2,grid1dTo2d_glo_l3
20   END INTERFACE
21
22   INTERFACE grid2dTo1d_glo
23    MODULE PROCEDURE grid2dTo1d_glo_i,grid2dTo1d_glo_i1,grid2dTo1d_glo_i2,grid2dTo1d_glo_i3, &
24                     grid2dTo1d_glo_r,grid2dTo1d_glo_r1,grid2dTo1d_glo_r2,grid2dTo1d_glo_r3, &
25                     grid2dTo1d_glo_l,grid2dTo1d_glo_l1,grid2dTo1d_glo_l2,grid2dTo1d_glo_l3
26   END INTERFACE
27 
28CONTAINS
29
30!!!!!!!!!!!!!!!!!!!!!!!!!!!!
31!! SUBROUTINE grid1dTo2d  !! 
32!!!!!!!!!!!!!!!!!!!!!!!!!!!!
33
34
35  SUBROUTINE init_grid_phy_lmdz(iim,jjp1,nbp,llm)
36  IMPLICIT NONE
37  INTEGER, INTENT(in) :: iim
38  INTEGER, INTENT(in) :: jjp1
39  INTEGER, INTENT(in) :: nbp
40  INTEGER, INTENT(in) :: llm
41 
42    nbp_lon=iim
43    nbp_lat=jjp1
44    nbp_lev=llm
45    klon_glo=nbp
46 
47  ! Ehouarn: handle 1D case:
48  if ((iim.eq.1).and.(jjp1.eq.2)) then
49    nbp_lat=1
50    klon_glo=1
51  endif
52 
53  END SUBROUTINE init_grid_phy_lmdz
54 
55 
56  SUBROUTINE grid1dTo2d_glo_i(VarIn,VarOut) 
57  IMPLICIT NONE 
58    INTEGER,INTENT(IN),DIMENSION(:)     :: VarIn
59    INTEGER,INTENT(OUT),DIMENSION(:,:)  :: VarOut
60   
61    CALL grid1dTo2d_glo_igen(VarIn,VarOut,1)
62 
63  END SUBROUTINE grid1dTo2d_glo_i
64 
65
66  SUBROUTINE grid1dTo2d_glo_i1(VarIn,VarOut) 
67  IMPLICIT NONE 
68    INTEGER,INTENT(IN),DIMENSION(:,:)     :: VarIn
69    INTEGER,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
70   
71    CALL grid1dTo2d_glo_igen(VarIn,VarOut,size(VarIn,2))
72 
73  END SUBROUTINE grid1dTo2d_glo_i1
74
75  SUBROUTINE grid1dTo2d_glo_i2(VarIn,VarOut) 
76  IMPLICIT NONE 
77    INTEGER,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
78    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
79   
80    CALL grid1dTo2d_glo_igen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
81 
82  END SUBROUTINE grid1dTo2d_glo_i2
83 
84  SUBROUTINE grid1dTo2d_glo_i3(VarIn,VarOut) 
85  IMPLICIT NONE 
86    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
87    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
88   
89    CALL grid1dTo2d_glo_igen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
90 
91  END SUBROUTINE grid1dTo2d_glo_i3
92
93
94  SUBROUTINE grid1dTo2d_glo_r(VarIn,VarOut) 
95  IMPLICIT NONE 
96    REAL,INTENT(IN),DIMENSION(:)     :: VarIn
97    REAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
98   
99    CALL grid1dTo2d_glo_rgen(VarIn,VarOut,1)
100 
101  END SUBROUTINE grid1dTo2d_glo_r
102 
103
104  SUBROUTINE grid1dTo2d_glo_r1(VarIn,VarOut) 
105  IMPLICIT NONE 
106    REAL,INTENT(IN),DIMENSION(:,:)     :: VarIn
107    REAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
108   
109    CALL grid1dTo2d_glo_rgen(VarIn,VarOut,size(VarIn,2))
110 
111  END SUBROUTINE grid1dTo2d_glo_r1
112
113  SUBROUTINE grid1dTo2d_glo_r2(VarIn,VarOut) 
114  IMPLICIT NONE 
115    REAL,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
116    REAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
117   
118    CALL grid1dTo2d_glo_rgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
119 
120  END SUBROUTINE grid1dTo2d_glo_r2
121 
122  SUBROUTINE grid1dTo2d_glo_r3(VarIn,VarOut) 
123  IMPLICIT NONE 
124    REAL,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
125    REAL,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
126   
127    CALL grid1dTo2d_glo_rgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
128 
129  END SUBROUTINE grid1dTo2d_glo_r3
130 
131 
132 
133  SUBROUTINE grid1dTo2d_glo_l(VarIn,VarOut) 
134  IMPLICIT NONE 
135    LOGICAL,INTENT(IN),DIMENSION(:)     :: VarIn
136    LOGICAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
137   
138    CALL grid1dTo2d_glo_lgen(VarIn,VarOut,1)
139 
140  END SUBROUTINE grid1dTo2d_glo_l
141 
142
143  SUBROUTINE grid1dTo2d_glo_l1(VarIn,VarOut) 
144  IMPLICIT NONE 
145    LOGICAL,INTENT(IN),DIMENSION(:,:)     :: VarIn
146    LOGICAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
147   
148    CALL grid1dTo2d_glo_lgen(VarIn,VarOut,size(VarIn,2))
149 
150  END SUBROUTINE grid1dTo2d_glo_l1
151
152  SUBROUTINE grid1dTo2d_glo_l2(VarIn,VarOut) 
153  IMPLICIT NONE 
154    LOGICAL,INTENT(IN),DIMENSION(:,:,:)     :: VarIn
155    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
156   
157    CALL grid1dTo2d_glo_lgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3))
158 
159  END SUBROUTINE grid1dTo2d_glo_l2
160 
161  SUBROUTINE grid1dTo2d_glo_l3(VarIn,VarOut) 
162  IMPLICIT NONE 
163    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:)     :: VarIn
164    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:,:)  :: VarOut
165   
166    CALL grid1dTo2d_glo_lgen(VarIn,VarOut,size(VarIn,2)*size(VarIn,3)*size(VarIn,4))
167 
168  END SUBROUTINE grid1dTo2d_glo_l3 
169 
170    SUBROUTINE grid2dTo1d_glo_i(VarIn,VarOut) 
171  IMPLICIT NONE 
172    INTEGER,INTENT(IN),DIMENSION(:,:) :: VarIn
173    INTEGER,INTENT(OUT),DIMENSION(:)  :: VarOut
174   
175    CALL grid2dTo1d_glo_igen(VarIn,VarOut,1)
176 
177  END SUBROUTINE grid2dTo1d_glo_i
178 
179
180  SUBROUTINE grid2dTo1d_glo_i1(VarIn,VarOut) 
181  IMPLICIT NONE 
182    INTEGER,INTENT(IN),DIMENSION(:,:,:) :: VarIn
183    INTEGER,INTENT(OUT),DIMENSION(:,:)  :: VarOut
184   
185    CALL grid2dTo1d_glo_igen(VarIn,VarOut,size(VarIn,3))
186 
187  END SUBROUTINE grid2dTo1d_glo_i1
188
189  SUBROUTINE grid2dTo1d_glo_i2(VarIn,VarOut) 
190  IMPLICIT NONE 
191    INTEGER,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
192    INTEGER,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
193   
194    CALL grid2dTo1d_glo_igen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
195 
196  END SUBROUTINE grid2dTo1d_glo_i2
197 
198  SUBROUTINE grid2dTo1d_glo_i3(VarIn,VarOut) 
199  IMPLICIT NONE 
200    INTEGER,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
201    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
202   
203    CALL grid2dTo1d_glo_igen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
204 
205  END SUBROUTINE grid2dTo1d_glo_i3
206 
207
208
209
210  SUBROUTINE grid2dTo1d_glo_r(VarIn,VarOut) 
211  IMPLICIT NONE 
212    REAL,INTENT(IN),DIMENSION(:,:) :: VarIn
213    REAL,INTENT(OUT),DIMENSION(:)  :: VarOut
214   
215    CALL grid2dTo1d_glo_rgen(VarIn,VarOut,1)
216 
217  END SUBROUTINE grid2dTo1d_glo_r
218 
219
220  SUBROUTINE grid2dTo1d_glo_r1(VarIn,VarOut) 
221  IMPLICIT NONE 
222    REAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
223    REAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
224   
225    CALL grid2dTo1d_glo_rgen(VarIn,VarOut,size(VarIn,3))
226 
227  END SUBROUTINE grid2dTo1d_glo_r1
228
229  SUBROUTINE grid2dTo1d_glo_r2(VarIn,VarOut) 
230  IMPLICIT NONE 
231    REAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
232    REAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
233   
234    CALL grid2dTo1d_glo_rgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
235 
236  END SUBROUTINE grid2dTo1d_glo_r2
237 
238  SUBROUTINE grid2dTo1d_glo_r3(VarIn,VarOut) 
239  IMPLICIT NONE 
240    REAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
241    REAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
242   
243    CALL grid2dTo1d_glo_rgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
244 
245  END SUBROUTINE grid2dTo1d_glo_r3
246
247
248
249  SUBROUTINE grid2dTo1d_glo_l(VarIn,VarOut) 
250  IMPLICIT NONE 
251    LOGICAL,INTENT(IN),DIMENSION(:,:) :: VarIn
252    LOGICAL,INTENT(OUT),DIMENSION(:)  :: VarOut
253   
254    CALL grid2dTo1d_glo_lgen(VarIn,VarOut,1)
255 
256  END SUBROUTINE grid2dTo1d_glo_l
257 
258
259  SUBROUTINE grid2dTo1d_glo_l1(VarIn,VarOut) 
260  IMPLICIT NONE 
261    LOGICAL,INTENT(IN),DIMENSION(:,:,:) :: VarIn
262    LOGICAL,INTENT(OUT),DIMENSION(:,:)  :: VarOut
263   
264    CALL grid2dTo1d_glo_lgen(VarIn,VarOut,size(VarIn,3))
265 
266  END SUBROUTINE grid2dTo1d_glo_l1
267
268  SUBROUTINE grid2dTo1d_glo_l2(VarIn,VarOut) 
269  IMPLICIT NONE 
270    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:) :: VarIn
271    LOGICAL,INTENT(OUT),DIMENSION(:,:,:)  :: VarOut
272   
273    CALL grid2dTo1d_glo_lgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4))
274 
275  END SUBROUTINE grid2dTo1d_glo_l2
276 
277  SUBROUTINE grid2dTo1d_glo_l3(VarIn,VarOut) 
278  IMPLICIT NONE 
279    LOGICAL,INTENT(IN),DIMENSION(:,:,:,:,:) :: VarIn
280    LOGICAL,INTENT(OUT),DIMENSION(:,:,:,:)  :: VarOut
281   
282    CALL grid2dTo1d_glo_lgen(VarIn,VarOut,size(VarIn,3)*size(VarIn,4)*size(VarIn,5))
283 
284  END SUBROUTINE grid2dTo1d_glo_l3
285
286!----------------------------------------------------------------
287!  fonctions generiques (privees)
288!----------------------------------------------------------------
289  SUBROUTINE grid1dTo2d_glo_igen(VarIn,VarOut,dimsize)
290    IMPLICIT NONE
291
292    INTEGER,INTENT(IN) :: dimsize
293    INTEGER,INTENT(IN) ,DIMENSION(klon_glo,dimsize)       :: VarIn
294    INTEGER,INTENT(OUT),DIMENSION(nbp_lon*nbp_lat,dimsize)  :: VarOut
295    INTEGER :: i,ij,Offset
296
297   
298    Offset=nbp_lon
299       
300    DO i=1,dimsize
301      DO ij=1,klon_glo
302        VarOut(ij+offset-1,i)=VarIn(ij,i)
303      ENDDO
304    ENDDO
305   
306   
307    DO i=1,dimsize
308      DO ij=1,nbp_lon
309       VarOut(ij,i)=VarIn(1,i)
310      ENDDO
311    ENDDO
312   
313   
314    DO i=1,dimsize
315      DO ij=nbp_lon*(nbp_lat-1)+1,nbp_lat*nbp_lon
316       VarOut(ij,i)=VarIn(klon_glo,i)
317      ENDDO
318    ENDDO
319
320  END SUBROUTINE grid1dTo2d_glo_igen   
321
322
323  SUBROUTINE grid1dTo2d_glo_rgen(VarIn,VarOut,dimsize)
324    IMPLICIT NONE
325
326    INTEGER,INTENT(IN) :: dimsize
327    REAL,INTENT(IN) ,DIMENSION(klon_glo,dimsize)       :: VarIn
328    REAL,INTENT(OUT),DIMENSION(nbp_lon*nbp_lat,dimsize)  :: VarOut
329    INTEGER :: i,ij,Offset
330
331   
332    Offset=nbp_lon
333       
334    DO i=1,dimsize
335      DO ij=1,klon_glo
336        VarOut(ij+offset-1,i)=VarIn(ij,i)
337      ENDDO
338    ENDDO
339   
340   
341    DO i=1,dimsize
342      DO ij=1,nbp_lon
343       VarOut(ij,i)=VarIn(1,i)
344      ENDDO
345    ENDDO
346   
347   
348    DO i=1,dimsize
349      DO ij=nbp_lon*(nbp_lat-1)+1,nbp_lat*nbp_lon
350       VarOut(ij,i)=VarIn(klon_glo,i)
351      ENDDO
352    ENDDO
353
354  END SUBROUTINE grid1dTo2d_glo_rgen   
355
356  SUBROUTINE grid1dTo2d_glo_lgen(VarIn,VarOut,dimsize)
357    IMPLICIT NONE
358   
359    INTEGER,INTENT(IN) :: dimsize
360    LOGICAL,INTENT(IN) ,DIMENSION(klon_glo,dimsize)       :: VarIn
361    LOGICAL,INTENT(OUT),DIMENSION(nbp_lon*nbp_lat,dimsize)  :: VarOut
362    INTEGER :: i,ij,Offset
363
364    Offset=nbp_lon
365       
366    DO i=1,dimsize
367      DO ij=1,klon_glo
368        VarOut(ij+offset-1,i)=VarIn(ij,i)
369      ENDDO
370    ENDDO
371   
372   
373    DO i=1,dimsize
374      DO ij=1,nbp_lon
375       VarOut(ij,i)=VarIn(1,i)
376      ENDDO
377    ENDDO
378   
379   
380    DO i=1,dimsize
381      DO ij=nbp_lon*(nbp_lat-1)+1,nbp_lat*nbp_lon
382       VarOut(ij,i)=VarIn(klon_glo,i)
383      ENDDO
384    ENDDO
385
386  END SUBROUTINE grid1dTo2d_glo_lgen     
387 
388 
389  SUBROUTINE grid2dTo1d_glo_igen(VarIn,VarOut,dimsize)
390    IMPLICIT NONE
391
392    INTEGER,INTENT(IN) :: dimsize
393    INTEGER,INTENT(IN) ,DIMENSION(nbp_lon*nbp_lat,dimsize) :: VarIn
394    INTEGER,INTENT(OUT),DIMENSION(klon_glo,dimsize)      :: VarOut
395    INTEGER :: i,ij,offset
396
397    offset=nbp_lon
398
399    DO i=1,dimsize
400      DO ij=1,klon_glo
401        VarOut(ij,i)=VarIn(ij+offset-1,i)
402      ENDDO
403    ENDDO
404
405    DO i=1,dimsize
406      VarOut(1,i)=VarIn(1,i)
407    ENDDO
408   
409  END SUBROUTINE grid2dTo1d_glo_igen   
410 
411  SUBROUTINE grid2dTo1d_glo_rgen(VarIn,VarOut,dimsize)
412    IMPLICIT NONE
413
414    INTEGER,INTENT(IN) :: dimsize
415    REAL,INTENT(IN) ,DIMENSION(nbp_lon*nbp_lat,dimsize) :: VarIn
416    REAL,INTENT(OUT),DIMENSION(klon_glo,dimsize)      :: VarOut
417    INTEGER :: i,ij,offset
418
419    offset=nbp_lon
420
421    DO i=1,dimsize
422      DO ij=1,klon_glo
423        VarOut(ij,i)=VarIn(ij+offset-1,i)
424      ENDDO
425    ENDDO
426
427    DO i=1,dimsize
428      VarOut(1,i)=VarIn(1,i)
429    ENDDO
430   
431  END SUBROUTINE grid2dTo1d_glo_rgen 
432   
433  SUBROUTINE grid2dTo1d_glo_lgen(VarIn,VarOut,dimsize)
434    IMPLICIT NONE
435
436    INTEGER,INTENT(IN) :: dimsize
437    LOGICAL,INTENT(IN) ,DIMENSION(nbp_lon*nbp_lat,dimsize) :: VarIn
438    LOGICAL,INTENT(OUT),DIMENSION(klon_glo,dimsize)      :: VarOut
439    INTEGER :: i,ij,offset
440
441    offset=nbp_lon
442
443    DO i=1,dimsize
444      DO ij=1,klon_glo
445        VarOut(ij,i)=VarIn(ij+offset-1,i)
446      ENDDO
447    ENDDO
448
449    DO i=1,dimsize
450      VarOut(1,i)=VarIn(1,i)
451    ENDDO
452   
453  END SUBROUTINE grid2dTo1d_glo_lgen   
454
455END MODULE mod_grid_phy_lmdz
Note: See TracBrowser for help on using the repository browser.