source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/icethd_sal.F90 @ 8518

Last change on this file since 8518 was 8518, checked in by clem, 3 years ago

changes in style - part6 - commits of the day

File size: 8.8 KB
Line 
1MODULE icethd_sal
2   !!======================================================================
3   !!                       ***  MODULE icethd_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   !!   ice_thd_sal   : salinity variations in the ice
15   !!----------------------------------------------------------------------
16   USE par_oce        ! ocean parameters
17   USE phycst         ! physical constants (ocean directory)
18   USE ice            ! LIM variables
19   USE ice1D          ! LIM thermodynamics
20   USE icevar         ! LIM variables
21   !
22   USE in_out_manager ! I/O manager
23   USE lib_mpp        ! MPP library
24   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   ice_thd_sal        ! called by icethd module
30   PUBLIC   ice_thd_sal_init   ! called by ice_init
31   
32   ! ** namelist (namsal) **
33   LOGICAL  ::   ln_icedS         ! activate gravity drainage and flushing (T) or not (F)
34   REAL(wp) ::   rn_sal_gd        !    restoring salinity for gravity drainage [PSU]
35   REAL(wp) ::   rn_time_gd       !    restoring time constant for gravity drainage (= 20 days) [s]
36   REAL(wp) ::   rn_sal_fl        !    restoring salinity for flushing [PSU]
37   REAL(wp) ::   rn_time_fl       !    restoring time constant for gravity drainage (= 10 days) [s]
38
39   !!----------------------------------------------------------------------
40   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
41   !! $Id: icethd_sal.F90 8420 2017-08-08 12:18:46Z clem $
42   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE ice_thd_sal
47      !!-------------------------------------------------------------------
48      !!                ***  ROUTINE ice_thd_sal  ***   
49      !!   
50      !! ** Purpose :   computes new salinities in the ice
51      !!
52      !! ** Method  :  3 possibilities
53      !!               -> nn_icesal = 1 -> Sice = cst    [ice salinity constant in both time & space]
54      !!               -> nn_icesal = 2 -> Sice = S(z,t) [Vancoppenolle et al. 2005]
55      !!               -> nn_icesal = 3 -> Sice = S(z)   [multiyear ice]
56      !!---------------------------------------------------------------------
57      INTEGER  ::   ji, jk                       ! dummy loop indices
58      REAL(wp) ::   iflush, igravdr              ! local scalars
59      REAL(wp) ::   zs_sni, zsm_i_gd, zsm_i_fl, zsm_i_si, zsm_i_bg   ! local scalars
60      !!---------------------------------------------------------------------
61
62      SELECT CASE ( nn_icesal )
63      !
64      !               !---------------------------------------------!
65      CASE( 2 )       !  time varying salinity with linear profile  !
66      !               !---------------------------------------------!
67         DO ji = 1, nidx
68
69            !---------------------------------------------------------
70            !  Update ice salinity from snow-ice and bottom growth
71            !---------------------------------------------------------
72            zs_sni   = sss_1d(ji) * ( rhoic - rhosn ) * r1_rhoic   ! Salinity of snow ice
73            rswitch  = MAX( 0._wp , SIGN( 1._wp , ht_i_1d(ji) - epsi20 ) )
74            zsm_i_si = ( zs_sni      - sm_i_1d(ji) ) *             dh_snowice(ji)  / MAX( ht_i_1d(ji), epsi20 ) * rswitch ! snow-ice   
75            zsm_i_bg = ( s_i_new(ji) - sm_i_1d(ji) ) * MAX( 0._wp, dh_i_bott(ji) ) / MAX( ht_i_1d(ji), epsi20 ) * rswitch ! bottom growth
76
77            ! Update salinity (nb: salt flux already included in icethd_dh)
78            sm_i_1d(ji) = sm_i_1d(ji) + zsm_i_bg + zsm_i_si
79
80            IF( ln_icedS ) THEN
81               !---------------------------------------------------------
82               !  Update ice salinity from brine drainage and flushing
83               !---------------------------------------------------------
84               iflush   = MAX( 0._wp , SIGN( 1._wp , t_su_1d(ji) - rt0         ) )  ! =1 if summer
85               igravdr  = MAX( 0._wp , SIGN( 1._wp , t_bo_1d(ji) - t_su_1d(ji) ) )  ! =1 if t_su < t_bo
86               zsm_i_gd = - igravdr * MAX( sm_i_1d(ji) - rn_sal_gd , 0._wp ) / rn_time_gd * rdt_ice  ! gravity drainage
87               zsm_i_fl = - iflush  * MAX( sm_i_1d(ji) - rn_sal_fl , 0._wp ) / rn_time_fl * rdt_ice  ! flushing
88               
89               ! Update salinity   
90               sm_i_1d(ji) = sm_i_1d(ji) + zsm_i_fl + zsm_i_gd
91               
92               ! Salt flux
93               sfx_bri_1d(ji) = sfx_bri_1d(ji) - rhoic * a_i_1d(ji) * ht_i_1d(ji) * ( zsm_i_fl + zsm_i_gd ) * r1_rdtice
94            ENDIF
95         END DO
96
97         ! Salinity profile
98         CALL ice_var_salprof1d
99         !
100      !         !---------------------------------------------!
101      CASE( 3 ) ! constant salinity with a fixed profile      ! (Schwarzacher (1959) multiyear salinity profile(mean = 2.30)
102      !         !---------------------------------------------!
103         CALL ice_var_salprof1d
104      !
105   END SELECT
106   !
107   END SUBROUTINE ice_thd_sal
108
109
110   SUBROUTINE ice_thd_sal_init
111      !!-------------------------------------------------------------------
112      !!                  ***  ROUTINE ice_thd_sal_init  ***
113      !!
114      !! ** Purpose :   initialization of ice salinity parameters
115      !!
116      !! ** Method  :   Read the namice_sal namelist and check the parameter
117      !!              values called at the first timestep (nit000)
118      !!
119      !! ** input   :   Namelist namice_sal
120      !!-------------------------------------------------------------------
121      INTEGER  ::   ios                 ! Local integer output status for namelist read
122      !!
123      NAMELIST/namice_sal/ ln_icedS , nn_icesal , rn_icesal, rn_sal_gd, rn_time_gd,   &
124         &                 rn_sal_fl, rn_time_fl, rn_simax , rn_simin 
125      !!-------------------------------------------------------------------
126      !
127      REWIND( numnam_ice_ref )              ! Namelist namice_sal in reference namelist : Ice salinity
128      READ  ( numnam_ice_ref, namice_sal, IOSTAT = ios, ERR = 901)
129901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_sal in reference namelist', lwp )
130      !
131      REWIND( numnam_ice_cfg )              ! Namelist namice_sal in configuration namelist : Ice salinity
132      READ  ( numnam_ice_cfg, namice_sal, IOSTAT = ios, ERR = 902 )
133902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_sal in configuration namelist', lwp )
134      IF(lwm) WRITE ( numoni, namice_sal )
135      !
136      IF(lwp) THEN                           ! control print
137         WRITE(numout,*)
138         WRITE(numout,*) 'ice_thd_sal_init : Ice parameters for salinity '
139         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
140         WRITE(numout,*) '   Namelist namice_sal'
141         WRITE(numout,*) '      activate gravity drainage and flushing (T) or not (F)   ln_icedS   = ', ln_icedS
142         WRITE(numout,*) '      switch for salinity                                     nn_icesal  = ', nn_icesal
143         WRITE(numout,*) '      bulk salinity value if nn_icesal = 1                    rn_icesal  = ', rn_icesal
144         WRITE(numout,*) '      restoring salinity for gravity drainage                 rn_sal_gd  = ', rn_sal_gd
145         WRITE(numout,*) '      restoring time for for gravity drainage                 rn_time_gd = ', rn_time_gd
146         WRITE(numout,*) '      restoring salinity for flushing                         rn_sal_fl  = ', rn_sal_fl
147         WRITE(numout,*) '      restoring time for flushing                             rn_time_fl = ', rn_time_fl
148         WRITE(numout,*) '      Maximum tolerated ice salinity                          rn_simax   = ', rn_simax
149         WRITE(numout,*) '      Minimum tolerated ice salinity                          rn_simin   = ', rn_simin
150      ENDIF
151      !
152      IF( ln_icedS .AND. nn_icesal == 1 ) THEN
153         ln_icedS = .FALSE.
154         CALL ctl_warn('ln_icedS is set to false since constant ice salinity is chosen (nn_icesal=1)')
155      ENDIF
156      !
157   END SUBROUTINE ice_thd_sal_init
158
159#else
160   !!----------------------------------------------------------------------
161   !!   Default option         Dummy Module          No LIM-3 sea-ice model
162   !!----------------------------------------------------------------------
163#endif
164
165   !!======================================================================
166END MODULE icethd_sal
Note: See TracBrowser for help on using the repository browser.