PUBLIC INTERFACE / ROUTINES / NAMELIST / FIELD_TABLE / DIAGNOSTIC OUTPUT / DOMAIN DECOMPOSITION / CHANGES / ERRORS / REFERENCES / NOTES

Last updated on .


Module spectral_dynamics_mod

     Contact: Isaac Held, V. Balaji, Peter Phillips, Paul Kushner


OVERVIEW


     The dynamical core of the spectral atmospheric model -- updates the 
     spectral and physical space atmospheric fields




OTHER MODULES USED


                fms_mod
          constants_mod
       time_manager_mod
      field_manager_mod
     tracer_manager_mod
       diag_manager_mod
         transforms_mod
     vert_advection_mod
           implicit_mod
   press_and_geopot_mod
   spectral_damping_mod
           leapfrog_mod
       fv_advection_mod
    water_borrowing_mod
    global_integral_mod
 spectral_init_cond_mod
        tracer_type_mod


PUBLIC INTERFACE


use spectral_dynamics_mod [,only: spectral_dynamics_init,        &
                                  spectral_dynamics,             &
                                  spectral_dynamics_end,         &
                                  get_num_levels,                &
                                  get_use_virtual_temperature,   &
                                  get_reference_sea_level_press, &
                                  get_surf_geopotential,         &
                                  get_pk_bk,                     &
                                  get_axis_id,                   &
                                  complete_robert_filter,        &
                                  complete_update_of_future,     &
                                  complete_init_of_tracers,      &
                                  spectral_diagnostics

spectral_dynamics_init : Initializes module

spectral_dynamics      : Updates atmospheric state

spectral_dynamics_end  : Releases array space allocated for use by this module.
                         calls termination routines of modules used.

get_*                  : Provides for the retrieval of selected variables by host modules.

complete_update_of_future: Transforms updated fields to spectral representation.
                           Must be called at end of atmospheric time step if fields
                           are modified after the call to subroutine spectral_dynamics.

complete_robert_filter : Uses spectral representation of updated fields to complete
                         the robert filter of the fields at the previous time step.
                         Must be called at end of atmospheric time step.
                         (After fields are fully updated in grid representation.)

complete_init_of_tracers: Tracer values may be initialized elsewhere in the model
                          besides spectral_dynamics_init. This subroutine allows 
                          those values to be known by spectral_dynamics_mod.
                          (Should be called near the end of the atmospheric initialization)

spectral_diagnostics : Writes diagnostic fields of dynamical variables in netcdf format.
                       (Should be called near the end of the atmospheric time step.)


PUBLIC ROUTINES


  call spectral_dynamics_init(Time, Time_step, tracer_attributes, nhum, ocean_mask)

input:

  type(time_type) :: Time , The model time corresponding to the most recent time step.

  type(time_type) :: Time_step , The model time step. i.e., the difference between the model time of
                                 the most recent time step and the next.

output:

  type(tracer_type) :: tracer_attributes

  logical :: dry_model -- .true. when water vapor does not appear in the field table

  integer :: nhum -- The tracer index of water vapor.
                     Zero when water vapor does not appear in the field table

  optional, logical, dimension(:,:) :: ocean_mask -- If present, used 
                    for the smoothing of topography when the computed
                    topography option is chosen. See topography_option
                    Ocean points are .true., land points .false.

------------------------------------------------------------------------------------
  call spectral_dynamics(Time, &
                         psg, ug, vg, tg, tracer_attributes, tracers, &
                         dt_psg, dt_ug, dt_vg, dt_tg, dt_tracers, &
                         wg_full, p_full, p_half, z_full)

intent(in):

 type(time_type) :: Time -- Model time of the current time step.

 real :: dt_psg, dt_ug, dt_vg, dt_tg, dt_tracers -- Tendencies of the
         atmospheric fields due to whatever atmospheric physics calculations
         may have been done prior to calling spectral_dynamics.
         The dynamical tendencies are added to the input tendencies,
         and the fields are updated.

 real, dimension(is:ie, js:je) :: dt_psg

 real, dimension(is:ie, js:je, num_levels) :: dt_ug, dt_vg, dt_tg

 real, dimension (is:ie, js:je, num_levels, num_tracers) :: dt_tracers

intent(out):

 psg, ug, vg, tg, tracers -- Updated atmospheric fields, corresponding
                             to the model time  Time + Time_step

 real, dimension(is:ie, js:je) :: psg -- Surface pressure (Pa)

 real, dimension(is:ie, js:je, num_levels) :: ug -- Zonal wind component (m/sec)

 real, dimension(is:ie, js:je, num_levels) :: vg -- Meridional wind component (m/sec)

 real, dimension(is:ie, js:je, num_levels) :: tg -- Temperature (deg K)

 real, dimension (is:ie, js:je, num_levels, num_tracers) :: tracers --
                   Any fields to be treated as passive tracers by the dynamics.

 wg_full -- real, dimension(is:ie, js:je, num_levels)
    Pressure vertical velocity = Dp/Dt

 p_full -- real, dimension(is:ie, js:je, num_levels) 
    Pressure at model full levels

 p_half -- real, dimension(is:ie, js:je, num_levels+1) 
    Pressure at model half levels

 z_full -- real, dimension(is:ie, js:je, num_levels) 
    Geopotential height at model full levels

------------------------------------------------------------------------------------

 call spectral_dynamics_end(tracer_attributes, Time)

 type(tracer_type), intent(in), dimension(:)  :: tracer_attributes

 type(time_type), intent(in), optional :: Time -- Model time of the current time step.
                      Omission of Time in the argument list has no adverse consequences,
                      it exists as an optional argument only to satify certain host modules.

 Writes fields to restart file: RESTART/spectral_dynamics.res.nc
 Deallocates module arrays, which includes all those of intent(inout).
 Calls destructors of modules initialized by spectral_dynamics_init.

------------------------------------------------------------------------------------
call get_num_levels(num_levels)

integer, intent(out) :: num_levels
------------------------------------------------------------------------------------
call get_use_virtual_temperature(use_virtual_temperature)

logical, intent(out) :: use_virtual_temperature
------------------------------------------------------------------------------------
call get_reference_sea_level_press(reference_sea_level_press)

real, intent(out) :: reference_sea_level_press
------------------------------------------------------------------------------------
call get_surf_geopotential(surf_geopotential)

real, intent(out), dimension(:,:) :: surf_geopotential
------------------------------------------------------------------------------------
call get_pk_bk(pk, bk)

real, intent(out), dimension(num_levels+1) :: pk, bk
------------------------------------------------------------------------------------
function get_axis_id()

integer, dimension(4) :: get_axis_id

  Returns the axis id numbers for the longitude, latitude, full pressure, and half pressure axes.
  These are netcdf id numbers and are assigned by the diagnostic manager.
  They can be used throughout the atmospheric model wherever diagnostic fields are saved (e.g., the physics).

------------------------------------------------------------------------------------
call complete_robert_filter(current, future, tracer_attributes, grid_tracers)

integer, intent(in) :: current, future
type(tracer_type), intent(inout), dimension(:) :: tracer_attributes
real,              intent(inout), dimension(:,:,:,:,:) :: grid_tracers

  Uses spectral representation of updated fields to complete
  the robert filter of the fields at the previous time step.
  Must be called at end of atmospheric time step.
  (After fields are fully updated in grid representation.)
------------------------------------------------------------------------------------
call complete_update_of_future(current, future, psg, ug, vg, tg, tracer_attributes, grid_tracers)

integer, intent(in) :: current, future
real,              intent(inout), dimension(:,:      ) :: psg
real,              intent(inout), dimension(:,:,:    ) :: ug, vg, tg
type(tracer_type), intent(inout), dimension(:        ) :: tracer_attributes
real,              intent(inout), dimension(:,:,:,:,:) :: grid_tracers

  Transforms updated fields to spectral representation.
  Must be called at end of atmospheric time step if fields
  are modified after the call to subroutine spectral_dynamics.

------------------------------------------------------------------------------------
call complete_init_of_tracers(tracer_attributes, previous, current, grid_tracers)

type(tracer_type), intent(in), dimension(:) :: tracer_attributes
integer, intent(in) :: previous, current
real,    intent(inout), dimension(:,:,:,:,:) :: grid_tracers

  Tracer values may be initialized elsewhere in the model
  besides spectral_dynamics_init. This subroutine allows 
  those values to be known by spectral_dynamics_mod.
  (Should be called near the end of the atmospheric initialization)
------------------------------------------------------------------------------------

NAMELIST


&spectral_dynamics_nml

  damping_option -- character

        parameters that define the sub-grid (hyper-)diffusion
        the diffusion operator is the Laplacian raised to the n'th power
        where n = damping_order (so  damping_order = 2 is biharmonic etc)

        damping_coeff controls the strength of the damping, but has different
          meaning depending on whether damping_option = resolution_depenent or resolution_indepenent

        damping_option = 'resolution_dependent': The damping coefficient has units of 1/s,
            and is the inverse of the damping time scale of wavenumber num_spherical-1.
            For example, if it is desired to damp wavenumber  num_spherical-1 with a
            time scale of 0.1 days then set damping_coeff=1./(0.1*86400.)

        damping_option = 'resolution_independent': The damping coefficient has units of 
           (meters**(2*damping_order))/seconds -- damping operator is 
                damping_coeff*(-1^(n-1))*laplacian^n

        defaults: damping_option = 'resolution_dependent'
                  damping_coeff  = 1.15740741e-4 (one tenth day)

 ---------------------------------------------------------------------------------------------

 damping_coeff_vor  -- real
 damping_order_vor  -- integer
 damping_coeff_div  -- real
 damping_order_div  -- integer
        
        Use these if it is desired to diffuse vorticity and divergence
        differently than the scalar fields.

        default: If not specified then values will be the same as those
                 specified for the scalar fields.

 ---------------------------------------------------------------------------------------------
 
 Additional horizontal diffusion may optionally be applied at the model top level.
 This additional diffusion is refered to as the "sponge".
 The sponge is always resolution independent and del-sqaured.
 (There is no equivalent of damping_option or damping_order)
 The sponge is applied separately to the eddy, zonal, and meridional winds.
 
 eddy_sponge_coeff -- sponge coefficient for eddy wind
 zmu_sponge_coeff  -- sponge coefficient for zonal wind
 zmv_sponge_coeff  -- sponge coefficient for meridional wind

 By default the sponge is off, that is, default for all = 0.0
 
 ---------------------------------------------------------------------------------------------

 initial_sphum = Cold start initial value of specific humidity.
                 Ignored if model is dry and/or when model is warm started.
                 default = 0.0

 ---------------------------------------------------------------------------------------------

 use_virtual_temperature = .true.  Virtual temperature is used in computation of geopotential.
                         = .false. Moisture is ignored in computation of geopotential.
                            default = .false.

 ---------------------------------------------------------------------------------------------

 do_mass_correction = .true. Surface pressure corrected by multiplicative constant
                             to prevent spectral_dynmaics from changing mean surface pressure.
                           default = .true.

 ---------------------------------------------------------------------------------------------

 do_water_correction = .true. Specific humidity corrected by multiplicative constant
                              to prevent spectral_dynmaics from changing glboal mean water vapor.
                            default = .true.

 ---------------------------------------------------------------------------------------------

 do_energy_correction = .true. Temperatures corrected by additive constant to prevent
                               spectral_dynamics from changing global mean energy.
                               (enthalpy plus kinetic energy; vertically integrated enthalpy
                               equals vertically integrated internal plus potential energy)
                             default = .true.

 ---------------------------------------------------------------------------------------------

 vert_advect_uv: Character string  specifying vertical advection scheme for wind components

 vert_advect_t : Character string  specifying vertical advection scheme for temperature

                 The vertical advection schemes are:
                 'second_centered':  centered second-order vertical advection
                 'fourth_centered':  centered fourth-order vertical advection
                 'van_leer_linear':  piecewise linear Van Leer in vertical
		 'finite_volume_parabolic': piecewise parabolic, finite volume

		 default for all three = 'second_centered'

 ---------------------------------------------------------------------------------------------

 use_implicit = .true. : Implicit time step is used.
              = .false.: Explicit time step is used.
              default = .true.

 ---------------------------------------------------------------------------------------------

 longitude_origin = The longitude of the first grid point in the global domain.
              default = 0.0

 ---------------------------------------------------------------------------------------------

 
 robert_coeff = Coefficient of the robert filter.
              default = .04

	      Note: The robert coefficient for any tracer can optionally be set to
	            a different value. This is done in the field table.
		    The value specified in the namelist applies to surface pressure,
		    vorticity, divergence, temperature and any tracer for which an
		    overriding value is not specified in the field table.

 ---------------------------------------------------------------------------------------------

 alpha_implicit = 0.5 : centered  implicit gravity wave scheme
                = 1.0 : backwards implicit gravity wave scheme
              default = 0.5

 ---------------------------------------------------------------------------------------------

 vert_difference_option='simmons_and_burridge' : Full levels computed according to the scheme of Simmons and Burridge.
                            See Mon. Weather Review: Vol. 109, No. 4, pp. 758-766

                       ='mcm' : Full levels at arithmetic mean of half levels.
                                This vertical differencing is used by the
                                Manabe Climate Model, hence the acronym "mcm".

                        default = 'simmons_and_burridge'

 ---------------------------------------------------------------------------------------------

 triang_trunc = .true.  for triangular truncation,
              = .false. for rhomboidal truncation.
                default = .true.

 -----------------------------------------------------------------------------------------------------
 
 topography_option = 'flat': surface height = 0 everywhere

                   = 'input': Topography is read from a netcdf file.
                        This file must exist as ./INPUT/topography.data.nc
                        Where "." is the directory where the model is executed.
                        The field name in this file must be "zsurf".
                        The field is assumed to be on the gaussian grid. The topography is 
                        transformed to spherical coefficients and back to the grid again
                        to ensure that it is spectrally truncated.
                        A previously generated output file containing "zsurf" may
                        be used, but the result may not reproduce exactly if the
                        data is not 8 byte.

                   = 'interpolated': Realistic topography is interpolated to the atmopheric model's grid
                        A file of raw topography must exist as ./DATA/navy_topography.data
                        Where "." is the directory where the model is executed.
                        The topography file must contain a single record of 32-bit ieee data.
                        topography.f90 expects the raw topography to be on a one-sixth degree
                        lat-lon grid.  (The option to regularize the topography is controlled by
                        namelist variable "ocean_topog_smoothing" See below)

                   = 'gaussian': Idealized gaussian moutains.

                     default = 'interpolated'

 -----------------------------------------------------------------------------------------------------

 ocean_topog_smoothing = The fractional smoothing of topography over the ocean.
                         Must be set when topography_option = 'interpolated'

       When ocean_topog_smoothing = 0. the topography is spectrally truncated but not regularized.
       For regularized topography, a value of about .93 has traditionally been used.
       A land-sea mask is required for topography regularization. This may be supplied as optional
       argument "ocean_mask" of spectral_dynamics_init.  If it is not, then an ocean mask will be
       computed by interpolating Navy water data to the model's grid. The raw water data must exist
       as ./DATA/navy_pctwater.data. Like the raw topography data, it must be a single record of
       32-bit ieee data and be on a one-sixth degree lat-lon grid.

       default = .93

 -----------------------------------------------------------------------------------------------------
                           
 num_fourier = number of fourier waves retained (zonal direction)
       default = 42

 ---------------------------------------------------------------------------------------------

 num_spherical = number of meridional waves retained.
       default = 43

 ---------------------------------------------------------------------------------------------

 fourier_inc   = number of "sectors"
                 If fourier_inc > 1, creates sector model in which all fields have
                 fourier_inc-fold symmetry around latitude circles.
       default = 1

 ---------------------------------------------------------------------------------------------

 num_levels = number of vertical levels
       default = 18

 ---------------------------------------------------------------------------------------------

 lon_max = number of longitude points
       default = 128

 ---------------------------------------------------------------------------------------------

 lat_max = number of latitude points
       default = 64

 ---------------------------------------------------------------------------------------------


 reference_sea_level_press: Used for three different purposes.
             1) It is used to compute initial sea level pressure for a "cold start"
             2) It is passed to the modular physics where it is used only for diagnostics.
             3) It is passed to implict to use as a reference pressure for the implicit scheme.

      default = 101325.

 ---------------------------------------------------------------------------------------------

 scale_heights:  See vert_coord_option, uneven_sigma and hybrid options
 surf_res:       See vert_coord_option, uneven_sigma and hybrid options
 exponent:       See vert_coord_option, uneven_sigma and hybrid options
 p_press:        See vert_coord_option, hybrid option
 p_sigma:        See vert_coord_option, hybrid option

      defaults: scale_heights = 4.0
                surf_res = 0.1
                exponent = 2.5
                p_press  = 0.1
                p_sigma  = 0.3

 -----------------------------------------------------------------------------------------------------

 vert_coord_option = 'input': Vertical coordinate specified on namelist vert_coordinate_nml
 
                   = 'even_sigma': Equally-spaced sigma coordinate.

                   = 'pk_sigma': Unequally-spaced sigma-coordinates following Polvani and Kushner, 2002 (GRL).

                   = 'uneven_sigma': Unequally-spaced sigma-coordinates obtained by assuming
                        equal spacing in zeta in the interval [0,1]
                        where:
                        zeta = (1.-(float(k-1)/float(num_levels)))
                        Z = surf_res*zeta + (1 - surf_res)*(zeta**exponent)
                        p = exp(-Z*scale_heights),
                        except for the top level, which is always at p = 0

                   = 'hybrid': Unequally spaced generalized coordinate making a smooth
                        transition from the unequally spaced sigma coordinates as
                        described above to pressure coordinates between the pressures.
                        p_sigma must be greater than p_press

                   = 'mcm': Unequally-spaced sigma-coordinates of the Manabe Climate Model.
                            num_levels must be 14

                   = 'v197': Standard v197 sigma levels.  num_levels must be 18

 -----------------------------------------------------------------------------------------------------

 valid_range_t : Two element array for the min and max allowable temperatures.
                 Allows for a check that model solution is not blowing up.

                 default = 100., 500.

 -----------------------------------------------------------------------------------------------------

 print_interval :  Two element integer array specifying the interval to print global integrals.
                   First element is days, second element is seconds.
                   For example: print_interval=1,43200 specifies output every 1.5 days
 -----------------------------------------------------------------------------------------------------



