source: codes/icosagcm/trunk/src/etat0_dcmip3.f90 @ 46

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

Implement DCMIP 3.1 etat0 testcase

YM

File size: 5.1 KB
Line 
1MODULE etat0_dcmip3_mod
2
3! test cases DCMIP 2012, category 3 : Non-hydrostatic gravity waves
4
5! Questions
6! Replace ps0 by preff ??
7
8  USE genmod
9  PRIVATE
10! some of the following should be obtained via getin
11!  REAL(rstd),PARAMETER :: ztop=10000.   ! Height position of the model top (m)
12!  REAL(rstd),PARAMETER :: ptop=27391.9  ! Pressure at the model top (Pa)
13!  REAL(rstd),PARAMETER :: Xscale=1.     ! Small-planet scaling factor (1=Earth)
14!  REAL(rstd),PARAMETER :: Omega =0      ! Planetary rotation rate (s-1)
15  REAL(rstd),PARAMETER :: u0=20.         ! Maximum amplitude of the zonal wind (m.s-1)
16  REAL(rstd),PARAMETER :: zs=0.          ! Surface elevation (m)
17  REAL(rstd),PARAMETER :: N=0.01         ! Brunt-Vaissala frequency (s-1)
18  REAL(rstd),PARAMETER :: Teq=300.       ! Surface temperature at the equator (K)
19  REAL(rstd),PARAMETER :: Peq=1e5        ! Reference surface pressure at the equator (hPa)
20  REAL(rstd),PARAMETER :: d=5000.        ! Witdth parameter for theta
21  REAL(rstd),PARAMETER :: lonc=2*pi/3    ! Longitudinal centerpoint of theta
22  REAL(rstd),PARAMETER :: latc=0         ! Longitudinal centerpoint of theta
23  REAL(rstd),PARAMETER :: dtheta=1.      ! Maximum amplitude of theta (K)
24  REAL(rstd),PARAMETER :: Lz=20000.      ! Vertical wave lenght of the theta perturbation
25
26  PUBLIC  etat0
27CONTAINS
28
29
30  SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q)
31  USE icosa
32  IMPLICIT NONE
33    TYPE(t_field),POINTER :: f_ps(:)
34    TYPE(t_field),POINTER :: f_phis(:)
35    TYPE(t_field),POINTER :: f_theta_rhodz(:)
36    TYPE(t_field),POINTER :: f_u(:)
37    TYPE(t_field),POINTER :: f_q(:)
38   
39    REAL(rstd),POINTER :: ps(:)
40    REAL(rstd),POINTER :: phis(:)
41    REAL(rstd),POINTER :: u(:,:)
42    REAL(rstd),POINTER :: theta_rhodz(:,:)
43    REAL(rstd),POINTER :: q(:,:,:)
44
45    INTEGER :: ind
46
47    DO ind=1,ndomain
48      CALL swap_dimensions(ind)
49      CALL swap_geometry(ind)
50
51      ps=f_ps(ind)
52      phis=f_phis(ind)
53      u=f_u(ind)
54      theta_rhodz=f_theta_rhodz(ind)
55      q=f_q(ind)
56      CALL compute_etat0_DCMIP3(ps,phis,u,theta_rhodz,q)
57    ENDDO
58           
59  END SUBROUTINE etat0
60 
61
62  SUBROUTINE compute_etat0_DCMIP3(ps, phis, u, theta_rhodz,q)
63  USE icosa
64  USE pression_mod
65  USE theta2theta_rhodz_mod
66  USE wind_mod
67  IMPLICIT NONE
68  REAL(rstd), INTENT(OUT) :: ps(iim*jjm)
69  REAL(rstd), INTENT(OUT) :: phis(iim*jjm)
70  REAL(rstd), INTENT(OUT) :: u(3*iim*jjm,llm)
71  REAL(rstd), INTENT(OUT) :: theta_rhodz(iim*jjm,llm)
72  REAL(rstd), INTENT(OUT) :: q(iim*jjm,llm,nqtot)
73 
74  REAL(rstd) :: Ts(iim*jjm)
75  REAL(rstd) :: s(iim*jjm)
76  REAL(rstd) :: z(iim*jjm,llm)
77  REAL(rstd) :: T(iim*jjm,llm)
78  REAL(rstd) :: p(iim*jjm,llm+1)
79  REAL(rstd) :: thetap(iim*jjm,llm)
80  REAL(rstd) :: thetap_rhodz(iim*jjm,llm)
81  REAL(rstd) :: ulon(3*iim*jjm,llm)
82  REAL(rstd) :: ulat(3*iim*jjm,llm)
83 
84 
85  INTEGER :: i,j,l,ij
86  REAL(rstd) :: Rd        ! gas constant of dry air, P=rho.Rd.T
87  REAL(rstd) :: alpha, rm, zs
88  REAL(rstd) :: lon,lat
89  REAL(rstd) :: C0,C1
90  REAL(rstd) :: GG
91  REAL(rstd) :: pspsk,r
92 
93  Rd=cpp/kappa
94   
95!    alpha=g/Rd/lapse_rate              ! g/(Rd*Gamma)
96
97    GG=(g/N)**2/cpp
98    C0=0.25*u0*(u0+2.*Omega*radius)
99
100    q(:,:,:)=0
101   
102   
103    DO j=jj_begin,jj_end
104      DO i=ii_begin,ii_end
105        ij=(j-1)*iim+i
106        CALL xyz2lonlat(xyz_i(ij,:),lon,lat)
107        C1=C0*(cos(2*lat)-1)
108       
109        !--- GROUND GEOPOTENTIAL
110        phis(ij)=0.
111
112        !--- GROUND TEMPERATURE
113        Ts(ij) = GG+(Teq-GG)*EXP(-C1*(N/g)**2)
114
115        !--- GROUND PRESSURE
116        Ps(ij) = peq*EXP(C1/GG/Rd)*(Ts(ij)/Teq)**(1/kappa)
117
118
119        r=radius*acos(sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc))
120        s(ij)= d**2/(d**2+r**2)
121      END DO
122    END DO
123
124    CALL compute_pression(ps,p,0)
125   
126    DO l=1,llm
127      DO j=jj_begin,jj_end
128        DO i=ii_begin,ii_end
129          ij=(j-1)*iim+i
130
131          pspsk=(0.5*(p(ij,l+1)+p(ij,l))/ps(ij) )**kappa
132          T(ij,l)=Ts(ij)*pspsk / ( Ts(ij) / GG * ( pspsk-1) +1)
133          z(ij,l)=-g/N**2*log( Ts(ij)/GG * (pspsk -1)+1) 
134        ENDDO
135      ENDDO
136    ENDDO
137   
138    CALL compute_temperature2theta_rhodz(ps,T,theta_rhodz,0)
139
140    DO l=1,llm
141      DO j=jj_begin,jj_end
142        DO i=ii_begin,ii_end
143          ij=(j-1)*iim+i
144          thetap(ij,l)=dtheta *sin(2*Pi*z(ij,l)/Lz) * s(ij)
145        ENDDO
146      ENDDO
147    ENDDO 
148   
149    CALL compute_theta2theta_rhodz(ps,thetap,thetap_rhodz,0)
150   
151   
152    DO l=1,llm
153      DO j=jj_begin,jj_end
154        DO i=ii_begin,ii_end
155          ij=(j-1)*iim+i
156          theta_rhodz(ij,l)=theta_rhodz(ij,l)+thetap_rhodz(ij,l)
157        ENDDO
158      ENDDO
159    ENDDO 
160
161    DO l=1,llm
162      DO j=jj_begin-1,jj_end+1
163        DO i=ii_begin-1,ii_end+1
164          ij=(j-1)*iim+i
165          CALL xyz2lonlat(xyz_e(ij+u_right,:),lon,lat)
166          ulon(ij+u_right,l)=u0*cos(lat)
167          ulat(ij+u_right,l)=0
168
169          CALL xyz2lonlat(xyz_e(ij+u_lup,:),lon,lat)
170          ulon(ij+u_lup,l)=u0*cos(lat)
171          ulat(ij+u_lup,l)=0
172
173          CALL xyz2lonlat(xyz_e(ij+u_ldown,:),lon,lat)
174          ulon(ij+u_ldown,l)=u0*cos(lat)
175          ulat(ij+u_ldown,l)=0
176        ENDDO
177      ENDDO
178    ENDDO
179   
180 
181    CALL compute_wind_perp_from_lonlat_compound(ulon,ulat,u)
182
183   
184         
185  END SUBROUTINE compute_etat0_DCMIP3
186
187
188END MODULE etat0_DCMIP3_mod 
Note: See TracBrowser for help on using the repository browser.