PUBLIC INTERFACE ~ PUBLIC DATA ~ PUBLIC ROUTINES ~ NAMELIST ~ DIAGNOSTIC FIELDS ~ ERROR MESSAGES ~ REFERENCES ~ NOTES

Module ocean_model_mod

Contact:  Tom Knutson
Reviewers: 
Change History: WebCVS Log


OVERVIEW

This is a slab-type ocean model. It is the primary means of determining the equilibrium climate sensitivity of an atmosphere/land/sea-ice model.

This is a slab-type ocean model, sometimes referred to as as a qflux-adjusted mixed-layer model. It is a very simple ocean model consisting of a single motionless layer without advection or diffusion, but possibly including sea ice. This type of model is the primary tool used to determine the equilibrium climate sensitivity of an atmosphere/land/sea-ice model.

The model is designed to run in 3 stages: restoring mode, qflux-adjusted control run mode, and perturbation experiment mode. The model can also be run in "free mode" with no restoring or qflux adjustments, although this is normally not done. It can also be run in various other combinations such as qflux-adjusted with further restoring although this is also not normally done.

Note that the sea-ice model is an integral part of the slab-ocean model although that code exists elsewhere (in the SIS part of FMS). Care should be taken that the ice restoring fluxes archived by the sea-ice model during the restoring phase are added to the sst restoring fluxes archived by this model during the restoring phase in order to determine the total qflux adjustment field. Similarly any ice-lid fluxes archived in the control experiment by the ice model should be added to the control run qflux adjustment field to obtain the final qflux adjustment field used for a perturbation experiment (without a lid). More discussion of these topics is provided in the postscript documentation for the model (in preparation).

Click here for additional documentation


OTHER MODULES USED

    constants_mod
time_manager_mod
mpp_mod
mpp_domains_mod
fms_mod
diag_manager_mod
data_override_mod
coupler_types_mod

PUBLIC INTERFACE

ocean_model_init:
This initializes the ocean model
update_ocean_model:
The main time-stepping routine for the mixed layer ocean model
ocean_model_end:
End of integration routine for the mixed layer ocean model
read_ice_ocean_boundary:
This ocean_model doesn't support concurrent runs, so this routine should never be called. This is a dummy routine.
read_ice_ocean_boundary:
This ocean_model doesn't support concurrent runs, so this routine should never be called. This is a dummy routine.
init_default_ice_ocean_boundary:
dummy routine


PUBLIC DATA

None.


