LMDZ
conf_dat_m.F90
Go to the documentation of this file.
1 MODULE conf_dat_m
2 !
3 !*******************************************************************************
4 
5  PRIVATE
6  PUBLIC :: conf_dat2d, conf_dat3d
7 
8 
9 CONTAINS
10 
11 
12 !-------------------------------------------------------------------------------
13 !
14 SUBROUTINE conf_dat2d(title, xd, yd, xf, yf, champd, interbar)
15 !
16 !-------------------------------------------------------------------------------
17 ! Author: P. Le Van
18 !-------------------------------------------------------------------------------
19 ! Purpose: Configure the 2D data field "champd" so that:
20 ! - Longitudes are in [ -pi pi ]
21 ! - Latitudes are in [ pi/2. -pi/2 ]
22 ! * xd / yd are initial lon / lats.
23 ! * xf / yf are output lon / lats, possibly modified to satisfy configuration.
24 ! * interbar is TRUE for barycentric interpolation.
25 !-------------------------------------------------------------------------------
26  USE assert_eq_m, ONLY: assert_eq
27  IMPLICIT NONE
28 !-------------------------------------------------------------------------------
29 ! Arguments:
30  CHARACTER(LEN=*), INTENT(IN) :: title
31  REAL, INTENT(IN) :: xd(:), yd(:) ! dim (lons) (lats)
32  REAL, INTENT(INOUT) :: xf(:), yf(:) ! dim (lons) (lats)
33  REAL, INTENT(INOUT) :: champd(:,:) ! dim (lons,lats)
34  LOGICAL, INTENT(IN) :: interbar
35 !-------------------------------------------------------------------------------
36 ! Local variables:
37  CHARACTER(LEN=256) :: modname="conf_dat2d"
38  INTEGER :: i, j, ip180, ind, lons, lats
39  LOGICAL :: radlon, invlon ,radlat, invlat
40  REAL :: pi, pis2, depi, rlatmin, rlatmax, oldxd1
41  REAL, ALLOCATABLE :: xtemp(:) , ytemp(:), champf(:,:)
42 !-------------------------------------------------------------------------------
43  lons=assert_eq(SIZE(xd),SIZE(xf),SIZE(champd,1),trim(modname)//" lons")
44  lats=assert_eq(SIZE(yd),SIZE(yf),SIZE(champd,2),trim(modname)//" lats")
45  ALLOCATE(xtemp(lons),ytemp(lats)); xtemp(:)=xd(:); ytemp(:)=yd(:)
46  ALLOCATE(champf(lons,lats))
47  pi = 2. * asin(1.)
48  pis2 = pi/2.
49  depi = 2. * pi
50  radlon=.false.; invlon=.false.
51  IF (xtemp(1)>=-pi-0.5.AND.xtemp(lons)<= pi+0.5) THEN
52  radlon = .true.; invlon = .false.
53  ELSE IF(xtemp(1)>= -0.5.AND.xtemp(lons)<=depi+0.5) THEN
54  radlon = .true.; invlon = .true.
55  ELSE IF(xtemp(1)>= -180.5.AND.xtemp(lons)<= 180.5) THEN
56  radlon = .false.; invlon = .false.
57  ELSE IF(xtemp(1)>= -0.5.AND.xtemp(lons)<= 360.5) THEN
58  radlon = .false.; invlon = .true.
59  else; WRITE(6,*) 'Problems with data longitudes for file '//trim(title)
60  END IF
61  invlat = ytemp(1)<ytemp(lats)
62  rlatmin = min( ytemp(1), ytemp(lats) )
63  rlatmax = max( ytemp(1), ytemp(lats) )
64 
65  IF (rlatmin>=-pis2-0.5.AND.rlatmax<=pis2+0.5) then; radlat = .true.
66  ELSE IF(rlatmin>= -90.-0.5.AND.rlatmax<= 90.+0.5) then; radlat = .false.
67  else; WRITE(6,*) 'Problems with data latitudes for file '//trim(title)
68  END IF
69 
70  IF(.NOT.radlon) xtemp(:)=xtemp(:)*pi/180.
71  IF(.NOT.radlat) ytemp(:)=ytemp(:)*pi/180.
72 
73 !--- FLIPPED LONGITUDES
74  IF(invlon) THEN
75  champf(:,:)=champd(:,:); xf(:)=xtemp(:)
76 
77  !--- Longitudes rotated to get them in [ -pi pi] interval.
78  DO i=1,lons; IF(xf(i)>pi) exit; end do; ip180 = i
79  DO i=1,lons; IF(xf(i)>pi) xf(i)=xf(i)-depi; END DO
80  DO i= ip180,lons; ind=i-ip180+1; xtemp(ind)=xf(i); END DO
81  DO i= ind+1,lons; xtemp(i )=xf(i-ind); END DO
82 
83  !--- Longitudes rotated in champf
84  DO j=1,lats
85  DO i=ip180,lons; ind=i-ip180+1; champd(ind,j)=champf(i ,j); END DO
86  DO i=ind+1,lons; champd(i ,j)=champf(i-ind,j); END DO
87  END DO
88  END IF
89 
90 !--- FLIPPED LATITUDES
91  IF(invlat) THEN
92  yf(:)=ytemp(:)
93  champf(:,:)=champd(:,:)
94  ytemp(lats:1:-1)=yf(:)
95  DO j=1,lats; champd(:,lats-j+1)=champf(:,j); END DO
96  END IF
97 
98 !--- FOR BARYCENTRIC INTERPOLATION
99  IF(interbar) THEN
100  oldxd1 = xtemp(1)
101  xtemp(1:lons-1)=0.5*(xtemp(1:lons-1)+xtemp(2:lons))
102  xtemp( lons )=0.5*(xtemp( lons )+oldxd1+depi)
103  ytemp(1:lats-1)=0.5*(ytemp(1:lats-1)+ytemp(2:lats))
104  END IF
105  DEALLOCATE(champf)
106  xf(:)=xtemp(:); DEALLOCATE(xtemp)
107  yf(:)=ytemp(:); DEALLOCATE(ytemp)
108 
109 END SUBROUTINE conf_dat2d
110 !
111 !-------------------------------------------------------------------------------
112 
113 
114 !-------------------------------------------------------------------------------
115 !
116 SUBROUTINE conf_dat3d(title, xd, yd, zd, xf, yf, zf, champd, interbar)
117 !
118 !-------------------------------------------------------------------------------
119 ! Author: P. Le Van
120 !-------------------------------------------------------------------------------
121 ! Purpose: Configure the 3D data field "champd" so that:
122 ! - Longitudes are in [ -pi pi ]
123 ! - Latitudes are in [ pi/2. -pi/2 ]
124 ! - Vertical levels from ground to model top (in Pascals)
125 ! * xd / yd are initial lon / lats.
126 ! * xf / yf are output lon / lats, possibly modified to satisfy configuration.
127 ! * zf are output pressures
128 ! * interbar is TRUE for barycentric interpolation.
129 !-------------------------------------------------------------------------------
130  USE assert_eq_m, ONLY: assert_eq
131  IMPLICIT NONE
132 !-------------------------------------------------------------------------------
133 ! Arguments:
134  CHARACTER(LEN=*), INTENT(IN) :: title
135  REAL, INTENT(IN) :: xd(:), yd(:), zd(:) ! (lons) (lats) (levs)
136  REAL, INTENT(INOUT) :: xf(:), yf(:), zf(:) ! (lons) (lats) (levs)
137  REAL, INTENT(INOUT) :: champd(:,:,:) ! (lons,lats,levs)
138  LOGICAL, INTENT(IN) :: interbar
139 !-------------------------------------------------------------------------------
140 ! Local variables:
141  CHARACTER(LEN=256) :: modname="conf_dat3d"
142  INTEGER :: i, j, l, ip180, ind, lons, lats, levs
143  LOGICAL :: radlon, invlon ,radlat, invlat, invlev
144  REAL :: pi, pis2, depi, presmax, rlatmin, rlatmax, oldxd1
145  REAL, ALLOCATABLE :: xtemp(:) , ytemp(:), ztemp(:), champf(:,:,:)
146 !-------------------------------------------------------------------------------
147  lons=assert_eq(SIZE(xd),SIZE(xf),SIZE(champd,1),trim(modname)//" lons")
148  lats=assert_eq(SIZE(yd),SIZE(yf),SIZE(champd,2),trim(modname)//" lats")
149  levs=assert_eq(SIZE(zd),SIZE(zf),SIZE(champd,3),trim(modname)//" levs")
150  ALLOCATE(xtemp(lons),ytemp(lats),ztemp(levs),champf(lons,lats,levs))
151  xtemp(:)=xd(:); ytemp(:)=yd(:); ztemp(:)=zd(:)
152  pi = 2. * asin(1.)
153  pis2 = pi/2.
154  depi = 2. * pi
155  radlon=.false.; invlon=.false.
156  IF (xtemp(1)>=-pi-0.5.AND.xtemp(lons)<= pi+0.5) THEN
157  radlon = .true.; invlon = .false.
158  ELSE IF(xtemp(1)>= -0.5.AND.xtemp(lons)<=depi+0.5) THEN
159  radlon = .true.; invlon = .true.
160  ELSE IF(xtemp(1)>= -180.5.AND.xtemp(lons)<= 180.5) THEN
161  radlon = .false.; invlon = .false.
162  ELSE IF(xtemp(1)>= -0.5.AND.xtemp(lons)<= 360.5) THEN
163  radlon = .false.; invlon = .true.
164  else; WRITE(6,*) 'Problems with data longitudes for file '//trim(title)
165  END IF
166  invlat = ytemp(1)<ytemp(lats)
167  rlatmin = min( ytemp(1), ytemp(lats) )
168  rlatmax = max( ytemp(1), ytemp(lats) )
169 
170  IF (rlatmin>=-pis2-0.5.AND.rlatmax<=pis2+0.5) then; radlat = .true.
171  ELSE IF(rlatmin>= -90.-0.5.AND.rlatmax<= 90.+0.5) then; radlat = .false.
172  else; WRITE(6,*) 'Problems with data latitudes for file '//trim(title)
173  END IF
174 
175  IF(.NOT.radlon) xtemp(:)=xtemp(:)*pi/180.
176  IF(.NOT.radlat) ytemp(:)=ytemp(:)*pi/180.
177 
178 !--- FLIPPED LONGITUDES
179  IF(invlon) THEN
180  champf(:,:,:)=champd(:,:,:); xf(:)=xtemp(:)
181 
182  !--- Longitudes rotated to get them in [ -pi pi] interval.
183  DO i=1,lons; IF(xf(i)>pi) exit; end do; ip180 = i
184  DO i=1,lons; IF(xf(i)>pi) xf(i)=xf(i)-depi; END DO
185  DO i= ip180,lons; ind=i-ip180+1; xtemp(ind)=xf(i); END DO
186  DO i= ind+1,lons; xtemp(i )=xf(i-ind); END DO
187 
188  !--- Longitudes rotated in champf
189  DO l=1,levs
190  DO j=1,lats
191  DO i=ip180,lons; ind=i-ip180+1; champd(ind,j,l)=champf(i ,j,l); END DO
192  DO i=ind+1,lons; champd(i ,j,l)=champf(i-ind,j,l); END DO
193  END DO
194  END DO
195  END IF
196 
197 !--- FLIPPED LATITUDES
198  IF(invlat) THEN
199  yf(:)=ytemp(:)
200  champf(:,:,:)=champd(:,:,:)
201  ytemp(lats:1:-1)=yf(:)
202  DO l=1,levs
203  DO j=1,lats; champd(:,lats-j+1,l)=champf(:,j,l); END DO
204  END DO
205  END IF
206 
207 !--- FOR BARYCENTRIC INTERPOLATION
208  IF(interbar) THEN
209  oldxd1 = xtemp(1)
210  xtemp(1:lons-1)=0.5*(xtemp(1:lons-1)+xtemp(2:lons))
211  xtemp( lons )=0.5*(xtemp( lons )+oldxd1+depi)
212  ytemp(1:lats-1)=0.5*(ytemp(1:lats-1)+ytemp(2:lats))
213  END IF
214 
215 !--- FLIPPED LEVELS
216  invlev=ztemp(1)<ztemp(levs)
217  IF(max(ztemp(1),ztemp(levs))<1200.) ztemp(:)=ztemp(:)*100.
218  IF(invlev) THEN
219  zf(:)=ztemp(:)
220  champf(:,:,:)=champd(:,:,:)
221  ztemp(levs:1:-1)=zf(:)
222  DO l=1,levs; champd(:,:,levs+1-l)=champf(:,:,l); END DO
223  END IF
224 
225  DEALLOCATE(champf)
226  xf(:)=xtemp(:); DEALLOCATE(xtemp)
227  yf(:)=ytemp(:); DEALLOCATE(ytemp)
228  zf(:)=ztemp(:); DEALLOCATE(ztemp)
229 
230 END SUBROUTINE conf_dat3d
231 !
232 !-------------------------------------------------------------------------------
233 
234 END MODULE conf_dat_m
235 
subroutine, public conf_dat2d(title, xd, yd, xf, yf, champd, interbar)
Definition: conf_dat_m.F90:15
subroutine, public conf_dat3d(title, xd, yd, zd, xf, yf, zf, champd, interbar)
Definition: conf_dat_m.F90:117
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true