&vert_coordinate_nml

   pk = An array of pressures used for the hybrid vertical coordinate.

   bk = An array of constants, in the range zero to one, defining the sigma levels.

   bk(num_levels) must equal 1.0

   The pressures at the interfaces of the model levels are given by:
   p = pk + bk*p_surf


FIELD_TABLE

 

  Attributes of tracers are specified in field_table.
  For a description of the field_table see tracer_manager.html

  Note that water vapor is a tracer. If water vapor does
  not appear in the field table then the model will be dry.

  The tracer attributes are must appear as the method field in the field table.
  An option for each attribute must appear as the scheme field in the field table.
  
  The attributes and there options are:

  numerical_representation: "spectral" or "grid"

                      spectral: Tracer is represented by spherical coefficients.
                                Grid values are computed and used for grid based computations,
				but it is the spherical field that is prognostic.

                      grid:  Tracer is represented as grid point values.
                             Spherical coefficients are not used.

                      default = "spectral"

               -------------------------------------------

  advect_vert: One of several character strings that specify a vertical advection scheme.
               See vert_advection.html
               As of the havana release the options are:
	       "second_centered", "fourth_centered", "van_leer_linear", "finite_volume_parabolic"

	       default = "second_centered"

               -------------------------------------------

  hole_filling: "on" or "off"

              on: When numerical_representation = "spectral", an attempt is made to fill
 	          negative values by borrowing from neighboring points above, below,
		  to the east and west. Borrowing is not done in the meridional direction.
		  Borrowing does not guarantee that negative values will be eliminated,
		  only they they will be reduced.
		  When numerical_representation = "grid", hole_filling is always off, so
		  that specifying "on" will have no effect.

             off: Borrowing is not done.

	     default = "off"

               -------------------------------------------

  robert_filter: "on" or "off"

              on: Current values will be robert filtered when future values are computed.
                  The value of the robert coefficient can be set to a value other than
		  what is specified in spectral_dynamics_nml. See robert_coeff
		  This is done by including a parameter field in the field table. See example below.

             off: Robert filtering is not done.

	     default = "on" with value of robert coefficient specified in namelist.

               -------------------------------------------

   As an example, the field table entry for water vapor might look like this:

   "TRACER", "atmos_mod",                "sphum"
             "longname",                 "specific humidity"
             "units",                    "kg/kg"
             "numerical_representation", "grid"
             "advect_vert",              "van_leer_linear"
             "holefilling"               "off",
             "robert_filter",            "on",       "robert_coeff=.03" /


