Skip to content
Snippets Groups Projects
Commit 67b34bb7 authored by Guillaume Samson's avatar Guillaume Samson :snowman2:
Browse files

Merge branch '48-bug-in-lupkes-sea-ice-transfert-coefficients-formula' into 'main'

Resolve "bug in Lupkes sea-ice transfert coefficients formula"

Closes #48

See merge request nemo/nemo!82

(cherry picked from commit 127cef6c)

4a5e44f8 correct Sc (already squared) variable in Lupkes formulas
parent 6c34c55d
No related branches found
No related tags found
No related merge requests found
...@@ -42,7 +42,7 @@ MODULE sbcblk_algo_ice_cdn ...@@ -42,7 +42,7 @@ MODULE sbcblk_algo_ice_cdn
CONTAINS CONTAINS
FUNCTION CdN10_f_LU12( pfrice, pz0w, pSc, phf, pDi ) FUNCTION CdN10_f_LU12( pfrice, pz0w, pSc2, phf, pDi )
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
!! *** ROUTINE CdN10_f_LU12 *** !! *** ROUTINE CdN10_f_LU12 ***
!! !!
...@@ -60,17 +60,17 @@ CONTAINS ...@@ -60,17 +60,17 @@ CONTAINS
!! !!
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
REAL(wp), DIMENSION(jpi,jpj) :: CdN10_f_LU12 ! neutral FORM drag coefficient contribution over sea-ice REAL(wp), DIMENSION(jpi,jpj) :: CdN10_f_LU12 ! neutral FORM drag coefficient contribution over sea-ice
REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc, phf and pDi all provided... REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc2, phf and pDi all provided...
REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0w ! roughness length over water [m] REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0w ! roughness length over water [m]
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances) REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc2 ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf ! mean freeboard of floes [m] REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf ! mean freeboard of floes [m]
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi ! cross wind dimension of the floe (aka effective edge length for form drag) [m] REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi ! cross wind dimension of the floe (aka effective edge length for form drag) [m]
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
LOGICAL :: l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE. LOGICAL :: l_known_Sc2=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc2, zhf, zDi
INTEGER :: ji, jj INTEGER :: ji, jj
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
l_known_Sc = PRESENT(pSc) l_known_Sc2 = PRESENT(pSc2)
l_known_hf = PRESENT(phf) l_known_hf = PRESENT(phf)
l_known_Di = PRESENT(pDi) l_known_Di = PRESENT(pDi)
...@@ -79,11 +79,11 @@ CONTAINS ...@@ -79,11 +79,11 @@ CONTAINS
zfri = pfrice(ji,jj) zfri = pfrice(ji,jj)
zfrw = (1._wp - zfri) zfrw = (1._wp - zfri)
IF(l_known_Sc) THEN IF(l_known_Sc2) THEN
zSc = pSc(ji,jj) zSc2 = pSc2(ji,jj)
ELSE ELSE
!! Sc parameterized in terms of A (ice fraction): !! Sc**2 parameterized in terms of A (ice fraction):
zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 )) ! Eq.(31) zSc2 = zfrw**(1._wp / ( 10._wp * rBeta_0 )) ! Eq.(31)
END IF END IF
IF(l_known_hf) THEN IF(l_known_hf) THEN
...@@ -104,7 +104,7 @@ CONTAINS ...@@ -104,7 +104,7 @@ CONTAINS
ztmp = 1._wp/pz0w(ji,jj) ztmp = 1._wp/pz0w(ji,jj)
zrlog = LOG(zhf*ztmp) / LOG(10._wp*ztmp) zrlog = LOG(zhf*ztmp) / LOG(10._wp*ztmp)
CdN10_f_LU12(ji,jj) = 0.5_wp* 0.3_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri ! Eq.(22) CdN10_f_LU12(ji,jj) = 0.5_wp* 0.3_wp * zrlog*zrlog * zSc2 * zhf/zDi * zfri ! Eq.(22)
!! 1/2 Ce !! 1/2 Ce
END_2D END_2D
...@@ -115,7 +115,7 @@ CONTAINS ...@@ -115,7 +115,7 @@ CONTAINS
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
REAL(wp), DIMENSION(jpi,jpj) :: CdN_f_LU12_eq36 ! neutral FORM drag coefficient contribution over sea-ice REAL(wp), DIMENSION(jpi,jpj) :: CdN_f_LU12_eq36 ! neutral FORM drag coefficient contribution over sea-ice
REAL(wp), INTENT(in) :: pzu ! reference height [m] REAL(wp), INTENT(in) :: pzu ! reference height [m]
REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc, phf and pDi all provided... REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc2, phf and pDi all provided...
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
REAL(wp) :: ztmp, zrlog, zfri, zhf, zDi REAL(wp) :: ztmp, zrlog, zfri, zhf, zDi
INTEGER :: ji, jj INTEGER :: ji, jj
...@@ -186,7 +186,7 @@ CONTAINS ...@@ -186,7 +186,7 @@ CONTAINS
END FUNCTION CdN10_f_LU13 END FUNCTION CdN10_f_LU13
FUNCTION CdN_f_LG15( pzu, pfrice, pz0i, pSc, phf, pDi ) FUNCTION CdN_f_LG15( pzu, pfrice, pz0i, pSc2, phf, pDi )
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
!! *** ROUTINE CdN_f_LG15 *** !! *** ROUTINE CdN_f_LG15 ***
!! !!
...@@ -205,17 +205,17 @@ CONTAINS ...@@ -205,17 +205,17 @@ CONTAINS
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
REAL(wp), DIMENSION(jpi,jpj) :: CdN_f_LG15 ! neutral FORM drag coefficient contribution over sea-ice REAL(wp), DIMENSION(jpi,jpj) :: CdN_f_LG15 ! neutral FORM drag coefficient contribution over sea-ice
REAL(wp), INTENT(in ) :: pzu ! reference height [m] REAL(wp), INTENT(in ) :: pzu ! reference height [m]
REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc, phf and pDi all provided... REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pfrice ! ice concentration [fraction] => at_i_b ! NOT USED if pSc2, phf and pDi all provided...
REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0i ! roughness length over ICE [m] (in LU12, it's over water ???) REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0i ! roughness length over ICE [m] (in LU12, it's over water ???)
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances) REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pSc2 ! squared shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances)
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf ! mean freeboard of floes [m] REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: phf ! mean freeboard of floes [m]
REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi ! cross wind dimension of the floe (aka effective edge length for form drag) [m] REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL :: pDi ! cross wind dimension of the floe (aka effective edge length for form drag) [m]
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
LOGICAL :: l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE. LOGICAL :: l_known_Sc2=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE.
REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi REAL(wp) :: ztmp, zrlog, zfri, zfrw, zSc2, zhf, zDi
INTEGER :: ji, jj INTEGER :: ji, jj
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
l_known_Sc = PRESENT(pSc) l_known_Sc2 = PRESENT(pSc2)
l_known_hf = PRESENT(phf) l_known_hf = PRESENT(phf)
l_known_Di = PRESENT(pDi) l_known_Di = PRESENT(pDi)
...@@ -224,11 +224,11 @@ CONTAINS ...@@ -224,11 +224,11 @@ CONTAINS
zfri = pfrice(ji,jj) zfri = pfrice(ji,jj)
zfrw = (1._wp - zfri) zfrw = (1._wp - zfri)
IF(l_known_Sc) THEN IF(l_known_Sc2) THEN
zSc = pSc(ji,jj) zSc2 = pSc2(ji,jj)
ELSE ELSE
!! Sc parameterized in terms of A (ice fraction): !! Sc**2 parameterized in terms of A (ice fraction):
zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 )) ! Eq.(31) zSc2 = zfrw**(1._wp / ( 10._wp * rBeta_0 )) ! Eq.(31)
END IF END IF
IF(l_known_hf) THEN IF(l_known_hf) THEN
...@@ -249,7 +249,7 @@ CONTAINS ...@@ -249,7 +249,7 @@ CONTAINS
ztmp = 1._wp/pz0i(ji,jj) ztmp = 1._wp/pz0i(ji,jj)
zrlog = LOG(zhf*ztmp/2.718_wp) / LOG(pzu*ztmp) !LOLO: adding number "e" !!! zrlog = LOG(zhf*ztmp/2.718_wp) / LOG(pzu*ztmp) !LOLO: adding number "e" !!!
CdN_f_LG15(ji,jj) = 0.5_wp* 0.4_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri ! Eq.(21) Lukes & Gryanik (2015) CdN_f_LG15(ji,jj) = 0.5_wp* 0.4_wp * zrlog*zrlog * zSc2 * zhf/zDi * zfri ! Eq.(21) Lukes & Gryanik (2015)
!! 1/2 Ce !! 1/2 Ce
END_2D END_2D
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment