MOM6
|
Time step the adiabatic dynamic core of MOM using RK2 method.
This file time steps the adiabatic dynamic core by splitting between baroclinic and barotropic modes. It uses a pseudo-second order Runge-Kutta time stepping scheme for the baroclinic momentum equation and a forward-backward coupling between the baroclinic momentum and continuity equations. This split time-stepping scheme is described in detail in Hallberg (JCP, 1997). Additional issues related to exact tracer conservation and how to ensure consistency between the barotropic and layered estimates of the free surface height are described in Hallberg and Adcroft (Ocean Modelling, 2009). This was the time stepping code that is used for most GOLD applications, including GFDL's ESM2G Earth system model, and all of the examples provided with the MOM code (although several of these solutions are routinely verified by comparison with the slower unsplit schemes).
The subroutine step_MOM_dyn_split_RK2 actually does the time stepping, while register_restarts_dyn_split_RK2 sets the fields that are found in a full restart file with this scheme, and initialize_dyn_split_RK2 initializes the cpu clocks that are used in this module. For largely historical reasons, this module does not have its own control structure, but shares the same control structure with MOM.F90 and the other MOM_dynamics_... modules.
Data Types | |
type | mom_dyn_split_rk2_cs |
MOM_dynamics_split_RK2 module control structure. More... | |
integer | id_clock_cor |
CPU time clock IDs. More... | |
integer | id_clock_pres |
CPU time clock IDs. More... | |
integer | id_clock_vertvisc |
CPU time clock IDs. More... | |
integer | id_clock_horvisc |
CPU time clock IDs. More... | |
integer | id_clock_mom_update |
CPU time clock IDs. More... | |
integer | id_clock_continuity |
CPU time clock IDs. More... | |
integer | id_clock_thick_diff |
CPU time clock IDs. More... | |
integer | id_clock_btstep |
CPU time clock IDs. More... | |
integer | id_clock_btcalc |
CPU time clock IDs. More... | |
integer | id_clock_btforce |
CPU time clock IDs. More... | |
integer | id_clock_pass |
CPU time clock IDs. More... | |
integer | id_clock_pass_init |
CPU time clock IDs. More... | |
subroutine, public | step_mom_dyn_split_rk2 (u, v, h, tv, visc, Time_local, dt, forces, p_surf_begin, p_surf_end, uh, vh, uhtr, vhtr, eta_av, G, GV, US, CS, calc_dtbt, VarMix, MEKE, thickness_diffuse_CSp, Waves) |
RK2 splitting for time stepping MOM adiabatic dynamics. More... | |
subroutine, public | register_restarts_dyn_split_rk2 (HI, GV, param_file, CS, restart_CS, uh, vh) |
This subroutine sets up any auxiliary restart variables that are specific to the unsplit time stepping scheme. All variables registered here should have the ability to be recreated if they are not present in a restart file. More... | |
subroutine, public | initialize_dyn_split_rk2 (u, v, h, uh, vh, eta, Time, G, GV, US, param_file, diag, CS, restart_CS, dt, Accel_diag, Cont_diag, MIS, VarMix, MEKE, thickness_diffuse_CSp, OBC, update_OBC_CSp, ALE_CSp, setVisc_CSp, visc, dirs, ntrunc, calc_dtbt) |
This subroutine initializes all of the variables that are used by this dynamic core, including diagnostics and the cpu clocks. More... | |
subroutine, public | end_dyn_split_rk2 (CS) |
Close the dyn_split_RK2 module. More... | |
subroutine, public mom_dynamics_split_rk2::end_dyn_split_rk2 | ( | type(mom_dyn_split_rk2_cs), pointer | CS | ) |
Close the dyn_split_RK2 module.
cs | module control structure |
Definition at line 1254 of file MOM_dynamics_split_RK2.F90.
subroutine, public mom_dynamics_split_rk2::initialize_dyn_split_rk2 | ( | real, dimension( g %isdb: g %iedb, g %jsd: g %jed, g %ke), intent(inout) | u, |
real, dimension( g %isd: g %ied, g %jsdb: g %jedb, g %ke), intent(inout) | v, | ||
real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(inout) | h, | ||
real, dimension( g %isdb: g %iedb, g %jsd: g %jed, g %ke), intent(inout), target | uh, | ||
real, dimension( g %isd: g %ied, g %jsdb: g %jedb, g %ke), intent(inout), target | vh, | ||
real, dimension( g %isd: g %ied, g %jsd: g %jed), intent(inout) | eta, | ||
type(time_type), intent(in), target | Time, | ||
type(ocean_grid_type), intent(inout) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(param_file_type), intent(in) | param_file, | ||
type(diag_ctrl), intent(inout), target | diag, | ||
type(mom_dyn_split_rk2_cs), pointer | CS, | ||
type(mom_restart_cs), pointer | restart_CS, | ||
real, intent(in) | dt, | ||
type(accel_diag_ptrs), intent(inout), target | Accel_diag, | ||
type(cont_diag_ptrs), intent(inout), target | Cont_diag, | ||
type(ocean_internal_state), intent(inout) | MIS, | ||
type(varmix_cs), pointer | VarMix, | ||
type(meke_type), pointer | MEKE, | ||
type(thickness_diffuse_cs), pointer | thickness_diffuse_CSp, | ||
type(ocean_obc_type), pointer | OBC, | ||
type(update_obc_cs), pointer | update_OBC_CSp, | ||
type(ale_cs), pointer | ALE_CSp, | ||
type(set_visc_cs), pointer | setVisc_CSp, | ||
type(vertvisc_type), intent(inout) | visc, | ||
type(directories), intent(in) | dirs, | ||
integer, intent(inout), target | ntrunc, | ||
logical, intent(out) | calc_dtbt | ||
) |
This subroutine initializes all of the variables that are used by this dynamic core, including diagnostics and the cpu clocks.
[in,out] | g | ocean grid structure |
[in] | gv | ocean vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in,out] | u | zonal velocity [L T-1 ~> m s-1] |
[in,out] | v | merid velocity [L T-1 ~> m s-1] |
[in,out] | h | layer thickness [H ~> m or kg m-2] |
[in,out] | uh | zonal volume/mass transport [H L2 T-1 ~> m3 s-1 or kg s-1] |
[in,out] | vh | merid volume/mass transport [H L2 T-1 ~> m3 s-1 or kg s-1] |
[in,out] | eta | free surface height or column mass [H ~> m or kg m-2] |
[in] | time | current model time |
[in] | param_file | parameter file for parsing |
[in,out] | diag | to control diagnostics |
cs | module control structure | |
restart_cs | restart control structure | |
[in] | dt | time step [T ~> s] |
[in,out] | accel_diag | points to momentum equation terms for budget analysis |
[in,out] | cont_diag | points to terms in continuity equation |
[in,out] | mis | "MOM6 internal state" used to pass diagnostic pointers |
varmix | points to spatially variable viscosities | |
meke | points to mesoscale eddy kinetic energy fields | |
thickness_diffuse_csp | Pointer to the control structure used for the isopycnal height diffusive transport. | |
obc | points to OBC related fields | |
update_obc_csp | points to OBC update related fields | |
ale_csp | points to ALE control structure | |
setvisc_csp | points to the set_visc control structure. | |
[in,out] | visc | vertical viscosities, bottom drag, and related |
[in] | dirs | contains directory paths |
[in,out] | ntrunc | A target for the variable that records the number of times the velocity is truncated (this should be 0). |
[out] | calc_dtbt | If true, recalculate the barotropic time step |
Definition at line 958 of file MOM_dynamics_split_RK2.F90.
References mom_coriolisadv::coriolisadv_init(), mom_verticalgrid::get_flux_units(), mom_hor_visc::hor_visc_init(), mom_hor_visc::horizontal_viscosity(), id_clock_btcalc, id_clock_btforce, id_clock_btstep, id_clock_continuity, id_clock_cor, id_clock_horvisc, id_clock_mom_update, id_clock_pass, id_clock_pass_init, id_clock_pres, id_clock_vertvisc, mom_restart::is_new_run(), mom_pressureforce::pressureforce_init(), mom_tidal_forcing::tidal_forcing_init(), and mom_vert_friction::updatecfltruncationvalue().
subroutine, public mom_dynamics_split_rk2::register_restarts_dyn_split_rk2 | ( | type(hor_index_type), intent(in) | HI, |
type(verticalgrid_type), intent(in) | GV, | ||
type(param_file_type), intent(in) | param_file, | ||
type(mom_dyn_split_rk2_cs), pointer | CS, | ||
type(mom_restart_cs), pointer | restart_CS, | ||
real, dimension(szib_(hi),szj_(hi),szk_(gv)), intent(inout), target | uh, | ||
real, dimension(szi_(hi),szjb_(hi),szk_(gv)), intent(inout), target | vh | ||
) |
This subroutine sets up any auxiliary restart variables that are specific to the unsplit time stepping scheme. All variables registered here should have the ability to be recreated if they are not present in a restart file.
[in] | hi | Horizontal index structure |
[in] | gv | ocean vertical grid structure |
[in] | param_file | parameter file |
cs | module control structure | |
restart_cs | restart control structure | |
[in,out] | uh | zonal volume/mass transport [H L2 T-1 ~> m3 s-1 or kg s-1] |
[in,out] | vh | merid volume/mass transport [H L2 T-1 ~> m3 s-1 or kg s-1] |
Definition at line 877 of file MOM_dynamics_split_RK2.F90.
References mom_verticalgrid::get_flux_units(), mom_barotropic::register_barotropic_restarts(), and mom_io::var_desc().
subroutine, public mom_dynamics_split_rk2::step_mom_dyn_split_rk2 | ( | real, dimension(szib_(g),szj_(g),szk_(g)), intent(inout), target | u, |
real, dimension(szi_(g),szjb_(g),szk_(g)), intent(inout), target | v, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | h, | ||
type(thermo_var_ptrs), intent(in) | tv, | ||
type(vertvisc_type), intent(inout) | visc, | ||
type(time_type), intent(in) | Time_local, | ||
real, intent(in) | dt, | ||
type(mech_forcing), intent(in) | forces, | ||
real, dimension(:,:), pointer | p_surf_begin, | ||
real, dimension(:,:), pointer | p_surf_end, | ||
real, dimension(szib_(g),szj_(g),szk_(g)), intent(inout), target | uh, | ||
real, dimension(szi_(g),szjb_(g),szk_(g)), intent(inout), target | vh, | ||
real, dimension(szib_(g),szj_(g),szk_(g)), intent(inout) | uhtr, | ||
real, dimension(szi_(g),szjb_(g),szk_(g)), intent(inout) | vhtr, | ||
real, dimension(szi_(g),szj_(g)), intent(out) | eta_av, | ||
type(ocean_grid_type), intent(inout) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(mom_dyn_split_rk2_cs), pointer | CS, | ||
logical, intent(in) | calc_dtbt, | ||
type(varmix_cs), pointer | VarMix, | ||
type(meke_type), pointer | MEKE, | ||
type(thickness_diffuse_cs), pointer | thickness_diffuse_CSp, | ||
type(wave_parameters_cs), optional, pointer | Waves | ||
) |
RK2 splitting for time stepping MOM adiabatic dynamics.
[in,out] | g | ocean grid structure |
[in] | gv | ocean vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in,out] | u | zonal velocity [L T-1 ~> m s-1] |
[in,out] | v | merid velocity [L T-1 ~> m s-1] |
[in,out] | h | layer thickness [H ~> m or kg m-2] |
[in] | tv | thermodynamic type |
[in,out] | visc | vertical visc, bottom drag, and related |
[in] | time_local | model time at end of time step |
[in] | dt | time step [T ~> s] |
[in] | forces | A structure with the driving mechanical forces |
p_surf_begin | surf pressure at start of this dynamic time step [Pa] | |
p_surf_end | surf pressure at end of this dynamic time step [Pa] | |
[in,out] | uh | zonal volume/mass transport |
[in,out] | vh | merid volume/mass transport |
[in,out] | uhtr | accumulatated zonal volume/mass transport |
[in,out] | vhtr | accumulatated merid volume/mass transport |
[out] | eta_av | free surface height or column mass time averaged over time step [H ~> m or kg m-2] |
cs | module control structure | |
[in] | calc_dtbt | if true, recalculate barotropic time step |
varmix | specify the spatially varying viscosities | |
meke | related to mesoscale eddy kinetic energy param | |
thickness_diffuse_csp | Pointer to a structure containing interface height diffusivities | |
waves | A pointer to a structure containing fields related to the surface wave conditions |
Definition at line 239 of file MOM_dynamics_split_RK2.F90.
References mom_error_handler::calltree_enter(), mom_error_handler::calltree_leave(), mom_error_handler::calltree_waypoint(), mom_domains::complete_group_pass(), mom_continuity::continuity_stencil(), mom_coriolisadv::coradcalc(), mom_diag_mediator::diag_update_remap_grids(), mom_hor_visc::horizontal_viscosity(), id_clock_btcalc, id_clock_btforce, id_clock_btstep, id_clock_continuity, id_clock_cor, id_clock_horvisc, id_clock_mom_update, id_clock_pass, id_clock_pres, id_clock_vertvisc, mom_checksum_packages::mom_accel_chksum(), mom_open_boundary::open_boundary_test_extern_h(), mom_pressureforce::pressureforce(), mom_barotropic::set_dtbt(), mom_set_visc::set_viscous_ml(), mom_domains::start_group_pass(), mom_boundary_update::update_obc_data(), and mom_vert_friction::updatecfltruncationvalue().
|
private |
CPU time clock IDs.
Definition at line 228 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 228 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 228 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 227 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
integer mom_dynamics_split_rk2::id_clock_cor |
CPU time clock IDs.
Definition at line 225 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 226 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 226 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 229 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 229 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 225 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().
|
private |
CPU time clock IDs.
Definition at line 227 of file MOM_dynamics_split_RK2.F90.
|
private |
CPU time clock IDs.
Definition at line 225 of file MOM_dynamics_split_RK2.F90.
Referenced by initialize_dyn_split_rk2(), and step_mom_dyn_split_rk2().