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.
constants_mod
time_manager_mod
mpp_mod
mpp_domains_mod
fms_mod
diag_manager_mod
data_override_mod
coupler_types_mod
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
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
subroutine ocean_model_end (Ocean)
type (ocean_data_type), intent(in) :: &
Ocean ! Ocean definition variable
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
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
! dummy routine
subroutine init_default_ice_ocean_boundary(iob)
type(ice_ocean_boundary_type),intent(INOUT) :: iob
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
|
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
|