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 8233 for branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO – NEMO

Ignore:
Timestamp:
2017-06-28T14:33:07+02:00 (7 years ago)
Author:
clem
Message:

merge with dev_r6859_LIM3_meltponds@r8179

Location:
branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO
Files:
15 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/ice.F90

    r7813 r8233  
    273273   REAL(wp), PUBLIC ::   rn_por_rdg       !: initial porosity of ridges (0.3 regular value) 
    274274   REAL(wp), PUBLIC ::   rn_fsnowrdg      !: fractional snow loss to the ocean during ridging 
     275   REAL(wp), PUBLIC ::   rn_fpondrdg      !: fractional melt pond loss to the ocean during ridging 
    275276   LOGICAL , PUBLIC ::   ln_rafting       !: rafting of ice or not                         
    276277   REAL(wp), PUBLIC ::   rn_hraft         !: threshold thickness (m) for rafting / ridging  
    277278   REAL(wp), PUBLIC ::   rn_craft         !: coefficient for smoothness of the hyperbolic tangent in rafting 
    278279   REAL(wp), PUBLIC ::   rn_fsnowrft      !: fractional snow loss to the ocean during ridging 
     280   REAL(wp), PUBLIC ::   rn_fpondrft      !: fractional snow loss to the ocean during rafting 
     281 
     282   ! MV MP 2016 
     283   !                                     !!** melt pond namelist (namicemp) 
     284   LOGICAL , PUBLIC ::   ln_pnd           !: activate ponds or not 
     285   LOGICAL , PUBLIC ::   ln_pnd_rad       !: ponds radiatively active or not 
     286   LOGICAL , PUBLIC ::   ln_pnd_fw        !: ponds active wrt meltwater or not 
     287   INTEGER , PUBLIC ::   nn_pnd_scheme    !: type of melt pond scheme:   =0 prescribed, =1 empirical, =2 topographic 
     288   REAL(wp), PUBLIC ::   rn_apnd          !: prescribed pond fraction (0<rn_apnd<1), only if nn_pnd_scheme = 0 
     289   REAL(wp), PUBLIC ::   rn_hpnd          !: prescribed pond depth    (0<rn_hpnd<1), only if nn_pnd_scheme = 0 
     290   ! END MV MP 2016 
    279291 
    280292   !                                     !!** some other parameters  
     
    311323 
    312324   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_snw     !: snow-ocean mass exchange   [kg.m-2.s-1] 
     325   ! MV MP 2016 
     326   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_snw_sum !: surface melt component of wfx_snw [kg.m-2.s-1] 
     327   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_pnd     !: melt pond-ocean mass exchange   [kg.m-2.s-1] 
     328   ! END MV MP 2016 
    313329   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_spr     !: snow precipitation on ice  [kg.m-2.s-1] 
    314330   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sub     !: snow/ice sublimation       [kg.m-2.s-1] 
     
    405421   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   s_i      !: ice salinities          [PSU] 
    406422 
     423   ! MV MP 2016 
     424   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_ip       !: melt pond fraction per grid cell area 
     425   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   v_ip       !: melt pond volume per grid cell area [m] 
     426   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   a_ip_frac  !: melt pond volume per ice area 
     427   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   h_ip       !: melt pond thickness [m] 
     428 
     429   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   at_ip      !: total melt pond fraction 
     430   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   vt_ip      !: total melt pond volume per unit area [m] 
     431   ! END MV MP 2016 
     432 
    407433   !!-------------------------------------------------------------------------- 
    408434   !! * Moments for advection 
     
    416442   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   sxage, syage, sxxage, syyage, sxyage   !: ice age 
    417443   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   sxe  , sye  , sxxe  , syye  , sxye     !: ice layers heat content 
     444   ! MV MP 2016 
     445   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   sxap , syap , sxxap , syyap , sxyap    !:  melt pond fraction 
     446   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   sxvp , syvp , sxxvp , syyvp , sxyvp    !:  melt pond volume 
     447   ! END MV MP 2016 
    418448 
    419449   !!-------------------------------------------------------------------------- 
     
    479509      ALLOCATE( t_bo   (jpi,jpj) , frld   (jpi,jpj) , pfrld  (jpi,jpj) , phicif (jpi,jpj) ,     & 
    480510         &      wfx_snw(jpi,jpj) , wfx_ice(jpi,jpj) , wfx_sub(jpi,jpj) , wfx_lam(jpi,jpj) ,     & 
     511         ! MV MP 2016 
     512         &      wfx_pnd(jpi,jpj) , wfx_snw_sum(jpi,jpj) ,                                       & 
     513         ! END MV MP 2016 
    481514         &      wfx_bog(jpi,jpj) , wfx_dyn(jpi,jpj) , wfx_bom(jpi,jpj) , wfx_sum(jpi,jpj) ,     & 
    482515         &      wfx_res(jpi,jpj) , wfx_sni(jpi,jpj) , wfx_opw(jpi,jpj) , wfx_spr(jpi,jpj) ,     & 
     
    509542      ALLOCATE( t_i(jpi,jpj,nlay_i,jpl) , e_i(jpi,jpj,nlay_i,jpl) , s_i(jpi,jpj,nlay_i,jpl) , STAT=ierr(ii) ) 
    510543 
     544      ! MV MP 2016 
     545      ii = ii + 1 
     546      ALLOCATE( a_ip(jpi,jpj,jpl) , v_ip(jpi,jpj,jpl) , a_ip_frac(jpi,jpj,jpl) , & 
     547         &      h_ip(jpi,jpj,jpl) , STAT = ierr(ii) ) 
     548      ii = ii + 1 
     549      ALLOCATE( at_ip(jpi,jpj) , vt_ip(jpi,jpj) , STAT = ierr(ii) ) 
     550      ! END MV MP 2016 
     551 
    511552      ! * Moments for advection 
    512553      ii = ii + 1 
     
    526567         &      syye(jpi,jpj,nlay_i,jpl) , sxye(jpi,jpj,nlay_i,jpl)                            , STAT=ierr(ii) ) 
    527568 
     569      ! MV MP 2016 
     570      ALLOCATE( sxap(jpi,jpj,jpl) , syap(jpi,jpj,jpl) , sxxap(jpi,jpj,jpl) , syyap(jpi,jpj,jpl) , sxyap(jpi,jpj,jpl) ,   & 
     571         &      sxvp(jpi,jpj,jpl) , syvp(jpi,jpj,jpl) , sxxvp(jpi,jpj,jpl) , syyvp(jpi,jpj,jpl) , sxyvp(jpi,jpj,jpl) ,   & 
     572         &      STAT = ierr(ii) ) 
     573      ! END MV MP 2016 
     574 
    528575      ! * Old values of global variables 
    529576      ii = ii + 1 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r7761 r8233  
    7878      !!   4.0  !  09-11  (M. Vancoppenolle)   Enhanced version for ice cats 
    7979      !!-------------------------------------------------------------------- 
    80       INTEGER  :: ji, jj, jk, jl   ! dummy loop indices 
    81       REAL(wp) :: ztmelts, zdh 
    82       INTEGER  :: i_hemis, i_fill, jl0   
    83       REAL(wp)   :: zarg, zV, zconv, zdv  
     80      !! * Local variables 
     81      INTEGER    :: ji, jj, jk, jl             ! dummy loop indices 
     82      REAL(wp)   :: ztmelts, zdh 
     83      INTEGER    :: i_hemis, i_fill, jl0 
     84      REAL(wp)   :: zarg, zV, zconv, zdv 
    8485      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator 
    8586      REAL(wp), POINTER, DIMENSION(:,:)   :: zht_i_ini, zat_i_ini, zvt_i_ini            !data from namelist or nc file 
     
    372373         tn_ice (:,:,:) = t_su (:,:,:) 
    373374 
     375         ! MV MP 2016 
     376         ! Melt pond volume and fraction 
     377         IF ( ln_pnd ) THEN 
     378 
     379            DO jl = 1, jpl 
     380 
     381               a_ip_frac(:,:,jl) = 0.2 *  zswitch(:,:) 
     382               h_ip     (:,:,jl) = 0.05 * zswitch(:,:) 
     383               a_ip(:,:,jl)      = a_ip_frac(:,:,jl) * a_i (:,:,jl)  
     384               v_ip(:,:,jl)      = h_ip     (:,:,jl) * a_ip(:,:,jl) 
     385 
     386            END DO 
     387 
     388         ELSE 
     389 
     390            a_ip(:,:,:)      = 0._wp 
     391            v_ip(:,:,:)      = 0._wp 
     392            a_ip_frac(:,:,:) = 0._wp 
     393            h_ip     (:,:,:) = 0._wp 
     394 
     395         ENDIF 
     396         ! END MV MP 2016 
     397 
    374398      ELSE ! if ln_limini=false 
    375399         a_i  (:,:,:) = 0._wp 
     
    395419         END DO 
    396420 
     421         a_ip(:,:,:)      = 0._wp 
     422         v_ip(:,:,:)      = 0._wp 
     423         a_ip_frac(:,:,:) = 0._wp 
     424         h_ip     (:,:,:) = 0._wp 
     425 
    397426      ENDIF ! ln_limini 
    398427       
     
    401430         at_i (:,:) = at_i (:,:) + a_i (:,:,jl) 
    402431      END DO 
    403       ! 
     432 
    404433      !-------------------------------------------------------------------- 
    405434      ! 4) Global ice variables for output diagnostics                    |  
     
    458487      u_ice_b(:,:)     = u_ice(:,:) 
    459488      v_ice_b(:,:)     = v_ice(:,:) 
     489 
     490      ! MV MP 2016 
     491      IF ( nn_pnd_scheme > 0 ) THEN 
     492         sxap  (:,:,:) = 0._wp    ; sxvp  (:,:,:) = 0._wp  
     493         syap  (:,:,:) = 0._wp    ; syvp  (:,:,:) = 0._wp  
     494         sxxap (:,:,:) = 0._wp    ; sxxvp (:,:,:) = 0._wp  
     495         syyap (:,:,:) = 0._wp    ; syyvp (:,:,:) = 0._wp  
     496         sxyap (:,:,:) = 0._wp    ; sxyvp (:,:,:) = 0._wp 
     497      ENDIF 
     498      ! END MV MP 2016 
    460499 
    461500!!!clem 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limitd_me.F90

    r7753 r8233  
    507507      REAL(wp), POINTER, DIMENSION(:) ::   ardg1 , ardg2    ! area of ice ridged & new ridges 
    508508      REAL(wp), POINTER, DIMENSION(:) ::   vsrdg , esrdg    ! snow volume & energy of ridging ice 
     509      ! MV MP 2016 
     510      REAL(wp), POINTER, DIMENSION(:) ::   vprdg            ! pond volume of ridging ice 
     511      REAL(wp), POINTER, DIMENSION(:) ::   aprdg1           ! pond area of ridging ice 
     512      REAL(wp), POINTER, DIMENSION(:) ::   aprdg2           ! pond area of ridging ice 
     513      ! END MV MP 2016 
    509514      REAL(wp), POINTER, DIMENSION(:) ::   dhr   , dhr2     ! hrmax - hrmin  &  hrmax^2 - hrmin^2 
    510515 
     
    520525      REAL(wp), POINTER, DIMENSION(:) ::   arft1 , arft2    ! area of ice rafted and new rafted zone 
    521526      REAL(wp), POINTER, DIMENSION(:) ::   virft , vsrft    ! ice & snow volume of rafting ice 
     527      ! MV MP 2016 
     528      REAL(wp), POINTER, DIMENSION(:) ::   vprft            ! pond volume of rafting ice 
     529      REAL(wp), POINTER, DIMENSION(:) ::   aprft1           ! pond area of rafted ice 
     530      REAL(wp), POINTER, DIMENSION(:) ::   aprft2           ! pond area of new rafted ice 
     531      ! END MV MP 2016 
    522532      REAL(wp), POINTER, DIMENSION(:) ::   esrft , smrft    ! snow energy & salinity of rafting ice 
    523533      REAL(wp), POINTER, DIMENSION(:) ::   oirft1, oirft2   ! ice age of ice rafted 
     
    531541      CALL wrk_alloc( jpij,        indxi, indxj ) 
    532542      CALL wrk_alloc( jpij,        zswitch, fvol ) 
    533       CALL wrk_alloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     543      ! MV MP 2016 
     544      !CALL wrk_alloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     545      CALL wrk_alloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, vprdg, aprdg1, aprdg2, dhr, dhr2 ) 
     546      ! END MV MP 2016 
    534547      CALL wrk_alloc( jpij,        vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw, oirdg1, oirdg2 ) 
    535       CALL wrk_alloc( jpij,        afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     548      ! MV MP 2016 
     549      !CALL wrk_alloc( jpij,        afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     550      CALL wrk_alloc(  jpij,        afrft, arft1, arft2, virft, vsrft, esrft, aprft1, aprft2) 
     551      CALL wrk_alloc ( jpij,        vprft, smrft, oirft1, oirft2 ) 
     552      ! END MV MP 2016 
    536553      CALL wrk_alloc( jpij,nlay_i, eirft, erdg1, erdg2, ersw ) 
    537554 
     
    586603 
    587604            !-------------------------------------------------------------------------- 
    588             ! 3.4) Subtract area, volume, and energy from ridging  
     605            ! 3.4) Substract area, volume, and energy from ridging  
    589606            !     / rafting category n1. 
    590607            !-------------------------------------------------------------------------- 
     
    595612            vsrdg (ij) = v_s  (ji,jj,  jl1) * afrac(ij) 
    596613            esrdg (ij) = e_s  (ji,jj,1,jl1) * afrac(ij) 
     614            !MV MP 2016 
     615            IF ( nn_pnd_scheme > 0 ) THEN 
     616               aprdg1(ij) = a_ip(ji,jj, jl1) * afrac(ij) 
     617               aprdg2(ij) = a_ip(ji,jj, jl1) * afrac(ij) * krdg(ji,jj,jl1) 
     618               vprdg(ij)  = v_ip(ji,jj, jl1) * afrac(ij) 
     619            ENDIF 
     620            ! END MV MP 2016 
    597621            srdg1 (ij) = smv_i(ji,jj,  jl1) * afrac(ij) 
    598622            oirdg1(ij) = oa_i (ji,jj,  jl1) * afrac(ij) 
     
    602626            virft (ij) = v_i  (ji,jj,  jl1) * afrft(ij) 
    603627            vsrft (ij) = v_s  (ji,jj,  jl1) * afrft(ij) 
     628            !MV MP 2016 
     629            IF ( nn_pnd_scheme > 0 ) THEN 
     630               aprft1(ij) = a_ip (ji,jj,  jl1) * afrft(ij) 
     631               aprft2(ij) = a_ip (ji,jj,  jl1) * afrft(ij) * kraft 
     632               vprft(ij)  = v_ip(ji,jj,jl1)    * afrft(ij) 
     633            ENDIF 
     634            ! END MV MP 2016 
     635            srdg1 (ij) = smv_i(ji,jj,  jl1) * afrac(ij) 
    604636            esrft (ij) = e_s  (ji,jj,1,jl1) * afrft(ij) 
    605637            smrft (ij) = smv_i(ji,jj,  jl1) * afrft(ij)  
     
    637669               &                                - esrft(ij) * ( 1._wp - rn_fsnowrft ) ) * r1_rdtice        ! heat sink for ocean (<0, W.m-2) 
    638670 
     671            ! MV MP 2016 
     672            !------------------------------------------             
     673            ! 3.X Put the melt pond water in the ocean 
     674            !------------------------------------------             
     675            !  Place part of the melt pond volume into the ocean.  
     676            IF ( ( nn_pnd_scheme > 0 ) .AND. ln_pnd_fw ) THEN 
     677               wfx_pnd(ji,jj) = wfx_pnd(ji,jj) + ( rhofw * vprdg(ij) * ( 1._wp - rn_fpondrdg )   &  
     678               &                                 + rhofw * vprft(ij) * ( 1._wp - rn_fpondrft ) ) * r1_rdtice  ! fresh water source for ocean 
     679            ENDIF 
     680            ! END MV MP 2016 
     681 
    639682            !----------------------------------------------------------------- 
    640683            ! 3.8 Compute quantities used to apportion ice among categories 
     
    652695            smv_i(ji,jj,  jl1) = smv_i(ji,jj,  jl1) - srdg1 (ij) - smrft (ij) 
    653696            oa_i (ji,jj,  jl1) = oa_i (ji,jj,  jl1) - oirdg1(ij) - oirft1(ij) 
     697 
     698            ! MV MP 2016 
     699            IF ( nn_pnd_scheme > 0 ) THEN 
     700               v_ip (ji,jj,jl1) = v_ip (ji,jj,jl1) - vprdg (ij) - vprft (ij) 
     701               a_ip (ji,jj,jl1) = a_ip (ji,jj,jl1) - aprdg1(ij) - aprft1(ij) 
     702            ENDIF 
     703            ! END MV MP 2016 
    654704 
    655705         END DO 
     
    716766               e_s  (ji,jj,1,jl2) = e_s  (ji,jj,1,jl2) + ( esrdg (ij) * rn_fsnowrdg * fvol(ij)  +  & 
    717767                  &                                        esrft (ij) * rn_fsnowrft * zswitch(ij) ) 
     768               ! MV MP 2016 
     769               IF ( nn_pnd_scheme > 0 ) THEN 
     770                  v_ip (ji,jj,jl2) = v_ip (ji,jj,jl2)  + ( vprdg (ij) * rn_fpondrdg * fvol(ij)  +   & 
     771                                                       &   vprft (ij) * rn_fpondrft * zswitch(ij) ) 
     772                  a_ip (ji,jj,jl2) = a_ip(ji,jj,jl2)   + ( aprdg2(ij) * rn_fpondrdg * farea +       &  
     773                                                       &   aprft2(ij) * rn_fpondrft * zswitch(ji) ) 
     774               ENDIF 
     775               ! END MV MP 2016 
    718776 
    719777            END DO 
     
    734792      CALL wrk_dealloc( jpij,        indxi, indxj ) 
    735793      CALL wrk_dealloc( jpij,        zswitch, fvol ) 
    736       CALL wrk_dealloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     794      ! MV MP 2016 
     795      !CALL wrk_dealloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, dhr, dhr2 ) 
     796      CALL wrk_dealloc( jpij,        afrac, ardg1, ardg2, vsrdg, esrdg, vprdg, aprdg1, aprdg2,  dhr, dhr2 ) 
     797      ! END MV MP 2016 
    737798      CALL wrk_dealloc( jpij,        vrdg1, vrdg2, vsw  , srdg1, srdg2, smsw, oirdg1, oirdg2 ) 
    738       CALL wrk_dealloc( jpij,        afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     799      ! MV MP 2016 
     800      !CALL wrk_dealloc( jpij,        afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
     801      CALL wrk_dealloc( jpij,        afrft, arft1, arft2, virft, vsrft, esrft, aprft1, aprft2, vprft ) 
     802      CALL wrk_dealloc( jpij,        smrft, oirft1, oirft2 ) 
    739803      CALL wrk_dealloc( jpij,nlay_i, eirft, erdg1, erdg2, ersw ) 
    740804      ! 
     
    915979      INTEGER :: ios                 ! Local integer output status for namelist read 
    916980      NAMELIST/namiceitdme/ rn_cs, nn_partfun, rn_gstar, rn_astar,             &  
    917         &                   ln_ridging, rn_hstar, rn_por_rdg, rn_fsnowrdg, ln_rafting, rn_hraft, rn_craft, rn_fsnowrft 
     981        &                   ln_ridging, rn_hstar, rn_por_rdg, rn_fsnowrdg, rn_fpondrdg, &  
     982                            ln_rafting, rn_hraft, rn_craft,   rn_fsnowrft, rn_fpondrft 
    918983      !!------------------------------------------------------------------- 
    919984      ! 
     
    9391004         WRITE(numout,*)'   Initial porosity of ridges                              rn_por_rdg  = ', rn_por_rdg 
    9401005         WRITE(numout,*)'   Fraction of snow volume conserved during ridging        rn_fsnowrdg = ', rn_fsnowrdg  
     1006         WRITE(numout,*)'   Fraction of pond volume conserved during ridging        rn_fpondrdg = ', rn_fpondrdg  
    9411007         WRITE(numout,*)'   Rafting of ice sheets or not                            ln_rafting  = ', ln_rafting 
    9421008         WRITE(numout,*)'   Parmeter thickness (threshold between ridge-raft)       rn_hraft    = ', rn_hraft 
    9431009         WRITE(numout,*)'   Rafting hyperbolic tangent coefficient                  rn_craft    = ', rn_craft   
    9441010         WRITE(numout,*)'   Fraction of snow volume conserved during ridging        rn_fsnowrft = ', rn_fsnowrft  
     1011         WRITE(numout,*)'   Fraction of pond volume conserved during rafting        rn_fpondrft = ', rn_fpondrft  
    9451012      ENDIF 
    9461013      ! 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90

    r7753 r8233  
    357357         IF ( a_i(ii,ij,1) > epsi10 .AND. ht_i(ii,ij,1) < rn_himin ) THEN 
    358358            a_i (ii,ij,1) = a_i(ii,ij,1) * ht_i(ii,ij,1) / rn_himin  
     359            ! MV MP 2016 
     360            IF ( nn_pnd_scheme > 0 ) THEN 
     361               a_ip(ii,ij,1) = a_ip(ii,ij,1) * ht_i(ii,ij,1) / rn_himin 
     362            ENDIF 
     363            ! END MV MP 2016 
    359364            ht_i(ii,ij,1) = rn_himin 
    360365         ENDIF 
     
    485490      REAL(wp) ::   zdo_aice           ! ice age times volume transferred 
    486491      REAL(wp) ::   zdaTsf             ! aicen*Tsfcn transferred 
     492      ! MV MP 2016  
     493      REAL(wp) ::   zdapnd             ! pond fraction transferred 
     494      REAL(wp) ::   zdvpnd             ! pond volume transferred 
     495      ! END MV MP 2016  
    487496 
    488497      INTEGER, POINTER, DIMENSION(:) ::   nind_i, nind_j   ! compressed indices for i/j directions 
     
    576585            zaTsfn(ii,ij,jl1)  = zaTsfn(ii,ij,jl1) - zdaTsf 
    577586            zaTsfn(ii,ij,jl2)  = zaTsfn(ii,ij,jl2) + zdaTsf  
     587 
     588            ! MV MP 2016  
     589            IF ( nn_pnd_scheme > 0 ) THEN 
     590            !--------------------- 
     591            ! Pond fraction 
     592            !--------------------- 
     593               zdapnd             = a_ip(ii,ij,jl1) * zdaice(ii,ij,jl) 
     594               a_ip(ii,ij,jl1)    = a_ip(ii,ij,jl1) - zdapnd 
     595               a_ip(ii,ij,jl2)    = a_ip(ii,ij,jl2) + zdapnd 
     596 
     597            !--------------------- 
     598            ! Pond volume 
     599            !--------------------- 
     600               zdvpnd             = v_ip(ii,ij,jl1) * zdaice(ii,ij,jl) 
     601               v_ip(ii,ij,jl1)    = v_ip(ii,ij,jl1) - zdvpnd 
     602               v_ip(ii,ij,jl2)    = v_ip(ii,ij,jl2) + zdvpnd 
     603 
     604            ENDIF 
     605            ! END MV MP 2016  
    578606 
    579607         END DO 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limrst.F90

    r7813 r8233  
    147147         z2d(:,:) = t_su(:,:,jl) 
    148148         CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     149      END DO 
     150 
     151      ! MV MP 2016 
     152      IF ( nn_pnd_scheme > 0 ) THEN 
     153         DO jl = 1, jpl  
     154            WRITE(zchar,'(I2.2)') jl 
     155            znam = 'a_ip'//'_htc'//zchar 
     156            z2d(:,:) = a_ip(:,:,jl) 
     157            CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     158            znam = 'v_ip'//'_htc'//zchar 
     159            z2d(:,:) = v_ip(:,:,jl) 
     160            CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     161         END DO 
     162      ENDIF 
     163      ! END MV MP 2016 
     164 
     165      DO jl = 1, jpl  
     166         WRITE(zchar,'(I2.2)') jl 
    149167         znam = 'tempt_sl1'//'_htc'//zchar 
    150168         z2d(:,:) = e_s(:,:,1,jl) 
     
    291309            END DO 
    292310         END DO 
     311         ! MV MP 2016 
     312         IF ( nn_pnd_scheme > 0 ) THEN 
     313            DO jl = 1, jpl  
     314               WRITE(zchar,'(I2.2)') jl 
     315               znam = 'sxap'//'_htc'//zchar 
     316               z2d(:,:) = sxap(:,:,jl) 
     317               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     318               znam = 'syap'//'_htc'//zchar 
     319               z2d(:,:) = syap(:,:,jl) 
     320               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     321               znam = 'sxxap'//'_htc'//zchar 
     322               z2d(:,:) = sxxap(:,:,jl) 
     323               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     324               znam = 'syyap'//'_htc'//zchar 
     325               z2d(:,:) = syyap(:,:,jl) 
     326               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     327               znam = 'sxyap'//'_htc'//zchar 
     328               z2d(:,:) = sxyap(:,:,jl) 
     329               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     330    
     331               znam = 'sxvp'//'_htc'//zchar 
     332               z2d(:,:) = sxvp(:,:,jl) 
     333               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     334               znam = 'syvp'//'_htc'//zchar 
     335               z2d(:,:) = syvp(:,:,jl) 
     336               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     337               znam = 'sxxvp'//'_htc'//zchar 
     338               z2d(:,:) = sxxvp(:,:,jl) 
     339               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     340               znam = 'syyvp'//'_htc'//zchar 
     341               z2d(:,:) = syyvp(:,:,jl) 
     342               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     343               znam = 'sxyvp'//'_htc'//zchar 
     344               z2d(:,:) = sxyvp(:,:,jl) 
     345               CALL iom_rstput( iter, nitrst, numriw, znam , z2d ) 
     346            END DO 
     347         ENDIF 
    293348 
    294349      ENDIF 
     
    368423         CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
    369424         t_su(:,:,jl) = z2d(:,:) 
     425      END DO 
     426 
     427      ! MV MP 2016 
     428      IF ( nn_pnd_scheme > 0 ) THEN 
     429         DO jl = 1, jpl  
     430            WRITE(zchar,'(I2.2)') jl 
     431            znam = 'a_ip'//'_htc'//zchar 
     432            CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     433            a_ip(:,:,jl) = z2d(:,:) 
     434            znam = 'v_ip'//'_htc'//zchar 
     435            CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     436            v_ip(:,:,jl) = z2d(:,:) 
     437         END DO 
     438      ENDIF 
     439      ! END MV MP 2016 
     440 
     441      DO jl = 1, jpl  
     442         WRITE(zchar,'(I2.2)') jl 
    370443         znam = 'tempt_sl1'//'_htc'//zchar 
    371444         CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     
    484557            sxyage(:,:,jl)= z2d(:,:) 
    485558         END DO 
     559         ! MV MP 2016 
     560         IF ( nn_pnd_scheme > 0 ) THEN 
     561            DO jl = 1, jpl  
     562               WRITE(zchar,'(I2.2)') jl 
     563               znam = 'sxap'//'_htc'//zchar 
     564               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     565               sxap(:,:,jl) = z2d(:,:) 
     566               znam = 'syap'//'_htc'//zchar 
     567               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     568               syap(:,:,jl) = z2d(:,:) 
     569               znam = 'sxxap'//'_htc'//zchar 
     570               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     571               sxxap(:,:,jl) = z2d(:,:) 
     572               znam = 'syyap'//'_htc'//zchar 
     573               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     574               syyap(:,:,jl) = z2d(:,:) 
     575               znam = 'sxyap'//'_htc'//zchar 
     576               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     577               sxyap(:,:,jl) = z2d(:,:) 
     578    
     579               znam = 'sxvp'//'_htc'//zchar 
     580               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     581               sxvp(:,:,jl) = z2d(:,:) 
     582               znam = 'syvp'//'_htc'//zchar 
     583               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     584               syvp(:,:,jl) = z2d(:,:) 
     585               znam = 'sxxvp'//'_htc'//zchar 
     586               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     587               sxxvp(:,:,jl) = z2d(:,:) 
     588               znam = 'syyvp'//'_htc'//zchar 
     589               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     590               syyvp(:,:,jl) = z2d(:,:) 
     591               znam = 'sxyvp'//'_htc'//zchar 
     592               CALL iom_get( numrir, jpdom_autoglo, znam , z2d ) 
     593               sxyvp(:,:,jl) = z2d(:,:) 
     594            END DO 
     595         ENDIF 
     596         ! END MV MP 2016 
    486597 
    487598         CALL iom_get( numrir, jpdom_autoglo, 'sxopw ' ,  sxopw  ) 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limsbc.F90

    r7753 r8233  
    127127      ELSEWHERE                       ;  zalb(:,:) = SUM( alb_ice * a_i_b, dim=3 ) / at_i_b 
    128128      END WHERE 
    129       IF( iom_use('alb_ice' ) )  CALL iom_put( "alb_ice"  , zalb(:,:) )           ! ice albedo output 
     129      IF( iom_use('alb_ice' ) )         CALL iom_put( "alb_ice"  , zalb(:,:) )           ! ice albedo output 
    130130 
    131131      zalb(:,:) = SUM( alb_ice * a_i_b, dim=3 ) + 0.066_wp * ( 1._wp - at_i_b )       
    132       IF( iom_use('albedo'  ) )  CALL iom_put( "albedo"  , zalb(:,:) )           ! ice albedo output 
     132      IF( iom_use('albedo'  ) )        CALL iom_put( "albedo"  , zalb(:,:) )           ! surface albedo output 
    133133 
    134134      CALL wrk_dealloc( jpi,jpj, zalb )     
     
    177177                           + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) + wfx_lam(ji,jj)  
    178178 
     179            IF ( ln_pnd_fw ) & 
     180               wfx_ice(ji,jj) = wfx_ice(ji,jj) + wfx_pnd(ji,jj) 
     181 
     182            ! add the snow melt water to snow mass flux to the ocean 
     183            wfx_snw(:,:)      = wfx_snw(:,:) + wfx_snw_sum(:,:)  
     184 
    179185            ! mass flux at the ocean/ice interface 
    180186            fmmflx(ji,jj) = - ( wfx_ice(ji,jj) + wfx_snw(ji,jj) + wfx_err_sub(ji,jj) )              ! F/M mass flux save at least for biogeochemical model 
     
    211217      !------------------------------------------------------------------------! 
    212218      CALL wrk_alloc( jpi,jpj,jpl,   zalb_cs, zalb_os )     
    213       CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os )  ! cloud-sky and overcast-sky ice albedos 
     219      CALL albedo_ice( t_su, ht_i, ht_s, a_ip_frac, h_ip, ln_pnd_rad, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 
     220 
    214221      alb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
    215222      CALL wrk_dealloc( jpi,jpj,jpl,   zalb_cs, zalb_os ) 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limthd.F90

    r7813 r8233  
    468468         ! 
    469469         CALL tab_2d_1d( nbpb, wfx_snw_1d (1:nbpb), wfx_snw         , jpi, jpj, npb(1:nbpb) ) 
     470         CALL tab_2d_1d( nbpb, wfx_snw_sum_1d(1:nbpb), wfx_snw_sum  , jpi, jpj, npb(1:nbpb) ) 
    470471         CALL tab_2d_1d( nbpb, wfx_sub_1d (1:nbpb), wfx_sub         , jpi, jpj, npb(1:nbpb) ) 
    471472         ! 
     
    519520         ! 
    520521         CALL tab_1d_2d( nbpb, wfx_snw       , npb, wfx_snw_1d(1:nbpb)   , jpi, jpj ) 
     522         CALL tab_1d_2d( nbpb, wfx_snw_sum   , npb, wfx_snw_sum_1d(1:nbpb),jpi, jpj ) 
    521523         CALL tab_1d_2d( nbpb, wfx_sub       , npb, wfx_sub_1d(1:nbpb)   , jpi, jpj ) 
    522524         ! 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90

    r7646 r8233  
    169169            hfx_res_1d(ji) = hfx_res_1d(ji) + q_s_1d(ji,1) * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice 
    170170            ! Contribution to mass flux 
    171             wfx_snw_1d(ji) = wfx_snw_1d(ji) + rhosn * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice 
     171            wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) + rhosn * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice 
    172172            ! updates 
    173173            ht_s_1d(ji)   = 0._wp 
     
    233233         hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * zqprec(ji) * r1_rdtice 
    234234         ! snow melting only = water into the ocean (then without snow precip), >0 
    235          wfx_snw_1d(ji) = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice     
     235         wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice 
    236236         ! updates available heat + precipitations after melting 
    237237         zq_su     (ji) = MAX( 0._wp , zq_su (ji) + zdeltah(ji,1) * zqprec(ji) )       
     
    255255            hfx_snw_1d(ji)   = hfx_snw_1d(ji) - zdeltah(ji,jk) * a_i_1d(ji) * q_s_1d(ji,jk) * r1_rdtice  
    256256            ! snow melting only = water into the ocean (then without snow precip) 
    257             wfx_snw_1d(ji)   = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
     257            wfx_snw_sum_1d(ji)   = wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    258258            ! updates available heat + thickness 
    259259            zq_su (ji)  = MAX( 0._wp , zq_su (ji) + zdeltah(ji,jk) * q_s_1d(ji,jk) ) 
     
    607607         hfx_snw_1d(ji)  = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * q_s_1d(ji,1) * r1_rdtice ! W.m-2 (>0) 
    608608         ! Contribution to mass flux 
    609          wfx_snw_1d(ji)  =  wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice 
     609         wfx_snw_sum_1d(ji)  =  wfx_snw_sum_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice 
    610610         !     
    611611         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limtrp.F90

    r7753 r8233  
    7676      ! --- diffusion --- ! 
    7777      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   zhdfptab 
    78       INTEGER , PARAMETER                    ::   ihdf_vars  = 6 ! Number of variables in which we apply horizontal diffusion 
     78      ! MV MP 2016 
     79      ! With melt ponds, we have to diffuse them 
     80      ! We hard code the number of variables to diffuse 
     81      ! since we can't put an IF ( nn_pnd_scheme ) for a declaration 
     82      ! ideally, the ihdf_vars should probably be passed as an argument and 
     83      ! defined somewhere depending on nn_pnd_scheme 
     84      ! END MV MP 2016 
     85      INTEGER , PARAMETER                    ::   ihdf_vars  = 8 ! Number of variables in which we apply horizontal diffusion 
    7986                                                                 !  inside limtrp for each ice category , not counting the  
    8087                                                                 !  variables corresponding to ice_layers  
     
    8693      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z0opw 
    8794      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z0ice, z0snw, z0ai, z0es , z0smi , z0oi 
     95      ! MV MP 2016 
     96      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z0ap , z0vp 
     97      REAL(wp) ::   za_old 
     98      ! END MV MP 2016 
    8899      REAL(wp), POINTER, DIMENSION(:,:,:,:)  ::   z0ei 
    89100      !! 
     
    205216               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_s(:,:,jl) )      ! Snow volume 
    206217               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, e_s(:,:,1,jl) )    ! Snow heat content 
     218               ! MV MP 2016 
     219               IF ( nn_pnd_scheme > 0 ) THEN 
     220                  CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, a_ip(:,:,jl) )  ! Melt pond fraction 
     221                  CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_ip(:,:,jl) )  ! Melt pond volume 
     222               ENDIF 
     223               ! END MV MP 2016 
    207224            END DO 
    208225         END DO 
     
    222239         CALL wrk_alloc( jpi,jpj,1,          z0opw ) 
    223240         CALL wrk_alloc( jpi,jpj,jpl,        z0ice, z0snw, z0ai, z0es , z0smi , z0oi ) 
     241         CALL wrk_alloc( jpi,jpj,jpl,        z0ap , z0vp ) 
    224242         CALL wrk_alloc( jpi,jpj,nlay_i,jpl, z0ei ) 
    225243          
     
    246264               z0ei  (:,:,jk,jl) = e_i  (:,:,jk,jl) * e1e2t(:,:) ! Ice  heat content 
    247265            END DO 
     266            ! MV MP 2016 
     267            IF ( nn_pnd_scheme > 0 ) THEN 
     268               z0ap  (:,:,jl)  = a_ip (:,:,jl) * e12t(:,:) ! Melt pond fraction 
     269               z0vp  (:,:,jl)  = v_ip (:,:,jl) * e12t(:,:) ! Melt pond volume 
     270            ENDIF 
     271            ! END MV MP 2016 
     272 
    248273         END DO 
    249274 
     
    288313                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
    289314                  END DO 
     315                  ! MV MP 2016 
     316                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &    !--- melt pond fraction -- 
     317                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  ) 
     318                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &  
     319                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  ) 
     320                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &    !--- melt pond volume   -- 
     321                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  ) 
     322                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &  
     323                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  ) 
     324                  ! END MV MP 2016 
    290325               END DO 
    291326            END DO 
     
    329364                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
    330365                  END DO 
     366                  ! MV MP 2016 
     367                  IF ( nn_pnd_scheme > 0 ) THEN 
     368                     CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &   !--- melt pond fraction --- 
     369                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  ) 
     370                     CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   & 
     371                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  ) 
     372                     CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &   !--- melt pond volume   --- 
     373                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  ) 
     374                     CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   & 
     375                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  ) 
     376                  ENDIF 
     377                  ! END MV MP 2016 
    331378               END DO 
    332379            END DO 
     
    347394               e_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:) 
    348395            END DO 
     396            ! MV MP 2016 
     397            IF ( nn_pnd_scheme > 0 ) THEN 
     398               a_ip  (:,:,jl)   = z0ap (:,:,jl) * r1_e12t(:,:) 
     399               v_ip  (:,:,jl)   = z0vp (:,:,jl) * r1_e12t(:,:) 
     400            ENDIF 
     401            ! END MV MP 2016 
    349402         END DO 
    350403 
     
    357410         CALL wrk_dealloc( jpi,jpj,1,          z0opw ) 
    358411         CALL wrk_dealloc( jpi,jpj,jpl,        z0ice, z0snw, z0ai, z0es , z0smi , z0oi ) 
     412         ! MV MP 2016 
     413         CALL wrk_dealloc( jpi,jpj,jpl,        z0ap , z0vp ) 
     414         ! END MV MP 2016 
    359415         CALL wrk_dealloc( jpi,jpj,nlay_i,jpl, z0ei ) 
    360416 
     
    385441            zhdfptab(:,:,jm)= oa_i (:,:,  jl); jm = jm + 1 
    386442            zhdfptab(:,:,jm)= e_s  (:,:,1,jl); jm = jm + 1 
     443            ! MV MP 2016 
     444            IF ( nn_pnd_scheme > 0 ) THEN 
     445               zhdfptab(:,:,jm)= a_ip  (:,:,  jl); jm = jm + 1 
     446               zhdfptab(:,:,jm)= v_ip  (:,:,  jl); jm = jm + 1 
     447            ENDIF 
     448            ! END MV MP 2016 
    387449            ! Sample of adding more variables to apply lim_hdf (ihdf_vars must be increased) 
    388450            !   zhdfptab(:,:,jm) = variable_1 (:,:,1,jl); jm = jm + 1   
     
    418480            oa_i (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1 
    419481            e_s  (:,:,1,jl) = zhdfptab(:,:,jm); jm = jm + 1 
     482            ! MV MP 2016 
     483            IF ( nn_pnd_scheme > 0 ) THEN 
     484               a_ip (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1 
     485               v_ip (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1 
     486            ENDIF 
    420487            ! Sample of adding more variables to apply lim_hdf 
    421488            !   variable_1  (:,:,1,jl) = zhdfptab(:,:, jm  ) ; jm + 1  
     
    470537                        e_s(ji,jj,1,jl)        = rswitch * e_s(ji,jj,1,jl) 
    471538                        e_i(ji,jj,1:nlay_i,jl) = rswitch * e_i(ji,jj,1:nlay_i,jl) 
     539 
     540                        ! MV MP 2016 
     541                        IF ( nn_pnd_scheme > 0 ) THEN 
     542                           a_ip (ji,jj,jl)        = rswitch * a_ip (ji,jj,jl) 
     543                           v_ip (ji,jj,jl)        = rswitch * v_ip (ji,jj,jl) 
     544                        ENDIF 
     545                        ! END MV MP 2016 
    472546                                                 
    473547                     ENDIF 
     
    483557         DO jj = 1, jpj 
    484558            DO ji = 1, jpi 
     559               ! MV MP 2016 
     560               za_old = a_i(ji,jj,jpl) 
     561               ! END MV MP 2016 
    485562               rswitch         = MAX( 0._wp , SIGN( 1._wp, ht_i(ji,jj,jpl) - epsi20 ) ) 
    486563               ht_i(ji,jj,jpl) = MIN( ht_i(ji,jj,jpl) , hi_max(jpl) ) 
    487564               a_i (ji,jj,jpl) = v_i(ji,jj,jpl) / MAX( ht_i(ji,jj,jpl) , epsi20 ) * rswitch 
    488             END DO 
    489          END DO 
     565               ! MV MP 2016 
     566               IF ( nn_pnd_scheme > 0 ) THEN 
     567                  ! correct pond fraction to avoid a_ip > a_i 
     568                  a_ip(ji,jj,jpl) = a_ip(ji,jj,jpl) * a_i(ji,jj,jpl) / MAX( za_old , epsi20 ) * rswitch 
     569               ENDIF 
     570               ! END MP 2016 
     571            END DO 
     572         END DO 
     573 
    490574 
    491575      ENDIF 
     
    513597      vt_s(:,:) = SUM( v_s(:,:,:), dim=3 ) 
    514598      at_i(:,:) = SUM( a_i(:,:,:), dim=3 ) 
     599 
     600      ! MV MP 2016 (remove once we get rid of a_i_frac and ht_i) 
     601      IF ( nn_pnd_scheme > 0 ) THEN 
     602          at_ip(:,:) = SUM( a_ip(:,:,:), dim = 3 ) 
     603          vt_ip(:,:) = SUM( v_ip(:,:,:), dim = 3 ) 
     604      ENDIF 
     605      ! END MP 2016 
    515606       
    516607      ! --- open water = 1 if at_i=0 -------------------------------- 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limvar.F90

    r7813 r8233  
    9191      et_i(:,:)  = SUM( SUM( e_i(:,:,:,:), dim=4 ), dim=3 ) 
    9292 
     93      ! MV MP 2016 
     94      IF ( ln_pnd ) THEN 
     95         at_ip(:,:) = SUM( a_ip, dim=3 ) 
     96         vt_ip(:,:) = SUM( v_ip, dim=3 ) 
     97      ENDIF 
     98      ! END MP 2016 
     99 
    93100      ! open water fraction 
    94101      DO jj = 1, jpj 
     
    244251      END DO 
    245252 
    246       ! integrated values 
     253      ! integrated values  
    247254      vt_i (:,:) = SUM( v_i, dim=3 ) 
    248255      vt_s (:,:) = SUM( v_s, dim=3 ) 
    249256      at_i (:,:) = SUM( a_i, dim=3 ) 
     257 
     258      ! MV MP 2016 
     259      ! probably should resum for melt ponds ??? 
    250260 
    251261      ! 
     
    516526      !!------------------------------------------------------------------- 
    517527      INTEGER  ::   ji, jj, jl, jk   ! dummy loop indices 
    518       REAL(wp) ::   zsal, zvi, zvs, zei, zes 
     528      REAL(wp) ::   zsal, zvi, zvs, zei, zes, zvp 
    519529      !!------------------------------------------------------------------- 
    520530      at_i (:,:) = 0._wp 
     
    556566               zvs  = v_s  (ji,jj,  jl) 
    557567               zes  = e_s  (ji,jj,1,jl) 
     568               IF ( ( nn_pnd_scheme > 0 ) .AND. ln_pnd_fw )   zvp  = v_ip (ji,jj  ,jl) 
    558569               !----------------------------------------------------------------- 
    559570               ! Zap snow energy  
     
    572583               oa_i (ji,jj,jl) = oa_i (ji,jj,jl) * rswitch 
    573584               smv_i(ji,jj,jl) = smv_i(ji,jj,jl) * rswitch 
     585 
     586               ! MV MP 2016 
     587               IF ( ln_pnd ) THEN  
     588                  a_ip (ji,jj,jl) = a_ip (ji,jj,jl) * rswitch 
     589                  v_ip (ji,jj,jl) = v_ip (ji,jj,jl) * rswitch 
     590                  IF ( ln_pnd_fw )   wfx_res(ji,jj)  = wfx_res(ji,jj) - ( v_ip(ji,jj,jl)  - zvp  ) * rhofw * r1_rdtice 
     591               ENDIF 
     592               ! END MV MP 2016 
    574593 
    575594               ! update exchanges with ocean 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/limwri.F90

    r7753 r8233  
    172172      CALL iom_put( "vfxice"     , wfx_ice * ztmp       )        ! total ice growth/melt  
    173173 
     174      IF ( ln_pnd ) & 
     175         CALL iom_put( "vfxpnd"  , wfx_pnd * ztmp       )        ! melt pond water flux 
     176 
    174177      IF ( iom_use( "vfxthin" ) ) THEN   ! ice production for open water + thin ice (<20cm) => comparable to observations   
    175178         WHERE( htm_i(:,:) < 0.2 .AND. htm_i(:,:) > 0. ) ; z2d = wfx_bog 
     
    207210      CALL iom_put ('hfxdhc'     , diag_heat(:,:)       )   ! Heat content variation in snow and ice  
    208211      CALL iom_put ('hfxspr'     , hfx_spr(:,:)         )   ! Heat content of snow precip  
     212 
     213      ! MV MP 2016 
     214      IF ( ln_pnd ) THEN 
     215         CALL iom_put( "iceamp"  , at_ip  * zswi        )   ! melt pond total fraction 
     216         CALL iom_put( "icevmp"  , vt_ip  * zswi        )   ! melt pond total volume per unit area 
     217      ENDIF 
     218      ! END MV MP 2016 
    209219 
    210220       
     
    224234      ! brine volume 
    225235      IF ( iom_use( "brinevol_cat" ) )  CALL iom_put( "brinevol_cat", bv_i * 100. * zswi2 ) 
     236 
     237      ! MV MP 2016 
     238      IF ( ln_pnd ) THEN 
     239         IF ( iom_use( "iceamp_cat"  ) )  CALL iom_put( "iceamp_cat"     , a_ip       * zswi2   )       ! melt pond frac for categories 
     240         IF ( iom_use( "icevmp_cat"  ) )  CALL iom_put( "icevmp_cat"     , v_ip       * zswi2   )       ! melt pond frac for categories 
     241         IF ( iom_use( "icehmp_cat"  ) )  CALL iom_put( "icehmp_cat"     , h_ip       * zswi2   )       ! melt pond frac for categories 
     242         IF ( iom_use( "iceafp_cat"  ) )  CALL iom_put( "iceafp_cat"     , a_ip_frac  * zswi2   )       ! melt pond frac for categories 
     243      ENDIF 
     244      ! END MV MP 2016 
    226245 
    227246      !     !  Create an output files (output.lim.abort.nc) if S < 0 or u > 20 m/s 
     
    287306      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    288307 
     308      ! MV MP 2016 
     309      IF ( ln_pnd ) THEN 
     310         CALL histdef( kid, "si_amp", "Melt pond fraction"      , "%"      ,   & 
     311      &         jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     312         CALL histdef( kid, "si_vmp", "Melt pond volume"        ,  "m"     ,   & 
     313      &         jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     314      ENDIF 
     315      ! END MV MP 2016 
     316 
    289317      CALL histdef( kid, "vfxbog", "Ice bottom production"   , "m/s"    ,   & 
    290318      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     
    331359      CALL histwrite( kid, "sidive", kt, divu_i*1.0e8   , jpi*jpj, (/1/) ) 
    332360 
     361      ! MV MP 2016 
     362      IF ( ln_pnd ) THEN 
     363         CALL histwrite( kid, "si_amp", kt, at_ip         , jpi*jpj, (/1/) ) 
     364         CALL histwrite( kid, "si_vmp", kt, vt_ip         , jpi*jpj, (/1/) ) 
     365      ENDIF 
     366      ! END MV MP 2016 
     367 
    333368      CALL histwrite( kid, "vfxbog", kt, wfx_bog        , jpi*jpj, (/1/) ) 
    334369      CALL histwrite( kid, "vfxdyn", kt, wfx_dyn        , jpi*jpj, (/1/) ) 
     
    338373      CALL histwrite( kid, "vfxbom", kt, wfx_bom        , jpi*jpj, (/1/) ) 
    339374      CALL histwrite( kid, "vfxsum", kt, wfx_sum        , jpi*jpj, (/1/) ) 
     375      IF ( ln_pnd ) & 
     376         CALL histwrite( kid, "vfxpnd", kt, wfx_pnd     , jpi*jpj, (/1/) ) 
    340377 
    341378      CALL histwrite( kid, "sithicat", kt, ht_i        , jpi*jpj*jpl, (/1/) )     
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/thd_ice.F90

    r7646 r8233  
    5858 
    5959   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_snw_1d  
     60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_snw_sum_1d 
    6061   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sub_1d 
    6162 
     
    146147      ii = ii + 1 
    147148      ALLOCATE( sprecip_1d (jpij) , frld_1d    (jpij) , at_i_1d    (jpij) ,                     & 
    148          &      fhtur_1d   (jpij) , wfx_snw_1d (jpij) , wfx_spr_1d (jpij) ,                     & 
     149         &      fhtur_1d   (jpij) , wfx_snw_1d (jpij) , wfx_spr_1d (jpij) , wfx_snw_sum_1d(jpij) , & 
    149150         &      fhld_1d    (jpij) , wfx_sub_1d (jpij) , wfx_bog_1d (jpij) , wfx_bom_1d(jpij) ,  & 
    150151         &      wfx_sum_1d(jpij)  , wfx_sni_1d (jpij) , wfx_opw_1d (jpij) , wfx_res_1d(jpij) ,  & 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90

    r7813 r8233  
    5454 
    5555   REAL(wp), PUBLIC ::   rhosn    =  330._wp         !: volumic mass of snow          [kg/m3] 
     56   ! MV MP 2016 
     57   REAL(wp), PUBLIC ::   rhofw    = 1000._wp         !: volumic mass of freshwater in melt ponds [kg/m3] 
     58   ! END MV MP 2016 
    5659   REAL(wp), PUBLIC ::   emic     =    0.97_wp       !: emissivity of snow or ice 
    5760   REAL(wp), PUBLIC ::   sice     =    6.0_wp        !: salinity of ice               [psu] 
     
    176179         WRITE(numout,*) '          density of sea ice                        = ', rhoic   , ' kg/m^3' 
    177180         WRITE(numout,*) '          density of snow                           = ', rhosn   , ' kg/m^3' 
     181         WRITE(numout,*) '          density of freshwater (in melt ponds)     = ', rhofw   , ' kg/m^3' 
    178182         WRITE(numout,*) '          emissivity of snow or ice                 = ', emic   
    179183         WRITE(numout,*) '          salinity of ice                           = ', sice    , ' psu' 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90

    r7813 r8233  
    77   !!   NEMO     1.0  ! 2003-07  (C. Ethe, G. Madec)  Optimization (old name:shine) 
    88   !!             -   ! 2004-11  (C. Talandier)  add albedo_init 
    9    !!             -   ! 2001-06  (M. Vancoppenolle) LIM 3.0 
     9   !!             -   ! 2006-06  (M. Vancoppenolle) LIM 3.0 
    1010   !!             -   ! 2006-08  (G. Madec)  cleaning for surface module 
    1111   !!            3.6  ! 2016-01  (C. Rousset) new parameterization for sea ice albedo 
     12   !!            4.0  ! 2017-05  (M. Vancoppenolle, O. Lecomte) Melt ponds 
    1213   !!---------------------------------------------------------------------- 
    1314 
     
    3940   !                             !!* namelist namsbc_alb 
    4041   INTEGER  ::   nn_ice_alb 
    41    REAL(wp) ::   rn_alb_sdry, rn_alb_smlt, rn_alb_idry, rn_alb_imlt 
     42   REAL(wp) ::   rn_alb_sdry, rn_alb_smlt, rn_alb_idry, rn_alb_imlt, rn_alb_dpnd 
    4243 
    4344   !!---------------------------------------------------------------------- 
     
    4849CONTAINS 
    4950 
    50    SUBROUTINE albedo_ice( pt_ice, ph_ice, ph_snw, pa_ice_cs, pa_ice_os ) 
     51   SUBROUTINE albedo_ice( pt_ice, ph_ice, ph_snw, pafrac_pnd, ph_pnd, ld_pnd, pa_ice_cs, pa_ice_os ) 
    5152      !!---------------------------------------------------------------------- 
    5253      !!               ***  ROUTINE albedo_ice  *** 
     
    5859      !!                  1: the scheme is "home made" (for cloudy skies) and based on Brandt et al. (J. Climate 2005) 
    5960      !!                                                                           and Grenfell & Perovich (JGR 2004) 
     61      !!                  2: fractional surface-based formulation of scheme 1 (NEW) 
    6062      !!                Description of scheme 1: 
    6163      !!                  1) Albedo dependency on ice thickness follows the findings from Brandt et al (2005) 
     
    8082      !!                Brandt et al. 2005, J. Climate, vol 18 
    8183      !!                Grenfell & Perovich 2004, JGR, vol 109  
    82       !!---------------------------------------------------------------------- 
    83       REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pt_ice      !  ice surface temperature (Kelvin) 
    84       REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_ice      !  sea-ice thickness 
    85       REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_snw      !  snow thickness 
    86       REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_cs   !  albedo of ice under clear    sky 
    87       REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_os   !  albedo of ice under overcast sky 
    88       !! 
    89       INTEGER  ::   ji, jj, jl         ! dummy loop indices 
    90       INTEGER  ::   ijpl               ! number of ice categories (3rd dim of ice input arrays) 
    91       REAL(wp)            ::   zswitch, z1_c1, z1_c2 
     84      !! 
     85      !!---------------------------------------------------------------------- 
     86      !! 
     87      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pt_ice              !  ice surface temperature (Kelvin) 
     88      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_ice              !  sea-ice thickness 
     89      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_snw              !  snow depth 
     90      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pafrac_pnd          !  melt pond relative fraction (per unit ice area) 
     91      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   ph_pnd              !  melt pond depth 
     92      LOGICAL , INTENT(in   )                   ::   ld_pnd              !  melt ponds radiatively active or not 
     93      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_cs           !  albedo of ice under clear    sky 
     94      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   pa_ice_os           !  albedo of ice under overcast sky 
     95      !! 
     96      INTEGER  ::   ji, jj, jl                                           ! dummy loop indices 
     97      INTEGER  ::   ijpl                                                 ! number of ice categories (3rd dim of ice input arrays) 
     98      REAL(wp)                            ::   zswitch, z1_c1, z1_c2 
     99      REAL(wp)                            ::   zhref_pnd                                  
    92100      REAL(wp)                            ::   zalb_sm, zalb_sf, zalb_st ! albedo of snow melting, freezing, total 
    93101      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb, zalb_it             ! intermediate variable & albedo of ice (snow free) 
     102!! MV MP 
     103      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb_pnd                  ! ponded sea ice albedo 
     104      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb_ice                  ! bare sea ice albedo 
     105      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb_snw                  ! snow-covered sea ice albedo 
     106      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zafrac_snw                ! relative snow fraction 
     107      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zafrac_ice                ! relative ice fraction 
     108      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zafrac_pnd                ! relative ice fraction (effective) 
     109      !! 
    94110      !!--------------------------------------------------------------------- 
    95111 
     
    97113       
    98114      CALL wrk_alloc( jpi,jpj,ijpl, zalb, zalb_it ) 
     115      CALL wrk_alloc( jpi,jpj,ijpl, zalb_pnd, zalb_ice, zalb_snw ) 
     116      CALL wrk_alloc( jpi,jpj,ijpl, zalb_pnd, zafrac_snw, zafrac_ice, zafrac_pnd ) 
    99117 
    100118      IF( albd_init == 0 )   CALL albedo_init      ! initialization  
    101        
     119 
     120      !----------------------------------------------------- 
     121      !  Snow-free albedo (no ice thickness dependence yet) 
     122      !----------------------------------------------------- 
     123      ! 
     124      ! Part common to nn_ice_alb = 0, 1, 2 
     125      ! 
     126      IF ( .NOT. ld_pnd ) THEN   !--- No melt ponds OR radiatively inactive melt ponds 
     127         ! Bare ice albedo is prescribed, with implicit assumption on pond fraction and depth 
     128         WHERE     ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;   zalb(:,:,:) = rn_alb_imlt 
     129                                                       ! !!! MV I think we could replace rt0_ice by rt0 and get rid of rt0 
     130         ELSE WHERE                                              ;   zalb(:,:,:) = rn_alb_idry 
     131         END  WHERE 
     132      ENDIF 
     133 
    102134      SELECT CASE ( nn_ice_alb ) 
    103135 
     
    105137      !  Shine and Henderson-Sellers (1985) 
    106138      !------------------------------------------ 
     139      ! NB: This parameterization is based on clear sky values 
     140 
    107141      CASE( 0 ) 
    108142        
    109          !  Computation of ice albedo (free of snow) 
    110          WHERE     ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;   zalb(:,:,:) = rn_alb_imlt 
    111          ELSE WHERE                                              ;   zalb(:,:,:) = rn_alb_idry 
    112          END  WHERE 
    113        
     143         ! Thickness-dependent bare ice albedo 
    114144         WHERE     ( 1.5  < ph_ice                     )  ;  zalb_it = zalb 
    115145         ELSE WHERE( 1.0  < ph_ice .AND. ph_ice <= 1.5 )  ;  zalb_it = 0.472  + 2.0 * ( zalb - 0.472 ) * ( ph_ice - 1.0 ) 
     
    119149         ELSE WHERE                                       ;  zalb_it = 0.1    + 3.6    * ph_ice 
    120150         END WHERE 
    121       
     151 
     152         IF ( ld_pnd ) THEN 
     153            ! Depth-dependent ponded ice albedo 
     154            zhref_pnd = 0.05        ! Characteristic length scale for thickness dependence of ponded ice albedo, Lecomte et al (2015) 
     155            zalb_pnd  = rn_alb_dpnd - ( rn_alb_dpnd - zalb_it ) * EXP( - ph_pnd / zhref_pnd )  
     156 
     157            ! Snow-free ice albedo is a function of pond fraction 
     158            WHERE ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ; zalb_it = zalb_it * ( 1. - pafrac_pnd  ) + zalb_pnd * pafrac_pnd ;   END WHERE 
     159         ENDIF  
     160 
    122161         DO jl = 1, ijpl 
    123162            DO jj = 1, jpj 
    124163               DO ji = 1, jpi 
    125                   ! freezing snow 
     164                  ! Freezing snow 
    126165                  ! no effect of underlying ice layer IF snow thickness > c1. Albedo does not depend on snow thick if > c2 
    127166                  zswitch   = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ( ph_snw(ji,jj,jl) - c1 ) ) ) 
     
    130169                     &        +         zswitch   * rn_alb_sdry   
    131170 
    132                   ! melting snow 
     171                  ! Melting snow 
    133172                  ! no effect of underlying ice layer. Albedo does not depend on snow thick IF > c2 
    134173                  zswitch   = MAX( 0._wp , SIGN( 1._wp , ph_snw(ji,jj,jl) - c2 ) ) 
     
    136175                      &     +         zswitch   *   rn_alb_smlt  
    137176                  ! 
    138                   ! snow albedo 
     177                  ! Snow albedo 
    139178                  zswitch  =  MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) )    
    140179                  zalb_st  =  zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 
    141180                
    142                   ! Ice/snow albedo 
    143                   zswitch   = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 
    144                   pa_ice_cs(ji,jj,jl) =  zswitch * zalb_st + ( 1._wp - zswitch ) * zalb_it(ji,jj,jl) 
     181                  ! Surface albedo 
     182                  zswitch             = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 
     183                  pa_ice_cs(ji,jj,jl) = zswitch * zalb_st + ( 1._wp - zswitch ) * zalb_it(ji,jj,jl) 
    145184                  ! 
    146185               END DO 
     
    153192      !  New parameterization (2016) 
    154193      !------------------------------------------ 
     194      ! NB: This parameterization is based on overcast skies values 
     195       
    155196      CASE( 1 )  
    156197 
    157 ! compilation of values from literature 
     198! compilation of values from literature (reference overcast sky values) 
    158199!        rn_alb_sdry = 0.85      ! dry snow 
    159200!        rn_alb_smlt = 0.75      ! melting snow 
    160201!        rn_alb_idry = 0.60      ! bare frozen ice 
     202!        rn_alb_dpnd = 0.36      ! ponded-ice overcast albedo (Lecomte et al, 2015) 
     203!                                ! early melt pnds 0.27, late melt ponds 0.14 Grenfell & Perovich 
    161204! Perovich et al 2002 (Sheba) => the only dataset for which all types of ice/snow were retrieved 
    162205!        rn_alb_sdry = 0.85      ! dry snow 
     
    168211!        rn_alb_idry = 0.54      ! bare frozen ice 
    169212!  
    170          !  Computation of ice albedo (free of snow) 
     213         ! Computation of snow-free ice albedo  
    171214         z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) )  
    172215         z1_c2 = 1. / 0.05 
    173          WHERE     ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;   zalb = rn_alb_imlt 
    174          ELSE WHERE                                              ;   zalb = rn_alb_idry 
    175          END  WHERE 
    176           
    177          WHERE     ( 1.5  < ph_ice                     )  ;  zalb_it = zalb 
    178          ELSE WHERE( 0.05 < ph_ice .AND. ph_ice <= 1.5 )  ;  zalb_it = zalb     + ( 0.18 - zalb     ) * z1_c1 *  & 
     216 
     217         ! Accounting for the ice-thickness dependency 
     218         WHERE     ( 1.5  < ph_ice                     )        ;  zalb_it = zalb 
     219         ELSE WHERE( 0.05 < ph_ice .AND. ph_ice <= 1.5 )        ;  zalb_it = zalb     + ( 0.18 - zalb     ) * z1_c1 *  & 
    179220            &                                                                     ( LOG(1.5) - LOG(ph_ice) ) 
    180          ELSE WHERE                                       ;  zalb_it = ralb_oce + ( 0.18 - ralb_oce ) * z1_c2 * ph_ice 
     221         ELSE WHERE                                             ;  zalb_it = ralb_oce + ( 0.18 - ralb_oce ) * z1_c2 * ph_ice 
    181222         END WHERE 
     223 
     224         IF ( ld_pnd ) THEN 
     225            ! Depth-dependent ponded ice albedo 
     226            zhref_pnd = 0.05        ! Characteristic length scale for thickness dependence of ponded ice albedo, Lecomte et al (2015) 
     227            zalb_pnd  = rn_alb_dpnd - ( rn_alb_dpnd - zalb_it ) * EXP( - ph_pnd / zhref_pnd )  
     228 
     229            ! Snow-free ice albedo is weighted mean of ponded ice and bare ice contributions 
     230            WHERE ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;  zalb_it = zalb_it * ( 1. - pafrac_pnd  ) + zalb_pnd * pafrac_pnd ;  END WHERE 
     231         ENDIF  
    182232 
    183233         z1_c1 = 1. / 0.02 
    184234         z1_c2 = 1. / 0.03 
    185          !  Computation of the snow/ice albedo 
     235          
     236         ! Overcast sky surface albedo (accounting for snow, ice melt ponds) 
    186237         DO jl = 1, ijpl 
    187238            DO jj = 1, jpj 
    188239               DO ji = 1, jpi 
     240                  ! Snow depth dependence of snow albedo 
    189241                  zalb_sf = rn_alb_sdry - ( rn_alb_sdry - zalb_it(ji,jj,jl)) * EXP( - ph_snw(ji,jj,jl) * z1_c1 ); 
    190242                  zalb_sm = rn_alb_smlt - ( rn_alb_smlt - zalb_it(ji,jj,jl)) * EXP( - ph_snw(ji,jj,jl) * z1_c2 ); 
    191243 
    192                   ! snow albedo 
     244                  ! Snow albedo (MV I guess we could use rt0 instead of rt0_snow) 
    193245                  zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) )    
    194246                  zalb_st = zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 
    195247 
    196                   ! Ice/snow albedo    
     248                  ! Surface albedo    
    197249                  zswitch             = MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 
    198250                  pa_ice_os(ji,jj,jl) = ( 1._wp - zswitch ) * zalb_st + zswitch *  zalb_it(ji,jj,jl) 
     
    201253            END DO 
    202254         END DO 
    203          ! Effect of the clouds (2d order polynomial) 
     255 
     256         ! Clear sky surface albedo 
    204257         pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 );  
     258 
     259      !--------------------------------------------------- 
     260      !  Fractional surface-based parameterization (2017) 
     261      !--------------------------------------------------- 
     262      CASE( 2 )  
     263  
     264      ! MV: I propose this formulation that is more elegant, and more easy to expand towards 
     265      !     varying pond and snow fraction. 
     266      !     Formulation 1 has issues to handle ponds and snow together that 
     267      !     can't easily be fixed. This one handles it better, I believe. 
     268 
     269          !----------------------------------------- 
     270          ! Snow, bare ice and ponded ice fractions  
     271          !----------------------------------------- 
     272          ! Specific fractions (zafrac) refer to relative area covered by snow within each ice category 
     273 
     274          !--- Effective pond fraction (for now, we prevent melt ponds and snow at the same time) 
     275          zafrac_pnd = 0._wp 
     276          IF ( ld_pnd ) THEN   
     277             WHERE( ph_snw == 0._wp ) ;  zafrac_pnd = pafrac_pnd ;  END WHERE  ! Snow fully "shades" melt ponds 
     278          ENDIF          
     279 
     280          !--- Specific snow fraction (for now, prescribed) 
     281          WHERE     ( ph_snw > 0._wp     ) ;  zafrac_snw = 1. 
     282          ELSE WHERE                       ;  zafrac_snw = 0. 
     283          END WHERE 
     284  
     285          !--- Specific ice fraction  
     286          zafrac_ice = 1. - zafrac_snw - zafrac_pnd 
     287  
     288          !-------------------------------------------------- 
     289          ! Snow-covered, pond-covered, and bare ice albedos 
     290          !-------------------------------------------------- 
     291          ! Bare ice albedo 
     292          z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) )  
     293          z1_c2 = 1. / 0.05 
     294          WHERE     ( 1.5  < ph_ice                     )  ;  zalb_ice = zalb 
     295          ELSE WHERE( 0.05 < ph_ice .AND. ph_ice <= 1.5 )  ;  zalb_ice = zalb     + ( 0.18 - zalb     ) * z1_c1 *  & 
     296            &                                                                       ( LOG(1.5) - LOG(ph_ice) ) 
     297          ELSE WHERE                                       ;  zalb_ice = ralb_oce + ( 0.18 - ralb_oce ) * z1_c2 * ph_ice 
     298          END WHERE 
     299 
     300          ! Snow-covered ice albedo (freezing, melting cases) 
     301          z1_c1 = 1. / 0.02 
     302          z1_c2 = 1. / 0.03 
     303          
     304          WHERE( pt_ice < rt0_snow ) ; zalb_snw = rn_alb_sdry - ( rn_alb_sdry - zalb_ice ) * EXP( - ph_snw * z1_c1 ); 
     305          ELSE WHERE                 ; zalb_snw = rn_alb_smlt - ( rn_alb_smlt - zalb_ice ) * EXP( - ph_snw * z1_c2 ); 
     306          END WHERE 
     307 
     308          ! Depth-dependent ponded ice albedo 
     309          IF ( ld_pnd ) THEN 
     310             zhref_pnd = 0.05        ! Characteristic length scale for thickness dependence of ponded ice albedo, Lecomte et al (2015) 
     311             zalb_pnd  = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd / zhref_pnd )  
     312          ELSE 
     313             zalb_pnd  = rn_alb_dpnd 
     314          ENDIF 
     315 
     316          ! Surface albedo is weighted mean of snow, ponds and bare ice contributions 
     317          pa_ice_os = zafrac_snw * zalb_snw  +  zafrac_pnd * zalb_pnd  +  zafrac_ice * zalb_ice 
     318           
     319          pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 ) 
    205320 
    206321      END SELECT 
    207322       
    208323      CALL wrk_dealloc( jpi,jpj,ijpl, zalb, zalb_it ) 
     324      CALL wrk_dealloc( jpi,jpj,ijpl, zalb_pnd, zalb_ice, zalb_snw ) 
     325      CALL wrk_dealloc( jpi,jpj,ijpl, zalb_pnd, zafrac_snw, zafrac_ice, zafrac_pnd ) 
    209326      ! 
    210327   END SUBROUTINE albedo_ice 
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90

    r7777 r8233  
    4848   USE limvar          ! Ice variables switch 
    4949   USE limctl          ! 
     50   ! MV MP 2016 
     51   USE limmp 
     52   ! END MV MP 2016 
     53 
    5054   USE limistate       ! LIM initial state 
    5155   USE limthd_sal      ! LIM ice thermodynamics: salinity 
     
    208212         CALL wrk_alloc( jpi,jpj,jpl, zalb_os, zalb_cs ) 
    209213          
    210                                       CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 
     214                                      CALL albedo_ice( t_su, ht_i, ht_s, a_ip_frac, h_ip, ln_pnd_rad, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos MV MP 2016 
     215 
    211216         SELECT CASE( ksbc ) 
    212217            CASE( jp_usr )   ;        CALL usrdef_sbc_ice_flx( kt ) ! user defined formulation 
     
    231236         ! --- zap this if no ice thermo --- ! 
    232237         IF( ln_limthd )              CALL lim_thd( kt )        ! -- Ice thermodynamics       
     238 
     239         ! MV MP 2016 
     240         IF ( ln_pnd )                CALL lim_mp( kt )         ! -- Melt ponds 
     241         ! END MV MP 2016 
     242 
    233243         IF( ln_limthd )              CALL lim_update2( kt )    ! -- Corrections 
    234244         ! --- 
     
    311321      ! 
    312322      CALL lim_thd_sal_init            ! set ice salinity parameters 
    313       ! 
     323        
     324      ! MV MP 2016 
     325      CALL lim_mp_init                 ! set melt ponds parameters 
     326      ! END MV MP 2016 
     327 
    314328      IF( ln_limdyn )   CALL lim_itd_me_init             ! ice thickness distribution initialization for mecanical deformation 
    315329      !                                ! Initial sea-ice state 
     
    620634      wfx_res(:,:) = 0._wp   ;   wfx_sub(:,:) = 0._wp 
    621635      wfx_spr(:,:) = 0._wp   ;   wfx_lam(:,:) = 0._wp   
     636 
     637      ! MV MP 2016 
     638      wfx_pnd(:,:) = 0._wp   ;   wfx_snw_sum(:,:) = 0._wp 
     639      ! END MV MP 2016 
    622640       
    623641      hfx_thd(:,:) = 0._wp   ; 
Note: See TracChangeset for help on using the changeset viewer.