MODULE icedyn !!====================================================================== !! *** MODULE icedyn *** !! Sea-Ice dynamics : !!====================================================================== !! history : 4.0 ! 2017-09 (C. Rousset) original code !!---------------------------------------------------------------------- #if defined key_lim3 !!---------------------------------------------------------------------- !! 'key_lim3' LIM3 sea-ice model !!---------------------------------------------------------------------- !! ice_dyn : dynamics of sea ice !! ice_dyn_init : initialisation of sea-ice dynamics !!---------------------------------------------------------------------- USE phycst ! physical constants USE dom_oce ! ocean space and time domain USE ice ! sea-ice: variables USE icerhg ! sea-ice: rheology USE iceadv ! sea-ice: advection USE icerdgrft ! sea-ice: ridging/rafting USE icecor ! sea-ice: corrections USE icevar ! sea-ice: operations ! USE lbclnk ! lateral boundary conditions - MPP exchanges USE lib_mpp ! MPP library USE in_out_manager ! I/O manager USE lib_fortran ! glob_sum USE timing ! Timing IMPLICIT NONE PRIVATE PUBLIC ice_dyn ! called by icestp.F90 PUBLIC ice_dyn_init ! called by icestp.F90 INTEGER :: nice_dyn ! choice of the type of advection scheme ! ! associated indices: INTEGER, PARAMETER :: np_dynNO = 0 ! no ice dynamics and ice advection INTEGER, PARAMETER :: np_dynFULL = 1 ! full ice dynamics (rheology + advection + ridging/rafting + correction) INTEGER, PARAMETER :: np_dyn = 2 ! no ridging/rafting (rheology + advection + correction) INTEGER, PARAMETER :: np_dynPURE = 3 ! pure dynamics (rheology + advection) !! * Substitutions # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/ICE 4.0 , NEMO Consortium (2017) !! $Id: icedyn.F90 8378 2017-07-26 13:55:59Z clem $ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE ice_dyn( kt ) !!------------------------------------------------------------------- !! *** ROUTINE ice_dyn *** !! !! ** Purpose : this routine manages sea ice dynamics !! !! ** Action : - Initialisation of some variables !! - call ice_rhg !!-------------------------------------------------------------------- INTEGER, INTENT(in) :: kt ! ice time step !! INTEGER :: jl ! dummy loop indices !!-------------------------------------------------------------------- ! IF( nn_timing == 1 ) CALL timing_start('icedyn') ! IF( kt == nit000 .AND. lwp ) THEN WRITE(numout,*) WRITE(numout,*)'ice_dyn: sea-ice dynamics' WRITE(numout,*)'~~~~~~~' ENDIF CALL ice_var_agg(1) ! -- aggregate ice categories ! IF( ln_landfast ) THEN ! -- Landfast ice parameterization: define max bottom friction tau_icebfr(:,:) = 0._wp DO jl = 1, jpl WHERE( ht_i(:,:,jl) > ht_n(:,:) * rn_gamma ) tau_icebfr(:,:) = tau_icebfr(:,:) + a_i(:,:,jl) * rn_icebfr END DO ENDIF SELECT CASE( nice_dyn ) ! -- Set which dynamics is running CASE ( np_dynFULL ) !== all dynamical processes ==! CALL ice_rhg ( kt ) ! -- rheology CALL ice_adv ( kt ) ! -- advection of ice CALL ice_rdgrft( kt ) ! -- ridging/rafting CALL ice_cor ( kt , 1 ) ! -- Corrections CASE ( np_dyn ) !== pure dynamics only ==! (no ridging/rafting) (nono cat. case 2) CALL ice_rhg ( kt ) ! -- rheology CALL ice_adv ( kt ) ! -- advection of ice CALL ice_cor ( kt , 1 ) ! -- Corrections CASE ( np_dynPURE ) !== pure dynamics only ==! (nn_icedyn= 1 ) CALL ice_rhg ( kt ) ! -- rheology CALL ice_adv ( kt ) ! -- advection of ice CASE ( np_dynNO ) !== prescribed ice velocities ==! (nn_icedyn= 0 ) u_ice(:,:) = rn_uice * umask(:,:,1) v_ice(:,:) = rn_vice * vmask(:,:,1) !!CALL RANDOM_NUMBER(u_ice(:,:)) !!CALL RANDOM_NUMBER(v_ice(:,:)) END SELECT ! IF( nn_timing == 1 ) CALL timing_stop('icedyn') ! END SUBROUTINE ice_dyn SUBROUTINE ice_dyn_init !!------------------------------------------------------------------- !! *** ROUTINE ice_dyn_init *** !! !! ** Purpose : Physical constants and parameters linked to the ice !! dynamics !! !! ** Method : Read the namice_dyn namelist and check the ice-dynamic !! parameter values called at the first timestep (nit000) !! !! ** input : Namelist namice_dyn !!------------------------------------------------------------------- INTEGER :: ios ! Local integer output status for namelist read !! NAMELIST/namice_dyn/ ln_icedyn , nn_icedyn, rn_uice , rn_vice , & & rn_ishlat , rn_cio , & & ln_landfast, rn_gamma , rn_icebfr, rn_lfrelax !!------------------------------------------------------------------- ! REWIND( numnam_ice_ref ) ! Namelist namice_dyn in reference namelist : Ice dynamics READ ( numnam_ice_ref, namice_dyn, IOSTAT = ios, ERR = 901) 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dyn in reference namelist', lwp ) ! REWIND( numnam_ice_cfg ) ! Namelist namice_dyn in configuration namelist : Ice dynamics READ ( numnam_ice_cfg, namice_dyn, IOSTAT = ios, ERR = 902 ) 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dyn in configuration namelist', lwp ) IF(lwm) WRITE ( numoni, namice_dyn ) ! IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) 'ice_dyn_init: ice parameters for ice dynamics ' WRITE(numout,*) '~~~~~~~~~~~~' WRITE(numout,*) ' Namelist namice_dyn' WRITE(numout,*) ' Ice dynamics (T) or not (F) ln_icedyn = ', ln_icedyn WRITE(numout,*) ' associated switch nn_icedyn = ', nn_icedyn WRITE(numout,*) ' =2 all processes (default option)' WRITE(numout,*) ' =1 advection only (no ridging/rafting)' WRITE(numout,*) ' =0 advection only with prescribed velocity given by ' WRITE(numout,*) ' a uniform field (u,v)_ice = (rn_uice,rn_vice) = (', rn_uice,',', rn_vice,')' WRITE(numout,*) ' lateral boundary condition for sea ice dynamics rn_ishlat = ', rn_ishlat WRITE(numout,*) ' drag coefficient for oceanic stress rn_cio = ', rn_cio WRITE(numout,*) ' Landfast: param (T or F) ln_landfast = ', ln_landfast WRITE(numout,*) ' fraction of ocean depth that ice must reach rn_gamma = ', rn_gamma WRITE(numout,*) ' maximum bottom stress per unit area of contact rn_icebfr = ', rn_icebfr WRITE(numout,*) ' relax time scale (s-1) to reach static friction rn_lfrelax = ', rn_lfrelax ENDIF ! !== set the choice of ice dynamics ==! SELECT CASE( nn_icedyn ) CASE( 2 ) IF( nn_monocat /= 2 ) THEN !--- full dynamics (rheology + advection + ridging/rafting + correction) nice_dyn = np_dynFULL ELSE nice_dyn = np_dyn !--- dynamics without ridging/rafting ENDIF CASE( 1 ) !--- dynamics without ridging/rafting and correction nice_dyn = np_dynPURE CASE( 0 ) !--- prescribed ice velocities (from namelist) nice_dyn = np_dynNO END SELECT ! ! !--- Lateral boundary conditions IF ( rn_ishlat == 0. ) THEN ; IF(lwp) WRITE(numout,*) ' ===>>> ice lateral free-slip' ELSEIF ( rn_ishlat == 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ===>>> ice lateral no-slip' ELSEIF ( 0. < rn_ishlat .AND. rn_ishlat < 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ===>>> ice lateral partial-slip' ELSEIF ( 2. < rn_ishlat ) THEN ; IF(lwp) WRITE(numout,*) ' ===>>> ice lateral strong-slip' ENDIF ! ! !--- NO Landfast ice : set to zero once for all IF( .NOT. ln_landfast ) tau_icebfr(:,:) = 0._wp ! ! !--- simple conservative piling, comparable with LIM2 l_piling = nn_icedyn == 1 .OR. ( nn_monocat == 2 .AND. jpl == 1 ) ! END SUBROUTINE ice_dyn_init #else !!---------------------------------------------------------------------- !! Default option Empty module NO LIM-3 sea-ice model !!---------------------------------------------------------------------- #endif !!====================================================================== END MODULE icedyn