mo_hyb.f90

      MODULE mo_hyb
      
        USE mo_parameters
      
   5:   IMPLICIT NONE
      
        ! ------------------------------------------------------------------
        !
        ! module *mo_hyb* - *loop indices and surface-pressure independent
  10:   !        variables associated with the vertical finite-difference scheme.
        !
        ! a.j.simmons     e.c.m.w.f.     16/11/81.
        !
        ! ------------------------------------------------------------------
  15: 
        INTEGER :: nlevm1         !  (number of levels)-1.
        INTEGER :: nplev          !  *number of pressure levels.
        INTEGER :: nplvp1         !  *nplev+1.*
        INTEGER :: nplvp2         !  *nplev+2.*
  20:   INTEGER :: nplvpa         !  *nplvp1,* or 2 if *nplev=0.*
        INTEGER :: nlmsgl         !  *nlev* - (number of sigma levels).
        INTEGER :: nlmslp         !  *nlmsgl+1.*
        INTEGER :: nlmsla         !  *nlmslp,* or 2 if *nlmslp=1.*
      
  25:   REAL :: apzero            !  *reference pressure for computation of the
        !   hybrid vertical levels.
        REAL :: rpr               !  *reciprocal of reference surface pressure.
        REAL :: rdtr              !   rd*(reference temperature).
        REAL :: apsurf            !   fixed global mean of surface pressure
  30:   REAL :: t0icao            !  *surface temperatur of reference atmosphere
        REAL :: tsticao           !  *stratospheric temperature of reference atmosphere
        REAL :: rdtstic           !  *rd*tsticao
        REAL :: rdlnp0i           !  *rd*ln(surface pressure) of reference atmosphere
        REAL :: alrrdic           !  *lapse-rate parameter of reference atmosphere
  35:   REAL :: rdt0ral           !  *rd*t0icao/alphaic
        REAL :: ptricao           !  *tropopause pressure of reference atmosphere
        REAL :: rdlnpti           !  *rd*ln(ptricao)
        REAL :: gsticao           !  *constant used in geopotential calculation
        REAL, ALLOCATABLE :: ralpha(:)    !   rd*alpha at pressure and sigma levels.
  40:   REAL, ALLOCATABLE :: rlnpr(:)     !   rd*ln(p(k+.5)/p(k-.5)) at pressure and sigma levels.
        REAL, ALLOCATABLE :: dela(:)      !   a(k+.5)-a(k-.5).
        REAL, ALLOCATABLE :: delb(:)      !   b(k+.5)-b(k-.5).
        REAL, ALLOCATABLE :: rddelb(:)    !   rd*delb.
        REAL, ALLOCATABLE :: cpg(:)       !   a(k+.5)*b(k-.5)-b(k+.5)*a(k-.5).
  45:   REAL, ALLOCATABLE :: delpr(:)     !   p(k+.5)-p(k-.5) for reference surface pressure.
        REAL, ALLOCATABLE :: rdelpr(:)    !  *reciprocal of *delpr.*
        REAL, ALLOCATABLE :: ralphr(:)    !  *constant array for use by pgrad.
        REAL, ALLOCATABLE :: alpham(:)    !  *constant array for use by dyn.
        REAL, ALLOCATABLE :: ardprc(:)    !  *constant array for use by dyn.
  50:   REAL, ALLOCATABLE :: rlnmar(:)    !  *constant array for use by pgrad.
        REAL, ALLOCATABLE :: aktlrd(:)    !  *constant array for use by conteq.
        REAL, ALLOCATABLE :: altrcp(:)    !  *constant array for use by conteq.
        REAL, ALLOCATABLE :: ceta(:)      !  *full hybrid vertical levels.
        REAL, ALLOCATABLE :: cetah(:)    !  *half hybrid vertical levels.
  55:   REAL, ALLOCATABLE :: bb(:,:) !  *gravity wave matrix
      
      CONTAINS
      
        SUBROUTINE inihyb
  60: 
          ! Description:
          !
          ! Initializes constants for vertical coordinate calculations.
          !
  65:     ! Method:
          !
          ! Compute loop indices and surface-pressure independent
          ! variables associated with the vertical finite-difference scheme.
          !
  70:     ! Output is in module *mo_hyb*
          !
          ! Authors:
          !
          ! A. J. Simmons, ECMWF, November 1981, original source
  75:     ! L. Kornblueh, MPI, May 1998, f90 rewrite
          ! U. Schulzweida, MPI, May 1998, f90 rewrite
          ! A. Rhodin, MPI, Jan 1999, subroutine inihyb -> module mo_hyb
          ! 
          ! for more details see file AUTHORS
  80:     !
      
          USE mo_constants, ONLY: g, rcpd, rd
          USE mo_control,   ONLY: nlev, nlevp1, nvclev, vct
      
  85:     IMPLICIT NONE
      
          !  Local scalars: 
          REAL :: za, zb, zetam, zetap, zp, zp0icao, zpp, zrd, zs, zsm
          INTEGER :: ilev, ilevp1, iplev, iplvp1, is, ism, ist, jk, jlev
  90: 
          !  Intrinsic functions 
          INTRINSIC EXP, LOG
      
      
  95:     !  Executable statements 
      
          !-- 1. Initialize variables
      
          apzero = 101325.
 100:     zrd = rd
          ralpha(1) = zrd*LOG(2.)
          rlnpr(1)  = 2.*ralpha(1)
          ilev   = nlev
          ilevp1 = ilev + 1
 105:     nlevp1 = ilevp1
          nlevm1 = ilev - 1
          iplev  = 0
          iplvp1 = 1
          is  = nvclev + ilevp1
 110:     ism = is - 1
          zpp = vct(1)
          zsm = vct(is)
      
          apsurf  = 98200.
 115: 
          t0icao  = 288.
          tsticao = 216.5
          zp0icao = 101320.
          rdlnp0i = rd*LOG(zp0icao)
 120:     rdtstic = rd*tsticao
          alrrdic = 0.0065/g
          rdt0ral = t0icao/alrrdic
          rdlnpti = rdlnp0i + (LOG(tsticao/t0icao))/alrrdic
          ptricao = EXP(rdlnpti/rd)
 125:     gsticao = tsticao*(rdlnpti-1./alrrdic)
      
          !-- 2. Calculate pressure-level values
      
      10  CONTINUE
 130: 
          zb = vct(nvclev+iplvp1+1)
          IF (zb>0.) THEN
             nplev  = iplev
             nplvp1 = iplvp1
 135:        nplvp2 = iplvp1 + 1
             IF (iplev==0) THEN
                nplvpa = 2
             ELSE
                nplvpa = iplvp1
 140:        END IF
             GO TO 20
          ELSE
             iplev  = iplvp1
             iplvp1 = iplev + 1
 145:        IF (iplvp1==ilevp1) GO TO 40
             zp  = zpp
             zpp = vct(iplvp1)
             delpr(iplev) = zpp - zp
             rdelpr(iplev) = 1./delpr(iplev)
 150:        IF (iplev>1) THEN
                rlnpr(iplev)  = zrd*LOG(zpp/zp)
                ralpha(iplev) = zrd - zp*rlnpr(iplev)/delpr(iplev)
             END IF
             alpham(iplev) = ralpha(iplev)*rcpd
 155:        ardprc(iplev) = rlnpr(iplev)*rdelpr(iplev)*rcpd
             GO TO 10
          END IF
      
          !-- 3. Calculate sigma-level values
 160: 
      20  CONTINUE
      
          za = vct(ism-nvclev)
          IF (za>0.) THEN
 165:        nlmsgl = ism - nvclev
             nlmslp = nlmsgl + 1
             nlmsla = nlmslp
             GO TO 30
          ELSE
 170:        is  = ism
             ism = is - 1
             ist = is - nvclev
             zs  = zsm
             zsm = vct(is)
 175:        IF (ist==1) THEN
                nlmsgl = 0
                nlmslp = 1
                nlmsla = 2
                GO TO 30
 180:        ELSE
                rlnpr(ist)  = zrd*LOG(zs/zsm)
                ralpha(ist) = zrd - zsm*rlnpr(ist)/(zs-zsm)
             END IF
             GO TO 20
 185:     END IF
      
          !-- 4. Calculate dela, delb, rddelb, cpg, and complete alphdb
      
      30  CONTINUE
 190: 
          DO jk = 1, nlev
             dela(jk)   = vct(jk+1) - vct(jk)
             delb(jk)   = vct(nvclev+jk+1) - vct(nvclev+jk)
             rddelb(jk) = rd*delb(jk)
 195:        cpg(jk)    = vct(nvclev+jk)*vct(jk+1) - vct(nvclev+jk+1)*vct(jk)
          END DO
      
          DO jk = nlmslp, nlev
             alpham(jk) = ralpha(jk)*delb(jk)
 200:     END DO
      
          !-- 5. Compute full level values of the hybrid coordinate
      
      40  CONTINUE
 205: 
          zetam = vct(1)/apzero + vct(nvclev+1)
          cetah(1) = zetam
      
          DO jlev = 1, nlev
 210:        zetap = vct(jlev+1)/apzero + vct(nvclev+1+jlev)
             ceta(jlev) = (zetam+zetap)*.5
             cetah(jlev+1) = zetap
             zetam = zetap
          END DO
 215: 
          RETURN
        END SUBROUTINE inihyb
      
      END MODULE mo_hyb


Info Section
uses: mo_constants, mo_control, mo_parameters
back to top
ECHAM 4 vf90 (C) 1998 Max-Planck-Institut für Meteorologie, Hamburg
Wed Nov 24 01:25:21 CST 1999

HTML derived from FORTRAN source by f2html.pl v0.3 (C) 1997,98 Beroud Jean-Marc.