Changeset 346
- Timestamp:
- 08/01/15 01:52:51 (9 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/etat0.f90
r345 r346 19 19 USE etat0_dcmip1_mod, ONLY : getin_etat0_dcmip1=>getin_etat0 20 20 USE etat0_dcmip2_mod, ONLY : getin_etat0_dcmip2=>getin_etat0 21 USE etat0_dcmip4_mod, ONLY : getin_etat0_dcmip4=>getin_etat0 21 22 USE etat0_dcmip5_mod, ONLY : getin_etat0_dcmip5=>getin_etat0 22 23 USE etat0_williamson_mod, ONLY : getin_etat0_williamson=>getin_etat0 … … 24 25 ! Ad hoc interfaces 25 26 USE etat0_academic_mod, ONLY : etat0_academic=>etat0 26 USE etat0_dcmip4_mod, ONLY : etat0_dcmip4=>etat027 27 USE etat0_heldsz_mod, ONLY : etat0_heldsz=>etat0 28 28 USE etat0_venus_mod, ONLY : etat0_venus=>etat0 … … 65 65 CALL getin_etat0_dcmip2 66 66 CASE ('dcmip3') 67 CASE ('dcmip4') 68 CALL getin_etat0_dcmip4 67 69 CASE ('dcmip5') 68 70 CALL getin_etat0_dcmip5 … … 86 88 CALL etat0_venus(f_ps, f_phis, f_theta_rhodz, f_u, f_q) 87 89 PRINT *, "Venus (Lebonnois et al., 2012) test case" 88 CASE ('dcmip4')89 IF(nqtot<2) THEN90 IF (is_mpi_root) THEN91 PRINT *, "nqtot must be at least 2 for test case DCMIP4"92 END IF93 STOP94 END IF95 CALL etat0_dcmip4(f_ps,f_phis,f_theta_rhodz,f_u, f_q)96 90 CASE DEFAULT 97 91 IF(collocated) THEN … … 170 164 USE etat0_dcmip2_mod, ONLY : compute_dcmip2 => compute_etat0 171 165 USE etat0_dcmip3_mod, ONLY : compute_dcmip3 => compute_etat0 166 USE etat0_dcmip4_mod, ONLY : compute_dcmip4 => compute_etat0 172 167 USE etat0_dcmip5_mod, ONLY : compute_dcmip5 => compute_etat0 173 168 USE etat0_williamson_mod, ONLY : compute_w91_6 => compute_etat0 … … 213 208 CALL compute_dcmip3(iim*jjm,lon_i,lat_i, phis, ps, temp_i, ulon_i, ulat_i, q) 214 209 CALL compute_dcmip3(3*iim*jjm,lon_e,lat_e, phis_e, ps_e, temp_e, ulon_e, ulat_e, q_e) 210 CASE('dcmip4') 211 CALL compute_dcmip4(iim*jjm,lon_i,lat_i, phis, ps, temp_i, ulon_i, ulat_i, q) 212 CALL compute_dcmip4(3*iim*jjm,lon_e,lat_e, phis_e, ps_e, temp_e, ulon_e, ulat_e, q_e) 215 213 CASE('dcmip5') 216 214 CALL compute_dcmip5(iim*jjm,lon_i,lat_i, phis, ps, temp_i, ulon_i, ulat_i, q) -
codes/icosagcm/trunk/src/etat0_dcmip4.f90
r286 r346 1 1 MODULE etat0_dcmip4_mod 2 2 USE icosa 3 IMPLICIT NONE 3 4 PRIVATE 5 4 6 REAL(rstd),PARAMETER :: eta0=0.252 5 7 REAL(rstd),PARAMETER :: etat=0.2 … … 11 13 REAL(rstd),PARAMETER :: Gamma=0.005 12 14 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) 15 REAL(rstd),PARAMETER :: lonc=Pi/9, latc=2*Pi/9, latw=2*Pi/9 16 REAL(rstd),PARAMETER :: pw=34000 17 REAL(rstd),PARAMETER :: q0=0.021 18 19 INTEGER,SAVE :: testcase 20 !$OMP THREADPRIVATE(testcase) 21 22 PUBLIC getin_etat0, compute_etat0 23 23 24 INTEGER,SAVE :: testcase 25 !$OMP THREADPRIVATE(testcase) 24 CONTAINS 26 25 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 26 SUBROUTINE getin_etat0 27 USE mpipara, ONLY : is_mpi_root 28 IF(nqtot<2) THEN 29 IF (is_mpi_root) THEN 30 PRINT *, "nqtot must be at least 2 for test case DCMIP4" 31 END IF 32 STOP 33 END IF 48 34 testcase=1 49 35 CALL getin("dcmip4_testcase",testcase) 36 END SUBROUTINE getin_etat0 37 38 SUBROUTINE compute_etat0(ngrid,lon,lat, phis,ps,temp,ulon,ulat,q) 39 USE icosa 40 USE disvert_mod 41 INTEGER, INTENT(IN) :: ngrid 42 REAL(rstd),INTENT(IN) :: lon(ngrid) 43 REAL(rstd),INTENT(IN) :: lat(ngrid) 44 REAL(rstd),INTENT(OUT) :: phis(ngrid) 45 REAL(rstd),INTENT(OUT) :: ps(ngrid) 46 REAL(rstd),INTENT(OUT) :: temp(ngrid,llm) 47 REAL(rstd),INTENT(OUT) :: ulon(ngrid,llm) 48 REAL(rstd),INTENT(OUT) :: ulat(ngrid,llm) 49 REAL(rstd),INTENT(OUT) :: q(ngrid,llm,nqtot) 50 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 51 INTEGER :: l,ij 52 REAL(rstd) :: etal, etavl, etas, etavs, sinlat, coslat, & 53 Y, Tave, T, phis_ave, vort, r2, utot, & 54 dthetaodeta_ave, dthetaodeta, dthetaodlat, duodeta, K, r 55 104 56 etas=ap(1)/preff+bp(1) 105 57 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 58 phis_ave=T0*g/Gamma*(1-etas**(Rd*Gamma/g)) 59 60 DO ij=1,ngrid 61 sinlat=SIN(lat(ij)) 62 coslat=COS(lat(ij)) 63 phis(ij)=phis_ave+u0*cos(etavs)**1.5*( (-2*sinlat**6 * (coslat**2+1./3) + 10./63 )*u0*cos(etavs)**1.5 & 64 +(8./5*coslat**3 * (sinlat**2 + 2./3) - Pi/4)*radius*Omega ) 65 ps(ij)=ps0 112 66 ENDDO 113 67 68 DO l=1,llm 69 etal = 0.5 *( ap(l)/preff+bp(l) + ap(l+1)/preff+bp(l+1) ) 70 etavl=(etal-eta0)*Pi/2 71 72 Tave=T0*etal**(Rd*Gamma/g) 73 dthetaodeta_ave = T0 *( Rd*Gamma/g - kappa)* etal**(Rd*Gamma/g-kappa-1) 74 IF (etat>etal) THEN 75 Tave=Tave+DeltaT*(etat-etal)**5 76 dthetaodeta_ave = dthetaodeta_ave - DeltaT * ( 5*(etat-etal)**4 * etal**(-kappa) & 77 + kappa * (etat-etal)**5 * etal**(-kappa-1)) 78 END IF 79 80 DO ij=1,ngrid 81 sinlat=SIN(lat(ij)) 82 coslat=COS(lat(ij)) 83 84 K=sin(latc)*sinlat+cos(latc)*coslat*cos(lon(ij)-lonc) 85 r=radius*acos(K) 86 utot=u0*cos(etavl)**1.5*sin(2*lat(ij))**2 + up0*exp(-(r/(0.1*radius))**2) 87 ulon(ij,l) = utot 88 ulat(ij,l) = 0. 89 Y = ((-2*sinlat**6*(coslat**2+1./3)+10./63)*2*u0*cos(etavl)**1.5 & 90 + (8./5*coslat**3*(sinlat**2+2./3)-Pi/4)*radius*Omega) 91 T = Tave + 0.75*(etal*Pi*u0/Rd)*sin(etavl)*cos(etavl)**0.5 * Y 92 temp(ij,l)=T 93 94 IF (testcase==1) THEN 95 q(ij,l,1)=T*etal**(-kappa) 96 IF(nqtot>2) q(ij,l,3)=1. 97 dthetaodeta=dthetaodeta_ave + 3./4. * Pi * u0/Rd*(1-kappa)*etal**(-kappa)*sin(etavl)*cos(etavl)**0.5 * Y & 98 + 3/8. * Pi**2*u0/Rd * etal**(1-kappa) * cos(etavl)**1.5 * Y & 99 - 3./16. * Pi**2 * u0 /Rd * etal**(1-kappa) * sin(etavl)**2 * cos(etavl)**(-0.5) *Y & 100 - 9./8. * Pi**2 * u0 /Rd * etal**(1-kappa) * sin(etavl)**2 * cos(etavl) & 101 * (-2*sinlat**6*(coslat**2+1./3.)+10./63.) 102 dthetaodlat=3./4.*Pi*u0/Rd*etal**(1-kappa)*sin(etavl)*cos(etavl)**0.5 & 103 *( 2*u0*cos(etavl)**1.5 * ( -12 * coslat*sinlat**5*(coslat**2+1./3.)+4*coslat*sinlat**7) & 104 + radius*omega*(-24./5. * sinlat * coslat**2 * (sinlat**2 + 2./3.) + 16./5. * coslat**4 * sinlat)) 105 106 duodeta=-u0 * sin(2*lat(ij))**2 * 3./4.*Pi * cos(etavl)**0.5 * sin(etavl) 107 108 vort = -4*u0/radius*cos(etavl)**1.5 * sinlat * coslat * (2.-5.*sinlat**2) & 109 + up0/radius*exp(-(r/(0.1*radius))**2) * (tan(lat(ij))-2*(radius/(0.1*radius))**2 * acos(K) * (sin(latc)*coslat & 110 -cos(latc)*sinlat*cos(lon(ij)-lonc))/(sqrt(1-K**2))) 111 q(ij,l,2)=ABS(g/preff*(-1./radius*duodeta*dthetaodlat-(2*sinlat*omega+vort)*dthetaodeta)) 112 IF(nqtot>3) q(ij,l,4)=cos(lon(ij))*coslat 113 ELSE IF (testcase==2) THEN 114 q(ij,l,1)=q0*exp(-(lat(ij)/latw)**4)*exp(-((etal-1)*preff/pw)**2) 115 END IF 116 END DO 117 END DO 114 118 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 119 END SUBROUTINE compute_etat0 229 120 230 121 END MODULE etat0_dcmip4_mod
Note: See TracChangeset
for help on using the changeset viewer.