Contact: Bill Stern Reviewers:
Calculates partial tendencies for the zonal and meridional winds due to the effect of mountain gravity wave drag.
Given temperature and wind profiles at the model's pressure levels, this module returns tendencies of wind due to orographically induced gravity wave drag.
This parameterization was developed by Pierrehumbert (see reference) and implemented by Bill Stern. This parameterization develops a saturation flux profile which s defined as a limiting amount of momentum flux, above which wave breaking will take place and flux absorption will take place (i.e., wave drag). A key feature of this scheme is that the base momentum flux will obey linear theory for small Froude number (Fr), but for large Fr it attempts to incorporate nonlinear effects which will act to limit the growth of the flux. A second significant distinction in this scheme is the separation of a low-level region (which may involve a strong nonlinear drag enhancement that is not part of this parameterization) from upper atmospheric flux absorption, which is the focus of this scheme.
mg_drag_init - Called once to initialize mg_drag - read in subgrid mountains as a restart file. Also reads namelist. Must be called before mg_drag.
mg_drag - Driver for mountain gravity wave drag module
mg_drag_end - Writes out subgrid mountains as a restart file..
Notes:
* A namelist interface ( &mg_drag_nml ) controls runtime
options.
!--------------------------------------------------------------
! Input Arguments
! lonb - longitude in radians of the grid box edges
! latb - latitude in radians of the grid box edges
!---------------------------------------------------------------------
real, intent(in), dimension(:) :: lonb,latb
!---------------------------------------------------------------------
! Optional Output Argument
! hprime - array of sub-grid scale mountain heights (in meters)
!---------------------------------------------------------------------
real, intent(out), dimension(:,:), optional :: hprime
!--------------------------------------------------------------
call mg_drag (is,js,delt,uwnd,vwnd,temp,pfull,phalf, &
zfull,zhalf,dtaux,dtauy,dtemp,taub,kbot)
!--------------------------------------------------------------
! Input Arguments
! IS,JS - integers containing
the starting
!
i,j indices from the full horizontal grid
! delt - time step in seconds (real)
! UWND Zonal
wind (dimensioned IDIM x JDIM x KDIM)
! VWND Meridional
wind (dimensioned IDIM x JDIM x KDIM)
! TEMP Temperature
at full model levels
!
(dimensioned IDIM x JDIM x KDIM)
! PFULL Pressure at
full model levels
!
(dimensioned IDIM x JDIM x KDIM)
! PHALF Pressure at
half model levels
!
(dimensioned IDIM x JDIM x KDIM+1)
! ZHALF Height at half
model levels
!
(dimensioned IDIM x JDIM x KDIM+1)
! ZFULL Height at full
model levels
!
(dimensioned IDIM x JDIM x KDIM+1)
! KBOT OPTIONAL;lowest
model level index (integer)
!
(dimensioned IDIM x JDIM)
!--------------------------------------------------------------
integer, intent(in) :: is,js
real, intent(in), dimension (:,:,:) :: uwnd, vwnd, temp,
pfull, phalf, zfull, zhalf
integer, intent(in), OPTIONAL, dimension(:,:) ::
kbot
!---------------------------------------------------------------------
! Output Arguments
! TAUB base momentum
flux - output for diagnostics
!
(dimensioned IDIM x JDIM)-kg/m/s**2
!
= -(RHO*U**3/(N*XL))*G(FR) FOR N**2 > 0
!
= 0
FOR N**2 <=0
! DTAUX Tendency of
the zonal wind component deceleration
!
(dimensioned IDIM x JDIM x KDIM)
! DTAUY Tendency of
the meridional wind component deceleration
!
(dimensioned IDIM x JDIM x KDIM)
! DTEMP Tendency of
the temperature due to the dissipation of momentum
!
!---------------------------------------------------------------------
real, intent(out), dimension (:,:) :: taub
real, intent(out), dimension (:,:,:) :: dtaux, dtauy
!-----------------------------------------------------------------------
call mg_drag_end ()
there are no arguments to this routine
&mg_drag_nml
xl_mtn Effective mountain length ( set currently to 100km) acoef Order unity "tunable" parameter (may have nonlinear impact) gmax Order unity "tunable" parameter (may be enhanced to increase drag) rho Stand value for density of the air at sea-level (1.13 KG/M**3) low_lev_frac Fraction of atmosphere (from bottom up) considered to be "low-level-layer" for base flux calc. and where no wave breaking is allowed. do_conserve_energy If TRUE the heating due to the dissipation of kinetic energy by Rayleigh damping will be computed (default is FALSE). source_of_sgsmtn ='computed': The topography sub-grid scale variance is computed from the navy 1/6'th degree topography data. = 'input': The topography sub-grid scale variance is read from a netcdf data file (INPUT/mg_drag.data.nc). The field name in this file must be "sgsmtn". A check exists that the resolution the model and data match. A previously generated output file containing "sgsmtn" may be used, but the result may not reproduce exactly if the data is not 8 byte. do_mcm_mg_drag If TRUE the gravity wave drag calculation mimics Manabe Climate Model. (default is FALSE).
MPP version created. Minor changes for open_file, error_mesg, and Fortran write statements.
Fatal error in mg_drag_init: No sub-grid orography restart file specified
There are no known bugs.
Code developed by Bill Stern & Ray Pierrehumbert Original code ~ Summer 1986. First Fortran 90 version created by Bill Stern in June 1999. ------------------------------------------------------------------- Important Note: The subgrid scale topography is now generated automatically (using topograpy_mod) when mg_drag_init is called and the navy hires-topography file is present. Users can still read their own subgrid scale topography from file INPUT/mg_drag.res if they remove the navy hires-topography file. Refer to module topograpy_mod for details on how the subgrid scale topography is computed. -------------------------------------------------------------------
Code for calculating subgrid-scale mountains was developed by Bruce Wyman. Subgrid-scale mountains are available for a number of resolutions including: N30, N45, T30, T42, T63, R15, R30. Subgrid-scale orography is computed from the Navy 1/6 degree dataset which may be found at: /archive/bw/HiresNavyTape/Zmean The following sample code may be used to create subgrid-scale orography for other resolutions: integer, parameter :: nlon = 2160, nlat = 1080 real, dimension :: data(nlon,nlat) real :: hpie, wb, sb, dlat, dlon ! INPUT: unit = unit number of topography file ! lon = longitude (in radians) of grid box boundaries ! lat = latitude (in radians) of grid box boundaries ! OUTPUT: zsurf = height of topography (in meters) ! stdev = standard deviation of height (m) within grid-box ! ! (zsurf and stdev must be dimensioned size(lon)-1 by size(lat)-1) integer, intent(in) :: unit real, intent(in), dimension(:) :: lon,lat real, intent(out), dimension(:,:) :: zsurf, stdev ! --- input (hires) grid resolution --- hpie = acos(0.0) wb = 0.0; sb = -hpie dlat = 2.0*hpie/float(nlat) dlon = 4.0*hpie/float(nlon) ! --- Read global 10 minute files --- open (unit, file='Zmean', form='unformatted') read (unit) data close (unit) ! --- convert topog from cm to m --- data(:,:)=data(:,:)*0.01 call horiz_interp (data, wb, sb, dlon, dlat, & lon, lat, zsurf) ! --- compute standard deviation of topography --- data(:,:)=data(:,:)*data(:,:) call horiz_interp (data, wb, sb, dlon, dlat, & lon, lat, stdev) stdev = stdev - zsurf*zsurf where (stdev > 0.0) stdev = sqrt ( stdev ) elsewhere stdev = 0.0 endwhere
none at this time