Changeset 24 for trunk/src/calcpv.f90
- Timestamp:
- May 23, 2014, 11:48:41 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/calcpv.f90
r4 r24 21 21 22 22 subroutine calcpv(n,uuh,vvh,pvh) 23 ! 23 ! i i i o 24 24 !***************************************************************************** 25 25 ! * … … 49 49 integer :: nlck 50 50 real :: vx(2),uy(2),phi,tanphi,cosphi,dvdx,dudy,f 51 real :: theta,thetap,thetam,dthetadp,dt1,dt2,dt ,ppmk52 real :: pvavr,ppml( nuvzmax)51 real :: theta,thetap,thetam,dthetadp,dt1,dt2,dt 52 real :: pvavr,ppml(0:nxmax-1,0:nymax-1,nuvzmax),ppmk(0:nxmax-1,0:nymax-1,nuvzmax) 53 53 real :: thup,thdn 54 54 real,parameter :: eps=1.e-5, p0=101325 … … 62 62 ! Loop over entire grid 63 63 !********************** 64 do kl=1,nuvz 65 do jy=0,nymin1 66 do ix=0,nxmin1 67 ppml(ix,jy,kl)=akz(kl)+bkz(kl)*ps(ix,jy,1,n) 68 enddo 69 enddo 70 enddo 71 ppmk=(100000./ppml)**kappa 72 64 73 do jy=0,nymin1 65 74 if (sglobal.and.jy.eq.0) goto 10 … … 106 115 end if 107 116 jux=jumpx 108 ! Precalculate pressure values for efficiency109 do kl=1,nuvz110 ppml(kl)=akz(kl)+bkz(kl)*ps(ix,jy,1,n)111 end do112 117 ! 113 118 ! Loop over the vertical … … 115 120 116 121 do kl=1,nuvz 117 ppmk=akz(kl)+bkz(kl)*ps(ix,jy,1,n) 118 theta=tth(ix,jy,kl,n)*(100000./ppmk)**kappa 122 theta=tth(ix,jy,kl,n)*ppmk(ix,jy,kl) 119 123 klvrp=kl+1 120 124 klvrm=kl-1 … … 125 129 if (klvrp.gt.nuvz) klvrp=nuvz 126 130 if (klvrm.lt.1) klvrm=1 127 ppmk=akz(klvrp)+bkz(klvrp)*ps(ix,jy,1,n) 128 thetap=tth(ix,jy,klvrp,n)*(100000./ppmk)**kappa 129 ppmk=akz(klvrm)+bkz(klvrm)*ps(ix,jy,1,n) 130 thetam=tth(ix,jy,klvrm,n)*(100000./ppmk)**kappa 131 dthetadp=(thetap-thetam)/(ppml(klvrp)-ppml(klvrm)) 131 thetap=tth(ix,jy,klvrp,n)*ppmk(ix,jy,klvrp) 132 thetam=tth(ix,jy,klvrm,n)*ppmk(ix,jy,klvrm) 133 dthetadp=(thetap-thetam)/(ppml(ix,jy,klvrp)-ppml(ix,jy,klvrm)) 132 134 133 135 ! Compute vertical position at pot. temperature surface on subgrid … … 156 158 kch=kch+1 157 159 k=kup 158 ppmk=akz(k)+bkz(k)*ps(ivr,jy,1,n) 159 thdn=tth(ivr,jy,k,n)*(100000./ppmk)**kappa 160 ppmk=akz(k+1)+bkz(k+1)*ps(ivr,jy,1,n) 161 thup=tth(ivr,jy,k+1,n)*(100000./ppmk)**kappa 162 163 164 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 165 ((thdn.le.theta).and.(thup.ge.theta))) then 166 dt1=abs(theta-thdn) 167 dt2=abs(theta-thup) 168 dt=dt1+dt2 169 if (dt.lt.eps) then ! Avoid division by zero error 170 dt1=0.5 ! G.W., 10.4.1996 171 dt2=0.5 172 dt=1.0 173 endif 174 vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt 175 goto 20 160 thdn=tth(ivr,jy,k,n)*ppmk(ivr,jy,k) 161 thup=tth(ivr,jy,k+1,n)*ppmk(ivr,jy,k+1) 162 163 164 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 165 ((thdn.le.theta).and.(thup.ge.theta))) then 166 dt1=abs(theta-thdn) 167 dt2=abs(theta-thup) 168 dt=dt1+dt2 169 if (dt.lt.eps) then ! Avoid division by zero error 170 dt1=0.5 ! G.W., 10.4.1996 171 dt2=0.5 172 dt=1.0 176 173 endif 174 vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt 175 goto 20 176 endif 177 177 41 continue 178 178 ! Downward branch … … 181 181 kch=kch+1 182 182 k=kdn 183 ppmk=akz(k)+bkz(k)*ps(ivr,jy,1,n) 184 thdn=tth(ivr,jy,k,n)*(100000./ppmk)**kappa 185 ppmk=akz(k+1)+bkz(k+1)*ps(ivr,jy,1,n) 186 thup=tth(ivr,jy,k+1,n)*(100000./ppmk)**kappa 187 188 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 189 ((thdn.le.theta).and.(thup.ge.theta))) then 190 dt1=abs(theta-thdn) 191 dt2=abs(theta-thup) 192 dt=dt1+dt2 193 if (dt.lt.eps) then ! Avoid division by zero error 194 dt1=0.5 ! G.W., 10.4.1996 195 dt2=0.5 196 dt=1.0 197 endif 198 vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt 199 goto 20 183 thdn=tth(ivr,jy,k,n)*ppmk(ivr,jy,k) 184 thup=tth(ivr,jy,k+1,n)*ppmk(ivr,jy,k+1) 185 186 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 187 ((thdn.le.theta).and.(thup.ge.theta))) then 188 dt1=abs(theta-thdn) 189 dt2=abs(theta-thup) 190 dt=dt1+dt2 191 if (dt.lt.eps) then ! Avoid division by zero error 192 dt1=0.5 ! G.W., 10.4.1996 193 dt2=0.5 194 dt=1.0 200 195 endif 201 goto 40 196 vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt 197 goto 20 198 endif 199 goto 40 202 200 ! This section used when no values were found 203 201 21 continue … … 236 234 kch=kch+1 237 235 k=kup 238 ppmk=akz(k)+bkz(k)*ps(ix,j,1,n) 239 thdn=tth(ix,j,k,n)*(100000./ppmk)**kappa 240 ppmk=akz(k+1)+bkz(k+1)*ps(ix,j,1,n) 241 thup=tth(ix,j,k+1,n)*(100000./ppmk)**kappa 242 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 243 ((thdn.le.theta).and.(thup.ge.theta))) then 244 dt1=abs(theta-thdn) 245 dt2=abs(theta-thup) 246 dt=dt1+dt2 247 if (dt.lt.eps) then ! Avoid division by zero error 248 dt1=0.5 ! G.W., 10.4.1996 249 dt2=0.5 250 dt=1.0 251 endif 252 uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt 253 goto 50 236 thdn=tth(ix,j,k,n)*ppmk(ix,j,k) 237 thup=tth(ix,j,k+1,n)*ppmk(ix,j,k+1) 238 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 239 ((thdn.le.theta).and.(thup.ge.theta))) then 240 dt1=abs(theta-thdn) 241 dt2=abs(theta-thup) 242 dt=dt1+dt2 243 if (dt.lt.eps) then ! Avoid division by zero error 244 dt1=0.5 ! G.W., 10.4.1996 245 dt2=0.5 246 dt=1.0 254 247 endif 248 uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt 249 goto 50 250 endif 255 251 71 continue 256 252 ! Downward branch … … 259 255 kch=kch+1 260 256 k=kdn 261 ppmk=akz(k)+bkz(k)*ps(ix,j,1,n) 262 thdn=tth(ix,j,k,n)*(100000./ppmk)**kappa 263 ppmk=akz(k+1)+bkz(k+1)*ps(ix,j,1,n) 264 thup=tth(ix,j,k+1,n)*(100000./ppmk)**kappa 265 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 266 ((thdn.le.theta).and.(thup.ge.theta))) then 267 dt1=abs(theta-thdn) 268 dt2=abs(theta-thup) 269 dt=dt1+dt2 270 if (dt.lt.eps) then ! Avoid division by zero error 271 dt1=0.5 ! G.W., 10.4.1996 272 dt2=0.5 273 dt=1.0 274 endif 275 uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt 276 goto 50 257 thdn=tth(ix,j,k,n)*ppmk(ix,j,k) 258 thup=tth(ix,j,k+1,n)*ppmk(ix,j,k+1) 259 if (((thdn.ge.theta).and.(thup.le.theta)).or. & 260 ((thdn.le.theta).and.(thup.ge.theta))) then 261 dt1=abs(theta-thdn) 262 dt2=abs(theta-thup) 263 dt=dt1+dt2 264 if (dt.lt.eps) then ! Avoid division by zero error 265 dt1=0.5 ! G.W., 10.4.1996 266 dt2=0.5 267 dt=1.0 277 268 endif 278 goto 70 269 uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt 270 goto 50 271 endif 272 goto 70 279 273 ! This section used when no values were found 280 274 51 continue 281 275 ! Must use uu at current level and lat. juy becomes smaller by 1 282 uy(jj)=uuh(ix,jy,kl)283 juy=juy-1276 uy(jj)=uuh(ix,jy,kl) 277 juy=juy-1 284 278 ! Otherwise OK 285 279 50 continue
Note: See TracChangeset
for help on using the changeset viewer.