ice_2.F90 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. MODULE ice_2
  2. !!======================================================================
  3. !! *** MODULE ice ***
  4. !! Sea Ice physics: diagnostics variables of ice defined in memory
  5. !!=====================================================================
  6. !! History : 2.0 ! 2003-08 (C. Ethe) F90: Free form and module
  7. !! 3.3 ! 2009-05 (G.Garric) addition of the lim2_evp cas
  8. !! 4.0 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation
  9. !!----------------------------------------------------------------------
  10. #if defined key_lim2
  11. !!----------------------------------------------------------------------
  12. !! 'key_lim2' : LIM 2.0 sea-ice model
  13. !!----------------------------------------------------------------------
  14. USE par_ice_2 ! LIM sea-ice parameters
  15. IMPLICIT NONE
  16. PRIVATE
  17. PUBLIC ice_alloc_2 ! Called in iceini_2.F90
  18. INTEGER , PUBLIC :: numit !: ice iteration index
  19. REAL(wp), PUBLIC :: rdt_ice !: ice time step
  20. ! !!* namicerun read in iceini *
  21. CHARACTER(len=32) , PUBLIC :: cn_icerst_in !: suffix of ice restart name (input)
  22. CHARACTER(len=256) , PUBLIC :: cn_icerst_indir !: ice restart in directory
  23. CHARACTER(len=32) , PUBLIC :: cn_icerst_out !: suffix of ice restart name (output)
  24. CHARACTER(len=256) , PUBLIC :: cn_icerst_outdir !: ice restart out directory
  25. LOGICAL , PUBLIC :: ln_limdyn !: flag for ice dynamics (T) or not (F)
  26. LOGICAL , PUBLIC :: ln_limdmp !: Ice damping
  27. REAL(wp) , PUBLIC :: hsndif !: snow temp. computation (0) or not (9999)
  28. REAL(wp) , PUBLIC :: hicdif !: ice temp. computation (0) or not (9999)
  29. REAL(wp), DIMENSION(2), PUBLIC :: acrit !: minimum lead fraction in the 2 hemisphere
  30. !
  31. LOGICAL , PUBLIC :: ln_nicep = .TRUE. !: flag grid points output (T) or not (F)
  32. ! !!* ice-dynamic namelist (namicedyn) *
  33. INTEGER , PUBLIC :: nbiter !: number of sub-time steps for relaxation
  34. INTEGER , PUBLIC :: nbitdr !: maximum number of iterations for relaxation
  35. INTEGER , PUBLIC :: nn_nevp !: number of EVP subcycling iterations
  36. INTEGER , PUBLIC :: telast !: timescale for EVP elastic waves
  37. REAL(wp), PUBLIC :: epsd !: tolerance parameter for dynamic
  38. REAL(wp), PUBLIC :: alpha !: coefficient for semi-implicit coriolis
  39. REAL(wp), PUBLIC :: dm !: diffusion constant for dynamics
  40. REAL(wp), PUBLIC :: om !: relaxation constant
  41. REAL(wp), PUBLIC :: resl !: maximum value for the residual of relaxation
  42. REAL(wp), PUBLIC :: cw !: drag coefficient for oceanic stress
  43. REAL(wp), PUBLIC :: angvg !: turning angle for oceanic stress
  44. REAL(wp), PUBLIC :: pstar !: first bulk-rheology parameter
  45. REAL(wp), PUBLIC :: c_rhg !: second bulk-rhelogy parameter
  46. REAL(wp), PUBLIC :: etamn !: minimun value for viscosity
  47. REAL(wp), PUBLIC :: rn_creepl !: creep limit
  48. REAL(wp), PUBLIC :: rn_ecc !: eccentricity of the elliptical yield curve
  49. REAL(wp), PUBLIC :: ahi0 !: sea-ice hor. eddy diffusivity coeff. (m2/s)
  50. REAL(wp), PUBLIC :: alphaevp !: coefficient for the solution of EVP int. stresses
  51. REAL(wp), PUBLIC :: usecc2 !: = 1.0 / ( rn_ecc * rn_ecc )
  52. REAL(wp), PUBLIC :: rhoco !: = rau0 * cw
  53. REAL(wp), PUBLIC :: sangvg, cangvg !: sin and cos of the turning angle for ocean stress
  54. REAL(wp), PUBLIC :: pstarh !: pstar / 2.0
  55. ! !!** switch for presence of ice or not
  56. REAL(wp), PUBLIC :: rswitch
  57. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ahiu , ahiv !: hor. diffusivity coeff. at ocean U- and V-points (m2/s)
  58. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: pahu , pahv !: ice hor. eddy diffusivity coef. at ocean U- and V-points
  59. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ust2s !: friction velocity
  60. !!* Ice Rheology
  61. # if defined key_lim2_vp
  62. ! !!* VP rheology *
  63. LOGICAL , PUBLIC :: lk_lim2_vp = .TRUE. !: Visco-Plactic reology flag
  64. !
  65. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hsnm , hicm !: mean snow and ice thicknesses
  66. !
  67. # else
  68. ! !!* EVP rheology *
  69. LOGICAL , PUBLIC:: lk_lim2_vp = .FALSE. !: Visco-Plactic reology flag
  70. !
  71. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: stress1_i !: first stress tensor element
  72. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: stress2_i !: second stress tensor element
  73. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: stress12_i !: diagonal stress tensor element
  74. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: delta_i !: rheology delta factor (see Flato and Hibler 95) [s-1]
  75. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: divu_i !: Divergence of the velocity field [s-1] -> limrhg.F90
  76. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: shear_i !: Shear of the velocity field [s-1] -> limrhg.F90
  77. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_i !: ice fraction
  78. !
  79. REAL(wp), PUBLIC, DIMENSION(:,:) , POINTER :: vt_s ,vt_i !: mean snow and ice thicknesses
  80. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET :: hsnm , hicm !: target vt_s,vt_i pointers
  81. #endif
  82. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdvosif !: ice volume change at ice surface (only used for outputs)
  83. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdvobif !: ice volume change at ice bottom (only used for outputs)
  84. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fdvolif !: Total ice volume change (only used for outputs)
  85. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdvonif !: Lateral ice volume change (only used for outputs)
  86. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sist !: Sea-Ice Surface Temperature [Kelvin]
  87. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tfu !: Freezing/Melting point temperature of sea water at SSS
  88. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hicif !: Ice thickness
  89. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hsnif !: Snow thickness
  90. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hicifp !: Ice production/melting
  91. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: frld !: Leads fraction = 1-a/totalarea
  92. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: phicif !: ice thickness at previous time
  93. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: pfrld !: Leads fraction at previous time
  94. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qstoif !: Energy stored in the brine pockets
  95. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fbif !: Heat flux at the ice base
  96. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdm_snw !: Variation of snow mass over 1 time step [Kg/m2]
  97. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdq_snw !: Heat content associated with rdm_snw [J/m2]
  98. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdm_ice !: Variation of ice mass over 1 time step [Kg/m2]
  99. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rdq_ice !: Heat content associated with rdm_ice [J/m2]
  100. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qldif !: heat balance of the lead (or of the open ocean)
  101. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qcmif !: Energy needed to freeze the ocean surface layer
  102. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fdtcn !: net downward heat flux from the ice to the ocean
  103. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qdtcn !: energy from the ice to the ocean point (at a factor 2)
  104. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: thcm !: part of the solar energy used in the lead heat budget
  105. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fstric_mean !: Solar flux transmitted trough the ice, for day mean of qsr ( PISCES, with dirunal cycle )
  106. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fstric !: Solar flux transmitted trough the ice
  107. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ffltbif !: linked with the max heat contained in brine pockets (?)
  108. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fscmbq !: Linked with the solar flux below the ice (?)
  109. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fsbbq !: Also linked with the solar flux below the ice (?)
  110. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qfvbq !: used to store energy in case of toral lateral ablation (?)
  111. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: dmgwi !: Variation of the mass of snow ice
  112. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice !: two components of the ice velocity at I-point (m/s)
  113. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_oce, v_oce !: two components of the ocean velocity at I-point (m/s)
  114. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tbif !: Temperature inside the ice/snow layer
  115. !!* moment used in the advection scheme
  116. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxice, syice, sxxice, syyice, sxyice !: for ice volume
  117. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxsn, sysn, sxxsn, syysn, sxysn !: for snow volume
  118. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxa, sya, sxxa, syya, sxya !: for ice cover area
  119. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxc0, syc0, sxxc0, syyc0, sxyc0 !: for heat content of snow
  120. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxc1, syc1, sxxc1, syyc1, sxyc1 !: for heat content of 1st ice layer
  121. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxc2, syc2, sxxc2, syyc2, sxyc2 !: for heat content of 2nd ice layer
  122. REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sxst, syst, sxxst, syyst, sxyst !: for heat content of brine pockets
  123. !!----------------------------------------------------------------------
  124. CONTAINS
  125. INTEGER FUNCTION ice_alloc_2()
  126. !!-----------------------------------------------------------------
  127. !! *** FUNCTION ice_alloc_2 ***
  128. !!-----------------------------------------------------------------
  129. USE lib_mpp, ONLY: ctl_warn ! MPP library
  130. INTEGER :: ierr(9) ! Local variables
  131. !!-----------------------------------------------------------------
  132. ierr(:) = 0
  133. !
  134. ALLOCATE( ahiu(jpi,jpj) , pahu(jpi,jpj) , &
  135. & ahiv(jpi,jpj) , pahv(jpi,jpj) , ust2s(jpi,jpj) , STAT=ierr(1) )
  136. !
  137. !* Ice Rheology
  138. #if defined key_lim2_vp
  139. ALLOCATE( hsnm(jpi,jpj) , hicm(jpi,jpj) , STAT=ierr(2) )
  140. #else
  141. ALLOCATE( stress1_i (jpi,jpj) , delta_i(jpi,jpj) , at_i(jpi,jpj) , &
  142. stress2_i (jpi,jpj) , divu_i (jpi,jpj) , hsnm(jpi,jpj) , &
  143. stress12_i(jpi,jpj) , shear_i(jpi,jpj) , hicm(jpi,jpj) , STAT=ierr(2) )
  144. #endif
  145. ALLOCATE( rdvosif(jpi,jpj) , rdvobif(jpi,jpj) , &
  146. & fdvolif(jpi,jpj) , rdvonif(jpi,jpj) , &
  147. & sist (jpi,jpj) , tfu (jpi,jpj) , hicif(jpi,jpj) , &
  148. & hsnif (jpi,jpj) , hicifp (jpi,jpj) , frld (jpi,jpj) , STAT=ierr(3) )
  149. ALLOCATE(phicif(jpi,jpj) , pfrld (jpi,jpj) , qstoif (jpi,jpj) , &
  150. & fbif (jpi,jpj) , rdm_snw(jpi,jpj) , rdq_snw(jpi,jpj) , &
  151. & rdm_ice(jpi,jpj) , rdq_ice(jpi,jpj) , &
  152. & qldif (jpi,jpj) , qcmif (jpi,jpj) , fdtcn (jpi,jpj) , &
  153. & qdtcn (jpi,jpj) , thcm (jpi,jpj) , STAT=ierr(4) )
  154. ALLOCATE(fstric(jpi,jpj) , ffltbif(jpi,jpj) , fscmbq(jpi,jpj) , &
  155. & fsbbq (jpi,jpj) , qfvbq (jpi,jpj) , dmgwi (jpi,jpj) , &
  156. & u_ice (jpi,jpj) , v_ice (jpi,jpj) , &
  157. & u_oce (jpi,jpj) , v_oce (jpi,jpj) , &
  158. & tbif (jpi,jpj,jplayersp1) , STAT=ierr(5))
  159. !* moment used in the advection scheme
  160. ALLOCATE(sxice (jpi,jpj) , syice (jpi,jpj) , sxxice(jpi,jpj) , &
  161. & syyice(jpi,jpj) , sxyice(jpi,jpj) , &
  162. & sxsn (jpi,jpj) , sysn (jpi,jpj) , sxxsn (jpi,jpj) , &
  163. & syysn (jpi,jpj) , sxysn (jpi,jpj) , STAT=ierr(6) )
  164. ALLOCATE(sxa (jpi,jpj) , sya (jpi,jpj) , sxxa (jpi,jpj) , &
  165. & syya (jpi,jpj) , sxya (jpi,jpj) , &
  166. & sxc0 (jpi,jpj) , syc0 (jpi,jpj) , sxxc0 (jpi,jpj) , &
  167. & syyc0 (jpi,jpj) , sxyc0 (jpi,jpj) , STAT=ierr(7))
  168. ALLOCATE(sxc1 (jpi,jpj) , syc1 (jpi,jpj) , sxxc1 (jpi,jpj) , &
  169. & syyc1 (jpi,jpj) , sxyc1 (jpi,jpj) , &
  170. & sxc2 (jpi,jpj) , syc2 (jpi,jpj) , sxxc2 (jpi,jpj) , &
  171. & syyc2 (jpi,jpj) , sxyc2 (jpi,jpj) , STAT=ierr(8))
  172. ALLOCATE(sxst (jpi,jpj) , syst (jpi,jpj) , sxxst (jpi,jpj) , &
  173. & syyst (jpi,jpj) , sxyst (jpi,jpj) , STAT=ierr(9))
  174. !
  175. ice_alloc_2 = MAXVAL( ierr )
  176. !
  177. IF( ice_alloc_2 /= 0 ) CALL ctl_warn('ice_alloc_2: failed to allocate arrays')
  178. !
  179. END FUNCTION ice_alloc_2
  180. #else
  181. !!----------------------------------------------------------------------
  182. !! Default option Empty module NO LIM 2.0 sea-ice model
  183. !!----------------------------------------------------------------------
  184. #endif
  185. !!-----------------------------------------------------------------
  186. !! NEMO/LIM2 3.3 , UCL - NEMO Consortium (2010)
  187. !! $Id: ice_2.F90 4306 2013-11-21 14:59:57Z cetlod $
  188. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  189. !!======================================================================
  190. END MODULE ice_2