DIAGNOSTIC OUTPUT


  The fields that may be output are:

             bk  vertical coordinate sigma values (dimensionless)
             pk  vertical coordinate pressure values (pascals)
          zsurf  height of the surface (meters)
             ps  surface pressure (pascals)
      pres_full  pressure at model full levels (pascals)
      pres_half  pressure at model half levels (pascals)
         height  geopotential height at model full levels (meters)
    height_half  geopotential height at model half levels (meters)
          ucomp  zonal wind component (m/sec)
          vcomp  meridional wind component (m/sec)
           temp  temperature (deg_k)
          omega  omega vertical velocity (pascals/sec)
        tracers  multiple number of tracers fields
       ucomp_sq  zonal wind component sqared (m/sec)**2
       vcomp_sq  meridional wind component sqared (m/sec)**2
       omega_sq  omega vertical velocity sqared (pascal/sec)**2
        temp_sq  temperature sqared (deg_k**2)
    ucomp_vcomp  zonal wind times meridional wind (m/sec)**2
     omega_temp  omega vertical velocity times temperature (deg_k*pascals/sec)
           wspd  wind speed (m/s)
            div  divergence (1/s)
            vor  relative vorticity (1/s)
            slp  sea level pressure (pascals)

  Notes:
      The diag_table module name for these fields is: 'dynamics'
      bk, pk and zsurf are static.
      They are written once and have no time axis.

      Diagnostic output is controlled through the diag_table.
      For a description of the diag_table see: diag_table_tk

    ----------------------------------------------------------------------------------

      To facilitate code development, it is sometimes desirable to see the intermediate
      values of the dynamical variables. That is, the values that are computed before
      completion of the time step. When a split time step is used, these are computed
      at a higher frequency than the physics time step.

      These values may be output by including one or more of the following in the diag_table:
      ps_every 
      u_every
      v_every
      t_every
      {tracer_name}_every

      The diag_table module name for these fields is: 'dynamics_every'
   
  NOTE:
      It is recommended that these fields be written to a
      different file than the standard dynamical fields.




