New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
limthd_sal.F90 in branches/2012/dev_NOC_2012_rev3555/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2012/dev_NOC_2012_rev3555/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90 @ 4291

Last change on this file since 4291 was 3625, checked in by acc, 12 years ago

Branch dev_NOC_2012_r3555. #1006. Step 7. Check in code now merged with dev_r3385_NOCS04_HAMF

  • Property svn:keywords set to Id
File size: 11.0 KB
RevLine 
[825]1MODULE limthd_sal
2   !!======================================================================
3   !!                       ***  MODULE limthd_sal ***
[2528]4   !! LIM-3 sea-ice :  computation of salinity variations in the ice
[825]5   !!======================================================================
[2528]6   !! History :   -   ! 2003-05 (M. Vancoppenolle) UCL-ASTR first coding for LIM3-1D
7   !!            3.0  ! 2005-12 (M. Vancoppenolle) adapted to the 3-D version
[2715]8   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
[2528]9   !!---------------------------------------------------------------------
[888]10#if defined key_lim3
[825]11   !!----------------------------------------------------------------------
[2528]12   !!   'key_lim3'                                      LIM-3 sea-ice model
13   !!----------------------------------------------------------------------
[3625]14   !!   lim_thd_sal   : salinity variations in the ice
[2528]15   !!----------------------------------------------------------------------
[3625]16   USE par_oce        ! ocean parameters
17   USE phycst         ! physical constants (ocean directory)
18   USE sbc_oce        ! Surface boundary condition: ocean fields
19   USE ice            ! LIM variables
20   USE par_ice        ! LIM parameters
21   USE thd_ice        ! LIM thermodynamics
22   USE limvar         ! LIM variables
23   USE in_out_manager ! I/O manager
24   USE lib_mpp        ! MPP library
25   USE wrk_nemo       ! work arrays
26   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
[825]27
28   IMPLICIT NONE
29   PRIVATE
30
[2528]31   PUBLIC   lim_thd_sal        ! called by limthd module
32   PUBLIC   lim_thd_sal_init   ! called by iceini module
[825]33
[1156]34   !!----------------------------------------------------------------------
[3625]35   !! NEMO/LIM3 3.4 , UCL - NEMO Consortium (2011)
[1156]36   !! $Id$
[2528]37   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[1156]38   !!----------------------------------------------------------------------
[921]39CONTAINS
[825]40
[2528]41   SUBROUTINE lim_thd_sal( kideb, kiut )
[825]42      !!-------------------------------------------------------------------
[2528]43      !!                ***  ROUTINE lim_thd_sal  ***   
44      !!   
45      !! ** Purpose :   computes new salinities in the ice
[825]46      !!
[3625]47      !! ** Method  :  3 possibilities
48      !!               -> num_sal = 1 -> Sice = cst    [ice salinity constant in both time & space]
49      !!               -> num_sal = 2 -> Sice = S(z,t) [Vancoppenolle et al. 2005]
50      !!               -> num_sal = 3 -> Sice = S(z)   [multiyear ice]
[825]51      !!---------------------------------------------------------------------
[3625]52      INTEGER, INTENT(in) ::   kideb, kiut   ! thickness category index
[2528]53      !
54      INTEGER  ::   ji, jk     ! dummy loop indices
[2715]55      REAL(wp) ::   zsold, iflush, iaccrbo, igravdr, isnowic, i_ice_switch,  ztmelts   ! local scalars
[2528]56      REAL(wp) ::   zaaa, zbbb, zccc, zdiscrim   ! local scalars
[2715]57      REAL(wp), POINTER, DIMENSION(:) ::   ze_init, zhiold, zsiold
[2528]58      !!---------------------------------------------------------------------
[825]59
[3294]60      CALL wrk_alloc( jpij, ze_init, zhiold, zsiold )
[825]61
[921]62      !------------------------------------------------------------------------------|
63      ! 1) Constant salinity, constant in time                                       |
64      !------------------------------------------------------------------------------|
[3625]65!!gm comment: if num_sal = 1 s_i_new, s_i_b and sm_i_b can be set to bulk_sal one for all in the initialisation phase !!
66!!gm           ===>>>   simplification of almost all test on num_sal value
67      IF(  num_sal == 1  ) THEN
68            s_i_b  (kideb:kiut,1:nlay_i) =  bulk_sal
69            sm_i_b (kideb:kiut)          =  bulk_sal 
70            s_i_new(kideb:kiut)          =  bulk_sal
[2528]71      ENDIF
[825]72
[921]73      !------------------------------------------------------------------------------|
74      !  Module 2 : Constant salinity varying in time                                |
75      !------------------------------------------------------------------------------|
[825]76
[3625]77      IF(  num_sal == 2  ) THEN
[825]78
79         !---------------------------------
80         ! Thickness at previous time step
81         !---------------------------------
82         DO ji = kideb, kiut
[2715]83            zhiold(ji) = ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) - dh_i_surf(ji)
84         END DO
[825]85
86         !---------------------
87         ! Global heat content
88         !---------------------
[2715]89         ze_init(:)  =  0._wp
[825]90         DO jk = 1, nlay_i
91            DO ji = kideb, kiut
92               ze_init(ji) = ze_init(ji) + q_i_b(ji,jk) * ht_i_b(ji) / nlay_i
[2715]93            END DO
94         END DO
[825]95
96         DO ji = kideb, kiut
[2715]97            !
[825]98            ! Switches
99            !----------
[2715]100            iflush       =         MAX( 0._wp , SIGN( 1.0 , t_su_b(ji) - rtt )        )    ! =1 if summer
101            igravdr      =         MAX( 0._wp , SIGN( 1.0 , t_bo_b(ji) - t_su_b(ji) ) )    ! =1 if t_su < t_bo
102            iaccrbo      =         MAX( 0._wp , SIGN( 1.0 , dh_i_bott(ji) )           )    ! =1 if bottom accretion
103            i_ice_switch = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - ht_i_b(ji) + 1.e-2 ) )
104            isnowic      = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - dh_snowice(ji) ) ) * i_ice_switch   ! =1 if snow ice formation
[825]105
106            !---------------------
107            ! Salinity tendencies
108            !---------------------
[2715]109            !                                   ! drainage by gravity drainage
[2528]110            dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_b(ji) - sal_G , 0._wp ) / time_G * rdt_ice 
[2715]111            !                                   ! drainage by flushing 
[3625]112            dsm_i_fl_1d(ji) = - iflush  * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice
[825]113
114            !-----------------
115            ! Update salinity   
116            !-----------------
117            ! only drainage terms ( gravity drainage and flushing )
[2715]118            ! snow ice / bottom sources are added in lim_thd_ent to conserve energy
[825]119            zsiold(ji) = sm_i_b(ji)
[2528]120            sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji)
[825]121
[2715]122            ! if no ice, salinity = 0.1
[2528]123            i_ice_switch = 1._wp - MAX ( 0._wp, SIGN( 1._wp , - ht_i_b(ji) ) )
[2715]124            sm_i_b(ji)   = i_ice_switch * sm_i_b(ji) + s_i_min * ( 1._wp - i_ice_switch )
[825]125         END DO ! ji
126
[3625]127         CALL lim_var_salprof1d( kideb, kiut )         ! Salinity profile
[825]128
[3625]129
[825]130         !----------------------------
131         ! Heat flux - brine drainage
132         !----------------------------
133
134         DO ji = kideb, kiut
[2715]135!!gm useless
[825]136            ! iflush  : 1 if summer
[3625]137            iflush  =  MAX( 0._wp , SIGN( 1._wp , t_su_b(ji) - rtt        )  ) 
[825]138            ! igravdr : 1 if t_su lt t_bo
[3625]139            igravdr =  MAX( 0._wp , SIGN( 1._wp , t_bo_b(ji) - t_su_b(ji) )  ) 
[825]140            ! iaccrbo : 1 if bottom accretion
[3625]141            iaccrbo =  MAX( 0._wp , SIGN( 1._wp , dh_i_bott(ji)           )  )
[2715]142!!gm end useless
[2528]143            !
144            fhbri_1d(ji) = 0._wp
[825]145         END DO ! ji
146
147         !----------------------------
148         ! Salt flux - brine drainage
149         !----------------------------
150         DO ji = kideb, kiut
[3625]151            i_ice_switch = 1._wp - MAX(  0._wp, SIGN( 1._wp , - ht_i_b(ji) )  )
152            sfx_bri_1d(ji) = sfx_bri_1d(ji) - i_ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji)         &
153               &           * ( MAX( dsm_i_gd_1d(ji) + dsm_i_fl_1d(ji) , sm_i_b(ji) - zsiold(ji) ) ) * r1_rdtice
154         END DO
[825]155
156         ! Only necessary for conservation check since salinity is modified
157         !--------------------
158         ! Temperature update
159         !--------------------
160         DO jk = 1, nlay_i
161            DO ji = kideb, kiut
162               ztmelts    =  -tmut*s_i_b(ji,jk) + rtt
163               !Conversion q(S,T) -> T (second order equation)
164               zaaa         =  cpic
[2528]165               zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus
[825]166               zccc         =  lfus * ( ztmelts - rtt )
[2715]167               zdiscrim     =  SQRT(  MAX( zbbb*zbbb - 4.0*zaaa*zccc, 0._wp )  )
[2528]168               t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa )
[2715]169            END DO
170         END DO
[2528]171         !
[3625]172      ENDIF 
[825]173
[921]174      !------------------------------------------------------------------------------|
175      !  Module 3 : Profile of salinity, constant in time                            |
176      !------------------------------------------------------------------------------|
[825]177
[3625]178      IF(  num_sal == 3  )   CALL lim_var_salprof1d( kideb, kiut )
[825]179
180
[921]181      !------------------------------------------------------------------------------|
182      ! 5) Computation of salt flux due to Bottom growth
183      !------------------------------------------------------------------------------|
[3625]184      ! note: s_i_new = bulk_sal in constant salinity case
185      DO ji = kideb, kiut
186         sfx_thd_1d(ji) = sfx_thd_1d(ji) - s_i_new(ji) * rhoic * a_i_b(ji) * MAX( dh_i_bott(ji) , 0._wp ) * r1_rdtice
187      END DO
[2528]188      !
[3294]189      CALL wrk_dealloc( jpij, ze_init, zhiold, zsiold )
[2715]190      !
[825]191   END SUBROUTINE lim_thd_sal
192
[2528]193
[825]194   SUBROUTINE lim_thd_sal_init
195      !!-------------------------------------------------------------------
196      !!                  ***  ROUTINE lim_thd_sal_init  ***
197      !!
198      !! ** Purpose :   initialization of ice salinity parameters
199      !!
[2528]200      !! ** Method  :   Read the namicesal namelist and check the parameter
201      !!              values called at the first timestep (nit000)
[825]202      !!
203      !! ** input   :   Namelist namicesal
204      !!-------------------------------------------------------------------
[2528]205      NAMELIST/namicesal/ num_sal, bulk_sal, sal_G, time_G, sal_F, time_F,   &
206         &                s_i_max, s_i_min, s_i_0, s_i_1
[825]207      !!-------------------------------------------------------------------
[2528]208      !
209      REWIND( numnam_ice )                   ! Read Namelist namicesal
210      READ  ( numnam_ice  , namicesal )
211      !
212      IF(lwp) THEN                           ! control print
[825]213         WRITE(numout,*)
214         WRITE(numout,*) 'lim_thd_sal_init : Ice parameters for salinity '
215         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
216         WRITE(numout,*) ' switch for salinity num_sal        : ', num_sal
217         WRITE(numout,*) ' bulk salinity value if num_sal = 1 : ', bulk_sal
218         WRITE(numout,*) ' restoring salinity for GD          : ', sal_G
219         WRITE(numout,*) ' restoring time for GD              : ', time_G
220         WRITE(numout,*) ' restoring salinity for flushing    : ', sal_F
221         WRITE(numout,*) ' restoring time for flushing        : ', time_F
222         WRITE(numout,*) ' Maximum tolerated ice salinity     : ', s_i_max
223         WRITE(numout,*) ' Minimum tolerated ice salinity     : ', s_i_min
224         WRITE(numout,*) ' 1st salinity for salinity profile  : ', s_i_0
225         WRITE(numout,*) ' 2nd salinity for salinity profile  : ', s_i_1
226      ENDIF
[2528]227      !
[825]228   END SUBROUTINE lim_thd_sal_init
229
230#else
231   !!----------------------------------------------------------------------
[2528]232   !!   Default option         Dummy Module          No LIM-3 sea-ice model
[825]233   !!----------------------------------------------------------------------
234#endif
235   !!======================================================================
236END MODULE limthd_sal
Note: See TracBrowser for help on using the repository browser.