Ignore:
Timestamp:
May 23, 2014, 11:48:41 AM (10 years ago)
Author:
igpis
Message:

version 9.2 beta. Changes from HH, AST, MC, NIK, IP. Changes in vert transform. New SPECIES input includes scavenging coefficients

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/verttransform_gfs.f90

    r4 r24  
    2121
    2222subroutine verttransform(n,uuh,vvh,wwh,pvh)
    23   !                         i  i   i   i   i
     23  !                      i  i   i   i   i
    2424  !*****************************************************************************
    2525  !                                                                            *
     
    7171  real :: f_qvsat,pressure
    7272  real :: rh,lsp,convp
    73   real :: uvzlev(nuvzmax),rhoh(nuvzmax),pinmconv(nzmax)
     73  real :: rhoh(nuvzmax),pinmconv(nzmax)
    7474  real :: ew,pint,tv,tvold,pold,dz1,dz2,dz,ui,vi
    7575  real :: xlon,ylat,xlonr,dzdx,dzdy
    76   real :: dzdx1,dzdx2,dzdy1,dzdy2
     76  real :: dzdx1,dzdx2,dzdy1,dzdy2,cosf
    7777  real :: uuaux,vvaux,uupolaux,vvpolaux,ddpol,ffpol,wdummy
    7878  real :: uuh(0:nxmax-1,0:nymax-1,nuvzmax)
     
    9292  ! If verttransform is called the first time, initialize heights of the   *
    9393  ! z levels in meter. The heights are the heights of model levels, where  *
    94   ! u,v,T and qv are given, and of the interfaces, where w is given. So,   *
    95   ! the vertical resolution in the z system is doubled. As reference point,*
    96   ! the lower left corner of the grid is used.                             *
    97   ! Unlike in the eta system, no difference between heights for u,v and    *
    98   ! heights for w exists.                                                  *
     94  ! u,v,T and qv are given.                                                *
    9995  !*************************************************************************
    10096
     
    118114
    119115    tvold=tt2(ixm,jym,1,n)*(1.+0.378*ew(td2(ixm,jym,1,n))/ &
    120          ps(ixm,jym,1,n))
     116    ps(ixm,jym,1,n))
    121117    pold=ps(ixm,jym,1,n)
    122118    height(1)=0.
     
    126122      tv=tth(ixm,jym,kz,n)*(1.+0.608*qvh(ixm,jym,kz,n))
    127123
    128 
    129   ! NOTE: In FLEXPART versions up to 4.0, the number of model levels was doubled
    130   ! upon the transformation to z levels. In order to save computer memory, this is
    131   ! not done anymore in the standard version. However, this option can still be
    132   ! switched on by replacing the following lines with those below, that are
    133   ! currently commented out.
    134   ! Note that two more changes are necessary in this subroutine below.
    135   ! One change is also necessary in gridcheck.f, and another one in verttransform_nests.
    136   !*****************************************************************************
    137 
    138124      if (abs(tv-tvold).gt.0.2) then
    139         height(kz)= &
    140              height(kz-1)+const*log(pold/pint)* &
    141              (tv-tvold)/log(tv/tvold)
     125        height(kz)=height(kz-1)+const*log(pold/pint)* &
     126        (tv-tvold)/log(tv/tvold)
    142127      else
    143         height(kz)=height(kz-1)+ &
    144              const*log(pold/pint)*tv
     128        height(kz)=height(kz-1)+const*log(pold/pint)*tv
    145129      endif
    146 
    147   ! Switch on following lines to use doubled vertical resolution
    148   !*************************************************************
    149   !    if (abs(tv-tvold).gt.0.2) then
    150   !      height((kz-1)*2)=
    151   !    +      height(max((kz-2)*2,1))+const*log(pold/pint)*
    152   !    +      (tv-tvold)/log(tv/tvold)
    153   !    else
    154   !      height((kz-1)*2)=height(max((kz-2)*2,1))+
    155   !    +      const*log(pold/pint)*tv
    156   !    endif
    157   ! End doubled vertical resolution
    158130
    159131      tvold=tv
    160132      pold=pint
    161133    end do
    162 
    163 
    164   ! Switch on following lines to use doubled vertical resolution
    165   !*************************************************************
    166   !  do 7 kz=3,nz-1,2
    167   !    height(kz)=0.5*(height(kz-1)+height(kz+1))
    168   !  height(nz)=height(nz-1)+height(nz-1)-height(nz-2)
    169   ! End doubled vertical resolution
    170134
    171135
     
    198162      llev = 0
    199163      do i=1,nuvz
    200        if (ps(ix,jy,1,n).lt.akz(i)) llev=i
     164        if (ps(ix,jy,1,n).lt.akz(i)) llev=i
    201165      end do
    202166       llev = llev+1
     
    212176      tvold=tth(ix,jy,llev,n)*(1.+0.608*qvh(ix,jy,llev,n))
    213177      pold=akz(llev)
    214       uvzlev(llev)=0.
    215178      wzlev(llev)=0.
    216179      uvwzlev(ix,jy,llev)=0.
     
    223186
    224187        if (abs(tv-tvold).gt.0.2) then
    225           uvzlev(kz)=uvzlev(kz-1)+const*log(pold/pint)* &
    226                (tv-tvold)/log(tv/tvold)
     188          uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)* &
     189          (tv-tvold)/log(tv/tvold)
    227190        else
    228           uvzlev(kz)=uvzlev(kz-1)+const*log(pold/pint)*tv
     191          uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)*tv
    229192        endif
    230         wzlev(kz)=uvzlev(kz)
    231         uvwzlev(ix,jy,kz)=uvzlev(kz)
     193        wzlev(kz)=uvwzlev(ix,jy,kz)
    232194
    233195        tvold=tv
    234196        pold=pint
    235197      end do
    236 
    237 
    238   ! Switch on following lines to use doubled vertical resolution
    239   ! Switch off the three lines above.
    240   !*************************************************************
    241   !22          uvwzlev(ix,jy,(kz-1)*2)=uvzlev(kz)
    242   !     do 23 kz=2,nwz
    243   !23          uvwzlev(ix,jy,(kz-1)*2+1)=wzlev(kz)
    244   ! End doubled vertical resolution
    245198
    246199  ! pinmconv=(h2-h1)/(p2-p1)
     
    279232      do iz=2,nz-1
    280233        do kz=kmin,nuvz
    281           if(height(iz).gt.uvzlev(nuvz)) then
     234          if(height(iz).gt.uvwzlev(ix,jy,nuvz)) then
    282235            uu(ix,jy,iz,n)=uu(ix,jy,nz,n)
    283236            vv(ix,jy,iz,n)=vv(ix,jy,nz,n)
     
    289242            goto 30
    290243          endif
    291           if ((height(iz).gt.uvzlev(kz-1)).and. &
    292                (height(iz).le.uvzlev(kz))) then
    293            dz1=height(iz)-uvzlev(kz-1)
    294            dz2=uvzlev(kz)-height(iz)
    295            dz=dz1+dz2
    296            uu(ix,jy,iz,n)=(uuh(ix,jy,kz-1)*dz2+uuh(ix,jy,kz)*dz1)/dz
    297            vv(ix,jy,iz,n)=(vvh(ix,jy,kz-1)*dz2+vvh(ix,jy,kz)*dz1)/dz
    298            tt(ix,jy,iz,n)=(tth(ix,jy,kz-1,n)*dz2 &
    299                 +tth(ix,jy,kz,n)*dz1)/dz
    300            qv(ix,jy,iz,n)=(qvh(ix,jy,kz-1,n)*dz2 &
    301                 +qvh(ix,jy,kz,n)*dz1)/dz
    302            pv(ix,jy,iz,n)=(pvh(ix,jy,kz-1)*dz2+pvh(ix,jy,kz)*dz1)/dz
    303            rho(ix,jy,iz,n)=(rhoh(kz-1)*dz2+rhoh(kz)*dz1)/dz
    304            pplev(ix,jy,iz,n)=(akz(kz-1)*dz2+akz(kz)*dz1)/dz
     244          if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
     245          (height(iz).le.uvwzlev(ix,jy,kz))) then
     246            dz1=height(iz)-uvwzlev(ix,jy,kz-1)
     247            dz2=uvwzlev(ix,jy,kz)-height(iz)
     248            dz=dz1+dz2
     249            uu(ix,jy,iz,n)=(uuh(ix,jy,kz-1)*dz2+uuh(ix,jy,kz)*dz1)/dz
     250            vv(ix,jy,iz,n)=(vvh(ix,jy,kz-1)*dz2+vvh(ix,jy,kz)*dz1)/dz
     251            tt(ix,jy,iz,n)=(tth(ix,jy,kz-1,n)*dz2 &
     252            +tth(ix,jy,kz,n)*dz1)/dz
     253            qv(ix,jy,iz,n)=(qvh(ix,jy,kz-1,n)*dz2 &
     254            +qvh(ix,jy,kz,n)*dz1)/dz
     255            pv(ix,jy,iz,n)=(pvh(ix,jy,kz-1)*dz2+pvh(ix,jy,kz)*dz1)/dz
     256            rho(ix,jy,iz,n)=(rhoh(kz-1)*dz2+rhoh(kz)*dz1)/dz
     257            pplev(ix,jy,iz,n)=(akz(kz-1)*dz2+akz(kz)*dz1)/dz
    305258          endif
    306259        end do
     
    318271        do kz=kmin,nwz
    319272          if ((height(iz).gt.wzlev(kz-1)).and. &
    320                (height(iz).le.wzlev(kz))) then
    321            dz1=height(iz)-wzlev(kz-1)
    322            dz2=wzlev(kz)-height(iz)
    323            dz=dz1+dz2
    324            ww(ix,jy,iz,n)=(wwh(ix,jy,kz-1)*pinmconv(kz-1)*dz2 &
    325                 +wwh(ix,jy,kz)*pinmconv(kz)*dz1)/dz
    326 
     273          (height(iz).le.wzlev(kz))) then
     274            dz1=height(iz)-wzlev(kz-1)
     275            dz2=wzlev(kz)-height(iz)
     276            dz=dz1+dz2
     277            ww(ix,jy,iz,n)=(wwh(ix,jy,kz-1)*pinmconv(kz-1)*dz2 &
     278            +wwh(ix,jy,kz)*pinmconv(kz)*dz1)/dz
    327279          endif
    328280        end do
     
    337289      do kz=2,nz-1
    338290        drhodz(ix,jy,kz,n)=(rho(ix,jy,kz+1,n)-rho(ix,jy,kz-1,n))/ &
    339              (height(kz+1)-height(kz-1))
     291        (height(kz+1)-height(kz-1))
    340292      end do
    341293      drhodz(ix,jy,nz,n)=drhodz(ix,jy,nz-1,n)
     
    351303
    352304  do jy=1,ny-2
     305    cosf=cos((real(jy)*dy+ylat0)*pi180)
    353306    do ix=1,nx-2
    354307
     
    367320      do iz=2,nz-1
    368321
    369         ui=uu(ix,jy,iz,n)*dxconst/cos((real(jy)*dy+ylat0)*pi180)
     322        ui=uu(ix,jy,iz,n)*dxconst/cosf
    370323        vi=vv(ix,jy,iz,n)*dyconst
    371324
    372325        do kz=kmin,nz
    373326          if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. &
    374                (height(iz).le.uvwzlev(ix,jy,kz))) then
     327          (height(iz).le.uvwzlev(ix,jy,kz))) then
    375328            dz1=height(iz)-uvwzlev(ix,jy,kz-1)
    376329            dz2=uvwzlev(ix,jy,kz)-height(iz)
     
    426379      xlon=xlon0+real(nx/2-1)*dx
    427380      xlonr=xlon*pi/180.
    428       ffpol=sqrt(uu(nx/2-1,nymin1,iz,n)**2+ &
    429            vv(nx/2-1,nymin1,iz,n)**2)
    430       if(vv(nx/2-1,nymin1,iz,n).lt.0.) then
    431         ddpol=atan(uu(nx/2-1,nymin1,iz,n)/ &
    432              vv(nx/2-1,nymin1,iz,n))-xlonr
     381      ffpol=sqrt(uu(nx/2-1,nymin1,iz,n)**2+vv(nx/2-1,nymin1,iz,n)**2)
     382      if (vv(nx/2-1,nymin1,iz,n).lt.0.) then
     383        ddpol=atan(uu(nx/2-1,nymin1,iz,n)/vv(nx/2-1,nymin1,iz,n))-xlonr
    433384      elseif (vv(nx/2-1,nymin1,iz,n).gt.0.) then
    434385        ddpol=pi+atan(uu(nx/2-1,nymin1,iz,n)/ &
    435              vv(nx/2-1,nymin1,iz,n))-xlonr
     386        vv(nx/2-1,nymin1,iz,n))-xlonr
    436387      else
    437388        ddpol=pi/2-xlonr
     
    446397      uuaux=-ffpol*sin(xlonr+ddpol)
    447398      vvaux=-ffpol*cos(xlonr+ddpol)
    448       call cc2gll(northpolemap,ylat,xlon,uuaux,vvaux,uupolaux, &
    449            vvpolaux)
    450 
     399      call cc2gll(northpolemap,ylat,xlon,uuaux,vvaux,uupolaux,vvpolaux)
    451400      jy=nymin1
    452401      do ix=0,nxmin1
     
    460409  ! ward parallel of latitude
    461410
    462   do iz=1,nz
     411    do iz=1,nz
    463412      wdummy=0.
    464413      jy=ny-2
     
    471420        ww(ix,jy,iz,n)=wdummy
    472421      end do
    473   end do
     422    end do
    474423
    475424  endif
     
    487436        do iz=1,nz
    488437          call cc2gll(southpolemap,ylat,xlon,uu(ix,jy,iz,n), &
    489                vv(ix,jy,iz,n),uupol(ix,jy,iz,n), &
    490                vvpol(ix,jy,iz,n))
     438          vv(ix,jy,iz,n),uupol(ix,jy,iz,n),vvpol(ix,jy,iz,n))
    491439        end do
    492440      end do
     
    498446      xlon=xlon0+real(nx/2-1)*dx
    499447      xlonr=xlon*pi/180.
    500       ffpol=sqrt(uu(nx/2-1,0,iz,n)**2+ &
    501            vv(nx/2-1,0,iz,n)**2)
     448      ffpol=sqrt(uu(nx/2-1,0,iz,n)**2+vv(nx/2-1,0,iz,n)**2)
    502449      if(vv(nx/2-1,0,iz,n).lt.0.) then
    503         ddpol=atan(uu(nx/2-1,0,iz,n)/ &
    504              vv(nx/2-1,0,iz,n))+xlonr
     450        ddpol=atan(uu(nx/2-1,0,iz,n)/vv(nx/2-1,0,iz,n))+xlonr
    505451      elseif (vv(nx/2-1,0,iz,n).gt.0.) then
    506         ddpol=pi+atan(uu(nx/2-1,0,iz,n)/ &
    507              vv(nx/2-1,0,iz,n))-xlonr
     452        ddpol=pi+atan(uu(nx/2-1,0,iz,n)/vv(nx/2-1,0,iz,n))-xlonr
    508453      else
    509454        ddpol=pi/2-xlonr
     
    518463      uuaux=+ffpol*sin(xlonr-ddpol)
    519464      vvaux=-ffpol*cos(xlonr-ddpol)
    520       call cc2gll(northpolemap,ylat,xlon,uuaux,vvaux,uupolaux, &
    521            vvpolaux)
     465      call cc2gll(northpolemap,ylat,xlon,uuaux,vvaux,uupolaux,vvpolaux)
    522466
    523467      jy=0
     
    562506         clouds(ix,jy,kz,n)=0
    563507         if (rh.gt.0.8) then ! in cloud
    564             if ((lsp.gt.0.01).or.(convp.gt.0.01)) then ! cloud and precipitation
    565                rain_cloud_above=1
    566                cloudsh(ix,jy,n)=cloudsh(ix,jy,n)+ &
    567                     height(kz)-height(kz-1)
    568                if (lsp.ge.convp) then
    569                   clouds(ix,jy,kz,n)=3 ! lsp dominated rainout
    570                else
    571                   clouds(ix,jy,kz,n)=2 ! convp dominated rainout
    572                endif
    573             else ! no precipitation
    574                   clouds(ix,jy,kz,n)=1 ! cloud
    575             endif
     508           if ((lsp.gt.0.01).or.(convp.gt.0.01)) then ! cloud and precipitation
     509              rain_cloud_above=1
     510              cloudsh(ix,jy,n)=cloudsh(ix,jy,n)+height(kz)-height(kz-1)
     511              if (lsp.ge.convp) then
     512                 clouds(ix,jy,kz,n)=3 ! lsp dominated rainout
     513              else
     514                 clouds(ix,jy,kz,n)=2 ! convp dominated rainout
     515              endif
     516           else ! no precipitation
     517             clouds(ix,jy,kz,n)=1 ! cloud
     518           endif
    576519         else ! no cloud
    577             if (rain_cloud_above.eq.1) then ! scavenging
    578                if (lsp.ge.convp) then
    579                   clouds(ix,jy,kz,n)=5 ! lsp dominated washout
    580                else
    581                   clouds(ix,jy,kz,n)=4 ! convp dominated washout
    582                endif
    583             endif
     520           if (rain_cloud_above.eq.1) then ! scavenging
     521             if (lsp.ge.convp) then
     522               clouds(ix,jy,kz,n)=5 ! lsp dominated washout
     523             else
     524               clouds(ix,jy,kz,n)=4 ! convp dominated washout
     525             endif
     526           endif
    584527         endif
    585528      end do
Note: See TracChangeset for help on using the changeset viewer.
hosted by ZAMG