DOMAIN DECOMPOSITION

  There a number of constraints on the decompostion of the global domain across processors.
  These constraints reduces the allowable choices for the number of processors on which the spectral model can be run.
  The constraints are:

  1) The decompostion is in the meridional direction only.
     Two dimensional decompostion is not an option.
 
  2) All processors must have an equal number of latitude rows.

  3) Number of processors must not be greater than num_fourier+1.


CHANGE HISTORY


   Modifications between inchon and jakarta include:

   (1) Public interface complete_leapfrog_tg replaced by complete_robert_filter
       and complete_update_of_future.

   (2) Addition of public interface spectral_diagnostics.

   (3) Addition of top level sponge.



ERROR MESSAGES


A fatal error message will be issued when any of the following conditions is detected.

  1) Water or energy correction is specified without mass correction.

  2) Water correction is specified when a humidity variable does not exist in the field_table.

  3) Any namelist variables are given invalid values.

  4) Either numerical_representation or advect_vert is given an invalid value in the field_table.

  5) Both sphum and mix_rat appear in the field_table at the same time.

  6) Atmospheric temperature out of valid range.

  7) Resolution of restart data does not match resolution specified on namelist.

  8) Any public interfaces are called prior to calling subroutine spectral_dynamics_init.


REFERENCES


     See technical documention
     (not yet available).


NOTES


    None.


FUTURE PLANS


    Provide technical documentation.