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 13516 for NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct.F90 – NEMO

Ignore:
Timestamp:
2020-09-24T20:38:10+02:00 (4 years ago)
Author:
hadcv
Message:

Tiling for tra_adv

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct.F90

    r13295 r13516  
    1515   USE oce            ! ocean dynamics and active tracers 
    1616   USE dom_oce        ! ocean space and time domain 
     17   ! TEMP: This change not necessary after trd_tra is tiled 
     18   USE domain, ONLY : dom_tile 
    1719   USE trc_oce        ! share passive tracers/Ocean variables 
    1820   USE trd_oce        ! trends: ocean variables 
     
    7981      INTEGER                                  , INTENT(in   ) ::   kn_fct_v        ! order of the FCT scheme (=2 or 4) 
    8082      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step 
     83      ! TEMP: This can be ST_2D(nn_hls) after trd_tra is tiled 
    8184      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components 
    8285      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
    8386      ! 
    8487      INTEGER  ::   ji, jj, jk, jn                           ! dummy loop indices   
     88      ! TEMP: This change not necessary after trd_tra is tiled 
     89      INTEGER  ::   itile 
    8590      REAL(wp) ::   ztra                                     ! local scalar 
    8691      REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u   !   -      - 
    8792      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v   !   -      - 
    88       REAL(wp), DIMENSION(jpi,jpj,jpk)        ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw 
    89       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdx, ztrdy, ztrdz, zptry 
    90       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zwinf, zwdia, zwsup 
     93      REAL(wp), DIMENSION(ST_2D(nn_hls),jpk)        ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw 
     94      ! TEMP: This change not necessary after trd_tra is tiled 
     95      REAL(wp), DIMENSION(:,:,:), SAVE, ALLOCATABLE ::   ztrdx, ztrdy, ztrdz 
     96      REAL(wp), DIMENSION(:,:,:)      , ALLOCATABLE ::   zptry 
     97      REAL(wp), DIMENSION(:,:,:)      , ALLOCATABLE ::   zwinf, zwdia, zwsup 
    9198      LOGICAL  ::   ll_zAimp                                 ! flag to apply adaptive implicit vertical advection 
    9299      !!---------------------------------------------------------------------- 
    93       ! 
    94       IF( kt == kit000 )  THEN 
    95          IF(lwp) WRITE(numout,*) 
    96          IF(lwp) WRITE(numout,*) 'tra_adv_fct : FCT advection scheme on ', cdtype 
    97          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    98       ENDIF 
     100      ! TEMP: This change not necessary after trd_tra is tiled 
     101      itile = ntile 
     102      ! 
     103      IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     104         IF( kt == kit000 )  THEN 
     105            IF(lwp) WRITE(numout,*) 
     106            IF(lwp) WRITE(numout,*) 'tra_adv_fct : FCT advection scheme on ', cdtype 
     107            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     108         ENDIF 
    99109      !! -- init to 0 
    100110      zwi(:,:,:) = 0._wp 
     
    107117      zltv(:,:,:) = 0._wp 
    108118      ztw(:,:,:) = 0._wp 
    109       ! 
    110       l_trd = .FALSE.            ! set local switches 
    111       l_hst = .FALSE. 
    112       l_ptr = .FALSE. 
    113       ll_zAimp = .FALSE. 
    114       IF( ( cdtype == 'TRA' .AND. l_trdtra  ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
    115       IF(   cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) )    l_ptr = .TRUE.  
    116       IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR.  & 
    117          &                         iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE. 
    118       ! 
    119       IF( l_trd .OR. l_hst )  THEN 
    120          ALLOCATE( ztrdx(jpi,jpj,jpk), ztrdy(jpi,jpj,jpk), ztrdz(jpi,jpj,jpk) ) 
    121          ztrdx(:,:,:) = 0._wp   ;    ztrdy(:,:,:) = 0._wp   ;   ztrdz(:,:,:) = 0._wp 
     119         ! 
     120         l_trd = .FALSE.            ! set local switches 
     121         l_hst = .FALSE. 
     122         l_ptr = .FALSE. 
     123         ll_zAimp = .FALSE. 
     124         IF( ( cdtype == 'TRA' .AND. l_trdtra  ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
     125         IF(   cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) )    l_ptr = .TRUE. 
     126         IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR.  & 
     127            &                         iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE. 
     128         ! 
     129         ! TEMP: This can be ST_2D(nn_hls) after trd_tra is tiled 
     130         IF( kt == kit000 .AND. (l_trd .OR. l_hst) )  THEN 
     131            ALLOCATE( ztrdx(jpi,jpj,jpk), ztrdy(jpi,jpj,jpk), ztrdz(jpi,jpj,jpk) ) 
     132         ENDIF 
    122133      ENDIF 
    123134      ! 
    124135      IF( l_ptr ) THEN   
    125          ALLOCATE( zptry(jpi,jpj,jpk) ) 
     136         ALLOCATE( zptry(ST_2D(nn_hls),jpk) ) 
    126137         zptry(:,:,:) = 0._wp 
    127138      ENDIF 
     
    134145      ! If adaptive vertical advection, check if it is needed on this PE at this time 
    135146      IF( ln_zad_Aimp ) THEN 
    136          IF( MAXVAL( ABS( wi(:,:,:) ) ) > 0._wp ) ll_zAimp = .TRUE. 
     147         IF( MAXVAL( ABS( wi(ST_2D(nn_hls),:) ) ) > 0._wp ) ll_zAimp = .TRUE. 
    137148      END IF 
    138149      ! If active adaptive vertical advection, build tridiagonal matrix 
    139150      IF( ll_zAimp ) THEN 
    140          ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk)) 
     151         ALLOCATE(zwdia(ST_2D(nn_hls),jpk), zwinf(ST_2D(nn_hls),jpk), zwsup(ST_2D(nn_hls),jpk)) 
    141152         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    142153            zwdia(ji,jj,jk) =  1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) )   & 
     
    167178         END_3D 
    168179         IF( ln_linssh ) THEN    ! top ocean value (only in linear free surface as zwz has been w-masked) 
     180            ! TODO: NOT TESTED- requires isf 
    169181            IF( ln_isfcav ) THEN             ! top of the ice-shelf cavities and at the ocean surface 
    170182               DO_2D( 1, 1, 1, 1 ) 
     
    207219         END IF 
    208220         !                 
     221         ! TEMP: This change not necessary after trd_tra is tiled 
    209222         IF( l_trd .OR. l_hst )  THEN             ! trend diagnostics (contribution of upstream fluxes) 
    210             ztrdx(:,:,:) = zwx(:,:,:)   ;   ztrdy(:,:,:) = zwy(:,:,:)   ;   ztrdz(:,:,:) = zwz(:,:,:) 
     223            DO_3D( 1, 0, 1, 0, 1, jpk ) 
     224               ztrdx(ji,jj,jk) = zwx(ji,jj,jk)   ;   ztrdy(ji,jj,jk) = zwy(ji,jj,jk)   ;   ztrdz(ji,jj,jk) = zwz(ji,jj,jk) 
     225            END_3D 
    211226         END IF 
    212227         !                             ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     
    336351         END IF          
    337352         ! 
     353         ! TEMP: These changes not necessary after trd_tra is tiled 
    338354         IF( l_trd .OR. l_hst ) THEN   ! trend diagnostics // heat/salt transport 
    339             ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< add anti-diffusive fluxes  
    340             ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  !     to upstream fluxes 
    341             ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:)  ! 
    342             ! 
    343             IF( l_trd ) THEN              ! trend diagnostics 
    344                CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztrdx, pU, pt(:,:,:,jn,Kmm) ) 
    345                CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztrdy, pV, pt(:,:,:,jn,Kmm) ) 
    346                CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, ztrdz, pW, pt(:,:,:,jn,Kmm) ) 
     355            DO_3D( 1, 0, 1, 0, 1, jpk ) 
     356               ztrdx(ji,jj,jk) = ztrdx(ji,jj,jk) + zwx(ji,jj,jk)  ! <<< add anti-diffusive fluxes 
     357               ztrdy(ji,jj,jk) = ztrdy(ji,jj,jk) + zwy(ji,jj,jk)  !     to upstream fluxes 
     358               ztrdz(ji,jj,jk) = ztrdz(ji,jj,jk) + zwz(ji,jj,jk)  ! 
     359            END_3D 
     360            ! 
     361            IF( ntile == 0 .OR. ntile == nijtile )  THEN                ! Do only for the full domain 
     362               IF( l_trd ) THEN              ! trend diagnostics 
     363                  IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 )         ! Use full domain 
     364 
     365                  ! TODO: TO BE TILED- trd_tra 
     366                  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztrdx, pU, pt(:,:,:,jn,Kmm) ) 
     367                  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztrdy, pV, pt(:,:,:,jn,Kmm) ) 
     368                  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, ztrdz, pW, pt(:,:,:,jn,Kmm) ) 
     369 
     370                  IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = itile )     ! Revert to tile domain 
     371               ENDIF 
    347372            ENDIF 
    348373            !                             ! heat/salt transport 
    349             IF( l_hst )   CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 
     374            IF( l_hst )   CALL dia_ar5_hst( jn, 'adv', ztrdx(ST_2D(nn_hls),:), ztrdy(ST_2D(nn_hls),:) ) 
    350375            ! 
    351376         ENDIF 
     
    360385         DEALLOCATE( zwdia, zwinf, zwsup ) 
    361386      ENDIF 
    362       IF( l_trd .OR. l_hst ) THEN  
    363          DEALLOCATE( ztrdx, ztrdy, ztrdz ) 
    364       ENDIF 
     387      ! TEMP: These changes not necessary after trd_tra is tiled 
     388!      IF( l_trd .OR. l_hst ) THEN 
     389!         DEALLOCATE( ztrdx, ztrdy, ztrdz ) 
     390!      ENDIF 
    365391      IF( l_ptr ) THEN  
    366392         DEALLOCATE( zptry ) 
     
    383409      !!       in-space based differencing for fluid 
    384410      !!---------------------------------------------------------------------- 
    385       INTEGER                          , INTENT(in   ) ::   Kmm             ! time level index  
    386       REAL(wp)                         , INTENT(in   ) ::   p2dt            ! tracer time-step 
    387       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in   ) ::   pbef, paft      ! before & after field 
    388       REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions 
     411      INTEGER                         , INTENT(in   ) ::   Kmm             ! time level index 
     412      REAL(wp)                        , INTENT(in   ) ::   p2dt            ! tracer time-step 
     413      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pbef            ! before field 
     414      REAL(wp), DIMENSION(ST_2D(nn_hls)    ,jpk), INTENT(in   ) ::   paft            ! after field 
     415      REAL(wp), DIMENSION(ST_2D(nn_hls)    ,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions 
    389416      ! 
    390417      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    392419      REAL(dp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn    ! local scalars 
    393420      REAL(dp) ::   zau, zbu, zcu, zav, zbv, zcv, zup, zdo            !   -      - 
    394       REAL(dp), DIMENSION(jpi,jpj,jpk) :: zbetup, zbetdo, zbup, zbdo 
     421      REAL(dp), DIMENSION(ST_2D(nn_hls),jpk) :: zbetup, zbetdo, zbup, zbdo 
    395422      !!---------------------------------------------------------------------- 
    396423      ! 
     
    402429      ! -------------------- 
    403430      ! max/min of pbef & paft with large negative/positive value (-/+zbig) inside land 
    404       zbup = MAX( pbef * tmask - zbig * ( 1._wp - tmask ),   & 
    405          &        paft * tmask - zbig * ( 1._wp - tmask )  ) 
    406       zbdo = MIN( pbef * tmask + zbig * ( 1._wp - tmask ),   & 
    407          &        paft * tmask + zbig * ( 1._wp - tmask )  ) 
     431      DO_3D( 1, 1, 1, 1, 1, jpk ) 
     432         zbup(ji,jj,jk) = MAX( pbef(ji,jj,jk) * tmask(ji,jj,jk) - zbig * ( 1._wp - tmask(ji,jj,jk) ),   & 
     433            &                  paft(ji,jj,jk) * tmask(ji,jj,jk) - zbig * ( 1._wp - tmask(ji,jj,jk) )  ) 
     434         zbdo(ji,jj,jk) = MIN( pbef(ji,jj,jk) * tmask(ji,jj,jk) + zbig * ( 1._wp - tmask(ji,jj,jk) ),   & 
     435            &                  paft(ji,jj,jk) * tmask(ji,jj,jk) + zbig * ( 1._wp - tmask(ji,jj,jk) )  ) 
     436      END_3D 
    408437 
    409438      DO jk = 1, jpkm1 
     
    537566      !!---------------------------------------------------------------------- 
    538567      REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt_in    ! field at t-point 
    539       REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point 
     568      REAL(wp),DIMENSION(ST_2D(nn_hls)    ,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point 
    540569      ! 
    541570      INTEGER ::   ji, jj, jk   ! dummy loop integers 
    542571      INTEGER ::   ikt, ikb     ! local integers 
    543       REAL(wp),DIMENSION(jpi,jpj,jpk) :: zwd, zwi, zws, zwrm, zwt 
     572      REAL(wp),DIMENSION(ST_2D(nn_hls),jpk) :: zwd, zwi, zws, zwrm, zwt 
    544573      !!---------------------------------------------------------------------- 
    545574      ! 
     
    561590!!gm   
    562591      ! 
     592      ! TODO: NOT TESTED- requires isf 
    563593      IF ( ln_isfcav ) THEN            ! set level two values which may not be set in ISF case 
    564594         zwd(:,:,2) = 1._wp  ;  zwi(:,:,2) = 0._wp  ;  zws(:,:,2) = 0._wp  ;  zwrm(:,:,2) = 0._wp 
     
    626656      !!        The 3d array zwt is used as a work space array. 
    627657      !!---------------------------------------------------------------------- 
    628       REAL(wp),DIMENSION(:,:,:), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix 
    629       REAL(wp),DIMENSION(:,:,:), INTENT(in   ) ::   pRHS          ! Right-Hand-Side 
    630       REAL(wp),DIMENSION(:,:,:), INTENT(  out) ::   pt_out        !!gm field at level=F(klev) 
    631       INTEGER                  , INTENT(in   ) ::   klev          ! =1 pt_out at w-level  
    632       !                                                           ! =0 pt at t-level 
     658      REAL(wp),DIMENSION(ST_2D(nn_hls),jpk), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix 
     659      REAL(wp),DIMENSION(ST_2D(nn_hls),jpk), INTENT(in   ) ::   pRHS          ! Right-Hand-Side 
     660      REAL(wp),DIMENSION(ST_2D(nn_hls),jpk), INTENT(  out) ::   pt_out        !!gm field at level=F(klev) 
     661      INTEGER                    , INTENT(in   ) ::   klev          ! =1 pt_out at w-level 
     662      !                                                             ! =0 pt at t-level 
    633663      INTEGER ::   ji, jj, jk   ! dummy loop integers 
    634664      INTEGER ::   kstart       ! local indices 
    635       REAL(wp),DIMENSION(jpi,jpj,jpk) ::   zwt   ! 3D work array 
     665      REAL(wp),DIMENSION(ST_2D(nn_hls),jpk) ::   zwt   ! 3D work array 
    636666      !!---------------------------------------------------------------------- 
    637667      ! 
Note: See TracChangeset for help on using the changeset viewer.