|
| 1 | +!> Update sea-ice dynamics using elastic-viscous-plastic rheology with a C-grid discretization |
| 2 | +module MOM_SIS_C_dyn_CS_type |
| 3 | + |
| 4 | +use MOM_time_manager, only : time_type |
| 5 | +use SIS_diag_mediator, only : SIS_diag_ctrl |
| 6 | + |
| 7 | +implicit none ; private |
| 8 | + |
| 9 | +#include <SIS2_memory.h> |
| 10 | + |
| 11 | +!> The control structure with parameters regulating C-grid ice dynamics |
| 12 | +type, public :: SIS_C_dyn_CS ; ! private |
| 13 | + real, allocatable, dimension(:,:) :: & |
| 14 | + str_t, & !< The tension stress tensor component [R Z L2 T-2 ~> Pa m]. |
| 15 | + str_d, & !< The divergence stress tensor component [R Z L2 T-2 ~> Pa m]. |
| 16 | + str_s !< The shearing stress tensor component (cross term) [R Z L2 T-2 ~> Pa m]. |
| 17 | + |
| 18 | + ! parameters for calculating water drag and internal ice stresses |
| 19 | + real :: p0 !< Pressure constant in the Hibler rheology [R L2 T-2 ~> Pa] |
| 20 | + real :: p0_rho !< The pressure constant divided by ice density [L2 T-2 ~> N m kg-1]. |
| 21 | + real :: c0 !< another pressure constant, c* in Hunke & Dukowicz 1997 [nondim] |
| 22 | + real :: cdw !< The drag coefficient between the sea ice and water. [nondim] |
| 23 | + real :: EC = 2.0 !< yield curve axis ratio [nondim] |
| 24 | + real :: Rho_ocean !< The nominal density of sea water [R ~> kg m-3]. |
| 25 | + real :: Rho_ice !< The nominal density of sea ice [R ~> kg m-3]. |
| 26 | + real :: drag_bg_vel2 = 0.0 !< A background (subgridscale) velocity for drag with the ocean |
| 27 | + !< squared [L2 T-2 ~> m2 s-2]. This is always 0 for now. |
| 28 | + real :: min_ocn_inertial_h !< A minimum ocean thickness used to limit the viscous coupling |
| 29 | + !! rate implied for the ocean by the ice-ocean stress [Z ~> m]. |
| 30 | + real :: Tdamp !< The damping timescale of the stress tensor components toward their |
| 31 | + !! equilibrium solution due to the elastic terms [T ~> s] or [nondim]. |
| 32 | + real :: del_sh_min_scale !< A scaling factor for the minimum permitted value of minimum |
| 33 | + !! shears used in the denominator of the stress equations [nondim]. |
| 34 | + ! I suspect that this needs to be greater than 1. -RWH |
| 35 | + real :: vel_underflow !< Velocity components smaller than vel_underflow |
| 36 | + !! are set to 0 [L T-1 ~> m s-1]. |
| 37 | + real :: str_underflow !< Stress tensor components smaller than str_underflow |
| 38 | + !! are set to 0 [R Z L2 T-2 ~> Pa m]. |
| 39 | + real :: CFL_trunc !< Velocity components will be truncated when they are large enough |
| 40 | + !! that the corresponding CFL number exceeds this value [nondim]. |
| 41 | + logical :: CFL_check_its !< If true, check the CFL number for every iteration |
| 42 | + !! of the rheology solver; otherwise only check the |
| 43 | + !! final velocities that are used for transport. |
| 44 | + logical :: debug !< If true, write verbose checksums for debugging purposes. |
| 45 | + logical :: debug_EVP !< If true, write out verbose debugging data for each of |
| 46 | + !! the steps within the EVP solver. |
| 47 | + logical :: debug_redundant !< If true, debug redundant points. |
| 48 | + logical :: project_drag_vel !< If true, project forward the ice velocity used in the drag |
| 49 | + !! calculation to avoid an instability that can occur when an finite |
| 50 | + !! stress is applied to thin ice moving with the velocity of the ocean. |
| 51 | + logical :: project_ci !< If true, project the ice concentration and related ice strength |
| 52 | + !! changes due to the convergent or divergent ice flow. |
| 53 | + logical :: weak_coast_stress = .false. !< If true, do not use land masks in determining the area |
| 54 | + !! for stress convergence, which acts to weaken the stress-driven |
| 55 | + !! acceleration in coastal points. |
| 56 | + logical :: weak_low_shear = .false. !< If true, the divergent stresses go toward 0 in the C-grid |
| 57 | + !! dynamics when the shear magnitudes are very weak. |
| 58 | + !! Otherwise they go to -P_ice. This setting is temporary. |
| 59 | + integer :: evp_sub_steps !< The number of iterations in the EVP dynamics |
| 60 | + !! for each slow time step. |
| 61 | + real :: dt_Rheo !< The maximum sub-cycling time step for the EVP dynamics [T ~> s]. |
| 62 | + type(time_type), pointer :: Time => NULL() !< A pointer to the ice model's clock. |
| 63 | + type(SIS_diag_ctrl), pointer :: diag => NULL() !< A structure that is used to regulate the |
| 64 | + !! timing of diagnostic output. |
| 65 | + integer, pointer :: ntrunc => NULL() !< The number of times the velocity has been truncated |
| 66 | + !! since the last call to write_ice_statistics. |
| 67 | + character(len = 200) :: u_trunc_file !< The complete path to the file in which a column's worth |
| 68 | + !! of u-accelerations are written if velocity truncations occur. |
| 69 | + character(len = 200) :: v_trunc_file !< The complete path to the file in which a column's worth |
| 70 | + !! of v-accelerations are written if velocity truncations occur. |
| 71 | + integer :: u_file = -1 !< The unit number for an opened u-truncation file, or -1 if it has |
| 72 | + !! not been opened. |
| 73 | + integer :: v_file = -1 !< The unit number for an opened v-truncation file, or -1 if it has |
| 74 | + !! not been opened. |
| 75 | + integer :: cols_written !< The number of columns whose output has been |
| 76 | + !! written by this PE during the current run. |
| 77 | + integer :: max_writes !< The maximum number of times any PE can write out |
| 78 | + !! a column's worth of accelerations during a run. |
| 79 | + logical :: lemieux_landfast !< If true, use the Lsemieux landfast ice parameterization. |
| 80 | + real :: lemieux_k1 !< 1st free parameter for landfast parameterization [nondim] |
| 81 | + real :: lemieux_k2 !< second free parameter (N/m^3) for landfast parametrization [R L T-2 ~> N m-3] |
| 82 | + real :: lemieux_alphab !< Cb factor in Lemieux et al 2015 [nondim] |
| 83 | + real :: lemieux_threshold_hw !< max water depth for grounding [Z ~> m] |
| 84 | + !! see keel data from Amundrud et al. 2004 (JGR) |
| 85 | + real :: lemieux_u0 !< residual velocity for basal stress [L T-1 ~> m s-1] |
| 86 | + logical :: itd_landfast !< If true, use the probabilistic landfast ice parameterization. |
| 87 | + real :: basal_stress_min_thick !< min ice thickness for grounding [Z ~> m] |
| 88 | + real :: basal_stress_max_depth !< max water depth for grounding [Z ~> m] |
| 89 | + real :: basal_stress_mu_s !< bottom drag parameter [L Z-1 ~> nondim] |
| 90 | + real :: bathy_roughness_min !< minimum bathymetric roughness [z ~> m] |
| 91 | + real :: bathy_roughness_max !< maximum bathymetric roughness [z ~> m] |
| 92 | + real :: puny !< small number [nondim] |
| 93 | + real :: onemeter !< make the units work out (hopefully) [Z ~> m] |
| 94 | + real :: basal_stress_cutoff !< tunable parameter for the bottom drag [nondim] |
| 95 | + integer :: ncat_b ! number of bathymetry categories |
| 96 | + integer :: ncat_i ! number of ice thickness categories (log-normal) |
| 97 | + |
| 98 | + real, pointer, dimension(:,:) :: Tb_u=>NULL() !< Basal stress component at u-points |
| 99 | + !! [R Z L T-2 -> kg m-1 s-2] |
| 100 | + real, pointer, dimension(:,:) :: Tb_v=>NULL() !< Basal stress component at v-points |
| 101 | + !! [R Z L T-2 -> kg m-1 s-2] |
| 102 | + real, pointer, dimension(:,:) :: sigma_b=>NULL() !< !< Bottom depth variance [Z ~> m]. |
| 103 | + |
| 104 | + logical :: FirstCall = .true. !< If true, this module has not been called before |
| 105 | + !>@{ Diagnostic IDs |
| 106 | + integer :: id_fix = -1, id_fiy = -1, id_fcx = -1, id_fcy = -1 |
| 107 | + integer :: id_fwx = -1, id_fwy = -1, id_sigi = -1, id_sigii = -1 |
| 108 | + integer :: id_flfx = -1, id_flfy = -1, id_stren = -1, id_stren0 = -1 |
| 109 | + integer :: id_ui = -1, id_vi = -1, id_Coru = -1, id_Corv = -1 |
| 110 | + integer :: id_PFu = -1, id_PFv = -1, id_fpx = -1, id_fpy = -1 |
| 111 | + integer :: id_fix_d = -1, id_fix_t = -1, id_fix_s = -1 |
| 112 | + integer :: id_fiy_d = -1, id_fiy_t = -1, id_fiy_s = -1 |
| 113 | + integer :: id_str_d = -1, id_str_t = -1, id_str_s = -1 |
| 114 | + integer :: id_sh_d = -1, id_sh_t = -1, id_sh_s = -1 |
| 115 | + integer :: id_del_sh = -1, id_del_sh_min = -1 |
| 116 | + integer :: id_mis = -1, id_ci = -1, id_ci0 = -1, id_miu = -1, id_miv = -1 |
| 117 | + integer :: id_ui_hifreq = -1, id_vi_hifreq = -1 |
| 118 | + integer :: id_str_d_hifreq = -1, id_str_t_hifreq = -1, id_str_s_hifreq = -1 |
| 119 | + integer :: id_sh_d_hifreq = -1, id_sh_t_hifreq = -1, id_sh_s_hifreq = -1 |
| 120 | + integer :: id_sigi_hifreq = -1, id_sigii_hifreq = -1 |
| 121 | + integer :: id_stren_hifreq = -1, id_ci_hifreq = -1 |
| 122 | + integer :: id_siu = -1, id_siv = -1, id_sispeed = -1 ! SIMIP diagnostics |
| 123 | + !!@} |
| 124 | +end type SIS_C_dyn_CS |
| 125 | + |
| 126 | +end module MOM_SIS_C_dyn_CS_type |
0 commit comments