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