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 13766 for NEMO/branches/2020/dev_12905_xios_ancil/src/OCE/ISF/isfcpl.F90 – NEMO

Ignore:
Timestamp:
2020-11-10T12:57:08+01:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2475: merge with trunk rev 13688

Location:
NEMO/branches/2020/dev_12905_xios_ancil
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_12905_xios_ancil

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
        88 
        99# SETTE 
        10 ^/utils/CI/sette@HEAD         sette 
         10^/utils/CI/sette@13559        sette 
  • NEMO/branches/2020/dev_12905_xios_ancil/src/OCE/ISF/isfcpl.F90

    r13016 r13766  
    1515   USE isfutils, ONLY : debug 
    1616   USE lib_mpp , ONLY: mpp_sum, mpp_max ! mpp routine 
     17#if ! defined key_qco 
    1718   USE domvvl  , ONLY: dom_vvl_zgr      ! vertical scale factor interpolation 
    18    USE domngb  , ONLY: dom_ngb          ! find the closest grid point from a given lon/lat position 
     19#else 
     20   USE domqco   , ONLY: dom_qco_zgr      ! vertical scale factor interpolation 
     21#endif 
     22   USE domutl  , ONLY: dom_ngb          ! find the closest grid point from a given lon/lat position 
    1923   ! 
    2024   USE oce            ! ocean dynamics and tracers 
     
    4347   !! * Substitutions 
    4448#  include "do_loop_substitute.h90" 
     49#  include "domzgr_substitute.h90" 
    4550   !!---------------------------------------------------------------------- 
    4651   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    112117      vv   (:,:,:,Kbb)   = vv   (:,:,:,Kmm) 
    113118      ssh (:,:,Kbb)     = ssh (:,:,Kmm) 
     119#if ! defined key_qco 
    114120      e3t(:,:,:,Kbb)   = e3t(:,:,:,Kmm) 
    115   
     121#endif  
    116122      ! prepare writing restart 
    117123      IF( lwxios ) THEN 
     
    135141      INTEGER, INTENT(in) :: Kmm    ! ocean time level index 
    136142      !!---------------------------------------------------------------------- 
     143      INTEGER :: jk                               ! loop index 
     144      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t, ze3u, ze3v, zgdepw  ! e3t , e3u, e3v !!st patch to use substitution 
     145      !!---------------------------------------------------------------------- 
     146      ! 
     147      DO jk = 1, jpk 
     148         ze3t(:,:,jk) = e3t(:,:,jk,Kmm) 
     149         ze3u(:,:,jk) = e3u(:,:,jk,Kmm) 
     150         ze3v(:,:,jk) = e3v(:,:,jk,Kmm) 
     151         ! 
     152         zgdepw(:,:,jk) = gdepw(:,:,jk,Kmm) 
     153      END DO  
    137154      ! 
    138155      IF( lwxios ) CALL iom_swap( cwxios_context ) 
    139156      CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask , ldxios = lwxios ) 
    140157      CALL iom_rstput( kt, nitrst, numrow, 'ssmask' , ssmask, ldxios = lwxios ) 
    141       CALL iom_rstput( kt, nitrst, numrow, 'e3t_n'  , e3t(:,:,:,Kmm) , ldxios = lwxios ) 
    142       CALL iom_rstput( kt, nitrst, numrow, 'e3u_n'  , e3u(:,:,:,Kmm) , ldxios = lwxios ) 
    143       CALL iom_rstput( kt, nitrst, numrow, 'e3v_n'  , e3v(:,:,:,Kmm) , ldxios = lwxios ) 
    144       CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', gdepw(:,:,:,Kmm) , ldxios = lwxios ) 
     158      CALL iom_rstput( kt, nitrst, numrow, 'e3t_n'  , ze3t , ldxios = lwxios ) 
     159      CALL iom_rstput( kt, nitrst, numrow, 'e3u_n'  , ze3u , ldxios = lwxios ) 
     160      CALL iom_rstput( kt, nitrst, numrow, 'e3v_n'  , ze3v , ldxios = lwxios ) 
     161      CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', zgdepw , ldxios = lwxios ) 
    145162      IF( lwxios ) CALL iom_swap( cxios_context ) 
    146163      ! 
     
    167184      ! 
    168185      IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    169       CALL iom_get( numror, jpdom_autoglo, 'ssmask'  , zssmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
     186      CALL iom_get( numror, jpdom_auto, 'ssmask'  , zssmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
    170187      IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    171188 
     
    179196         ! 
    180197         zdssmask(:,:) = ssmask(:,:) - zssmask0(:,:) 
    181          DO_2D_00_00 
     198         DO_2D( 0, 0, 0, 0 ) 
    182199            jip1=ji+1; jim1=ji-1; 
    183200            jjp1=jj+1; jjm1=jj-1; 
     
    197214         zssmask0(:,:) = zssmask_b(:,:) 
    198215         ! 
    199          CALL lbc_lnk_multi( 'iscplrst', zssh, 'T', 1., zssmask0, 'T', 1. ) 
     216         CALL lbc_lnk_multi( 'iscplrst', zssh, 'T', 1.0_wp, zssmask0, 'T', 1.0_wp ) 
    200217         ! 
    201218      END DO 
     
    211228      IF(lwp) write(numout,*) 'isfcpl_ssh : recompute scale factor from ssh (new wet cell,Kmm)' 
    212229      IF(lwp) write(numout,*) '~~~~~~~~~~~' 
     230#if ! defined key_qco 
    213231      DO jk = 1, jpk 
    214          e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) & 
    215              &                          / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk)   & 
    216              &          + e3t_0(:,:,jk)                               * (1._wp -tmask(:,:,jk)) 
     232         e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( 1._wp + (ht_0(:,:) + ssh(:,:,Kmm)) * r1_ht_0(:,:) ) 
    217233      END DO 
    218234      e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    219235      CALL dom_vvl_zgr(Kbb, Kmm, Kaa) 
     236#else 
     237      CALL dom_qco_zgr(Kbb, Kmm, Kaa) 
     238#endif 
    220239      ! 
    221240   END SUBROUTINE isfcpl_ssh 
     
    248267      ! 
    249268      IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    250       CALL iom_get( numror, jpdom_autoglo, 'tmask'  , ztmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
    251       !CALL iom_get( numror, jpdom_autoglo, 'wmask'  , zwmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
    252       !CALL iom_get( numror, jpdom_autoglo, 'gdepw_n', zdepw_b(:,:,:), ldxios = lrxios ) ! need to interpol vertical profile (vvl) 
     269      CALL iom_get( numror, jpdom_auto, 'tmask'  , ztmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
     270      !CALL iom_get( numror, jpdom_auto, 'wmask'  , zwmask_b, ldxios = lrxios   ) ! need to extrapolate T/S 
     271      !CALL iom_get( numror, jpdom_auto, 'gdepw_n', zdepw_b(:,:,:), ldxios = lrxios ) ! need to interpol vertical profile (vvl) 
    253272      IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    254273      ! 
     
    302321            zdmask(:,:) = tmask(:,:,jk) - ztmask0(:,:,jk); 
    303322            ! 
    304             DO_2D_00_00 
     323            DO_2D( 0, 0, 0, 0 ) 
    305324               jip1=ji+1; jim1=ji-1; 
    306325               jjp1=jj+1; jjm1=jj-1; 
     
    352371         ztmask0(:,:,:) = ztmask1(:,:,:) 
    353372         ! 
    354          CALL lbc_lnk_multi( 'iscplrst', zts0(:,:,:,jp_tem), 'T', 1., zts0(:,:,:,jp_sal), 'T', 1., ztmask0, 'T', 1.) 
     373         CALL lbc_lnk_multi( 'iscplrst', zts0(:,:,:,jp_tem), 'T', 1.0_wp, zts0(:,:,:,jp_sal), 'T', 1.0_wp, ztmask0, 'T', 1.0_wp) 
    355374         ! 
    356375      END DO  ! nn_drown 
     
    363382      ! ----------------------------------------------------------------------------------------- 
    364383      ! case we open a cell but no neigbour cells available to get an estimate of T and S 
    365       DO_3D_11_11( 1,jpk-1 ) 
     384      DO_3D( 1, 1, 1, 1, 1,jpk-1 ) 
    366385         IF (tmask(ji,jj,jk) == 1._wp .AND. ts(ji,jj,jk,2,Kmm) == 0._wp)              & 
    367386            &   CALL ctl_stop('STOP', 'failing to fill all new weet cell,     & 
     
    396415      ! 
    397416      IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    398       CALL iom_get( numror, jpdom_autoglo, 'tmask'  , ztmask_b, ldxios = lrxios ) 
    399       CALL iom_get( numror, jpdom_autoglo, 'e3u_n'  , ze3u_b  , ldxios = lrxios ) 
    400       CALL iom_get( numror, jpdom_autoglo, 'e3v_n'  , ze3v_b  , ldxios = lrxios ) 
     417      CALL iom_get( numror, jpdom_auto, 'tmask'  , ztmask_b, ldxios = lrxios ) 
     418      CALL iom_get( numror, jpdom_auto, 'e3u_n'  , ze3u_b  , ldxios = lrxios ) 
     419      CALL iom_get( numror, jpdom_auto, 'e3v_n'  , ze3v_b  , ldxios = lrxios ) 
    401420      IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    402421      ! 
     
    405424      DO jk = 1, jpk                                 ! Horizontal slab 
    406425         ! 1.1: get volume flux before coupling (>0 out) 
    407          DO_2D_00_00 
    408             zqvolb(ji,jj,jk) =  (   e2u(ji,jj) * ze3u_b(ji,jj,jk) * uu(ji,jj,jk,Kmm) - e2u(ji-1,jj  ) * ze3u_b(ji-1,jj  ,jk) * uu(ji-1,jj  ,jk,Kmm)    & 
    409                &                  + e1v(ji,jj) * ze3v_b(ji,jj,jk) * vv(ji,jj,jk,Kmm) - e1v(ji  ,jj-1) * ze3v_b(ji  ,jj-1,jk) * vv(ji  ,jj-1,jk,Kmm)  ) & 
     426         DO_2D( 0, 0, 0, 0 ) 
     427            zqvolb(ji,jj,jk) =    & 
     428               &  (   e2u(ji  ,jj  ) * ze3u_b(ji  ,jj  ,jk) * uu(ji  ,jj  ,jk,Kmm)      & 
     429               &    - e2u(ji-1,jj  ) * ze3u_b(ji-1,jj  ,jk) * uu(ji-1,jj  ,jk,Kmm)      & 
     430               &    + e1v(ji  ,jj  ) * ze3v_b(ji  ,jj  ,jk) * vv(ji  ,jj  ,jk,Kmm)      & 
     431               &    - e1v(ji  ,jj-1) * ze3v_b(ji  ,jj-1,jk) * vv(ji  ,jj-1,jk,Kmm)  )   & 
    410432               &                * ztmask_b(ji,jj,jk) 
    411433         END_2D 
     
    417439         vv(:,:,jk,Kmm) = vv(:,:,jk,Kmm) * vmask(:,:,jk) 
    418440         ! compute volume flux divergence after coupling 
    419          DO_2D_00_00 
    420             zqvoln(ji,jj,jk) = (   e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm) - e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * uu(ji-1,jj  ,jk,Kmm)    & 
    421                &                 + e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) - e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * vv(ji  ,jj-1,jk,Kmm)  ) & 
     441         DO_2D( 0, 0, 0, 0 ) 
     442            zqvoln(ji,jj,jk) =   & 
     443               &  (   e2u(ji  ,jj  ) * e3u(ji  ,jj  ,jk,Kmm) * uu(ji  ,jj  ,jk,Kmm)    & 
     444               &    - e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * uu(ji-1,jj  ,jk,Kmm)    & 
     445               &    + e1v(ji  ,jj  ) * e3v(ji  ,jj  ,jk,Kmm) * vv(ji  ,jj  ,jk,Kmm)    & 
     446               &    - e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * vv(ji  ,jj-1,jk,Kmm)  ) & 
    422447               &               * tmask(ji,jj,jk) 
    423448         END_2D 
     
    430455      ! 2.0: include the contribution of the vertical velocity in the volume flux correction 
    431456      ! 
    432       DO_2D_00_00 
     457      DO_2D( 0, 0, 0, 0 ) 
    433458         ! 
    434459         ikt = mikt(ji,jj) 
     
    439464      END_2D 
    440465      ! 
    441       CALL lbc_lnk( 'iscpl', risfcpl_vol, 'T', 1. ) 
     466      CALL lbc_lnk( 'iscpl', risfcpl_vol, 'T', 1.0_wp ) 
    442467      ! 
    443468      ! 3.0: set total correction (div, tr(:,:,:,:,Krhs), ssh) 
     
    502527      ! get restart variable 
    503528      IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    504       CALL iom_get( numror, jpdom_autoglo, 'tmask'  , ztmask_b(:,:,:), ldxios = lrxios   ) ! need to extrapolate T/S 
    505       CALL iom_get( numror, jpdom_autoglo, 'e3t_n'  , ze3t_b(:,:,:)  , ldxios = lrxios ) 
    506       CALL iom_get( numror, jpdom_autoglo, 'tn'     , zt_b(:,:,:)    , ldxios = lrxios ) 
    507       CALL iom_get( numror, jpdom_autoglo, 'sn'     , zs_b(:,:,:)    , ldxios = lrxios ) 
     529      CALL iom_get( numror, jpdom_auto, 'tmask'  , ztmask_b(:,:,:), ldxios = lrxios   ) ! need to extrapolate T/S 
     530      CALL iom_get( numror, jpdom_auto, 'e3t_n'  , ze3t_b(:,:,:)  , ldxios = lrxios ) 
     531      CALL iom_get( numror, jpdom_auto, 'tn'     , zt_b(:,:,:)    , ldxios = lrxios ) 
     532      CALL iom_get( numror, jpdom_auto, 'sn'     , zs_b(:,:,:)    , ldxios = lrxios ) 
    508533      IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    509534 
     
    527552 
    528553      DO jk = 1,jpk-1 
    529          DO jj = nldj,nlej 
    530             DO ji = nldi,nlei 
     554         DO jj = Njs0,Nje0 
     555            DO ji = Nis0,Nie0 
    531556 
    532557               ! volume diff 
    533                zdvol = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) - ze3t_b(ji,jj,jk) * ztmask_b(ji,jj,jk) 
     558               zdvol =   e3t  (ji,jj,jk,Kmm) *  tmask  (ji,jj,jk)   & 
     559                  &   - ze3t_b(ji,jj,jk    ) * ztmask_b(ji,jj,jk) 
    534560 
    535561               ! heat diff 
     
    560586      nisfl(:)=0 
    561587      DO jk = 1,jpk-1 
    562          DO jj = nldj,nlej 
    563             DO ji = nldi,nlei 
     588         DO jj = Njs0,Nje0 
     589            DO ji = Nis0,Nie0 
    564590               jip1=MIN(ji+1,jpi) ; jim1=MAX(ji-1,1) ; jjp1=MIN(jj+1,jpj) ; jjm1=MAX(jj-1,1) ; 
    565                IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) nisfl(narea) = nisfl(narea) + MAX(SUM(tmask(jim1:jip1,jjm1:jjp1,jk)),1._wp) 
     591               IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN  
     592                  nisfl(narea) = nisfl(narea) + MAX(SUM(tmask(jim1:jip1,jjm1:jjp1,jk)),1._wp) 
     593               ENDIF 
    566594            ENDDO 
    567595         ENDDO 
     
    580608      jisf = 0 
    581609      DO jk = 1,jpk-1 
    582          DO jj = nldj,nlej 
    583             DO ji = nldi,nlei 
     610         DO jj = Njs0,Nje0 
     611            DO ji = Nis0,Nie0 
    584612               IF ( tmask(ji,jj,jk) == 0._wp .AND. ztmask_b(ji,jj,jk) == 1._wp ) THEN 
    585613 
     
    610638                  ELSE IF ( tmask(ji,jj,jk+1) == 1._wp ) THEN 
    611639                     ! spread correction amoung neigbourg wet cells (vertical direction) 
    612                      CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk+1, zdvol, zdsal, zdtem, 1., 0) 
     640                     CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk+1, zdvol, zdsal, zdtem, 1.0_wp, 0) 
    613641                  ELSE 
    614642                     ! need to find where to put correction in later on 
    615                      CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk  , zdvol, zdsal, zdtem, 1., 1) 
     643                     CALL update_isfpts(zisfpts, jisf, ji  , jj  , jk  , zdvol, zdsal, zdtem, 1.0_wp, 1) 
    616644                  END IF 
    617645               END IF 
     
    673701      ! 
    674702      ! add lbclnk 
    675       CALL lbc_lnk_multi( 'iscplrst', risfcpl_cons_tsc(:,:,:,jp_tem), 'T', 1., risfcpl_cons_tsc(:,:,:,jp_sal), 'T', 1., & 
    676          &                            risfcpl_cons_vol(:,:,:)       , 'T', 1.) 
     703      CALL lbc_lnk_multi( 'iscplrst', risfcpl_cons_tsc(:,:,:,jp_tem), 'T', 1.0_wp, risfcpl_cons_tsc(:,:,:,jp_sal), 'T', 1.0_wp, & 
     704         &                            risfcpl_cons_vol(:,:,:)       , 'T', 1.0_wp) 
    677705      ! 
    678706      ! ssh correction (for dynspg_ts) 
Note: See TracChangeset for help on using the changeset viewer.