Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/calcpv.f90

    r24 r4  
    2121
    2222subroutine calcpv(n,uuh,vvh,pvh)
    23   !               i  i   i   o
     23  !                  i  i   i   o
    2424  !*****************************************************************************
    2525  !                                                                            *
     
    4949  integer :: nlck
    5050  real :: vx(2),uy(2),phi,tanphi,cosphi,dvdx,dudy,f
    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)
     51  real :: theta,thetap,thetam,dthetadp,dt1,dt2,dt,ppmk
     52  real :: pvavr,ppml(nuvzmax)
    5353  real :: thup,thdn
    5454  real,parameter :: eps=1.e-5, p0=101325
     
    6262  ! Loop over entire grid
    6363  !**********************
    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 
    7364  do jy=0,nymin1
    7465    if (sglobal.and.jy.eq.0) goto 10
     
    115106      end if
    116107      jux=jumpx
     108  ! Precalculate pressure values for efficiency
     109      do kl=1,nuvz
     110        ppml(kl)=akz(kl)+bkz(kl)*ps(ix,jy,1,n)
     111      end do
    117112  !
    118113  ! Loop over the vertical
     
    120115
    121116      do kl=1,nuvz
    122         theta=tth(ix,jy,kl,n)*ppmk(ix,jy,kl)
     117        ppmk=akz(kl)+bkz(kl)*ps(ix,jy,1,n)
     118        theta=tth(ix,jy,kl,n)*(100000./ppmk)**kappa
    123119        klvrp=kl+1
    124120        klvrm=kl-1
     
    129125        if (klvrp.gt.nuvz) klvrp=nuvz
    130126        if (klvrm.lt.1) klvrm=1
    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))
     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))
    134132
    135133  ! Compute vertical position at pot. temperature surface on subgrid
     
    158156          kch=kch+1
    159157          k=kup
    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
     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
    173176            endif
    174             vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt
    175             goto 20
    176           endif
    17717741        continue
    178178  ! Downward branch
     
    181181          kch=kch+1
    182182          k=kdn
    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
     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
    195200            endif
    196             vx(ii)=(vvh(ivr,jy,k)*dt2+vvh(ivr,jy,k+1)*dt1)/dt
    197             goto 20
    198           endif
    199           goto 40
     201            goto 40
    200202  ! This section used when no values were found
    20120321      continue
     
    234236          kch=kch+1
    235237          k=kup
    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
     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
    247254            endif
    248             uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt
    249             goto 50
    250           endif
    25125571        continue
    252256  ! Downward branch
     
    255259          kch=kch+1
    256260          k=kdn
    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
     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
    268277            endif
    269             uy(jj)=(uuh(ix,j,k)*dt2+uuh(ix,j,k+1)*dt1)/dt
    270             goto 50
    271           endif
    272           goto 70
     278            goto 70
    273279  ! This section used when no values were found
    27428051      continue
    275281  ! Must use uu at current level and lat. juy becomes smaller by 1
    276           uy(jj)=uuh(ix,jy,kl)
    277           juy=juy-1
     282        uy(jj)=uuh(ix,jy,kl)
     283        juy=juy-1
    278284  ! Otherwise OK
    27928550        continue
Note: See TracChangeset for help on using the changeset viewer.
hosted by ZAMG