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.
sbcblk_algo_ice_cdn.F90 in NEMO/trunk/src/OCE/SBC – NEMO

source: NEMO/trunk/src/OCE/SBC/sbcblk_algo_ice_cdn.F90 @ 14072

Last change on this file since 14072 was 14072, checked in by laurent, 3 years ago

Merging branch "2020/dev_r13648_ASINTER-04_laurent_bulk_ice", ticket #2369

File size: 14.4 KB
Line 
1! AeroBulk / 2020 / L. Brodeau
2!
3!   When using AeroBulk to produce scientific work, please acknowledge with the following citation:
4!
5!   Brodeau, L., B. Barnier, S. Gulev, and C. Woods, 2016: Climatologically
6!   significant effects of some approximations in the bulk parameterizations of
7!   turbulent air-sea fluxes. J. Phys. Oceanogr., doi:10.1175/JPO-D-16-0169.1.
8!
9!
10MODULE sbcblk_algo_ice_cdn
11   !!====================================================================================
12   !!            Author: Laurent Brodeau, January 2020
13   !!====================================================================================
14   USE par_kind, ONLY: wp
15   USE par_oce,  ONLY: jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls, ntsi, ntsj, ntei, ntej
16   USE phycst          ! physical constants
17   USE sbc_phy         ! Catalog of functions for physical/meteorological parameters in the marine boundary layer
18
19   IMPLICIT NONE
20   PRIVATE
21
22   PUBLIC :: CdN10_f_LU12, CdN_f_LU12_eq36, CdN10_f_LU13, CdN_f_LG15, CdN_f_LG15_light
23
24   REAL(wp), PARAMETER :: rCe_0    = 2.23E-3_wp !LOLO: this one can be more accurate when sea-ice data => Lupkes et al (2013), Eq.(1)
25   REAL(wp), PARAMETER :: rNu_0    = 1._wp
26   REAL(wp), PARAMETER :: rMu_0    = 1._wp
27   REAL(wp), PARAMETER :: rbeta_0  = 1.4_wp     ! (Eq.47) MIZ
28
29   REAL(wp), PARAMETER :: rhmin_0 = 0.286_wp  ! Eq.(25)
30   REAL(wp), PARAMETER :: rhmax_0 = 0.534_wp  ! Eq.(25)
31   REAL(wp), PARAMETER :: rDmin_0 =   8._wp      ! Eq.(27)
32   REAL(wp), PARAMETER :: rDmax_0 = 300._wp      ! Eq.(27)
33   REAL(wp), PARAMETER :: rz0_w_0 = 3.27E-4   ! fixed roughness length over water (paragraph below Eq.36)
34
35   !!============================================================
36   REAL(wp), PARAMETER ::   rce10_i_0 = 3.46e-3_wp ! (Eq.48) MIZ
37
38   REAL(wp), PARAMETER ::   ralpha_0  = 0.2_wp     ! (Eq.12) (ECHAM6 value)
39
40   !! * Substitutions
41#  include "do_loop_substitute.h90"
42   !!----------------------------------------------------------------------
43CONTAINS
44
45
46   FUNCTION CdN10_f_LU12( pfrice, pz0w,  pSc, phf, pDi  )
47      !!----------------------------------------------------------------------
48      !!                      ***  ROUTINE  CdN10_f_LU12  ***
49      !!
50      !!        GENERAL FORM OF EQUATION 22 of Lupkes et al. 2012
51      !!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
52      !!
53      !! ** Purpose :    Computes the "form" contribution of the neutral air-ice
54      !!                 drag referenced at 10m to make it dependent on edges at
55      !!                 leads, melt ponds and flows (to be added to the "skin"
56      !!                 contribution. After some
57      !!                 approximations, this can be resumed to a dependency on
58      !!                 ice concentration.
59      !!
60      !! ** References : Lupkes et al. JGR 2012 (theory)
61      !!
62      !!----------------------------------------------------------------------
63      REAL(wp), DIMENSION(jpi,jpj)                       :: CdN10_f_LU12  ! neutral FORM drag coefficient contribution over sea-ice
64      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           :: pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc, phf and pDi all provided...
65      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           :: pz0w   ! roughness length over water  [m]
66      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc    ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
67      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf    ! mean freeboard of floes    [m]
68      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
69      !!----------------------------------------------------------------------
70      LOGICAL :: l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
71      REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi
72      INTEGER  :: ji, jj
73      !!----------------------------------------------------------------------
74      l_known_Sc    = PRESENT(pSc)
75      l_known_hf    = PRESENT(phf)
76      l_known_Di    = PRESENT(pDi)
77
78      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
79           
80            zfri = pfrice(ji,jj)
81            zfrw = (1._wp - zfri)
82
83            IF(l_known_Sc) THEN
84               zSc = pSc(ji,jj)
85            ELSE
86               !! Sc parameterized in terms of A (ice fraction):
87               zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 ))   ! Eq.(31)
88            END IF
89
90            IF(l_known_hf) THEN
91               zhf = phf(ji,jj)
92            ELSE
93               !! hf parameterized in terms of A (ice fraction):
94               zhf = rhmax_0*zfri + rhmin_0*zfrw  ! Eq.(25)
95            END IF
96
97            IF(l_known_Di) THEN
98               zDi = pDi(ji,jj)
99            ELSE
100               !! Di parameterized in terms of A (ice fraction):
101               ztmp = 1._wp / ( 1._wp - (rDmin_0/rDmax_0)**(1._wp/rBeta_0) )   ! A* Eq.(27)
102               zDi =  rDmin_0 * ( ztmp/(ztmp - zfri) )**rBeta_0                !    Eq.(26)
103            END IF
104
105            ztmp  = 1._wp/pz0w(ji,jj)
106            zrlog = LOG(zhf*ztmp) / LOG(10._wp*ztmp)
107
108            CdN10_f_LU12(:,:) = 0.5_wp* 0.3_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri  ! Eq.(22)
109            !!                   1/2      Ce
110
111      END_2D
112   END FUNCTION CdN10_f_LU12
113
114   
115   FUNCTION CdN_f_LU12_eq36( pzu, pfrice )
116      REAL(wp), DIMENSION(jpi,jpj)             :: CdN_f_LU12_eq36 ! neutral FORM drag coefficient contribution over sea-ice
117      REAL(wp),                     INTENT(in) :: pzu    ! reference height                       [m]
118      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc, phf and pDi all provided...
119      !!----------------------------------------------------------------------
120      REAL(wp) :: ztmp, zrlog, zfri, zhf, zDi
121      INTEGER  :: ji, jj
122      !!----------------------------------------------------------------------
123      !zhf   = 0.28   ! h_fc
124      zhf   = 0.41   ! h_fc
125      zDi   = rDmin_0
126
127      ztmp  = 1._wp/rz0_w_0
128      zrlog = LOG(zhf*ztmp) / LOG(pzu*ztmp)
129
130      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
131
132            zfri = pfrice(ji,jj)
133
134            CdN_f_LU12_eq36(:,:) = 0.5_wp* 0.3_wp * zrlog*zrlog * zhf/zDi  * (1._wp - zfri)**rBeta_0 ! Eq.(35) & (36)
135            !!                        1/2      Ce
136      END_2D
137   END FUNCTION CdN_f_LU12_eq36
138
139
140
141
142   FUNCTION CdN10_f_LU13( pfrice )
143      !!----------------------------------------------------------------------
144      !!                      ***  ROUTINE  CdN10_f_LU13  ***
145      !!
146      !! ** Purpose :    Computes the "form" contribution of the neutral air-ice
147      !!                 drag referenced at 10m to make it dependent on edges at
148      !!                 leads, melt ponds and flows (to be added to the "skin"
149      !!                 contribution. After some
150      !!                 approximations, this can be resumed to a dependency on
151      !!                 ice concentration.
152      !!
153      !! ** Method :     The parameterization is taken from Lupkes et al. (2012) eq.(50)
154      !!                 with the highest level of approximation: level4, eq.(59)
155      !!                 The generic drag over a cell partly covered by ice can be re-written as follows:
156      !!
157      !!                 Cd = Cdw * (1-A) + Cdi * A + Ce * (1-A)**(nu+1/(10*beta)) * A**mu
158      !!
159      !!                    Ce = 2.23e-3       , as suggested by Lupkes (eq. 59)
160      !!                    nu = mu = beta = 1 , as suggested by Lupkes (eq. 59)
161      !!                    A is the concentration of ice minus melt ponds (if any)
162      !!
163      !!                 This new drag has a parabolic shape (as a function of A) starting at
164      !!                 Cdw(say 1.5e-3) for A=0, reaching 1.97e-3 for A~0.5
165      !!                 and going down to Cdi(say 1.4e-3) for A=1
166      !!
167      !!                 It is theoretically applicable to all ice conditions (not only MIZ)
168      !!                 => see Lupkes et al (2013)
169      !!
170      !! ** References : Lupkes et al. JGR 2012 (theory)
171      !!                 Lupkes et al. GRL 2013 (application to GCM)
172      !!
173      !!----------------------------------------------------------------------
174      REAL(wp), DIMENSION(jpi,jpj)              :: CdN10_f_LU13  ! neutral FORM drag coefficient contribution over sea-ice
175      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pfrice           ! ice concentration [fraction]  => at_i_b
176
177      !!----------------------------------------------------------------------
178      REAL(wp)            ::   zcoef
179      !!----------------------------------------------------------------------
180      zcoef = rNu_0 + 1._wp / ( 10._wp * rBeta_0 )
181
182      !! We are not an AGCM, we are an OGCM!!! => we drop term "(1 - A)*Cd_w"
183      !!  => so we keep only the last rhs terms of Eq.(1) of Lupkes et al, 2013 that we divide by "A":
184      !! (we multiply Cd_i_s and Cd_i_f by A later, when applying ocean-ice partitioning...
185
186      CdN10_f_LU13(:,:) = rCe_0 * pfrice(:,:)**(rMu_0 - 1._wp) * (1._wp - pfrice(:,:))**zcoef
187      !! => seems okay for winter 100% sea-ice as second rhs term vanishes as pfrice == 1....
188
189   END FUNCTION CdN10_f_LU13
190
191
192   FUNCTION CdN_f_LG15( pzu, pfrice, pz0i,  pSc, phf, pDi  )
193      !!----------------------------------------------------------------------
194      !!                      ***  ROUTINE  CdN_f_LG15  ***
195      !!
196      !!        GENERAL FORM OF EQUATION 21 of Lupkes & Gryanik (2015)
197      !!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
198      !!
199      !! ** Purpose :    Computes the "form" contribution of the neutral air-ice
200      !!                 drag referenced at 10m to make it dependent on edges at
201      !!                 leads, melt ponds and flows (to be added to the "skin"
202      !!                 contribution. After some
203      !!                 approximations, this can be resumed to a dependency on
204      !!                 ice concentration.
205      !!
206      !! ** References : Lupkes & Gryanik (2015)
207      !!
208      !!----------------------------------------------------------------------
209      REAL(wp), DIMENSION(jpi,jpj)                       :: CdN_f_LG15  ! neutral FORM drag coefficient contribution over sea-ice
210      REAL(wp),                     INTENT(in )          :: pzu    ! reference height                       [m]
211      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           :: pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc, phf and pDi all provided...
212      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           :: pz0i   ! roughness length over ICE  [m] (in LU12, it's over water ???)
213      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc    ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
214      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf    ! mean freeboard of floes    [m]
215      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m]
216      !!----------------------------------------------------------------------
217      LOGICAL :: l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
218      REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi
219      INTEGER  :: ji, jj
220      !!----------------------------------------------------------------------
221      l_known_Sc    = PRESENT(pSc)
222      l_known_hf    = PRESENT(phf)
223      l_known_Di    = PRESENT(pDi)
224
225      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
226
227            zfri = pfrice(ji,jj)
228            zfrw = (1._wp - zfri)
229
230            IF(l_known_Sc) THEN
231               zSc = pSc(ji,jj)
232            ELSE
233               !! Sc parameterized in terms of A (ice fraction):
234               zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 ))   ! Eq.(31)
235            END IF
236
237            IF(l_known_hf) THEN
238               zhf = phf(ji,jj)
239            ELSE
240               !! hf parameterized in terms of A (ice fraction):
241               zhf = rhmax_0*zfri + rhmin_0*zfrw  ! Eq.(25)
242            END IF
243
244            IF(l_known_Di) THEN
245               zDi = pDi(ji,jj)
246            ELSE
247               !! Di parameterized in terms of A (ice fraction):
248               ztmp = 1._wp / ( 1._wp - (rDmin_0/rDmax_0)**(1._wp/rBeta_0) )   ! A* Eq.(27)
249               zDi =  rDmin_0 * ( ztmp/(ztmp - zfri) )**rBeta_0                !    Eq.(26)
250            END IF
251
252            ztmp  = 1._wp/pz0i(ji,jj)
253            zrlog = LOG(zhf*ztmp/2.718_wp) / LOG(pzu*ztmp)  !LOLO: adding number "e" !!!
254
255            CdN_f_LG15(:,:) = 0.5_wp* 0.4_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri  ! Eq.(21) Lukes & Gryanik (2015)
256            !!                   1/2      Ce
257
258      END_2D
259   END FUNCTION CdN_f_LG15
260
261
262
263   FUNCTION CdN_f_LG15_light( pzu, pfrice, pz0w )
264      !!----------------------------------------------------------------------
265      !!                      ***  ROUTINE  CdN_f_LG15_light  ***
266      !!
267      !! ** Purpose :    Computes the "form" contribution of the neutral air-ice
268      !!                 drag referenced at 10m to make it dependent on edges at
269      !!                 leads, melt ponds and flows (to be added to the "skin"
270      !!                 contribution. After some
271      !!                 approximations, this can be resumed to a dependency on
272      !!                 ice concentration.
273      !!
274      !! ** References : Lupkes & Gryanik (2015)
275      !!
276      !!----------------------------------------------------------------------
277      REAL(wp), DIMENSION(jpi,jpj)             :: CdN_f_LG15_light  ! neutral FORM drag coefficient contribution over sea-ice
278      REAL(wp),                     INTENT(in) :: pzu    ! reference height [m]
279      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction]  => at_i_b
280      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0w   ! roughness length over water  [m]
281      !!----------------------------------------------------------------------
282      REAL(wp) :: ztmp, zrlog, zfri
283      INTEGER  :: ji, jj
284      !!----------------------------------------------------------------------
285      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
286
287            zfri = pfrice(ji,jj)
288
289            ztmp = 1._wp / pz0w(ji,jj)
290            zrlog = LOG( 10._wp * ztmp ) / LOG( pzu * ztmp ) ! part of (Eq.46)
291
292            CdN_f_LG15_light(:,:) = rce10_i_0 *zrlog*zrlog * zfri * (1._wp - zfri)**rbeta_0  ! (Eq.46)  [ index 1 is for ice, 2 for water ]
293
294      END_2D
295   END FUNCTION CdN_f_LG15_light
296
297
298
299   !!======================================================================
300END MODULE sbcblk_algo_ice_cdn
Note: See TracBrowser for help on using the repository browser.