source: codes/icosagcm/trunk/src/etat0_dcmip2016_cyclone.f90 @ 388

Last change on this file since 388 was 388, checked in by ymipsl, 8 years ago
  • Add dcmip2016 cyclone etat0 estcase
  • Add fisrt guess of dcmip2016 etat0 supercell testcase

YM

File size: 4.1 KB
Line 
1MODULE etat0_dcmip2016_cyclone_mod
2  USE icosa
3  IMPLICIT NONE
4  PRIVATE
5  REAL(rstd),PARAMETER :: zt=15000
6  REAL(rstd),PARAMETER :: q0=0.021
7  REAL(rstd),PARAMETER :: qt=1e-11
8  REAL(rstd),PARAMETER :: T0=302.15
9  REAL(rstd),PARAMETER :: Ts=302.15
10  REAL(rstd),PARAMETER :: zq1=3000
11  REAL(rstd),PARAMETER :: zq2=8000
12  REAL(rstd),PARAMETER :: Gamma=0.007
13  REAL(rstd),PARAMETER :: pb=101500
14  REAL(rstd),PARAMETER :: Deltap=1115
15  REAL(rstd),PARAMETER :: rp=282000
16  REAL(rstd),PARAMETER :: zp=7000
17  REAL(rstd),PARAMETER :: epsilon=1e-25
18  REAL(rstd),PARAMETER :: Rd=287
19 
20  REAL(rstd), PARAMETER :: lonc=Pi, latc=Pi/18, &
21       Tv0=T0*(1+0.608*q0), Tvt=Tv0-Gamma*zt
22
23  PUBLIC getin_etat0, compute_etat0
24
25CONTAINS
26 
27  SUBROUTINE getin_etat0
28    USE mpipara, ONLY : is_mpi_root
29
30    IF(nqtot<1) THEN
31       IF (is_mpi_root)  THEN
32          PRINT *, "nqtot must be at least 1 for test case DCMIP5"
33       END IF
34       STOP
35    END IF
36
37  END SUBROUTINE getin_etat0
38
39  SUBROUTINE compute_etat0(ngrid,lon,lat, phis, ps, Temp, ulon, ulat, q)
40    USE disvert_mod
41    USE omp_para
42    INTEGER, INTENT(IN)    :: ngrid
43    REAL(rstd),INTENT(IN)  :: lon(ngrid)
44    REAL(rstd),INTENT(IN)  :: lat(ngrid)
45    REAL(rstd),INTENT(OUT) :: ps(ngrid)
46    REAL(rstd),INTENT(OUT) :: phis(ngrid)
47    REAL(rstd),INTENT(OUT) :: Temp(ngrid,llm)
48    REAL(rstd),INTENT(OUT) :: ulon(ngrid,llm)
49    REAL(rstd),INTENT(OUT) :: ulat(ngrid,llm)
50    REAL(rstd),INTENT(OUT) :: q(ngrid,llm,nqtot)
51
52    INTEGER :: l,ij
53    REAL(rstd) :: r, d, d1,d2, zz, Tave, Tp, vt, aa, bb
54
55    phis(:)=0.
56
57    DO ij=1,ngrid
58       r=radius*arc(lonc,latc, lon(ij),lat(ij))
59       ps(ij)=pb-DeltaP*exp(-(r/rp)**1.5)
60    END DO
61
62    DO l=ll_begin,ll_end
63       aa=.5*(ap(l)+ap(l+1))
64       bb=.5*(bp(l)+bp(l+1))
65       DO ij=1,ngrid
66          r=radius*arc(lonc,latc, lon(ij),lat(ij))
67          CALL compute_z(aa+bb*ps(ij),ps(ij),r,zz)
68          IF (zz<=zt) THEN
69             q(ij,l,1)=q0*exp(-zz/zq1)*exp(-(zz/zq2)**2)
70             Tave=Tv0-Gamma*zz
71             Tp=(Tv0-Gamma*zz) * ( ( 1 + 2*Rd*(Tv0-Gamma*zz)*zz /                          &
72                  (g*zp**2*(1-pb/Deltap*exp((r/rp)**1.5+(zz/zp)**2))))**(-1) - 1) 
73             vt=-omega*sin(latc)*r+sqrt( (omega*sin(latc)*r)**2 -  1.5*(r/rp)**1.5 * (Tv0-Gamma*zz)*Rd    &
74                  / (1 + 2*Rd*(Tv0-Gamma*zz)*zz/(g*zp**2)        &
75                  - pb/Deltap * exp((r/rp)**1.5 + (zz/zp)**2 )))
76          ELSE
77             q(ij,l,1)=qt
78             Tave=Tvt
79             Tp=0
80             vt=0
81          ENDIF
82          Temp(ij,l)=Tave+Tp 
83
84          d1=sin(latc)*cos(lat(ij))-cos(latc)*sin(lat(ij))*cos(lon(ij)-lonc)
85          d2=cos(latc)*sin(lon(ij)-lonc)
86          d=MAX(1e-25,sqrt(d1**2+d2**2))
87          ulon(ij,l)=vt*d1/d
88          ulat(ij,l)=vt*d2/d
89       END DO
90    ENDDO
91  END SUBROUTINE compute_etat0
92 
93  SUBROUTINE compute_z(pmodel,ps,r,z)
94  USE icosa
95  IMPLICIT NONE
96     REAL(rstd),PARAMETER   :: epsilon0=2e-13
97     REAL(rstd),INTENT(IN)  :: pmodel
98     REAL(rstd),INTENT(IN)  :: ps
99     REAL(rstd),INTENT(IN)  :: r
100     REAL(rstd),INTENT(OUT) :: z
101     
102     REAL(rstd) :: pt, pave, pp, dpdz
103     REAL(rstd) :: znp1
104     REAL(rstd) :: epsilon
105     REAL(rstd) :: p
106     INTEGER  :: n     
107
108     pt=pb*(Tvt/Tv0)**(g/(Rd*Gamma))
109
110     IF (pmodel>pt) THEN
111       z=Tv0/Gamma*(1-(pmodel/ps)**(Rd*Gamma/g))
112     ELSE
113       z=zt+Rd*Tvt/g*log(Pt/pmodel)
114     ENDIF
115     
116     IF (z>zt .OR. r>1000000) return
117     
118     epsilon=1
119     n=0
120     
121     DO WHILE(epsilon>epsilon0 .AND. n<20)
122 
123       IF (z<zt) THEN
124         pave=pb*((Tv0-Gamma*z)/Tv0)**(g/(Rd*Gamma))
125         pp= -Deltap * exp(-(r/rp)**1.5-(z/zp)**2) *  ( (Tv0-Gamma*z)/Tv0 )**(g/(Rd*Gamma))
126       ELSE
127         pave=pt*exp(g*(zt-z)/(Rd*Tvt))
128         pp=0
129       ENDIF
130       p=pave+pp
131     
132       dpdz =  2*Deltap*z/zp**2 * exp(-(r/rp)**1.5) * exp(-(z/zp)**2) * ((Tv0-Gamma*z)/Tv0)**(g/(Rd*Gamma))  &
133             - g/(Rd*Tv0) * (preff - Deltap*exp(-(r/rp)**1.5) * exp(-(z/zp)**2)) * ( (Tv0-Gamma*z)/Tv0 )**(g/(Rd*Gamma)-1)
134           
135       znp1 = z - ( pmodel - p ) / (-dpdz)
136       
137       epsilon=ABS( (znp1-z)/znp1 )
138       z=znp1
139       n=n+1
140     ENDDO 
141   
142   END SUBROUTINE compute_z
143
144END MODULE etat0_dcmip2016_cyclone_mod
Note: See TracBrowser for help on using the repository browser.