source: branches/dev_r4028_CNRS_LIM3_MV2014/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90 @ 4626

Last change on this file since 4626 was 4626, checked in by gm, 7 years ago

dev_r4028_CNRS_LIM3_MV2014 : minor corrections on LIM3

  • Property svn:keywords set to Id
File size: 10.0 KB
Line 
1MODULE limthd_sal
2   !!======================================================================
3   !!                       ***  MODULE limthd_sal ***
4   !! LIM-3 sea-ice :  computation of salinity variations in the ice
5   !!======================================================================
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
8   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
9   !!---------------------------------------------------------------------
10#if defined key_lim3
11   !!----------------------------------------------------------------------
12   !!   'key_lim3'                                      LIM-3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!   lim_thd_sal   : salinity variations in the ice
15   !!----------------------------------------------------------------------
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) 
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   lim_thd_sal        ! called by limthd module
32   PUBLIC   lim_thd_sal_init   ! called by iceini module
33
34   !!----------------------------------------------------------------------
35   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
36   !! $Id$
37   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
38   !!----------------------------------------------------------------------
39CONTAINS
40
41   SUBROUTINE lim_thd_sal( kideb, kiut )
42      !!-------------------------------------------------------------------
43      !!                ***  ROUTINE lim_thd_sal  ***   
44      !!   
45      !! ** Purpose :   computes new salinities in the ice
46      !!
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]
51      !!---------------------------------------------------------------------
52      INTEGER, INTENT(in) ::   kideb, kiut   ! thickness category index
53      !
54      INTEGER  ::   ji, jk     ! dummy loop indices
55      REAL(wp) ::   zsold, iflush, iaccrbo, igravdr, isnowic, ice_switch,  ztmelts   ! local scalars
56      REAL(wp) ::   zaaa, zbbb, zccc, zdiscrim   ! local scalars
57      REAL(wp), POINTER, DIMENSION(:) ::   ze_init, zhiold, zsiold
58      !!---------------------------------------------------------------------
59
60      CALL wrk_alloc( jpij, ze_init, zhiold, zsiold )
61
62      !------------------------------------------------------------------------------|
63      ! 1) Constant salinity, constant in time                                       |
64      !------------------------------------------------------------------------------|
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
71      ENDIF
72
73      !------------------------------------------------------------------------------|
74      !  Module 2 : Constant salinity varying in time                                |
75      !------------------------------------------------------------------------------|
76
77      IF(  num_sal == 2  ) THEN
78
79         !---------------------------------
80         ! Thickness at previous time step
81         !---------------------------------
82         DO ji = kideb, kiut
83            zhiold(ji) = ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) - dh_i_surf(ji)
84            zsiold(ji) = sm_i_b(ji)
85         END DO
86
87         !---------------------
88         ! Global heat content
89         !---------------------
90         ze_init(:)  =  0._wp
91         DO jk = 1, nlay_i
92            DO ji = kideb, kiut
93               ze_init(ji) = ze_init(ji) + q_i_b(ji,jk) * ht_i_b(ji) / REAL (nlay_i )
94            END DO
95         END DO
96
97         DO ji = kideb, kiut
98            !
99            ! Switches
100            !----------
101            iflush     =         MAX( 0._wp , SIGN( 1.0 , t_su_b(ji) - rtt )        )           ! =1 if summer
102            igravdr    =         MAX( 0._wp , SIGN( 1.0 , t_bo_b(ji) - t_su_b(ji) ) )           ! =1 if t_su < t_bo
103            iaccrbo    =         MAX( 0._wp , SIGN( 1.0 , dh_i_bott(ji) )           )           ! =1 if bottom accretion
104            ice_switch = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - ht_i_b(ji) + 1.e-2 ) )           ! =1 ice thickness > 1cm
105            isnowic    = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - dh_snowice(ji) ) ) * ice_switch  ! =1 if snow ice formation
106            !
107            !---------------------
108            ! Salinity tendencies
109            !---------------------
110            !                               
111            dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_b(ji) - sal_G , 0._wp ) / time_G * rdt_ice  ! drainage by gravity
112            dsm_i_fl_1d(ji) = - iflush  * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice  ! drainage by flushing
113            !
114            !-----------------
115            ! Update salinity   
116            !-----------------
117            ! only drainage terms ( gravity drainage and flushing )
118            ! snow ice / bottom sources are added in lim_thd_ent to conserve energy
119            sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji)
120            !
121            ! if no ice, salinity = 0.1
122            ice_switch = 1._wp - MAX ( 0._wp, SIGN( 1._wp , - ht_i_b(ji) ) )
123            sm_i_b(ji) = ice_switch * sm_i_b(ji) + s_i_min * ( 1._wp - ice_switch )
124            !
125            !----------------------------
126            ! Heat flux - brine drainage
127            !----------------------------
128            fhbri_1d(ji) = 0._wp
129            !
130            !----------------------------
131            ! Salt flux - brine drainage
132            !----------------------------
133            sfx_bri_1d(ji) = sfx_bri_1d(ji) - ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji) * ( sm_i_b(ji) - zsiold(ji) ) * r1_rdtice
134            !
135         END DO
136
137         ! Salinity profile
138         CALL lim_var_salprof1d( kideb, kiut )
139
140
141         ! Only necessary for conservation check since salinity is modified
142         !--------------------
143         ! Temperature update
144         !--------------------
145         DO jk = 1, nlay_i
146            DO ji = kideb, kiut
147               ztmelts    =  -tmut*s_i_b(ji,jk) + rtt
148               !Conversion q(S,T) -> T (second order equation)
149               zaaa         =  cpic
150               zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus
151               zccc         =  lfus * ( ztmelts - rtt )
152               zdiscrim     =  SQRT(  MAX( zbbb*zbbb - 4.0*zaaa*zccc, 0._wp )  )
153               t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa )
154            END DO
155         END DO
156         !
157      ENDIF 
158
159      !------------------------------------------------------------------------------|
160      !  Module 3 : Profile of salinity, constant in time                            |
161      !------------------------------------------------------------------------------|
162
163      IF(  num_sal == 3  )   CALL lim_var_salprof1d( kideb, kiut )
164
165      !
166      CALL wrk_dealloc( jpij, ze_init, zhiold, zsiold )
167      !
168   END SUBROUTINE lim_thd_sal
169
170
171   SUBROUTINE lim_thd_sal_init
172      !!-------------------------------------------------------------------
173      !!                  ***  ROUTINE lim_thd_sal_init  ***
174      !!
175      !! ** Purpose :   initialization of ice salinity parameters
176      !!
177      !! ** Method  :   Read the namicesal namelist and check the parameter
178      !!              values called at the first timestep (nit000)
179      !!
180      !! ** input   :   Namelist namicesal
181      !!-------------------------------------------------------------------
182      NAMELIST/namicesal/ num_sal, bulk_sal, sal_G, time_G, sal_F, time_F,   &
183         &                s_i_max, s_i_min, s_i_0, s_i_1
184      !!-------------------------------------------------------------------
185      !
186      REWIND( numnam_ice )                   ! Read Namelist namicesal
187      READ  ( numnam_ice  , namicesal )
188      !
189      IF(lwp) THEN                           ! control print
190         WRITE(numout,*)
191         WRITE(numout,*) 'lim_thd_sal_init : Ice parameters for salinity '
192         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
193         WRITE(numout,*) ' switch for salinity num_sal        : ', num_sal
194         WRITE(numout,*) ' bulk salinity value if num_sal = 1 : ', bulk_sal
195         WRITE(numout,*) ' restoring salinity for GD          : ', sal_G
196         WRITE(numout,*) ' restoring time for GD              : ', time_G
197         WRITE(numout,*) ' restoring salinity for flushing    : ', sal_F
198         WRITE(numout,*) ' restoring time for flushing        : ', time_F
199         WRITE(numout,*) ' Maximum tolerated ice salinity     : ', s_i_max
200         WRITE(numout,*) ' Minimum tolerated ice salinity     : ', s_i_min
201         WRITE(numout,*) ' 1st salinity for salinity profile  : ', s_i_0
202         WRITE(numout,*) ' 2nd salinity for salinity profile  : ', s_i_1
203      ENDIF
204      !
205   END SUBROUTINE lim_thd_sal_init
206
207#else
208   !!----------------------------------------------------------------------
209   !!   Default option         Dummy Module          No LIM-3 sea-ice model
210   !!----------------------------------------------------------------------
211#endif
212   !!======================================================================
213END MODULE limthd_sal
Note: See TracBrowser for help on using the repository browser.