source: NEMO/branches/UKMO/NEMO_4.0_add_pond_lids_prints/src/ICE/icethd_pnd.F90 @ 12379

Last change on this file since 12379 was 12379, checked in by dancopsey, 14 months ago

Add meltpond lid thickness as a new prognostic.

File size: 12.8 KB
Line 
1MODULE icethd_pnd 
2   !!======================================================================
3   !!                     ***  MODULE  icethd_pnd   ***
4   !!   sea-ice: Melt ponds on top of sea ice
5   !!======================================================================
6   !! history :       !  2012     (O. Lecomte)       Adaptation from Flocco and Turner
7   !!                 !  2017     (M. Vancoppenolle, O. Lecomte, C. Rousset) Implementation
8   !!            4.0  !  2018     (many people)      SI3 [aka Sea Ice cube]
9   !!----------------------------------------------------------------------
10#if defined key_si3
11   !!----------------------------------------------------------------------
12   !!   'key_si3' :                                     SI3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!   ice_thd_pnd_init : some initialization and namelist read
15   !!   ice_thd_pnd      : main calling routine
16   !!----------------------------------------------------------------------
17   USE phycst         ! physical constants
18   USE dom_oce        ! ocean space and time domain
19   USE ice            ! sea-ice: variables
20   USE ice1D          ! sea-ice: thermodynamics variables
21   USE icetab         ! sea-ice: 1D <==> 2D transformation
22   !
23   USE in_out_manager ! I/O manager
24   USE lib_mpp        ! MPP library
25   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero)
26   USE timing         ! Timing
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   ice_thd_pnd_init    ! routine called by icestp.F90
32   PUBLIC   ice_thd_pnd         ! routine called by icestp.F90
33
34   INTEGER ::              nice_pnd    ! choice of the type of pond scheme
35   !                                   ! associated indices:
36   INTEGER, PARAMETER ::   np_pndNO  = 0   ! No pond scheme
37   INTEGER, PARAMETER ::   np_pndCST = 1   ! Constant pond scheme
38   INTEGER, PARAMETER ::   np_pndH12 = 2   ! Evolutive pond scheme (Holland et al. 2012)
39
40   !! * Substitutions
41#  include "vectopt_loop_substitute.h90"
42   !!----------------------------------------------------------------------
43   !! NEMO/ICE 4.0 , NEMO Consortium (2018)
44   !! $Id$
45   !! Software governed by the CeCILL license (see ./LICENSE)
46   !!----------------------------------------------------------------------
47CONTAINS
48
49   SUBROUTINE ice_thd_pnd
50      !!-------------------------------------------------------------------
51      !!               ***  ROUTINE ice_thd_pnd   ***
52      !!               
53      !! ** Purpose :   change melt pond fraction
54      !!               
55      !! ** Method  :   brut force
56      !!-------------------------------------------------------------------
57      !
58      SELECT CASE ( nice_pnd )
59      !
60      CASE (np_pndCST)   ;   CALL pnd_CST    !==  Constant melt ponds  ==!
61         !
62      CASE (np_pndH12)   ;   CALL pnd_H12    !==  Holland et al 2012 melt ponds  ==!
63         !
64      END SELECT
65      !
66   END SUBROUTINE ice_thd_pnd 
67
68
69   SUBROUTINE pnd_CST 
70      !!-------------------------------------------------------------------
71      !!                ***  ROUTINE pnd_CST  ***
72      !!
73      !! ** Purpose :   Compute melt pond evolution
74      !!
75      !! ** Method  :   Melt pond fraction and thickness are prescribed
76      !!                to non-zero values when t_su = 0C
77      !!
78      !! ** Tunable parameters : pond fraction (rn_apnd), pond depth (rn_hpnd)
79      !!               
80      !! ** Note   : Coupling with such melt ponds is only radiative
81      !!             Advection, ridging, rafting... are bypassed
82      !!
83      !! ** References : Bush, G.W., and Trump, D.J. (2017)
84      !!-------------------------------------------------------------------
85      INTEGER  ::   ji        ! loop indices
86      !!-------------------------------------------------------------------
87      DO ji = 1, npti
88         !
89         IF( a_i_1d(ji) > 0._wp .AND. t_su_1d(ji) >= rt0 ) THEN
90            a_ip_frac_1d(ji) = rn_apnd
91            h_ip_1d(ji)      = rn_hpnd   
92            a_ip_1d(ji)      = a_ip_frac_1d(ji) * a_i_1d(ji)
93         ELSE
94            a_ip_frac_1d(ji) = 0._wp
95            h_ip_1d(ji)      = 0._wp   
96            a_ip_1d(ji)      = 0._wp
97         ENDIF
98         !
99      END DO
100      !
101   END SUBROUTINE pnd_CST
102
103
104   SUBROUTINE pnd_H12
105      !!-------------------------------------------------------------------
106      !!                ***  ROUTINE pnd_H12  ***
107      !!
108      !! ** Purpose    : Compute melt pond evolution
109      !!
110      !! ** Method     : Empirical method. A fraction of meltwater is accumulated in ponds
111      !!                 and sent to ocean when surface is freezing
112      !!
113      !!                 pond growth:      Vp = Vp + dVmelt
114      !!                    with dVmelt = R/rhow * ( rhoi*dh_i + rhos*dh_s ) * a_i
115      !!                 pond contraction: Vp = Vp * exp(0.01*MAX(Tp-Tsu,0)/Tp)
116      !!                    with Tp = -2degC
117      !! 
118      !! ** Tunable parameters : (no real expertise yet, ideas?)
119      !!
120      !! ** Note       : Stolen from CICE for quick test of the melt pond
121      !!                 radiation and freshwater interfaces
122      !!                 Coupling can be radiative AND freshwater
123      !!                 Advection, ridging, rafting are called
124      !!
125      !! ** References : Holland, M. M. et al (J Clim 2012)
126      !!-------------------------------------------------------------------
127      REAL(wp), PARAMETER ::   zrmin       = 0.15_wp  ! minimum fraction of available meltwater retained for melt ponding
128      REAL(wp), PARAMETER ::   zrmax       = 0.70_wp  ! maximum     -           -         -         -            -
129      REAL(wp), PARAMETER ::   zpnd_aspect = 0.174_wp   ! pond aspect ratio
130      REAL(wp), PARAMETER ::   zTp         = -2._wp   ! reference temperature
131      !
132      REAL(wp) ::   zfr_mlt          ! fraction of available meltwater retained for melt ponding
133      REAL(wp) ::   zdv_mlt          ! available meltwater for melt ponding
134      REAL(wp) ::   z1_Tp            ! inverse reference temperature
135      REAL(wp) ::   z1_rhow          ! inverse freshwater density
136      REAL(wp) ::   z1_zpnd_aspect   ! inverse pond aspect ratio
137      REAL(wp) ::   zfac, zdum
138      !
139      INTEGER  ::   ji   ! loop indices
140      !!-------------------------------------------------------------------
141      z1_rhow        = 1._wp / rhow 
142      z1_zpnd_aspect = 1._wp / zpnd_aspect
143      z1_Tp          = 1._wp / zTp 
144
145      DO ji = 1, npti
146
147         IF (to_print(ji) == 10) THEN
148            write(numout,*)'icethd_pnd_start: h_ip_1d(ji), a_ip_frac_1d(ji), a_ip_1d(ji) = ',h_ip_1d(ji), ' ', a_ip_frac_1d(ji), ' ', a_ip_1d(ji)
149         END IF
150
151         !                                                        !--------------------------------!
152         IF( h_i_1d(ji) < rn_himin) THEN                          ! Case ice thickness < rn_himin  !
153            !                                                     !--------------------------------!
154            !--- Remove ponds on thin ice
155            a_ip_1d(ji)      = 0._wp
156            a_ip_frac_1d(ji) = 0._wp
157            h_ip_1d(ji)      = 0._wp
158            lh_ip_1d(ji)     = 0._wp
159            !                                                     !--------------------------------!
160         ELSE                                                     ! Case ice thickness >= rn_himin !
161            !                                                     !--------------------------------!
162            v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji)   ! record pond volume at previous time step
163            !
164            ! available meltwater for melt ponding [m, >0] and fraction
165            zdv_mlt = -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) * z1_rhow * a_i_1d(ji)
166            zfr_mlt = zrmin + ( zrmax - zrmin ) * a_i_1d(ji)  ! from CICE doc
167            !zfr_mlt = zrmin + zrmax * a_i_1d(ji)             ! from Holland paper
168            !
169            !--- Pond gowth ---!
170            ! v_ip should never be negative, otherwise code crashes
171            v_ip_1d(ji) = MAX( 0._wp, v_ip_1d(ji) + zfr_mlt * zdv_mlt )
172            !
173            ! melt pond mass flux (<0)
174            IF( zdv_mlt > 0._wp ) THEN
175               zfac = zfr_mlt * zdv_mlt * rhow * r1_rdtice
176               wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - zfac
177               !
178               ! adjust ice/snow melting flux to balance melt pond flux (>0)
179               zdum = zfac / ( wfx_snw_sum_1d(ji) + wfx_sum_1d(ji) )
180               wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) * (1._wp + zdum)
181               wfx_sum_1d(ji)     = wfx_sum_1d(ji)     * (1._wp + zdum)
182            ENDIF
183            !
184            !--- Pond contraction (due to refreezing) ---!
185            v_ip_1d(ji) = v_ip_1d(ji) * EXP( 0.01_wp * MAX( zTp+rt0 - t_su_1d(ji), 0._wp ) * z1_Tp )
186            !
187            ! Set new pond area and depth assuming linear relation between h_ip and a_ip_frac
188            !    h_ip = zpnd_aspect * a_ip_frac = zpnd_aspect * a_ip/a_i
189            a_ip_1d(ji)      = SQRT( v_ip_1d(ji) * z1_zpnd_aspect * a_i_1d(ji) )
190            a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji)
191            h_ip_1d(ji)      = zpnd_aspect * a_ip_frac_1d(ji)
192            !
193         ENDIF
194
195         IF (to_print(ji) == 10) THEN
196            write(numout,*)'icethd_pnd: h_ip_1d(ji), zpnd_aspect, a_ip_frac_1d(ji), a_ip_1d(ji) = ',h_ip_1d(ji), zpnd_aspect, a_ip_frac_1d(ji), a_ip_1d(ji)
197            write(numout,*)'icethd_pnd: a_i_1d(ji), v_ip_1d(ji), t_su_1d(ji), zfr_mlt, zdv_mlt = ',a_i_1d(ji), ' ', v_ip_1d(ji), ' ', t_su_1d(ji), ' ', zfr_mlt, ' ', zdv_mlt
198            write(numout,*)'icethd_pnd: meltt = ', -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) / rhoi
199         END IF
200
201      END DO
202      !
203   END SUBROUTINE pnd_H12
204
205
206   SUBROUTINE ice_thd_pnd_init 
207      !!-------------------------------------------------------------------
208      !!                  ***  ROUTINE ice_thd_pnd_init   ***
209      !!
210      !! ** Purpose : Physical constants and parameters linked to melt ponds
211      !!              over sea ice
212      !!
213      !! ** Method  :  Read the namthd_pnd  namelist and check the melt pond 
214      !!               parameter values called at the first timestep (nit000)
215      !!
216      !! ** input   :   Namelist namthd_pnd 
217      !!-------------------------------------------------------------------
218      INTEGER  ::   ios, ioptio   ! Local integer
219      !!
220      NAMELIST/namthd_pnd/  ln_pnd_H12, ln_pnd_CST, rn_apnd, rn_hpnd, ln_pnd_alb
221      !!-------------------------------------------------------------------
222      !
223      REWIND( numnam_ice_ref )              ! Namelist namthd_pnd  in reference namelist : Melt Ponds 
224      READ  ( numnam_ice_ref, namthd_pnd, IOSTAT = ios, ERR = 901)
225901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namthd_pnd  in reference namelist', lwp )
226      REWIND( numnam_ice_cfg )              ! Namelist namthd_pnd  in configuration namelist : Melt Ponds
227      READ  ( numnam_ice_cfg, namthd_pnd, IOSTAT = ios, ERR = 902 )
228902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namthd_pnd in configuration namelist', lwp )
229      IF(lwm) WRITE ( numoni, namthd_pnd )
230      !
231      IF(lwp) THEN                        ! control print
232         WRITE(numout,*)
233         WRITE(numout,*) 'ice_thd_pnd_init: ice parameters for melt ponds'
234         WRITE(numout,*) '~~~~~~~~~~~~~~~~'
235         WRITE(numout,*) '   Namelist namicethd_pnd:'
236         WRITE(numout,*) '      Evolutive  melt pond fraction and depth (Holland et al 2012) ln_pnd_H12 = ', ln_pnd_H12
237         WRITE(numout,*) '      Prescribed melt pond fraction and depth                      ln_pnd_CST = ', ln_pnd_CST
238         WRITE(numout,*) '         Prescribed pond fraction                                  rn_apnd    = ', rn_apnd
239         WRITE(numout,*) '         Prescribed pond depth                                     rn_hpnd    = ', rn_hpnd
240         WRITE(numout,*) '      Melt ponds affect albedo or not                              ln_pnd_alb = ', ln_pnd_alb
241      ENDIF
242      !
243      !                             !== set the choice of ice pond scheme ==!
244      ioptio = 0
245                                                            nice_pnd = np_pndNO
246      IF( ln_pnd_CST ) THEN   ;   ioptio = ioptio + 1   ;   nice_pnd = np_pndCST    ;   ENDIF
247      IF( ln_pnd_H12 ) THEN   ;   ioptio = ioptio + 1   ;   nice_pnd = np_pndH12    ;   ENDIF
248      IF( ioptio > 1 )   CALL ctl_stop( 'ice_thd_pnd_init: choose one and only one pond scheme (ln_pnd_H12 or ln_pnd_CST)' )
249      !
250      SELECT CASE( nice_pnd )
251      CASE( np_pndNO )         
252         IF( ln_pnd_alb ) THEN ; ln_pnd_alb = .FALSE. ; CALL ctl_warn( 'ln_pnd_alb=false when no ponds' ) ; ENDIF
253      END SELECT
254      !
255   END SUBROUTINE ice_thd_pnd_init
256   
257#else
258   !!----------------------------------------------------------------------
259   !!   Default option          Empty module          NO SI3 sea-ice model
260   !!----------------------------------------------------------------------
261#endif 
262
263   !!======================================================================
264END MODULE icethd_pnd 
Note: See TracBrowser for help on using the repository browser.