[3810] | 1 | MODULE etat0_dcmip4_mod |
---|
| 2 | USE icosa |
---|
| 3 | PRIVATE |
---|
| 4 | REAL(rstd),PARAMETER :: eta0=0.252 |
---|
| 5 | REAL(rstd),PARAMETER :: etat=0.2 |
---|
| 6 | REAL(rstd),PARAMETER :: ps0=1e5 |
---|
| 7 | REAL(rstd),PARAMETER :: u0=35 |
---|
| 8 | REAL(rstd),PARAMETER :: T0=288 |
---|
| 9 | REAL(rstd),PARAMETER :: DeltaT=4.8e5 |
---|
| 10 | REAL(rstd),PARAMETER :: Rd=287 |
---|
| 11 | REAL(rstd),PARAMETER :: Gamma=0.005 |
---|
| 12 | REAL(rstd),PARAMETER :: up0=1 |
---|
| 13 | REAL(rstd) :: latw=2*Pi/9 |
---|
| 14 | !$OMP THREADPRIVATE(latw) |
---|
| 15 | REAL(rstd) :: pw=34000 |
---|
| 16 | !$OMP THREADPRIVATE(pw) |
---|
| 17 | REAL(rstd) :: q0=0.021 |
---|
| 18 | !$OMP THREADPRIVATE(q0) |
---|
| 19 | REAL(rstd) :: lonc |
---|
| 20 | !$OMP THREADPRIVATE(lonc) |
---|
| 21 | REAL(rstd) :: latc |
---|
| 22 | !$OMP THREADPRIVATE(latc) |
---|
| 23 | |
---|
| 24 | INTEGER,SAVE :: testcase |
---|
| 25 | !$OMP THREADPRIVATE(testcase) |
---|
| 26 | |
---|
| 27 | PUBLIC etat0 |
---|
| 28 | CONTAINS |
---|
| 29 | |
---|
| 30 | |
---|
| 31 | |
---|
| 32 | SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q) |
---|
| 33 | USE icosa |
---|
| 34 | IMPLICIT NONE |
---|
| 35 | TYPE(t_field),POINTER :: f_ps(:) |
---|
| 36 | TYPE(t_field),POINTER :: f_phis(:) |
---|
| 37 | TYPE(t_field),POINTER :: f_theta_rhodz(:) |
---|
| 38 | TYPE(t_field),POINTER :: f_u(:) |
---|
| 39 | TYPE(t_field),POINTER :: f_q(:) |
---|
| 40 | |
---|
| 41 | REAL(rstd),POINTER :: ps(:) |
---|
| 42 | REAL(rstd),POINTER :: phis(:) |
---|
| 43 | REAL(rstd),POINTER :: theta_rhodz(:,:) |
---|
| 44 | REAL(rstd),POINTER :: u(:,:) |
---|
| 45 | REAL(rstd),POINTER :: q(:,:,:) |
---|
| 46 | INTEGER :: ind |
---|
| 47 | |
---|
| 48 | testcase=1 |
---|
| 49 | CALL getin("dcmip4_testcase",testcase) |
---|
| 50 | |
---|
| 51 | DO ind=1,ndomain |
---|
| 52 | IF (.NOT. assigned_domain(ind)) CYCLE |
---|
| 53 | CALL swap_dimensions(ind) |
---|
| 54 | CALL swap_geometry(ind) |
---|
| 55 | ps=f_ps(ind) |
---|
| 56 | phis=f_phis(ind) |
---|
| 57 | theta_rhodz=f_theta_rhodz(ind) |
---|
| 58 | u=f_u(ind) |
---|
| 59 | q=f_q(ind) |
---|
| 60 | CALL compute_etat0_dcmip4(ps, phis, theta_rhodz, u, q) |
---|
| 61 | ENDDO |
---|
| 62 | |
---|
| 63 | END SUBROUTINE etat0 |
---|
| 64 | |
---|
| 65 | SUBROUTINE compute_etat0_dcmip4(ps, phis, theta_rhodz, u, q) |
---|
| 66 | USE icosa |
---|
| 67 | USE disvert_mod |
---|
| 68 | USE pression_mod |
---|
| 69 | USE exner_mod |
---|
| 70 | USE geopotential_mod |
---|
| 71 | USE theta2theta_rhodz_mod |
---|
| 72 | IMPLICIT NONE |
---|
| 73 | REAL(rstd),INTENT(OUT) :: ps(iim*jjm) |
---|
| 74 | REAL(rstd),INTENT(OUT) :: phis(iim*jjm) |
---|
| 75 | REAL(rstd),INTENT(OUT) :: theta_rhodz(iim*jjm,llm) |
---|
| 76 | REAL(rstd),INTENT(OUT) :: u(3*iim*jjm,llm) |
---|
| 77 | REAL(rstd),INTENT(OUT) :: q(iim*jjm,llm,nqtot) |
---|
| 78 | |
---|
| 79 | INTEGER :: i,j,l,ij |
---|
| 80 | REAL(rstd) :: theta(iim*jjm,llm) |
---|
| 81 | REAL(rstd) :: Y(iim*jjm,llm) |
---|
| 82 | REAL(rstd) :: vort |
---|
| 83 | REAL(rstd) :: eta(llm) |
---|
| 84 | REAL(rstd) :: etav(llm) |
---|
| 85 | REAL(rstd) :: etas, etavs |
---|
| 86 | REAL(rstd) :: lon,lat |
---|
| 87 | REAL(rstd) :: ulon(3) |
---|
| 88 | REAL(rstd) :: ep(3), norm_ep |
---|
| 89 | REAL(rstd) :: Tave, T |
---|
| 90 | REAL(rstd) :: phis_ave |
---|
| 91 | REAL(rstd) :: V0(3) |
---|
| 92 | REAL(rstd) :: r2 |
---|
| 93 | REAL(rstd) :: utot |
---|
| 94 | REAL(rstd) :: lonx,latx |
---|
| 95 | REAL(rstd) :: dthetaodeta_ave, dthetaodeta, dthetaodlat, duodeta, K, r |
---|
| 96 | |
---|
| 97 | lonc=Pi/9 |
---|
| 98 | latc=2*Pi/9 |
---|
| 99 | |
---|
| 100 | DO l=1,llm |
---|
| 101 | eta(l)= 0.5 *( ap(l)/preff+bp(l) + ap(l+1)/preff+bp(l+1) ) |
---|
| 102 | etav(l)=(eta(l)-eta0)*Pi/2 |
---|
| 103 | ENDDO |
---|
| 104 | etas=ap(1)/preff+bp(1) |
---|
| 105 | etavs=(etas-eta0)*Pi/2 |
---|
| 106 | |
---|
| 107 | DO j=jj_begin,jj_end |
---|
| 108 | DO i=ii_begin,ii_end |
---|
| 109 | ij=(j-1)*iim+i |
---|
| 110 | ps(ij)=ps0 |
---|
| 111 | ENDDO |
---|
| 112 | ENDDO |
---|
| 113 | |
---|
| 114 | |
---|
| 115 | CALL lonlat2xyz(lonc,latc,V0) |
---|
| 116 | |
---|
| 117 | u(:,:)=1e10 |
---|
| 118 | DO l=1,llm |
---|
| 119 | DO j=jj_begin-1,jj_end+1 |
---|
| 120 | DO i=ii_begin-1,ii_end+1 |
---|
| 121 | ij=(j-1)*iim+i |
---|
| 122 | |
---|
| 123 | lon=lon_e(ij+u_right) ; lat=lat_e(ij+u_right) |
---|
| 124 | K=sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc) |
---|
| 125 | r=radius*acos(K) |
---|
| 126 | utot=u0*cos(etav(l))**1.5*sin(2*lat)**2 + up0*exp(-(r/(0.1*radius))**2) |
---|
| 127 | u(ij+u_right,l) = utot * sum(elon_e(ij+u_right,:) * ep_e(ij+u_right,:)) |
---|
| 128 | |
---|
| 129 | lon=lon_e(ij+u_lup) ; lat=lat_e(ij+u_lup) |
---|
| 130 | K=sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc) |
---|
| 131 | r=radius*acos(K) |
---|
| 132 | utot=u0*cos(etav(l))**1.5*sin(2*lat)**2 + up0*exp(-(r/(0.1*radius))**2) |
---|
| 133 | u(ij+u_lup,l) = utot * sum(elon_e(ij+u_lup,:) * ep_e(ij+u_lup,:)) |
---|
| 134 | |
---|
| 135 | lon=lon_e(ij+u_ldown) ; lat=lat_e(ij+u_ldown) |
---|
| 136 | K=sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc) |
---|
| 137 | r=radius*acos(K) |
---|
| 138 | utot=u0*cos(etav(l))**1.5*sin(2*lat)**2 + up0*exp(-(r/(0.1*radius))**2) |
---|
| 139 | u(ij+u_ldown,l) = utot * sum(elon_e(ij+u_ldown,:) * ep_e(ij+u_ldown,:)) |
---|
| 140 | |
---|
| 141 | ENDDO |
---|
| 142 | ENDDO |
---|
| 143 | ENDDO |
---|
| 144 | |
---|
| 145 | |
---|
| 146 | DO l=1,llm |
---|
| 147 | Tave=T0*eta(l)**(Rd*Gamma/g) |
---|
| 148 | IF (etat>eta(l)) Tave=Tave+DeltaT*(etat-eta(l))**5 |
---|
| 149 | DO j=jj_begin-1,jj_end+1 |
---|
| 150 | DO i=ii_begin-1,ii_end+1 |
---|
| 151 | ij=(j-1)*iim+i |
---|
| 152 | lat=lat_i(ij) |
---|
| 153 | Y(ij,l)=((-2*sin(lat)**6*(cos(lat)**2+1./3)+10./63)*2*u0*cos(etav(l))**1.5 & |
---|
| 154 | + (8./5*cos(lat)**3*(sin(lat)**2+2./3)-Pi/4)*radius*Omega) |
---|
| 155 | T=Tave+ 0.75*(eta(l)*Pi*u0/Rd)*sin(etav(l))*cos(etav(l))**0.5 * Y(ij,l) |
---|
| 156 | |
---|
| 157 | theta(ij,l)=T*eta(l)**(-kappa) |
---|
| 158 | |
---|
| 159 | ENDDO |
---|
| 160 | ENDDO |
---|
| 161 | ENDDO |
---|
| 162 | |
---|
| 163 | |
---|
| 164 | phis_ave=T0*g/Gamma*(1-etas**(Rd*Gamma/g)) |
---|
| 165 | DO j=jj_begin,jj_end |
---|
| 166 | DO i=ii_begin,ii_end |
---|
| 167 | ij=(j-1)*iim+i |
---|
| 168 | lat=lat_i(ij) |
---|
| 169 | phis(ij)=phis_ave+u0*cos(etavs)**1.5*( (-2*sin(lat)**6 * (cos(lat)**2+1./3) + 10./63 )*u0*cos(etavs)**1.5 & |
---|
| 170 | +(8./5*cos(lat)**3 * (sin(lat)**2 + 2./3) - Pi/4)*radius*Omega ) |
---|
| 171 | ! phis(ij)=phis_ave+u0*cos(etavs)**1.5 |
---|
| 172 | |
---|
| 173 | ENDDO |
---|
| 174 | ENDDO |
---|
| 175 | |
---|
| 176 | CALL compute_theta2theta_rhodz(ps,theta,theta_rhodz,0) |
---|
| 177 | |
---|
| 178 | |
---|
| 179 | IF (testcase==1) THEN |
---|
| 180 | |
---|
| 181 | q(:,:,1)=theta(:,:) |
---|
| 182 | IF(nqtot>2) q(:,:,3)=1. |
---|
| 183 | |
---|
| 184 | DO l=1,llm |
---|
| 185 | dthetaodeta_ave = T0 *( Rd*Gamma/g - kappa)* eta(l)**(Rd*Gamma/g-kappa-1) |
---|
| 186 | IF (etat>eta(l)) dthetaodeta_ave = dthetaodeta_ave - DeltaT * ( 5*(etat-eta(l))**4 * eta(l)**(-kappa) & |
---|
| 187 | + kappa * (etat-eta(l))**5 * eta(l)**(-kappa-1)) |
---|
| 188 | DO j=jj_begin,jj_end |
---|
| 189 | DO i=ii_begin,ii_end |
---|
| 190 | ij=(j-1)*iim+i |
---|
| 191 | lon=lon_i(ij) ; lat=lat_i(ij) |
---|
| 192 | dthetaodeta=dthetaodeta_ave + 3./4. * Pi * u0/Rd*(1-kappa)*eta(l)**(-kappa)*sin(etav(l))*cos(etav(l))**0.5 * Y(ij,l) & |
---|
| 193 | + 3/8. * Pi**2*u0/Rd * eta(l)**(1-kappa) * cos(etav(l))**1.5 * Y(ij,l) & |
---|
| 194 | - 3./16. * Pi**2 * u0 /Rd * eta(l)**(1-kappa) * sin(etav(l))**2 * cos(etav(l))**(-0.5) *Y(ij,l)& |
---|
| 195 | - 9./8. * Pi**2 * u0 /Rd * eta(l)**(1-kappa) * sin(etav(l))**2 * cos(etav(l)) & |
---|
| 196 | * (-2*sin(lat)**6*(cos(lat)**2+1./3.)+10./63.) |
---|
| 197 | dthetaodlat=3./4.*Pi*u0/Rd*eta(l)**(1-kappa)*sin(etav(l))*cos(etav(l))**0.5 & |
---|
| 198 | *( 2*u0*cos(etav(l))**1.5 * ( -12 * cos(lat)*sin(lat)**5*(cos(lat)**2+1./3.)+4*cos(lat)*sin(lat)**7) & |
---|
| 199 | + radius*omega*(-24./5. * sin(lat) * cos(lat)**2 * (sin(lat)**2 + 2./3.) + 16./5. * cos(lat)**4 * sin(lat))) |
---|
| 200 | |
---|
| 201 | duodeta=-u0 * sin(2*lat)**2 * 3./4.*Pi * cos(etav(l))**0.5 * sin(etav(l)) |
---|
| 202 | |
---|
| 203 | K=sin(latc)*sin(lat)+cos(latc)*cos(lat)*cos(lon-lonc) |
---|
| 204 | r=radius*acos(K) |
---|
| 205 | vort = -4*u0/radius*cos(etav(l))**1.5 * sin(lat) * cos(lat) * (2.-5.*sin(lat)**2) & |
---|
| 206 | + up0/radius*exp(-(r/(0.1*radius))**2) * (tan(lat)-2*(radius/(0.1*radius))**2 * acos(K) * (sin(latc)*cos(lat) & |
---|
| 207 | -cos(latc)*sin(lat)*cos(lon-lonc))/(sqrt(1-K**2))) |
---|
| 208 | q(ij,l,2)=ABS(g/preff*(-1./radius*duodeta*dthetaodlat-(2*sin(lat)*omega+vort)*dthetaodeta)) |
---|
| 209 | IF(nqtot>3) q(ij,l,4)=cos(lon)*cos(lat) |
---|
| 210 | ENDDO |
---|
| 211 | ENDDO |
---|
| 212 | ENDDO |
---|
| 213 | |
---|
| 214 | ELSE IF (testcase==2) THEN |
---|
| 215 | |
---|
| 216 | DO l=1,llm |
---|
| 217 | DO j=jj_begin,jj_end |
---|
| 218 | DO i=ii_begin,ii_end |
---|
| 219 | ij=(j-1)*iim+i |
---|
| 220 | q(ij,l,1)=q0*exp(-(lat_i(ij)/latw)**4)*exp(-((eta(l)-1)*preff/pw)**2) |
---|
| 221 | ENDDO |
---|
| 222 | ENDDO |
---|
| 223 | ENDDO |
---|
| 224 | |
---|
| 225 | ENDIF |
---|
| 226 | |
---|
| 227 | |
---|
| 228 | END SUBROUTINE compute_etat0_dcmip4 |
---|
| 229 | |
---|
| 230 | END MODULE etat0_dcmip4_mod |
---|