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 12766 for NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/TRA/traldf_iso.F90 – NEMO

Ignore:
Timestamp:
2020-04-17T14:54:46+02:00 (4 years ago)
Author:
hadcv
Message:

tra_ldf_iso trial using structures

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/TRA/traldf_iso.F90

    r12489 r12766  
    3636   PUBLIC   tra_ldf_iso   ! routine called by step.F90 
    3737 
    38    LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
    39    LOGICAL  ::   l_hst   ! flag to compute heat transport 
    40  
    4138   !! * Substitutions 
    4239#  include "do_loop_substitute.h90" 
     
    4845CONTAINS 
    4946 
    50   SUBROUTINE tra_ldf_iso( kt, Kmm, kit000, cdtype, pahu, pahv,                    & 
     47  SUBROUTINE tra_ldf_iso( ktile, kt, Kmm, kit000, cdtype, pahu, pahv,                    & 
    5148      &                                            pgu , pgv    ,   pgui, pgvi,   & 
    5249      &                                       pt , pt2 , pt_rhs , kjpt  , kpass ) 
     
    9188      !! ** Action :   Update pt_rhs arrays with the before rotated diffusion 
    9289      !!---------------------------------------------------------------------- 
     90      TYPE(TILE)                           , INTENT(in   ) ::   ktile      ! Tile indices 
    9391      INTEGER                              , INTENT(in   ) ::   kt         ! ocean time-step index 
    9492      INTEGER                              , INTENT(in   ) ::   kit000     ! first time step index 
     
    104102      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend 
    105103      ! 
     104      LOGICAL  ::  l_ptr                                 ! flag to compute poleward transport 
     105      LOGICAL  ::  l_hst                                 ! flag to compute heat transport 
    106106      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices 
    107107      INTEGER  ::  ikt 
     
    110110      REAL(wp) ::  zmskv, zahv_w, zabe2, zcof2, zcoef4   !   -      - 
    111111      REAL(wp) ::  zcoef0, ze3w_2, zsign                 !   -      - 
    112       REAL(wp), DIMENSION(jpi,jpj)     ::   zdkt, zdk1t, z2d 
    113       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdit, zdjt, zftu, zftv, ztfw  
     112      REAL(wp), DIMENSION(IND_2D)     ::   zdkt, zdk1t, z2d 
     113      REAL(wp), DIMENSION(IND_2D,jpk) ::   zdit, zdjt, zftu, zftv, ztfw 
    114114      !!---------------------------------------------------------------------- 
    115115      ! 
    116116      IF( kpass == 1 .AND. kt == kit000 )  THEN 
    117          IF(lwp) WRITE(numout,*) 
    118          IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype 
    119          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    120          ! 
    121          akz     (:,:,:) = 0._wp       
    122          ah_wslp2(:,:,:) = 0._wp 
     117         IF( ktile % ntile == 1 )  THEN               ! Do only on the first tile 
     118            ! TODO: TO BE TILED 
     119            IF(lwp) WRITE(numout,*) 
     120            IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype 
     121            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     122         ENDIF 
     123         ! 
     124         DO_3D_11_11_T( 1, jpk ) 
     125            akz     (ji,jj,jk) = 0._wp 
     126            ah_wslp2(ji,jj,jk) = 0._wp 
     127         END_3D 
    123128      ENDIF 
    124129      !    
     
    140145      IF( kpass == 1 ) THEN                  !==  first pass only  ==! 
    141146         ! 
    142          DO_3D_00_00( 2, jpkm1 ) 
     147         DO_3D_00_00_T( 2, jpkm1 ) 
    143148            ! 
    144149            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    157162         ! 
    158163         IF( ln_traldf_msc ) THEN                ! stabilizing vertical diffusivity coefficient 
    159             DO_3D_00_00( 2, jpkm1 ) 
     164            DO_3D_00_00_T( 2, jpkm1 ) 
    160165               akz(ji,jj,jk) = 0.25_wp * (                                                                     & 
    161166                  &              ( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )   & 
     
    166171            ! 
    167172            IF( ln_traldf_blp ) THEN                ! bilaplacian operator 
    168                DO_3D_10_10( 2, jpkm1 ) 
     173               DO_3D_10_10_T( 2, jpkm1 ) 
    169174                  akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk)   & 
    170175                     &          * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) )  ) 
    171176               END_3D 
    172177            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator 
    173                DO_3D_10_10( 2, jpkm1 ) 
     178               DO_3D_10_10_T( 2, jpkm1 ) 
    174179                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    175180                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  ) 
     
    179184           ! 
    180185         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 
    181             akz(:,:,:) = ah_wslp2(:,:,:)       
     186            DO_3D_11_11_T( 1, jpk ) 
     187               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 
     188            END_3D 
    182189         ENDIF 
    183190      ENDIF 
     
    196203 
    197204         ! Horizontal tracer gradient  
    198          DO_3D_10_10( 1, jpkm1 ) 
     205         DO_3D_10_10_T( 1, jpkm1 ) 
    199206            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
    200207            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 
    201208         END_3D 
    202209         IF( ln_zps ) THEN      ! botton and surface ocean correction of the horizontal gradient 
    203             DO_2D_10_10 
     210            DO_2D_10_10_T 
    204211               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn)           
    205212               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 
    206213            END_2D 
    207214            IF( ln_isfcav ) THEN      ! first wet level beneath a cavity 
    208                DO_2D_10_10 
     215               DO_2D_10_10_T 
    209216                  IF( miku(ji,jj) > 1 )   zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn)           
    210217                  IF( mikv(ji,jj) > 1 )   zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn)      
     
    219226         DO jk = 1, jpkm1                                 ! Horizontal slab 
    220227            ! 
    221             !                             !== Vertical tracer gradient 
    222             zdk1t(:,:) = ( pt(:,:,jk,jn) - pt(:,:,jk+1,jn) ) * wmask(:,:,jk+1)     ! level jk+1 
    223             ! 
    224             IF( jk == 1 ) THEN   ;   zdkt(:,:) = zdk1t(:,:)                          ! surface: zdkt(jk=1)=zdkt(jk=2) 
    225             ELSE                 ;   zdkt(:,:) = ( pt(:,:,jk-1,jn) - pt(:,:,jk,jn) ) * wmask(:,:,jk) 
    226             ENDIF 
    227             DO_2D_10_10 
     228            DO_2D_11_11_T 
     229               !                             !== Vertical tracer gradient 
     230               zdk1t(ji,jj) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * wmask(ji,jj,jk+1)     ! level jk+1 
     231               ! 
     232               IF( jk == 1 ) THEN   ;   zdkt(ji,jj) = zdk1t(ji,jj)                          ! surface: zdkt(jk=1)=zdkt(jk=2) 
     233               ELSE                 ;   zdkt(ji,jj) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * wmask(ji,jj,jk) 
     234               ENDIF 
     235            END_2D 
     236            ! 
     237            DO_2D_10_10_T 
    228238               zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) 
    229239               zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     
    246256            END_2D 
    247257            ! 
    248             DO_2D_00_00 
     258            DO_2D_00_00_T 
    249259               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  zftu(ji,jj,jk) - zftu(ji-1,jj,jk)      & 
    250260                  &                                                 + zftv(ji,jj,jk) - zftv(ji,jj-1,jk)  )   & 
     
    262272         ztfw(:,:, 1 ) = 0._wp      ;      ztfw(:,:,jpk) = 0._wp 
    263273          
    264          DO_3D_00_00( 2, jpkm1 ) 
     274         DO_3D_00_00_T( 2, jpkm1 ) 
    265275            ! 
    266276            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    284294         !                                !==  add the vertical 33 flux  ==! 
    285295         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz 
    286             DO_3D_00_00( 2, jpkm1 ) 
     296            DO_3D_00_00_T( 2, jpkm1 ) 
    287297               ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)   & 
    288298                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )               & 
     
    293303            SELECT CASE( kpass ) 
    294304            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2 
    295                DO_3D_00_00( 2, jpkm1 ) 
     305               DO_3D_00_00_T( 2, jpkm1 ) 
    296306                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk)                       & 
    297307                     &           + ah_wslp2(ji,jj,jk)  * e1e2t(ji,jj)   & 
     
    299309               END_3D 
    300310            CASE(  2  )                         ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp. 
    301                DO_3D_00_00( 2, jpkm1 ) 
     311               DO_3D_00_00_T( 2, jpkm1 ) 
    302312                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)                  & 
    303313                     &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   & 
     
    307317         ENDIF 
    308318         !          
    309          DO_3D_00_00( 1, jpkm1 ) 
     319         DO_3D_00_00_T( 1, jpkm1 ) 
    310320            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1)  )   & 
    311321               &                                              * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
    312322         END_3D 
    313323         ! 
    314          IF( ( kpass == 1 .AND. ln_traldf_lap ) .OR.  &     !==  first pass only (  laplacian)  ==! 
    315              ( kpass == 2 .AND. ln_traldf_blp ) ) THEN      !==  2nd   pass      (bilaplacian)  ==! 
    316             ! 
    317             !                             ! "Poleward" diffusive heat or salt transports (T-S case only) 
    318                ! note sign is reversed to give down-gradient diffusive transports ) 
    319             IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -zftv(:,:,:)  ) 
    320             !                          ! Diffusive heat transports 
    321             IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) ) 
    322             ! 
    323          ENDIF                                                    !== end pass selection  ==! 
     324         IF( ktile % ntile == jpnijtile )  THEN                ! Do only after all tiles finish 
     325            IF( ( kpass == 1 .AND. ln_traldf_lap ) .OR.  &     !==  first pass only (  laplacian)  ==! 
     326                ( kpass == 2 .AND. ln_traldf_blp ) ) THEN      !==  2nd   pass      (bilaplacian)  ==! 
     327               ! 
     328               !                             ! "Poleward" diffusive heat or salt transports (T-S case only) 
     329                  ! note sign is reversed to give down-gradient diffusive transports ) 
     330               ! TODO: TO BE TILED 
     331               IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -zftv(:,:,:)  ) 
     332               !                          ! Diffusive heat transports 
     333               ! TODO: TO BE TILED 
     334               IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) ) 
     335               ! 
     336            ENDIF                                                    !== end pass selection  ==! 
     337         ENDIF 
    324338         ! 
    325339         !                                                        ! =============== 
Note: See TracChangeset for help on using the changeset viewer.