limthd_lac_2.F90 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. MODULE limthd_lac_2
  2. #if defined key_lim2
  3. !!======================================================================
  4. !! *** MODULE limthd_lac_2 ***
  5. !! lateral thermodynamic growth of the ice
  6. !!======================================================================
  7. !!----------------------------------------------------------------------
  8. !! lim_lat_acr_2 : lateral accretion of ice
  9. !!----------------------------------------------------------------------
  10. USE par_oce ! ocean parameters
  11. USE phycst
  12. USE thd_ice_2
  13. USE ice_2
  14. USE limistate_2
  15. USE lib_mpp ! MPP library
  16. USE wrk_nemo ! work arrays
  17. USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
  18. IMPLICIT NONE
  19. PRIVATE
  20. PUBLIC lim_thd_lac_2 ! called by lim_thd_2
  21. REAL(wp) :: & ! constant values
  22. epsi20 = 1.e-20 , &
  23. epsi13 = 1.e-13 , &
  24. zzero = 0.e0 , &
  25. zone = 1.e0
  26. !!----------------------------------------------------------------------
  27. !! NEMO/LIM2 3.3 , UCL - NEMO Consortium (2010)
  28. !! $Id: limthd_lac_2.F90 3625 2012-11-21 13:19:18Z acc $
  29. !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
  30. !!----------------------------------------------------------------------
  31. CONTAINS
  32. SUBROUTINE lim_thd_lac_2( kideb, kiut )
  33. !!-------------------------------------------------------------------
  34. !! *** ROUTINE lim_thd_lac_2 ***
  35. !!
  36. !! ** Purpose : Computation of the evolution of the ice thickness and
  37. !! concentration as a function of the heat balance in the leads.
  38. !! It is only used for lateral accretion
  39. !!
  40. !! ** Method : Ice is formed in the open water when ocean lose heat
  41. !! (heat budget of open water Bl is negative) .
  42. !! Computation of the increase of 1-A (ice concentration) fol-
  43. !! lowing the law :
  44. !! (dA/dt)acc = F[ (1-A)/(1-a) ] * [ Bl / (Li*h0) ]
  45. !! where - h0 is the thickness of ice created in the lead
  46. !! - a is a minimum fraction for leads
  47. !! - F is a monotonic non-increasing function defined as:
  48. !! F(X)=( 1 - X**exld )**(1.0/exld)
  49. !! - exld is the exponent closure rate (=2 default val.)
  50. !!
  51. !! ** Action : - Adjustment of snow and ice thicknesses and heat
  52. !! content in brine pockets
  53. !! - Updating ice internal temperature
  54. !! - Computation of variation of ice volume and mass
  55. !! - Computation of frldb after lateral accretion and
  56. !! update h_snow_1d, h_ice_1d and tbif_1d(:,:)
  57. !!
  58. !! ** References :
  59. !! M. Maqueda, 1995, PhD Thesis, Univesidad Complutense Madrid
  60. !! Fichefet T. and M. Maqueda 1997, J. Geo. Res., 102(C6),
  61. !! 12609 -12646
  62. !! History :
  63. !! 1.0 ! 01-04 (LIM) original code
  64. !! 2.0 ! 02-08 (C. Ethe, G. Madec) F90, mpp
  65. !!-------------------------------------------------------------------
  66. INTEGER , INTENT(IN):: &
  67. kideb , & ! start point on which the the computation is applied
  68. kiut ! end point on which the the computation is applied
  69. ! * Local variables
  70. INTEGER :: &
  71. ji , & ! dummy loop indices
  72. iicefr , & ! 1 = existing ice ; 0 = no ice
  73. iiceform , & ! 1 = ice formed ; 0 = no ice formed
  74. ihemis ! dummy indice
  75. REAL(wp), POINTER, DIMENSION(:) :: zqbgow ! heat budget of the open water (negative)
  76. REAL(wp), POINTER, DIMENSION(:) :: zfrl_old ! previous sea/ice fraction
  77. REAL(wp), POINTER, DIMENSION(:) :: zhice_old ! previous ice thickness
  78. REAL(wp), POINTER, DIMENSION(:) :: zhice0 ! thickness of newly formed ice in leads
  79. REAL(wp), POINTER, DIMENSION(:) :: zfrlmin ! minimum fraction for leads
  80. REAL(wp), POINTER, DIMENSION(:) :: zdhicbot ! part of thickness of newly formed ice in leads which
  81. ! has been already used in transport for example
  82. REAL(wp) :: &
  83. zhemis , & ! hemisphere (0 = North, 1 = South)
  84. zhicenew , & ! new ice thickness
  85. zholds2 , & ! ratio of previous ice thickness and 2
  86. zhnews2 , & ! ratio of new ice thickness and 2
  87. zfrlnew , & ! new sea/ice fraction
  88. zfrld , & ! ratio of sea/ice fraction and minimum fraction for leads
  89. zfrrate , & ! leads-closure rate
  90. zdfrl ! sea-ice fraction increment
  91. REAL(wp) :: &
  92. zdh1 , zdh2 , zdh3 , zdh4, zdh5 , & ! tempory scalars
  93. ztint , zta1 , zta2 , zta3 , zta4 , &
  94. zah, zalpha , zbeta
  95. !!---------------------------------------------------------------------
  96. CALL wrk_alloc( jpij, zqbgow, zfrl_old, zhice_old, zhice0, zfrlmin, zdhicbot )
  97. !--------------------------------------------------------------
  98. ! Computation of the heat budget of the open water (negative)
  99. !--------------------------------------------------------------
  100. DO ji = kideb , kiut
  101. zqbgow(ji) = qldif_1d(ji) - qcmif_1d(ji)
  102. END DO
  103. !-----------------------------------------------------------------
  104. ! Taking the appropriate values for the corresponding hemisphere
  105. !-----------------------------------------------------------------
  106. DO ji = kideb , kiut
  107. zhemis = MAX( zzero , SIGN( zone , frld_1d(ji) - 2.0 ) )
  108. ihemis = INT( 1 + zhemis )
  109. zhice0 (ji) = hiccrit( ihemis )
  110. zfrlmin (ji) = acrit ( ihemis )
  111. frld_1d (ji) = frld_1d(ji) - 2.0 * zhemis
  112. zfrl_old(ji) = frld_1d(ji)
  113. END DO
  114. !-------------------------------------------------------------------
  115. ! Lateral Accretion (modification of the fraction of open water)
  116. ! The ice formed in the leads has always a thickness zhice0, but
  117. ! only a fraction zfrrate of the ice formed contributes to the
  118. ! increase of the ice fraction. The remaining part (1-zfrrate)
  119. ! is rather assumed to lead to an increase in the thickness of the
  120. ! pre-existing ice (transport for example).
  121. ! Morales Maqueda, 1995 - Fichefet and Morales Maqueda, 1997
  122. !---------------------------------------------------------------------
  123. !CDIR NOVERRCHK
  124. DO ji = kideb , kiut
  125. iicefr = 1 - MAX( 0, INT( SIGN( 1.5 * zone , zfrl_old(ji) - 1.0 + epsi13 ) ) )
  126. !---computation of the leads-closure rate
  127. zfrld = MIN( zone , ( 1.0 - frld_1d(ji) ) / ( 1.0 - zfrlmin(ji) ) )
  128. zfrrate = ( 1.0 - zfrld**exld )**( 1.0 / exld )
  129. !--computation of the sea-ice fraction increment and the new fraction
  130. zdfrl = ( zfrrate / zhice0(ji) ) * ( zqbgow(ji) / xlic )
  131. zfrlnew = zfrl_old(ji) + zdfrl
  132. !--update the sea-ice fraction
  133. frld_1d (ji) = MAX( zfrlnew , zfrlmin(ji) )
  134. !--computation of the remaining part of ice thickness which has been already used
  135. zdhicbot(ji) = ( frld_1d(ji) - zfrlnew ) * zhice0(ji) / ( 1.0 - zfrlmin(ji) ) &
  136. & - ( ( 1.0 - zfrrate ) / ( 1.0 - frld_1d(ji) ) ) * ( zqbgow(ji) / xlic )
  137. END DO
  138. !----------------------------------------------------------------------------------------
  139. ! Ajustement of snow and ice thicknesses and updating the total heat stored in brine pockets
  140. ! The thickness of newly formed ice is averaged with that of the pre-existing
  141. ! (1-Anew) * hinew = (1-Aold) * hiold + ((1-Anew)-(1-Aold)) * h0
  142. ! Snow is distributed over the new ice-covered area
  143. ! (1-Anew) * hsnew = (1-Aold) * hsold
  144. !--------------------------------------------------------------------------------------------
  145. DO ji = kideb , kiut
  146. iicefr = 1 - MAX( 0, INT( SIGN( 1.5 * zone , zfrl_old(ji) - 1.0 + epsi13 ) ) )
  147. zhice_old(ji) = h_ice_1d(ji)
  148. zhicenew = iicefr * zhice_old(ji) + ( 1 - iicefr ) * zhice0(ji)
  149. zalpha = ( 1. - zfrl_old(ji) ) / ( 1.- frld_1d(ji) )
  150. h_snow_1d(ji) = zalpha * h_snow_1d(ji)
  151. h_ice_1d (ji) = zalpha * zhicenew + ( 1.0 - zalpha ) * zhice0(ji)
  152. qstbif_1d(ji) = zalpha * qstbif_1d(ji)
  153. END DO
  154. !-------------------------------------------------------
  155. ! Ajustement of ice internal temperatures
  156. !-------------------------------------------------------
  157. DO ji = kideb , kiut
  158. iicefr = 1 - MAX( 0, INT( SIGN( 1.5 * zone , zfrl_old(ji) - 1.0 + epsi13 ) ) )
  159. iiceform = 1 - MAX( 0 ,INT( SIGN( 1.5 * zone , zhice0(ji) - h_ice_1d(ji) ) ) )
  160. zholds2 = zhice_old(ji)/ 2.
  161. zhnews2 = h_ice_1d(ji) / 2.
  162. zdh1 = MAX( zzero , zhice_old(ji) - zhnews2 )
  163. zdh2 = MAX( zzero , -zhice_old(ji) + zhnews2 )
  164. zdh3 = MAX( zzero , h_ice_1d(ji) - zholds2 )
  165. zdh4 = MAX( zzero , -h_ice_1d(ji) + zholds2 )
  166. zdh5 = MAX( zzero , zhice0(ji) - zholds2 )
  167. ztint = iiceform * ( ( zholds2 - zdh3 ) * tbif_1d(ji,3) + zdh4 * tbif_1d(ji,2) ) &
  168. & / MAX( epsi20 , h_ice_1d(ji) - zhice0(ji) ) &
  169. & + ( 1 - iiceform ) * tfu_1d(ji)
  170. zta1 = iicefr * ( 1. - zfrl_old(ji) ) * tbif_1d(ji,2)
  171. zta2 = iicefr * ( 1. - zfrl_old(ji) ) * tbif_1d(ji,3)
  172. zta3 = iicefr * ( 1. - zfrl_old(ji) ) * ztint
  173. zta4 = ( zfrl_old(ji) - frld_1d (ji) ) * tfu_1d(ji)
  174. zah = ( 1. - frld_1d(ji) ) * zhnews2
  175. tbif_1d(ji,2) = ( MIN( zhnews2 , zholds2 ) * zta1 &
  176. & + ( 1 - iiceform ) * ( zholds2 - zdh1 ) * zta2 &
  177. & + ( iiceform * ( zhnews2 - zhice0(ji) + zdh5 ) + ( 1 - iiceform ) * zdh2 ) * zta3 &
  178. & + MIN ( zhnews2 , zhice0(ji) ) * zta4 &
  179. & ) / zah
  180. tbif_1d(ji,3) = ( iiceform * ( zhnews2 - zdh3 ) * zta1 &
  181. & + ( iiceform * zdh3 + ( 1 - iiceform ) * zdh1 ) * zta2 &
  182. & + ( iiceform * ( zhnews2 - zdh5 ) + ( 1 - iiceform ) * ( zhnews2 - zdh1 ) ) * zta3 &
  183. & + ( iiceform * zdh5 + ( 1 - iiceform ) * zhnews2 ) * zta4 &
  184. & ) / zah
  185. !---removing the remaining part of ice formed which has been already used
  186. zbeta = h_ice_1d(ji) / ( h_ice_1d(ji) + zdhicbot(ji) )
  187. h_ice_1d(ji) = h_ice_1d(ji) + zdhicbot(ji)
  188. tbif_1d (ji,2)= zbeta * tbif_1d(ji,2) + ( 1.0 - zbeta ) * tbif_1d(ji,3)
  189. tbif_1d (ji,3)= ( 2. * zbeta - 1.0 ) * tbif_1d(ji,3) + ( 2. * zdhicbot(ji) / h_ice_1d(ji) ) * tfu_1d(ji)
  190. END DO
  191. !-------------------------------------------------------------
  192. ! Computation of variation of ice volume and ice mass
  193. ! Vold = (1-Aold) * hiold ; Vnew = (1-Anew) * hinew
  194. ! dV = Vnew - Vold
  195. !-------------------------------------------------------------
  196. DO ji = kideb , kiut
  197. dvlbq_1d (ji) = ( 1. - frld_1d(ji) ) * h_ice_1d(ji) - ( 1. - zfrl_old(ji) ) * zhice_old(ji)
  198. rdm_ice_1d(ji) = rdm_ice_1d(ji) + rhoic * dvlbq_1d(ji)
  199. rdq_ice_1d(ji) = rdq_ice_1d(ji) + rcpic * dvlbq_1d(ji) * ( tfu_1d(ji) - rt0 ) ! heat content relative to rt0
  200. END DO
  201. CALL wrk_dealloc( jpij, zqbgow, zfrl_old, zhice_old, zhice0, zfrlmin, zdhicbot )
  202. !
  203. END SUBROUTINE lim_thd_lac_2
  204. #else
  205. !!----------------------------------------------------------------------
  206. !! *** MODULE limthd_lac_2 ***
  207. !! no sea ice model
  208. !!----------------------------------------------------------------------
  209. CONTAINS
  210. SUBROUTINE lim_thd_lac_2 ! Empty routine
  211. END SUBROUTINE lim_thd_lac_2
  212. #endif
  213. !!======================================================================
  214. END MODULE limthd_lac_2