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 14037 for NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/ICE/icedyn_adv_umx.F90 – NEMO

Ignore:
Timestamp:
2020-12-03T12:20:38+01:00 (3 years ago)
Author:
ayoung
Message:

Updated to trunk at 14020. Sette tests passed with change of results for configurations with non-linear ssh. Ticket #2506.

Location:
NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG

    • Property svn:externals
      •  

        old new  
        88 
        99# SETTE 
        10 ^/utils/CI/sette@13292        sette 
         10^/utils/CI/sette_wave@13990         sette 
  • NEMO/branches/2020/dev_r13333_KERNEL-08_techene_gm_HPG_SPG/src/ICE/icedyn_adv_umx.F90

    r13295 r14037  
    6060 
    6161   SUBROUTINE ice_dyn_adv_umx( kn_umx, kt, pu_ice, pv_ice, ph_i, ph_s, ph_ip,  & 
    62       &                        pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 
     62      &                        pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 
    6363      !!---------------------------------------------------------------------- 
    6464      !!                  ***  ROUTINE ice_dyn_adv_umx  *** 
     
    8585      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_ip      ! melt pond concentration 
    8686      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_ip      ! melt pond volume 
     87      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_il      ! melt pond lid volume 
    8788      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s       ! snw heat content 
    8889      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i       ! ice heat content 
     
    9192      INTEGER  ::   icycle                  ! number of sub-timestep for the advection 
    9293      REAL(wp) ::   zamsk                   ! 1 if advection of concentration, 0 if advection of other tracers 
    93       REAL(wp) ::   zdt, zvi_cen 
    94       REAL(wp), DIMENSION(1)           ::   zcflprv, zcflnow   ! for global communication 
    95       REAL(wp), DIMENSION(jpi,jpj)     ::   zudy, zvdx, zcu_box, zcv_box 
    96       REAL(wp), DIMENSION(jpi,jpj)     ::   zati1, zati2 
    97       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zu_cat, zv_cat 
    98       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zua_ho, zva_ho, zua_ups, zva_ups 
    99       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_ai , z1_aip, zhvar 
    100       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zhi_max, zhs_max, zhip_max 
     94      REAL(wp) ::   zdt, z1_dt, zvi_cen 
     95      REAL(wp), DIMENSION(1)                  ::   zcflprv, zcflnow   ! for global communication 
     96      REAL(wp), DIMENSION(jpi,jpj)            ::   zudy, zvdx, zcu_box, zcv_box 
     97      REAL(wp), DIMENSION(jpi,jpj)            ::   zati1, zati2 
     98      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zu_cat, zv_cat 
     99      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zua_ho, zva_ho, zua_ups, zva_ups 
     100      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   z1_ai , z1_aip, zhvar 
     101      REAL(wp), DIMENSION(jpi,jpj,jpl)        ::   zhi_max, zhs_max, zhip_max, zs_i, zsi_max 
     102      REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) ::   ze_i, zei_max 
     103      REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) ::   ze_s, zes_max 
    101104      ! 
    102105      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zuv_ho, zvv_ho, zuv_ups, zvv_ups, z1_vi, z1_vs  
     106      !! diagnostics 
     107      REAL(wp), DIMENSION(jpi,jpj)            ::   zdiag_adv_mass, zdiag_adv_salt, zdiag_adv_heat       
    103108      !!---------------------------------------------------------------------- 
    104109      ! 
    105110      IF( kt == nit000 .AND. lwp )   WRITE(numout,*) '-- ice_dyn_adv_umx: Ultimate-Macho advection scheme' 
    106111      ! 
    107       ! --- Record max of the surrounding 9-pts ice thick. (for call Hbig) --- ! 
    108       DO jl = 1, jpl 
    109          DO_2D( 0, 0, 0, 0 ) 
    110             zhip_max(ji,jj,jl) = MAX( epsi20, ph_ip(ji,jj,jl), ph_ip(ji+1,jj  ,jl), ph_ip(ji  ,jj+1,jl), & 
    111                &                                               ph_ip(ji-1,jj  ,jl), ph_ip(ji  ,jj-1,jl), & 
    112                &                                               ph_ip(ji+1,jj+1,jl), ph_ip(ji-1,jj-1,jl), & 
    113                &                                               ph_ip(ji+1,jj-1,jl), ph_ip(ji-1,jj+1,jl) ) 
    114             zhi_max (ji,jj,jl) = MAX( epsi20, ph_i (ji,jj,jl), ph_i (ji+1,jj  ,jl), ph_i (ji  ,jj+1,jl), & 
    115                &                                               ph_i (ji-1,jj  ,jl), ph_i (ji  ,jj-1,jl), & 
    116                &                                               ph_i (ji+1,jj+1,jl), ph_i (ji-1,jj-1,jl), & 
    117                &                                               ph_i (ji+1,jj-1,jl), ph_i (ji-1,jj+1,jl) ) 
    118             zhs_max (ji,jj,jl) = MAX( epsi20, ph_s (ji,jj,jl), ph_s (ji+1,jj  ,jl), ph_s (ji  ,jj+1,jl), & 
    119                &                                               ph_s (ji-1,jj  ,jl), ph_s (ji  ,jj-1,jl), & 
    120                &                                               ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 
    121                &                                               ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 
    122          END_2D 
    123       END DO 
    124       CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1.0_wp, zhs_max, 'T', 1.0_wp, zhip_max, 'T', 1.0_wp ) 
     112      ! --- Record max of the surrounding 9-pts (for call Hbig) --- ! 
     113      ! thickness and salinity 
     114      WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:) 
     115      ELSEWHERE                      ; zs_i(:,:,:) = 0._wp 
     116      END WHERE 
     117      CALL icemax3D( ph_i , zhi_max ) 
     118      CALL icemax3D( ph_s , zhs_max ) 
     119      CALL icemax3D( ph_ip, zhip_max) 
     120      CALL icemax3D( zs_i , zsi_max ) 
     121      CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1._wp, zhs_max, 'T', 1._wp, zhip_max, 'T', 1._wp, zsi_max, 'T', 1._wp ) 
     122      ! 
     123      ! enthalpies 
     124      DO jk = 1, nlay_i 
     125         WHERE( pv_i(:,:,:) >= epsi10 ) ; ze_i(:,:,jk,:) = pe_i(:,:,jk,:) / pv_i(:,:,:) 
     126         ELSEWHERE                      ; ze_i(:,:,jk,:) = 0._wp 
     127         END WHERE 
     128      END DO 
     129      DO jk = 1, nlay_s 
     130         WHERE( pv_s(:,:,:) >= epsi10 ) ; ze_s(:,:,jk,:) = pe_s(:,:,jk,:) / pv_s(:,:,:) 
     131         ELSEWHERE                      ; ze_s(:,:,jk,:) = 0._wp 
     132         END WHERE 
     133      END DO    
     134      CALL icemax4D( ze_i , zei_max ) 
     135      CALL icemax4D( ze_s , zes_max ) 
     136      CALL lbc_lnk( 'icedyn_adv_umx', zei_max, 'T', 1._wp ) 
     137      CALL lbc_lnk( 'icedyn_adv_umx', zes_max, 'T', 1._wp ) 
    125138      ! 
    126139      ! 
     
    138151      ENDIF 
    139152      zdt = rDt_ice / REAL(icycle) 
     153      z1_dt = 1._wp / zdt 
    140154 
    141155      ! --- transport --- ! 
     
    166180      !---------------! 
    167181      DO jt = 1, icycle 
     182 
     183         ! diagnostics 
     184         zdiag_adv_mass(:,:) =   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos & 
     185            &                  + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow 
     186         zdiag_adv_salt(:,:) =   SUM( psv_i(:,:,:) , dim=3 ) * rhoi 
     187         zdiag_adv_heat(:,:) = - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) & 
     188            &                  - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) 
    168189 
    169190         ! record at_i before advection (for open water) 
     
    318339         ! 
    319340         !== melt ponds ==! 
    320          IF ( ln_pnd_H12 ) THEN 
     341         IF ( ln_pnd_LEV .OR. ln_pnd_TOPO ) THEN 
    321342            ! concentration 
    322343            zamsk = 1._wp 
     
    328349            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy , zvdx , zua_ho , zva_ho , zcu_box, zcv_box, & 
    329350               &                                      zhvar, pv_ip, zua_ups, zva_ups ) 
     351            ! lid 
     352            IF ( ln_pnd_lids ) THEN 
     353               zamsk = 0._wp 
     354               zhvar(:,:,:) = pv_il(:,:,:) * z1_aip(:,:,:) 
     355               CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy , zvdx , zua_ho , zva_ho , zcu_box, zcv_box, & 
     356                  &                                      zhvar, pv_il, zua_ups, zva_ups ) 
     357            ENDIF 
    330358         ENDIF 
     359 
     360         ! --- Lateral boundary conditions --- ! 
     361         IF    ( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. ln_pnd_lids ) THEN 
     362            CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
     363               &                                , pa_ip,'T',1._wp, pv_ip,'T',1._wp, pv_il,'T',1._wp ) 
     364         ELSEIF( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. .NOT.ln_pnd_lids ) THEN 
     365            CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp & 
     366               &                                , pa_ip,'T',1._wp, pv_ip,'T',1._wp ) 
     367         ELSE 
     368            CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i,'T',1._wp, pv_i,'T',1._wp, pv_s,'T',1._wp, psv_i,'T',1._wp, poa_i,'T',1._wp ) 
     369         ENDIF 
     370         CALL lbc_lnk( 'icedyn_adv_umx', pe_i, 'T', 1._wp ) 
     371         CALL lbc_lnk( 'icedyn_adv_umx', pe_s, 'T', 1._wp ) 
    331372         ! 
    332373         !== Open water area ==! 
     
    336377               &                          - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 
    337378         END_2D 
    338          CALL lbc_lnk( 'icedyn_adv_umx', pato_i, 'T',  1.0_wp ) 
    339          ! 
     379         CALL lbc_lnk( 'icedyn_adv_umx', pato_i, 'T',  1._wp ) 
     380         ! 
     381         ! --- diagnostics --- ! 
     382         diag_adv_mass(:,:) = diag_adv_mass(:,:) + (   SUM( pv_i (:,:,:) , dim=3 ) * rhoi + SUM( pv_s (:,:,:) , dim=3 ) * rhos & 
     383            &                                        + SUM( pv_ip(:,:,:) , dim=3 ) * rhow + SUM( pv_il(:,:,:) , dim=3 ) * rhow & 
     384            &                                        - zdiag_adv_mass(:,:) ) * z1_dt 
     385         diag_adv_salt(:,:) = diag_adv_salt(:,:) + (   SUM( psv_i(:,:,:) , dim=3 ) * rhoi & 
     386            &                                        - zdiag_adv_salt(:,:) ) * z1_dt 
     387         diag_adv_heat(:,:) = diag_adv_heat(:,:) + ( - SUM(SUM( pe_i(:,:,1:nlay_i,:) , dim=4 ), dim=3 ) & 
     388            &                                        - SUM(SUM( pe_s(:,:,1:nlay_s,:) , dim=4 ), dim=3 ) & 
     389            &                                        - zdiag_adv_heat(:,:) ) * z1_dt 
    340390         ! 
    341391         ! --- Ensure non-negative fields and in-bound thicknesses --- ! 
    342392         ! Remove negative values (conservation is ensured) 
    343393         !    (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20) 
    344          CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 
     394         CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 
    345395         ! 
    346396         ! --- Make sure ice thickness is not too big --- ! 
    347397         !     (because ice thickness can be too large where ice concentration is very small) 
    348          CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 
     398         CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, & 
     399            &            pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 
    349400         ! 
    350401         ! --- Ensure snow load is not too big --- ! 
     
    396447      !!             work on H (and not V). It is partly related to the multi-category approach 
    397448      !!             Therefore, after advection we limit the thickness to the largest value of the 9-points around (only if ice 
    398       !!             concentration is small). Since we do not limit S and T, large values can occur at the edge but it does not really matter 
    399       !!             since sv_i and e_i are still good. 
     449      !!             concentration is small). We also limit S and T. 
    400450      !!---------------------------------------------------------------------- 
    401451      REAL(wp)                        , INTENT(in   )           ::   pamsk            ! advection of concentration (1) or other tracers (0) 
     
    441491      IF( pamsk == 0._wp ) THEN 
    442492         DO jl = 1, jpl 
    443             DO_2D( 1, 0, 1, 0 ) 
     493            DO_2D( 0, 0, 1, 0 ) 
    444494               IF( ABS( pu(ji,jj) ) > epsi10 ) THEN 
    445495                  zfu_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) * puc    (ji,jj,jl) / pu(ji,jj) 
     
    450500               ENDIF 
    451501               ! 
     502            END_2D 
     503            DO_2D( 1, 0, 0, 0 ) 
    452504               IF( ABS( pv(ji,jj) ) > epsi10 ) THEN 
    453505                  zfv_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) * pvc    (ji,jj,jl) / pv(ji,jj) 
     
    484536      IF( PRESENT( pua_ho ) ) THEN 
    485537         DO jl = 1, jpl 
    486             DO_2D( 1, 0, 1, 0 ) 
    487                pua_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) ; pva_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) 
    488                pua_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) ; pva_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) 
     538            DO_2D( 0, 0, 1, 0 ) 
     539               pua_ho (ji,jj,jl) = zfu_ho (ji,jj,jl) 
     540               pua_ups(ji,jj,jl) = zfu_ups(ji,jj,jl) 
     541            END_2D 
     542            DO_2D( 1, 0, 0, 0 ) 
     543               pva_ho (ji,jj,jl) = zfv_ho (ji,jj,jl) 
     544               pva_ups(ji,jj,jl) = zfv_ups(ji,jj,jl) 
    489545            END_2D 
    490546         END DO 
     
    500556         END_2D 
    501557      END DO 
    502       CALL lbc_lnk( 'icedyn_adv_umx', ptc, 'T',  1.0_wp ) 
    503558      ! 
    504559   END SUBROUTINE adv_umx 
     
    539594            ! 
    540595            DO jl = 1, jpl              !-- flux in x-direction 
    541                DO_2D( 1, 0, 1, 0 ) 
     596               DO_2D( 1, 1, 1, 0 ) 
    542597                  pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * pt(ji+1,jj,jl) 
    543598               END_2D 
     
    545600            ! 
    546601            DO jl = 1, jpl              !-- first guess of tracer from u-flux 
    547                DO_2D( 0, 0, 0, 0 ) 
     602               DO_2D( 1, 1, 0, 0 ) 
    548603                  ztra = - ( pfu_ups(ji,jj,jl) - pfu_ups(ji-1,jj,jl) )              & 
    549604                     &   + ( pu     (ji,jj   ) - pu     (ji-1,jj   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    552607               END_2D 
    553608            END DO 
    554             CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    555609            ! 
    556610            DO jl = 1, jpl              !-- flux in y-direction 
    557                DO_2D( 1, 0, 1, 0 ) 
     611               DO_2D( 1, 0, 0, 0 ) 
    558612                  pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * zpt(ji,jj+1,jl) 
    559613               END_2D 
     
    563617            ! 
    564618            DO jl = 1, jpl              !-- flux in y-direction 
    565                DO_2D( 1, 0, 1, 0 ) 
     619               DO_2D( 1, 0, 1, 1 ) 
    566620                  pfv_ups(ji,jj,jl) = MAX( pv(ji,jj), 0._wp ) * pt(ji,jj,jl) + MIN( pv(ji,jj), 0._wp ) * pt(ji,jj+1,jl) 
    567621               END_2D 
     
    569623            ! 
    570624            DO jl = 1, jpl              !-- first guess of tracer from v-flux 
    571                DO_2D( 0, 0, 0, 0 ) 
     625               DO_2D( 0, 0, 1, 1 ) 
    572626                  ztra = - ( pfv_ups(ji,jj,jl) - pfv_ups(ji,jj-1,jl) )  & 
    573627                     &   + ( pv     (ji,jj   ) - pv     (ji,jj-1   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    576630               END_2D 
    577631            END DO 
    578             CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    579632            ! 
    580633            DO jl = 1, jpl              !-- flux in x-direction 
    581                DO_2D( 1, 0, 1, 0 ) 
     634               DO_2D( 0, 0, 1, 0 ) 
    582635                  pfu_ups(ji,jj,jl) = MAX( pu(ji,jj), 0._wp ) * zpt(ji,jj,jl) + MIN( pu(ji,jj), 0._wp ) * zpt(ji+1,jj,jl) 
    583636               END_2D 
     
    628681         ! 
    629682         DO jl = 1, jpl 
    630             DO_2D( 1, 0, 1, 0 ) 
     683            DO_2D( 1, 1, 1, 0 ) 
    631684               pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj  ,jl) ) 
     685            END_2D 
     686            DO_2D( 1, 0, 1, 1 ) 
    632687               pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji  ,jj+1,jl) ) 
    633688            END_2D 
     
    646701            ! 
    647702            DO jl = 1, jpl              !-- flux in x-direction 
    648                DO_2D( 1, 0, 1, 0 ) 
     703               DO_2D( 1, 1, 1, 0 ) 
    649704                  pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( pt(ji,jj,jl) + pt(ji+1,jj,jl) ) 
    650705               END_2D 
     
    653708 
    654709            DO jl = 1, jpl              !-- first guess of tracer from u-flux 
    655                DO_2D( 0, 0, 0, 0 ) 
     710               DO_2D( 1, 1, 0, 0 ) 
    656711                  ztra = - ( pfu_ho(ji,jj,jl) - pfu_ho(ji-1,jj,jl) )              & 
    657712                     &   + ( pu    (ji,jj   ) - pu    (ji-1,jj   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    660715               END_2D 
    661716            END DO 
    662             CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    663717 
    664718            DO jl = 1, jpl              !-- flux in y-direction 
    665                DO_2D( 1, 0, 1, 0 ) 
     719               DO_2D( 1, 0, 0, 0 ) 
    666720                  pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji,jj+1,jl) ) 
    667721               END_2D 
     
    672726            ! 
    673727            DO jl = 1, jpl              !-- flux in y-direction 
    674                DO_2D( 1, 0, 1, 0 ) 
     728               DO_2D( 1, 0, 1, 1 ) 
    675729                  pfv_ho(ji,jj,jl) = 0.5_wp * pv(ji,jj) * ( pt(ji,jj,jl) + pt(ji,jj+1,jl) ) 
    676730               END_2D 
     
    679733            ! 
    680734            DO jl = 1, jpl              !-- first guess of tracer from v-flux 
    681                DO_2D( 0, 0, 0, 0 ) 
     735               DO_2D( 0, 0, 1, 1 ) 
    682736                  ztra = - ( pfv_ho(ji,jj,jl) - pfv_ho(ji,jj-1,jl) )  & 
    683737                     &   + ( pv    (ji,jj   ) - pv    (ji,jj-1   ) ) * pt(ji,jj,jl) * (1.-pamsk) 
     
    686740               END_2D 
    687741            END DO 
    688             CALL lbc_lnk( 'icedyn_adv_umx', zpt, 'T', 1.0_wp ) 
    689742            ! 
    690743            DO jl = 1, jpl              !-- flux in x-direction 
    691                DO_2D( 1, 0, 1, 0 ) 
     744               DO_2D( 0, 0, 1, 0 ) 
    692745                  pfu_ho(ji,jj,jl) = 0.5_wp * pu(ji,jj) * ( zpt(ji,jj,jl) + zpt(ji+1,jj,jl) ) 
    693746               END_2D 
     
    846899         !         
    847900         DO jl = 1, jpl 
    848             DO_2D( 1, 0, 1, 0 ) 
     901            DO_2D( 0, 0, 1, 0 ) 
    849902               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
    850903                  &                                         - SIGN( 1._wp, pu(ji,jj) ) * ( pt(ji+1,jj,jl) - pt(ji,jj,jl) ) ) 
     
    855908         ! 
    856909         DO jl = 1, jpl 
    857             DO_2D( 1, 0, 1, 0 ) 
     910            DO_2D( 0, 0, 1, 0 ) 
    858911               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    859912               pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     
    865918         ! 
    866919         DO jl = 1, jpl 
    867             DO_2D( 1, 0, 1, 0 ) 
     920            DO_2D( 0, 0, 1, 0 ) 
    868921               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    869922               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    879932         ! 
    880933         DO jl = 1, jpl 
    881             DO_2D( 1, 0, 1, 0 ) 
     934            DO_2D( 0, 0, 1, 0 ) 
    882935               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    883936               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    893946         ! 
    894947         DO jl = 1, jpl 
    895             DO_2D( 1, 0, 1, 0 ) 
     948            DO_2D( 0, 0, 1, 0 ) 
    896949               zcu  = pu(ji,jj) * r1_e2u(ji,jj) * pdt * r1_e1u(ji,jj) 
    897950               zdx2 = e1u(ji,jj) * e1u(ji,jj) 
     
    914967      IF( ll_neg ) THEN 
    915968         DO jl = 1, jpl 
    916             DO_2D( 1, 0, 1, 0 ) 
     969            DO_2D( 0, 0, 1, 0 ) 
    917970               IF( pt_u(ji,jj,jl) < 0._wp .OR. ( imsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 
    918971                  pt_u(ji,jj,jl) = 0.5_wp * umask(ji,jj,1) * (                                pt(ji+1,jj,jl) + pt(ji,jj,jl)   & 
     
    924977      !                                                     !-- High order flux in i-direction  --! 
    925978      DO jl = 1, jpl 
    926          DO_2D( 1, 0, 1, 0 ) 
     979         DO_2D( 0, 0, 1, 0 ) 
    927980            pfu_ho(ji,jj,jl) = pu(ji,jj) * pt_u(ji,jj,jl) 
    928981         END_2D 
     
    9571010      !                                                     !--  Laplacian in j-direction  --! 
    9581011      DO jl = 1, jpl 
    959          DO_2D( 1, 0, 0, 0 ) 
     1012         DO_2D( 1, 0, 0, 0 )         ! First derivative (gradient) 
    9601013            ztv1(ji,jj,jl) = ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
    9611014         END_2D 
    962          DO_2D( 0, 0, 0, 0 ) 
     1015         DO_2D( 0, 0, 0, 0 )         ! Second derivative (Laplacian) 
    9631016            ztv2(ji,jj,jl) = ( ztv1(ji,jj,jl) - ztv1(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
    9641017         END_2D 
     
    9681021      !                                                     !--  BiLaplacian in j-direction  --! 
    9691022      DO jl = 1, jpl 
    970          DO_2D( 1, 0, 0, 0 ) 
     1023         DO_2D( 1, 0, 0, 0 )         ! First derivative 
    9711024            ztv3(ji,jj,jl) = ( ztv2(ji,jj+1,jl) - ztv2(ji,jj,jl) ) * r1_e2v(ji,jj) * vmask(ji,jj,1) 
    9721025         END_2D 
    973          DO_2D( 0, 0, 0, 0 ) 
     1026         DO_2D( 0, 0, 0, 0 )         ! Second derivative 
    9741027            ztv4(ji,jj,jl) = ( ztv3(ji,jj,jl) - ztv3(ji,jj-1,jl) ) * r1_e2t(ji,jj) 
    9751028         END_2D 
     
    9821035      CASE( 1 )                                                !==  1st order central TIM  ==! (Eq. 21) 
    9831036         DO jl = 1, jpl 
    984             DO_2D( 1, 0, 1, 0 ) 
     1037            DO_2D( 1, 0, 0, 0 ) 
    9851038               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   & 
    9861039                  &                                         - SIGN( 1._wp, pv(ji,jj) ) * ( pt(ji,jj+1,jl) - pt(ji,jj,jl) ) ) 
     
    9901043      CASE( 2 )                                                !==  2nd order central TIM  ==! (Eq. 23) 
    9911044         DO jl = 1, jpl 
    992             DO_2D( 1, 0, 1, 0 ) 
     1045            DO_2D( 1, 0, 0, 0 ) 
    9931046               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    9941047               pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                                pt(ji,jj+1,jl) + pt(ji,jj,jl)   & 
     
    9991052      CASE( 3 )                                                !==  3rd order central TIM  ==! (Eq. 24) 
    10001053         DO jl = 1, jpl 
    1001             DO_2D( 1, 0, 1, 0 ) 
     1054            DO_2D( 1, 0, 0, 0 ) 
    10021055               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10031056               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10121065      CASE( 4 )                                                !==  4th order central TIM  ==! (Eq. 27) 
    10131066         DO jl = 1, jpl 
    1014             DO_2D( 1, 0, 1, 0 ) 
     1067            DO_2D( 1, 0, 0, 0 ) 
    10151068               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10161069               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10251078      CASE( 5 )                                                !==  5th order central TIM  ==! (Eq. 29) 
    10261079         DO jl = 1, jpl 
    1027             DO_2D( 1, 0, 1, 0 ) 
     1080            DO_2D( 1, 0, 0, 0 ) 
    10281081               zcv  = pv(ji,jj) * r1_e1v(ji,jj) * pdt * r1_e2v(ji,jj) 
    10291082               zdy2 = e2v(ji,jj) * e2v(ji,jj) 
     
    10461099      IF( ll_neg ) THEN 
    10471100         DO jl = 1, jpl 
    1048             DO_2D( 1, 0, 1, 0 ) 
     1101            DO_2D( 1, 0, 0, 0 ) 
    10491102               IF( pt_v(ji,jj,jl) < 0._wp .OR. ( jmsk_small(ji,jj,jl) == 0 .AND. pamsk == 0. ) ) THEN 
    10501103                  pt_v(ji,jj,jl) = 0.5_wp * vmask(ji,jj,1) * (                              ( pt(ji,jj+1,jl) + pt(ji,jj,jl) )  & 
     
    10561109      !                                                     !-- High order flux in j-direction  --! 
    10571110      DO jl = 1, jpl 
    1058          DO_2D( 1, 0, 1, 0 ) 
     1111         DO_2D( 1, 0, 0, 0 ) 
    10591112            pfv_ho(ji,jj,jl) = pv(ji,jj) * pt_v(ji,jj,jl) 
    10601113         END_2D 
     
    10921145      ! -------------------------------------------------- 
    10931146      DO jl = 1, jpl 
    1094          DO_2D( 1, 0, 1, 0 ) 
     1147         DO_2D( 0, 0, 1, 0 ) 
    10951148            pfu_ho(ji,jj,jl) = pfu_ho(ji,jj,jl) - pfu_ups(ji,jj,jl) 
     1149         END_2D 
     1150         DO_2D( 1, 0, 0, 0 ) 
    10961151            pfv_ho(ji,jj,jl) = pfv_ho(ji,jj,jl) - pfv_ups(ji,jj,jl) 
    10971152         END_2D 
     
    11991254      ! --------------------------------- 
    12001255      DO jl = 1, jpl 
    1201          DO_2D( 1, 0, 1, 0 ) 
     1256         DO_2D( 0, 0, 1, 0 ) 
    12021257            zau = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji+1,jj,jl) ) 
    12031258            zbu = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji+1,jj,jl) ) 
     
    12101265         END_2D 
    12111266 
    1212          DO_2D( 1, 0, 1, 0 ) 
     1267         DO_2D( 1, 0, 0, 0 ) 
    12131268            zav = MIN( 1._wp , zbetdo(ji,jj,jl) , zbetup(ji,jj+1,jl) ) 
    12141269            zbv = MIN( 1._wp , zbetup(ji,jj,jl) , zbetdo(ji,jj+1,jl) ) 
     
    14091464 
    14101465 
    1411    SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 
     1466   SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, & 
     1467      &                  pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 
    14121468      !!------------------------------------------------------------------- 
    14131469      !!                  ***  ROUTINE Hbig  *** 
     
    14231479      !! ** input   : Max thickness of the surrounding 9-points 
    14241480      !!------------------------------------------------------------------- 
    1425       REAL(wp)                    , INTENT(in   ) ::   pdt                          ! tracer time-step 
    1426       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   phi_max, phs_max, phip_max   ! max ice thick from surrounding 9-pts 
    1427       REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i, pv_s, pa_i, pa_ip, pv_ip 
     1481      REAL(wp)                    , INTENT(in   ) ::   pdt                                   ! tracer time-step 
     1482      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   phi_max, phs_max, phip_max, psi_max   ! max ice thick from surrounding 9-pts 
     1483      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pes_max 
     1484      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pei_max 
     1485      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i 
    14281486      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s 
    1429       ! 
    1430       INTEGER  ::   ji, jj, jl         ! dummy loop indices 
    1431       REAL(wp) ::   z1_dt, zhip, zhi, zhs, zfra 
     1487      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i 
     1488      ! 
     1489      INTEGER  ::   ji, jj, jk, jl         ! dummy loop indices 
     1490      REAL(wp) ::   z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra 
    14321491      !!------------------------------------------------------------------- 
    14331492      ! 
     
    14351494      ! 
    14361495      DO jl = 1, jpl 
    1437  
    14381496         DO_2D( 1, 1, 1, 1 ) 
    14391497            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 
     
    14411499               !                               ! -- check h_ip -- ! 
    14421500               ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 
    1443                IF( ln_pnd_H12 .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 
     1501               IF( ( ln_pnd_LEV .OR. ln_pnd_TOPO ) .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 
    14441502                  zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 
    14451503                  IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN 
     
    14681526               ENDIF            
    14691527               !                   
     1528               !                               ! -- check s_i -- ! 
     1529               ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean 
     1530               zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl) 
     1531               IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 
     1532                  zfra = psi_max(ji,jj,jl) / zsi 
     1533                  sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt 
     1534                  psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra 
     1535               ENDIF 
     1536               ! 
    14701537            ENDIF 
    14711538         END_2D 
    14721539      END DO  
     1540      ! 
     1541      !                                           ! -- check e_i/v_i -- ! 
     1542      DO jl = 1, jpl 
     1543         DO_3D( 1, 1, 1, 1, 1, nlay_i ) 
     1544            IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 
     1545               ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 
     1546               zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl) 
     1547               IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 
     1548                  zfra = pei_max(ji,jj,jk,jl) / zei 
     1549                  hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 
     1550                  pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra 
     1551               ENDIF 
     1552            ENDIF 
     1553         END_3D 
     1554      END DO 
     1555      !                                           ! -- check e_s/v_s -- ! 
     1556      DO jl = 1, jpl 
     1557         DO_3D( 1, 1, 1, 1, 1, nlay_s ) 
     1558            IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 
     1559               ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 
     1560               zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl) 
     1561               IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 
     1562                  zfra = pes_max(ji,jj,jk,jl) / zes 
     1563                  hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 
     1564                  pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra 
     1565               ENDIF 
     1566            ENDIF 
     1567         END_3D 
     1568      END DO 
    14731569      ! 
    14741570   END SUBROUTINE Hbig 
     
    15261622   END SUBROUTINE Hsnow 
    15271623 
     1624   SUBROUTINE icemax3D( pice , pmax ) 
     1625      !!--------------------------------------------------------------------- 
     1626      !!                   ***  ROUTINE icemax3D ***                      
     1627      !! ** Purpose :  compute the max of the 9 points around 
     1628      !!---------------------------------------------------------------------- 
     1629      REAL(wp), DIMENSION(:,:,:)      , INTENT(in ) ::   pice   ! input 
     1630      REAL(wp), DIMENSION(:,:,:)      , INTENT(out) ::   pmax   ! output 
     1631      REAL(wp), DIMENSION(2:jpim1,jpj)              ::   zmax   ! temporary array 
     1632      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
     1633      !!---------------------------------------------------------------------- 
     1634      DO jl = 1, jpl 
     1635         DO jj = Njs0-1, Nje0+1     
     1636            DO ji = Nis0, Nie0 
     1637               zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jl), pice(ji-1,jj,jl), pice(ji+1,jj,jl) ) 
     1638            END DO 
     1639         END DO 
     1640         DO jj = Njs0, Nje0     
     1641            DO ji = Nis0, Nie0 
     1642               pmax(ji,jj,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 
     1643            END DO 
     1644         END DO 
     1645      END DO 
     1646   END SUBROUTINE icemax3D 
     1647 
     1648   SUBROUTINE icemax4D( pice , pmax ) 
     1649      !!--------------------------------------------------------------------- 
     1650      !!                   ***  ROUTINE icemax4D ***                      
     1651      !! ** Purpose :  compute the max of the 9 points around 
     1652      !!---------------------------------------------------------------------- 
     1653      REAL(wp), DIMENSION(:,:,:,:)    , INTENT(in ) ::   pice   ! input 
     1654      REAL(wp), DIMENSION(:,:,:,:)    , INTENT(out) ::   pmax   ! output 
     1655      REAL(wp), DIMENSION(2:jpim1,jpj)              ::   zmax   ! temporary array 
     1656      INTEGER  ::   jlay, ji, jj, jk, jl   ! dummy loop indices 
     1657      !!---------------------------------------------------------------------- 
     1658      jlay = SIZE( pice , 3 )   ! size of input arrays 
     1659      DO jl = 1, jpl 
     1660         DO jk = 1, jlay 
     1661            DO jj = Njs0-1, Nje0+1     
     1662               DO ji = Nis0, Nie0 
     1663                  zmax(ji,jj) = MAX( epsi20, pice(ji,jj,jk,jl), pice(ji-1,jj,jk,jl), pice(ji+1,jj,jk,jl) ) 
     1664               END DO 
     1665            END DO 
     1666            DO jj = Njs0, Nje0     
     1667               DO ji = Nis0, Nie0 
     1668                  pmax(ji,jj,jk,jl) = MAX( epsi20, zmax(ji,jj), zmax(ji,jj-1), zmax(ji,jj+1) ) 
     1669               END DO 
     1670            END DO 
     1671         END DO 
     1672      END DO 
     1673   END SUBROUTINE icemax4D 
    15281674 
    15291675#else 
Note: See TracChangeset for help on using the changeset viewer.