source: codes/icosagcm/trunk/src/etat0_dcmip5.f90 @ 113

Last change on this file since 113 was 113, checked in by ymipsl, 12 years ago

Add dcmip 5 testcase

YM

File size: 9.1 KB
Line 
1MODULE etat0_dcmip5_mod
2  USE icosa
3  PRIVATE
4  REAL(rstd),PARAMETER :: zt=15000
5  REAL(rstd),PARAMETER :: q0=0.021
6  REAL(rstd),PARAMETER :: qt=1e-11
7  REAL(rstd),PARAMETER :: T0=302.15
8  REAL(rstd),PARAMETER :: Ts=302.15
9  REAL(rstd),PARAMETER :: zq1=3000
10  REAL(rstd),PARAMETER :: zq2=8000
11  REAL(rstd),PARAMETER :: Gamma=0.007
12  REAL(rstd),PARAMETER :: pb=101500
13  REAL(rstd),PARAMETER :: Deltap=1115
14  REAL(rstd),PARAMETER :: rp=282000
15  REAL(rstd),PARAMETER :: zp=7000
16  REAL(rstd),PARAMETER :: epsilon=1e-25
17  REAL(rstd),PARAMETER :: Rd=287
18  REAL(rstd) :: lonc
19  REAL(rstd) :: latc
20  TYPE(t_field),POINTER :: f_out_i(:)
21  REAL(rstd),POINTER :: out_i(:,:)
22
23  PUBLIC  etat0
24CONTAINS
25 
26   
27   
28  SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q)
29  USE icosa
30  IMPLICIT NONE
31    TYPE(t_field),POINTER :: f_ps(:)
32    TYPE(t_field),POINTER :: f_phis(:)
33    TYPE(t_field),POINTER :: f_theta_rhodz(:)
34    TYPE(t_field),POINTER :: f_u(:)
35    TYPE(t_field),POINTER :: f_q(:)
36 
37    REAL(rstd),POINTER :: ps(:)
38    REAL(rstd),POINTER :: phis(:)
39    REAL(rstd),POINTER :: theta_rhodz(:,:)
40    REAL(rstd),POINTER :: u(:,:)
41    REAL(rstd),POINTER :: q(:,:,:)
42    INTEGER :: ind
43 
44    CALL allocate_field(f_out_i,field_t,type_real,llm)
45 
46    DO ind=1,ndomain
47      CALL swap_dimensions(ind)
48      CALL swap_geometry(ind)
49      ps=f_ps(ind)
50      phis=f_phis(ind)
51      theta_rhodz=f_theta_rhodz(ind)
52      u=f_u(ind)
53      q=f_q(ind)
54      out_i=f_out_i(ind)
55      CALL compute_etat0_dcmip5(ps, phis, theta_rhodz, u, q)
56    ENDDO
57    CALL writefield("out_i",f_out_i)
58    CALL deallocate_field(f_out_i)
59  END SUBROUTINE etat0
60 
61  SUBROUTINE compute_etat0_dcmip5(ps, phis, theta_rhodz, ue, q)
62  USE icosa
63  USE pression_mod
64  USE wind_mod
65  USE theta2theta_rhodz_mod
66  IMPLICIT NONE 
67  REAL(rstd),INTENT(OUT) :: ps(iim*jjm)
68  REAL(rstd),INTENT(OUT) :: phis(iim*jjm)
69  REAL(rstd),INTENT(OUT) :: theta_rhodz(iim*jjm,llm)
70  REAL(rstd),INTENT(OUT) :: ue(3*iim*jjm,llm)
71  REAL(rstd),INTENT(OUT) :: q(iim*jjm,llm,nqtot)
72 
73  INTEGER :: i,j,l,ij
74  INTEGER :: testcase
75  REAL(rstd) :: Tv0, Tvt 
76  REAL(rstd) :: r 
77  REAL(rstd) :: z(iim*jjm,llm),zz 
78  REAL(rstd) :: p(iim*jjm,llm+1) 
79  REAL(rstd) :: Tave,Tp 
80  REAL(rstd) :: T(iim*jjm,llm) 
81  REAL(rstd) :: vt 
82  REAL(rstd) :: d1,d2,d 
83  REAL(rstd) :: ulon(3*iim*jjm,llm) 
84  REAL(rstd) :: ulat(3*iim*jjm,llm)
85  REAL(rstd) :: lon,lat
86
87
88    latc=Pi/18
89    lonc=Pi 
90
91    Tv0=T0/(1+0.608*q0)
92    Tvt=Tv0-Gamma*zt
93 
94    testcase=1
95    CALL getin("dcmip5_testcase",testcase)
96   
97    phis(:)=0.
98   
99    DO j=jj_begin,jj_end
100      DO i=ii_begin,ii_end
101        ij=(j-1)*iim+i
102        CALL xyz2lonlat(xyz_i(ij,:),lon,lat)
103        r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
104        ps(ij)=pb-DeltaP*exp(-(r/rp)**1.5)
105      ENDDO
106    ENDDO
107   
108    CALL compute_pression(ps,p,0)
109
110    DO l=1,llm
111      DO j=jj_begin,jj_end
112        DO i=ii_begin,ii_end
113          ij=(j-1)*iim+i
114          CALL xyz2lonlat(xyz_i(ij,:),lon,lat)
115          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
116          CALL compute_z(0.5*(p(ij,l)+p(ij,l+1)),ps(ij),r,z(ij,l))
117        ENDDO
118      ENDDO
119    ENDDO
120    out_i=z
121   
122    DO l=1,llm
123      DO j=jj_begin-1,jj_end+1
124        DO i=ii_begin-1,ii_end+1
125          ij=(j-1)*iim+i
126          IF (z(ij,l)<=zt) THEN
127            q(ij,l,1)=q0*exp(-z(ij,l)/zq1)*exp(-(z(ij,l)/zq2)**2)
128          ELSE
129            q(ij,l,1)=qt
130          ENDIF
131        ENDDO
132      ENDDO
133    ENDDO
134
135   
136     DO l=1,llm
137      DO j=jj_begin-1,jj_end+1
138        DO i=ii_begin-1,ii_end+1
139          ij=(j-1)*iim+i
140          CALL xyz2lonlat(xyz_i(ij,:),lon,lat)
141          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
142          IF (z(ij,l)<=zt) THEN
143            Tave=Tv0-Gamma*z(ij,l)
144            Tp=(Tv0-Gamma*z(ij,l)) * ( ( 1 + 2*Rd*(Tv0-Gamma*z(ij,l))*z(ij,l) /                           &
145                                            (g*zp**2*(1-pb/Deltap*exp((r/rp)**1.5+(z(ij,l)/zp)**2))))**(-1) - 1) 
146          ELSE
147            Tave=Tvt
148            Tp=0
149          ENDIF
150          T(ij,l)=Tave+Tp 
151        ENDDO
152      ENDDO
153    ENDDO
154
155    DO l=1,llm
156      DO j=jj_begin-1,jj_end+1
157        DO i=ii_begin-1,ii_end+1
158          ij=(j-1)*iim+i
159
160          CALL xyz2lonlat(xyz_e(ij+u_right,:),lon,lat)
161          zz=0.5*(z(ij,l)+z(ij+t_right,l))
162          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
163          IF (zz<=zt) THEN
164            vt=-omega*sin(latc)*r+sqrt( (omega*sin(latc)*r)**2 -  1.5*(r/rp)**1.5 * (Tv0-Gamma*zz)*Rd    &
165                                                                 / (1 + 2*Rd*(Tv0-Gamma*zz)*zz/(g*zp**2)        &
166                                                                      - pb/Deltap * exp((r/rp)**1.5 + (zz/zp)**2 )))
167          ELSE
168            vt = 0
169          ENDIF
170          d1=sin(latc)*cos(lat)-cos(latc)*sin(lat)*cos(lon-lonc)
171          d2=cos(latc)*sin(lon-lonc)
172          d=MAX(1e-25,sqrt(d1**2+d2**2))
173          ulon(ij+u_right,l)=vt*d1/d
174          ulat(ij+u_right,l)=vt*d2/d
175
176
177         
178          CALL xyz2lonlat(xyz_e(ij+u_lup,:),lon,lat)
179          zz=0.5*(z(ij,l)+z(ij+t_lup,l))
180          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
181          IF (zz<=zt) THEN
182            vt=-omega*sin(latc)*r+sqrt( (omega*sin(latc)*r)**2 -  1.5*(r/rp)**1.5 * (Tv0-Gamma*zz)*Rd    &
183                                                                 / (1 + 2*Rd*(Tv0-Gamma*zz)*zz/(g*zp**2)        &
184                                                                      - pb/Deltap * exp((r/rp)**1.5 + (zz/zp)**2 )))
185
186         ELSE
187            vt = 0
188          ENDIF
189          d1=sin(latc)*cos(lat)-cos(latc)*sin(lat)*cos(lon-lonc)
190          d2=cos(latc)*sin(lon-lonc)
191          d=MAX(1e-25,sqrt(d1**2+d2**2))
192          ulon(ij+u_lup,l)=vt*d1/d
193          ulat(ij+u_lup,l)=vt*d2/d
194         
195         
196         
197         
198          CALL xyz2lonlat(xyz_e(ij+u_ldown,:),lon,lat)
199          zz=0.5*(z(ij,l)+z(ij+t_ldown,l))
200          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
201          IF (zz<=zt) THEN
202            vt=-omega*sin(latc)*r+sqrt( (omega*sin(latc)*r)**2 -  1.5*(r/rp)**1.5 * (Tv0-Gamma*zz)*Rd    &
203                                                                 / (1 + 2*Rd*(Tv0-Gamma*zz)*zz/(g*zp**2)        &
204                                                                      - pb/Deltap * exp((r/rp)**1.5 + (zz/zp)**2 )))
205
206          ELSE
207            vt = 0
208          ENDIF
209          d1=sin(latc)*cos(lat)-cos(latc)*sin(lat)*cos(lon-lonc)
210          d2=cos(latc)*sin(lon-lonc)
211          d=MAX(1e-25,sqrt(d1**2+d2**2))
212          ulon(ij+u_ldown,l)=vt*d1/d
213          ulat(ij+u_ldown,l)=vt*d2/d
214         
215
216
217          CALL xyz2lonlat(xyz_i(ij,:),lon,lat)
218          zz=z(ij,l)
219          r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
220          IF (zz<=zt) THEN
221            vt=-omega*sin(latc)*r+sqrt( (omega*sin(latc)*r)**2 -  1.5*(r/rp)**1.5 * (Tv0-Gamma*zz)*Rd    &
222                                                                 / (1 + 2*Rd*(Tv0-Gamma*zz)*zz/(g*zp**2)        &
223                                                                      - pb/Deltap * exp((r/rp)**1.5 + (zz/zp)**2 )))
224          ELSE
225            vt = 0
226          ENDIF
227          d1=sin(latc)*cos(lat)-cos(latc)*sin(lat)*cos(lon-lonc)
228          d2=cos(latc)*sin(lon-lonc)
229          d=MAX(1e-25,sqrt(d1**2+d2**2))
230!          ulon(ij+u_ldown,l)=vt*d1/d
231!          ulat(ij+u_ldown,l)=vt*d2/d
232          out_i(ij,l)=sqrt((vt*d1/d)**2+(vt*d2/d)**2)
233        ENDDO
234      ENDDO
235    ENDDO
236   
237    CALL compute_wind_perp_from_lonlat_compound(ulon, ulat, ue)
238    CALL compute_temperature2theta_rhodz(T,ps,theta_rhodz,0)
239     
240  END SUBROUTINE compute_etat0_dcmip5
241 
242  SUBROUTINE compute_z(pmodel,ps,r,z)
243  USE icosa
244  IMPLICIT NONE
245     REAL(rstd),PARAMETER   :: epsilon0=2e-13
246     REAL(rstd),INTENT(IN)  :: pmodel
247     REAL(rstd),INTENT(IN)  :: ps
248     REAL(rstd),INTENT(IN)  :: r
249     REAL(rstd),INTENT(OUT) :: z
250     
251     REAL(rstd) :: Tv0,Tvt,pt
252     REAL(rstd) :: pave, pp, dpdz
253     REAL(rstd) :: znp1
254     REAL(rstd) :: epsilon
255     REAL(rstd) :: p
256     INTEGER  :: n
257         
258     Tv0=T0/(1+0.608*q0)
259     Tvt=Tv0-Gamma*zt
260     pt=pb*(Tvt/Tv0)**(g/(Rd*Gamma))
261
262     IF (pmodel>pt) THEN
263       z=Tv0/Gamma*(1-(pmodel/ps)**(Rd*Gamma/g))
264     ELSE
265       z=zt+Rd*Tvt/g*log(Pt/pmodel)
266     ENDIF
267     
268!     PRINT*,pmodel,pt,z,zt
269     IF (z>zt .OR. r>1000000) return
270     
271     epsilon=1
272     n=0
273     
274     DO WHILE(epsilon>epsilon0 .AND. n<20)
275 
276       IF (z<zt) THEN
277         pave=pb*((Tv0-Gamma*z)/Tv0)**(g/(Rd*Gamma))
278         pp= -Deltap * exp(-(r/rp)**1.5-(z/zp)**2) *  ( (Tv0-Gamma*z)/Tv0 )**(g/(Rd*Gamma))
279       ELSE
280         pave=pt*exp(g*(zt-z)/(Rd*Tvt))
281         pp=0
282       ENDIF
283       p=pave+pp
284     
285       dpdz =  2*Deltap*z/zp**2 * exp(-(r/rp)**1.5) * exp(-(z/zp)**2) * ((Tv0-Gamma*z)/Tv0)**(g/(Rd*Gamma))  &
286             - g/(Rd*Tv0) * (preff - Deltap*exp(-(r/rp)**1.5) * exp(-(z/zp)**2)) * ( (Tv0-Gamma*z)/Tv0 )**(g/(Rd*Gamma)-1)
287           
288       znp1 = z - ( pmodel - p ) / (-dpdz)
289       
290       epsilon=ABS( (znp1-z)/znp1 )
291!       PRINT *,"epsilon",epsilon,r,z,znp1
292!       PRINT *,"----",n,pmodel,ps,pave,dpdz
293       z=znp1
294       n=n+1
295     ENDDO 
296   
297   END SUBROUTINE compute_z
298
299END MODULE etat0_dcmip5_mod
Note: See TracBrowser for help on using the repository browser.