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.
Changeset 15079 – NEMO

Changeset 15079


Ignore:
Timestamp:
2021-07-05T12:59:50+02:00 (3 years ago)
Author:
clem
Message:

trunk was not repro with variable air-ice bulk transfer coefficients (ln_Cx_ice_LU12 & ln_Cx_ice_LG15)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/SBC/sbcblk_algo_ice_cdn.F90

    r14072 r15079  
    3535   !!============================================================ 
    3636   REAL(wp), PARAMETER ::   rce10_i_0 = 3.46e-3_wp ! (Eq.48) MIZ 
    37  
    3837   REAL(wp), PARAMETER ::   ralpha_0  = 0.2_wp     ! (Eq.12) (ECHAM6 value) 
    3938 
     
    6160      !! 
    6261      !!---------------------------------------------------------------------- 
    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 
     62      REAL(wp), DIMENSION(jpi,jpj)                       ::   CdN10_f_LU12  ! neutral FORM drag coefficient contribution over sea-ice 
     63      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc, phf and pDi all provided... 
     64      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pz0w   ! roughness length over water  [m] 
     65      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pSc    ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances) 
     66      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m] 
     67      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m] 
     68      !!---------------------------------------------------------------------- 
     69      LOGICAL  ::  l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE. 
     70      REAL(wp) ::   ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi 
     71      INTEGER  ::   ji, jj 
    7372      !!---------------------------------------------------------------------- 
    7473      l_known_Sc    = PRESENT(pSc) 
     
    7877      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    7978             
    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 
     79         zfri = pfrice(ji,jj) 
     80         zfrw = (1._wp - zfri) 
     81          
     82         IF(l_known_Sc) THEN 
     83            zSc = pSc(ji,jj) 
     84         ELSE 
     85            !! Sc parameterized in terms of A (ice fraction): 
     86            zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 ))   ! Eq.(31) 
     87         END IF 
     88          
     89         IF(l_known_hf) THEN 
     90            zhf = phf(ji,jj) 
     91         ELSE 
     92            !! hf parameterized in terms of A (ice fraction): 
     93            zhf = rhmax_0*zfri + rhmin_0*zfrw  ! Eq.(25) 
     94         END IF 
     95          
     96         IF(l_known_Di) THEN 
     97            zDi = pDi(ji,jj) 
     98         ELSE 
     99            !! Di parameterized in terms of A (ice fraction): 
     100            ztmp = 1._wp / ( 1._wp - (rDmin_0/rDmax_0)**(1._wp/rBeta_0) )   ! A* Eq.(27) 
     101            zDi =  rDmin_0 * ( ztmp/(ztmp - zfri) )**rBeta_0                !    Eq.(26) 
     102         END IF 
     103          
     104         ztmp  = 1._wp/pz0w(ji,jj) 
     105         zrlog = LOG(zhf*ztmp) / LOG(10._wp*ztmp) 
     106 
     107         CdN10_f_LU12(ji,jj) = 0.5_wp* 0.3_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri  ! Eq.(22) 
     108         !!                    1/2      Ce 
    110109 
    111110      END_2D 
     
    114113    
    115114   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... 
     115      !!---------------------------------------------------------------------- 
     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... 
    119119      !!---------------------------------------------------------------------- 
    120120      REAL(wp) :: ztmp, zrlog, zfri, zhf, zDi 
     
    129129 
    130130      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 
     131         zfri = pfrice(ji,jj) 
     132         CdN_f_LU12_eq36(ji,jj) = 0.5_wp* 0.3_wp * zrlog*zrlog * zhf/zDi  * (1._wp - zfri)**rBeta_0 ! Eq.(35) & (36) 
     133         !!                       1/2      Ce 
    136134      END_2D 
    137135   END FUNCTION CdN_f_LU12_eq36 
    138  
    139  
    140136 
    141137 
     
    172168      !! 
    173169      !!---------------------------------------------------------------------- 
    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 
     170      REAL(wp), DIMENSION(jpi,jpj)              ::   CdN10_f_LU13  ! neutral FORM drag coefficient contribution over sea-ice 
     171      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  ::   pfrice           ! ice concentration [fraction]  => at_i_b 
     172      !!---------------------------------------------------------------------- 
     173      INTEGER  ::   ji, jj 
     174      REAL(wp) ::   zcoef 
    179175      !!---------------------------------------------------------------------- 
    180176      zcoef = rNu_0 + 1._wp / ( 10._wp * rBeta_0 ) 
     
    183179      !!  => so we keep only the last rhs terms of Eq.(1) of Lupkes et al, 2013 that we divide by "A": 
    184180      !! (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 
     181      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     182         CdN10_f_LU13(ji,jj) = rCe_0 * pfrice(ji,jj)**(rMu_0 - 1._wp) * (1._wp - pfrice(ji,jj))**zcoef 
     183      END_2D 
    187184      !! => seems okay for winter 100% sea-ice as second rhs term vanishes as pfrice == 1.... 
    188185 
     
    207204      !! 
    208205      !!---------------------------------------------------------------------- 
    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 
     206      REAL(wp), DIMENSION(jpi,jpj)                       ::   CdN_f_LG15  ! neutral FORM drag coefficient contribution over sea-ice 
     207      REAL(wp),                     INTENT(in )          ::   pzu    ! reference height                       [m] 
     208      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pfrice ! ice concentration [fraction]  => at_i_b  ! NOT USED if pSc, phf and pDi all provided... 
     209      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)           ::   pz0i   ! roughness length over ICE  [m] (in LU12, it's over water ???) 
     210      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pSc    ! shletering function [0-1] (Sc->1 for large distance between floes, ->0 for small distances) 
     211      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   phf    ! mean freeboard of floes    [m] 
     212      REAL(wp), DIMENSION(jpi,jpj), INTENT(in), OPTIONAL ::   pDi    ! cross wind dimension of the floe (aka effective edge length for form drag)   [m] 
     213      !!---------------------------------------------------------------------- 
     214      LOGICAL  ::  l_known_Sc=.FALSE., l_known_hf=.FALSE., l_known_Di=.FALSE. 
     215      REAL(wp) ::   ztmp, zrlog, zfri, zfrw, zSc, zhf, zDi 
     216      INTEGER  ::   ji, jj 
    220217      !!---------------------------------------------------------------------- 
    221218      l_known_Sc    = PRESENT(pSc) 
     
    225222      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    226223 
    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  
     224         zfri = pfrice(ji,jj) 
     225         zfrw = (1._wp - zfri) 
     226          
     227         IF(l_known_Sc) THEN 
     228            zSc = pSc(ji,jj) 
     229         ELSE 
     230            !! Sc parameterized in terms of A (ice fraction): 
     231            zSc = zfrw**(1._wp / ( 10._wp * rBeta_0 ))   ! Eq.(31) 
     232         END IF 
     233          
     234         IF(l_known_hf) THEN 
     235            zhf = phf(ji,jj) 
     236         ELSE 
     237            !! hf parameterized in terms of A (ice fraction): 
     238            zhf = rhmax_0*zfri + rhmin_0*zfrw  ! Eq.(25) 
     239         END IF 
     240          
     241         IF(l_known_Di) THEN 
     242            zDi = pDi(ji,jj) 
     243         ELSE 
     244            !! Di parameterized in terms of A (ice fraction): 
     245            ztmp = 1._wp / ( 1._wp - (rDmin_0/rDmax_0)**(1._wp/rBeta_0) )   ! A* Eq.(27) 
     246            zDi =  rDmin_0 * ( ztmp/(ztmp - zfri) )**rBeta_0                !    Eq.(26) 
     247         END IF 
     248          
     249         ztmp  = 1._wp/pz0i(ji,jj) 
     250         zrlog = LOG(zhf*ztmp/2.718_wp) / LOG(pzu*ztmp)  !LOLO: adding number "e" !!! 
     251          
     252         CdN_f_LG15(ji,jj) = 0.5_wp* 0.4_wp * zrlog*zrlog * zSc*zSc * zhf/zDi * zfri  ! Eq.(21) Lukes & Gryanik (2015) 
     253         !!                   1/2      Ce 
     254          
    258255      END_2D 
    259256   END FUNCTION CdN_f_LG15 
    260257 
    261258 
    262  
    263259   FUNCTION CdN_f_LG15_light( pzu, pfrice, pz0w ) 
    264260      !!---------------------------------------------------------------------- 
     
    275271      !! 
    276272      !!---------------------------------------------------------------------- 
    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 ] 
     273      REAL(wp), DIMENSION(jpi,jpj)             ::   CdN_f_LG15_light  ! neutral FORM drag coefficient contribution over sea-ice 
     274      REAL(wp),                     INTENT(in) ::   pzu    ! reference height [m] 
     275      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pfrice ! ice concentration [fraction]  => at_i_b 
     276      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pz0w   ! roughness length over water  [m] 
     277      !!---------------------------------------------------------------------- 
     278      REAL(wp) ::   ztmp, zrlog, zfri 
     279      INTEGER  ::   ji, jj 
     280      !!---------------------------------------------------------------------- 
     281      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     282 
     283         zfri = pfrice(ji,jj) 
     284          
     285         ztmp = 1._wp / pz0w(ji,jj) 
     286         zrlog = LOG( 10._wp * ztmp ) / LOG( pzu * ztmp ) ! part of (Eq.46) 
     287          
     288         CdN_f_LG15_light(ji,jj) = rce10_i_0 *zrlog*zrlog * zfri * (1._wp - zfri)**rbeta_0  ! (Eq.46)  [ index 1 is for ice, 2 for water ] 
    293289 
    294290      END_2D 
    295291   END FUNCTION CdN_f_LG15_light 
    296  
    297292 
    298293 
Note: See TracChangeset for help on using the changeset viewer.