PUBLIC ROUTINES

  1. ocean_model_init

      subroutine ocean_model_init (Ocean, Time_init, Time, Time_step)
    
        type (ocean_data_type), &
             intent(inout) :: Ocean     ! Ocean definition variable
        type (time_type), intent(in) :: &
             Time_init, &               ! Initial time (currently not used by routine)
             Time,      &               ! Current time
             Time_step                  ! Time step of ocean model
    DESCRIPTION
    The ocean model is initialized by reading namelist, reading in restart data, setting up variables and domains, etc.


  2. update_ocean_model

      subroutine update_ocean_model( Ice_boundary, Ocean, &
           ocean_seg_start, ocean_seg_end, num_ocean_calls )
    
        type(ice_ocean_boundary_type), intent(in) :: &
                   Ice_boundary  ! Variable with fields for communication 
                                 ! from ice to the ocean
        type (ocean_data_type), intent(inout) :: &
                   Ocean         ! Ocean definition variable 
        logical, intent(in), optional :: &
                   ocean_seg_start, &  ! currently unused placeholder parameter 
                   ocean_seg_end       ! currently unused placeholder parameter
        integer ,intent(in), optional :: &
                   num_ocean_calls     ! currently unused placeholder parameter
    DESCRIPTION
    The mixed layer ocean model is integrated forward for one ocean time step according to the following key set of equations:

    hflx = Ice_boundary%sw_flux + Ice_boundary%lw_flux - & (Ice_boundary%fprec+Ice_boundary%calving)*hlf - Ice_boundary%t_flux - Ice_boundary%q_flux*hlv

    net_hflx(:,:) = hflx(:,:) + qflux_adj(:,:) + qflux_restore_sst(:,:)

    Ocean%t_surf = Ocean%t_surf + dt_ocean * net_hflx/mlcp



  3. ocean_model_end

      subroutine ocean_model_end (Ocean)
    
        type (ocean_data_type), intent(in) :: &
                         Ocean        ! Ocean definition variable
    DESCRIPTION
    This routine writes and closes the restart file and is called at the end of a model run on the system.


  4. read_ice_ocean_boundary

      subroutine read_ice_ocean_boundary(file_name,iob,Ocean)
    
        character(LEN=*),             intent(IN)    :: file_name  
        type(ice_ocean_boundary_type),intent(INOUT) :: iob
        type(ocean_data_type),        intent(IN)    :: Ocean
    DESCRIPTION
    This ocean_model doesn't support concurrent runs, so this routine should never be called. This is a dummy routine.


  5. read_ice_ocean_boundary

      subroutine write_ice_ocean_boundary(file_name,iob,Ocean)
    
        character(LEN=*),             intent(IN) :: file_name  
        type(ice_ocean_boundary_type),intent(IN) :: iob
        type(ocean_data_type),        intent(IN) :: Ocean
    DESCRIPTION
    This ocean_model doesn't support concurrent runs, so this routine should never be called. This is a dummy routine.


  6. init_default_ice_ocean_boundary

    ! dummy routine
    
      subroutine init_default_ice_ocean_boundary(iob)
    
        type(ice_ocean_boundary_type),intent(INOUT) :: iob
    DESCRIPTION
    dummy routine



PUBLIC TYPES

  type ocean_data_type
     type(domain2D) :: Domain

     real, pointer, dimension(:,:) :: &
          t_surf =>NULL(), &      !  mixed layer temperature
          s_surf =>NULL(), &      !  mixed layer salinity (a constant at present in this model)
          sea_lev =>NULL(), &     !  sea level (Not used in Mixed layer model)
          frazil =>NULL(), &      !  energy flux of frazil formation.
                                  !     unit:  when divided by dt_ocean, unit is W/m2
          u_surf =>NULL(), &      !  zonal ocean current (= 0 at present in this model)
          v_surf =>NULL()         !  meridional ocean current (= 0 at present in this model)
     logical, pointer, dimension(:,:) :: maskmap =>NULL()! A pointer to an array indicating which
                                                         ! logical processors are actually used for
                                                         ! the ocean code. The other logical
                                                         ! processors would be all land points and
                                                         ! are not assigned to actual processors.
                                                         ! This need not be assigned if all logical
                                                         ! processors are used. This variable is dummy and need 
                                                         ! not to be set, but it is needed to pass compilation.
     logical, pointer, dimension(:,:) :: mask =>NULL() ! mask is true for ocean points, false for land points
     type (time_type)                 :: Time, &       ! Current time for model
                                         Time_step     ! Time step for ocean model
     integer, pointer :: pelist(:) =>NULL()
     logical :: pe
     integer, dimension(3)            :: axes    
     type(coupler_2d_bc_type)         :: fields  ! array of fields used for additional tracers
  end type ocean_data_type
  type, public :: ice_ocean_boundary_type      
     real, dimension(:,:), pointer :: u_flux =>NULL(), &    ! zonal wind stress (Pa)
                                      v_flux =>NULL(), &    ! meridional wind stress (Pa)
                                      t_flux =>NULL(), &    ! sensible heat flux (w/m2)
                                      q_flux =>NULL(), &    ! specific humidity flux (kg/m2/s)
                                      salt_flux =>NULL(), & ! salinity flux (kd/m2/s) (Not used in mixed layer model) 
                                      lw_flux =>NULL(), &   ! net (down-up) longwave flux (W/m2)
                                      sw_flux =>NULL(), &   ! net (down-up) shortwave flux (W/m2)
                                      sw_flux_vis => NULL(),  & ! visible sw radiation (w/m2)
                                      sw_flux_dir => NULL(),  & ! direct sw radiation (w/m2)
                                      sw_flux_dif => NULL(),  & ! diffuse sw radiation (w/m2)
                                      sw_flux_vis_dir => NULL(),  & ! direct visible sw radiation (w/m2)
                                      sw_flux_vis_dif => NULL(),  & ! diffuse visible sw radiation (w/m2)
                                      lprec =>NULL(), &     ! mass flux of liquid precipitation (Kg/m2/s)
                                      fprec =>NULL()        ! mass flux of frozen precipitation (Kg/m2/s)
     real, dimension(:,:), pointer :: runoff =>NULL(), &    ! mass flux of liquid runoff (Kg/m2/s)
                                      calving =>NULL()      ! mass flux of frozen runoff (Kg/m2/s)


     real, dimension(:,:), pointer :: p =>NULL()   ! pressure on the surface of the ocean (Pa) 
                                                   ! (Not used in mixed layer model)
     real, dimension(:,:,:), pointer :: data =>NULL() ! collective field for "named" fields above
     integer :: xtype             !REGRID, REDIST or DIRECT
     type(coupler_2d_bc_type)      :: fluxes  ! array of fields used for additional tracers
  end type ice_ocean_boundary_type


NAMELIST

&ocean_model_nml

mixed_layer_depth
Depth of the mixed layer
[real, units: meters, default: 50.0]
mixed_layer_salin
Salinitiy of the mixed layer
[real, units: parts per thousand, default: 33.333]
layout
Multiple processor layout variable
[integer, units: , default: (/0,0/)]
do_qflux_adj
Add qflux adjustment to mixed layer tendency equation?
[logical, units: , default: .false.]
do_restore_sst
Restore mixed layer temperature toward observed SST?
[logical, units: , default: .false.]
sst_restore_timescale
Time scale for mixed layer temperature restoring (if used)
[real, units: days, default: 5.0.]


DATA SETS

None.


PUBLIC CODE

From subroutine update_ocean_model:
! The following are some key equations for this model:
     
     hflx = Ice_boundary%sw_flux + Ice_boundary%lw_flux - &
             (Ice_boundary%fprec+Ice_boundary%calving)*hlf - Ice_boundary%t_flux - Ice_boundary%q_flux*hlv

     net_hflx(:,:) = hflx(:,:) + qflux_adj(:,:) + qflux_restore_sst(:,:)

     Ocean%t_surf = Ocean%t_surf + dt_ocean*net_hflx/mlcp


ERROR MESSAGES

FATAL in ocean_model_init
cannot open INPUT/grid_spec.nc
Grid specification file could not be opened.
FATAL in ocean_model_init
cannot find wet on INPUT/grid_spec.nc
The wet field could not be located on the grid specification file.
FATAL in ocean_model_init
cannot find geo_lonc on INPUT/grid_spec.nc
The geo_lonc field could not be located on the grid specification file.
FATAL in ocean_model_init
cannot find geo_latc on INPUT/grid_spec.nc
The geo_latc field could not be located on the grid specification file.
FATAL in update_ocean_model
Slab ocean_model not correctly initialized.
The slab or mixed-layer type ocean model was not correctly initialized.
FATAL in update_ocean_model
Ice_ocean_boundary not correctly initialized.
The Ice_ocean_boundary variable was not correctly initialized.
FATAL in read_ice_ocean_boundary
ocean_mixed_layer model cannot run concurrently.
The ocean_mixed_layer model is not coded to run concurrently at present.
FATAL in read_ice_ocean_boundary
ocean_mixed_layer model cannot run concurrently.
The ocean_mixed_layer model is not coded to run concurrently at present.


top