Changeset 12766


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

tra_ldf_iso trial using structures

Location:
NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/cfgs/SHARED/namelist_ref

    r12530 r12766  
    9494   ln_use_jattr = .false.    !  use (T) the file attribute: open_ocean_jstart, if present 
    9595   !                         !  in netcdf input files, as the start j-row for reading 
     96/ 
     97!----------------------------------------------------------------------- 
     98&namtile        !   parameters of the tiling 
     99!----------------------------------------------------------------------- 
     100   ln_tile = .false.     !  Use tiling (T) or not (F) 
     101   nn_tile_i = 10        !  Length of tiles in i 
     102   nn_tile_j = 10        !  Length of tiles in j 
    96103/ 
    97104!----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/DOM/dom_oce.F90

    r12489 r12766  
    7272   !                                !  = 7 bi-cyclic East-West AND North-South 
    7373   LOGICAL, PUBLIC ::   l_Iperio, l_Jperio   !   should we explicitely take care I/J periodicity  
     74 
     75   ! Tiling namelist 
     76   LOGICAL, PUBLIC ::   ln_tile 
     77   INTEGER         ::   nn_tile_i, nn_tile_j 
     78 
     79   ! Tile indices 
     80   TYPE, PUBLIC    ::   TILE 
     81      INTEGER      ::   ntsi, ntsj, ntei, ntej, ntsim1, ntsjm1, nteip1, ntejp1, ntile 
     82   END TYPE TILE 
    7483 
    7584   !                                 !  domain MPP decomposition parameters 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/DOM/domain.F90

    r12489 r12766  
    4949 
    5050   PUBLIC   dom_init     ! called by nemogcm.F90 
     51   PUBLIC   dom_tile     ! called by step.F90 
    5152   PUBLIC   domain_cfg   ! called by nemogcm.F90 
    5253 
     
    270271 
    271272 
     273   SUBROUTINE dom_tile(kntile, ktile) 
     274      !!---------------------------------------------------------------------- 
     275      !!                     ***  ROUTINE dom_tile  *** 
     276      !! 
     277      !! ** Purpose :   Set domain indices for specified tile 
     278      !! 
     279      !! ** Action  : - ntile          : current tile number 
     280      !!              - ntsi, ntsj     : start of internal part of domain 
     281      !!              - ntei, ntej     : end of internal part of domain 
     282      !!              - ntsim1, ntsjm1 : start of domain 
     283      !!              - nteip1, ntejp1 : end of domain 
     284      !!---------------------------------------------------------------------- 
     285      INTEGER   , INTENT(in ) :: kntile               ! Tile number 
     286      TYPE(TILE), INTENT(out) :: ktile                ! Tile indices 
     287      INTEGER                 :: iitile, ijtile       ! Tile number in i and j 
     288      !!---------------------------------------------------------------------- 
     289 
     290      IF( ln_tile .AND. kntile > 0 ) THEN          ! Tile domain 
     291         iitile = 1 + MOD( kntile - 1, jpnitile ) 
     292         ijtile = 1 + (kntile - 1) / jpnitile 
     293 
     294         ktile % ntile = kntile 
     295         ktile % ntsi = 2 + (iitile - 1) * nn_tile_i 
     296         ktile % ntsj = 2 + (ijtile - 1) * nn_tile_j 
     297         ktile % ntei = MIN(ktile % ntsi + nn_tile_i - 1, jpim1)   ! Size of last tile limited by full domain 
     298         ktile % ntej = MIN(ktile % ntsj + nn_tile_j - 1, jpjm1)   ! 
     299         ktile % ntsim1 = ktile % ntsi - 1 
     300         ktile % ntsjm1 = ktile % ntsj - 1 
     301         ktile % nteip1 = ktile % ntei + 1 
     302         ktile % ntejp1 = ktile % ntej + 1 
     303      ELSE                                         ! Full domain 
     304         ktile % ntile = 1 
     305         ktile % ntsi = 2 
     306         ktile % ntsj = 2 
     307         ktile % ntei = jpim1 
     308         ktile % ntej = jpjm1 
     309         ktile % ntsim1 = 1 
     310         ktile % ntsjm1 = 1 
     311         ktile % nteip1 = jpi 
     312         ktile % ntejp1 = jpj 
     313      ENDIF 
     314   END SUBROUTINE dom_tile 
     315 
     316 
    272317   SUBROUTINE dom_nam 
    273318      !!---------------------------------------------------------------------- 
     
    278323      !! ** input   : - namrun namelist 
    279324      !!              - namdom namelist 
     325      !!              - namtile namelist 
    280326      !!              - namnc4 namelist   ! "key_netcdf4" only 
    281327      !!---------------------------------------------------------------------- 
     
    290336         &             ln_cfmeta, ln_xios_read, nn_wxios 
    291337      NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask 
     338      NAMELIST/namtile/ ln_tile, nn_tile_i, nn_tile_j 
    292339#if defined key_netcdf4 
    293340      NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip 
     
    417464      r1_Dt = 1._wp / rDt 
    418465 
     466      READ  ( numnam_ref, namtile, IOSTAT = ios, ERR = 905 ) 
     467905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtile in reference namelist' ) 
     468      READ  ( numnam_cfg, namtile, IOSTAT = ios, ERR = 906 ) 
     469906   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtile in configuration namelist' ) 
     470      IF(lwm) WRITE( numond, namtile ) 
     471 
     472      ! Set tile decomposition 
     473      IF( ln_tile ) THEN 
     474         jpnitile = (jpi - 2) / nn_tile_i 
     475         jpnjtile = (jpj - 2) / nn_tile_j 
     476         IF( MOD( jpi - 2, nn_tile_i ) /= 0 ) jpnitile = jpnitile + 1 
     477         IF( MOD( jpj - 2, nn_tile_j ) /= 0 ) jpnjtile = jpnjtile + 1 
     478      ELSE 
     479         jpnitile = 1 
     480         jpnjtile = 1 
     481      ENDIF 
     482      jpnijtile = jpnitile * jpnjtile 
     483 
     484      IF(lwp) THEN 
     485         WRITE(numout,*) 
     486         WRITE(numout,*) '   Namelist : namtile   ---   tiling decomposition' 
     487         WRITE(numout,*) '      Tiling (T) or not (F)                ln_tile   = ', ln_tile 
     488         WRITE(numout,*) '      Length of tile in i                  nn_tile_i = ', nn_tile_i 
     489         WRITE(numout,*) '      Length of tile in j                  nn_tile_j = ', nn_tile_j 
     490         WRITE(numout,*) 
     491         IF( ln_tile ) THEN 
     492            WRITE(numout,*) '      The domain will be decomposed into', jpnijtile, 'tiles of size', nn_tile_i, 'x', nn_tile_j 
     493         ELSE 
     494            WRITE(numout,*) '      Domain tiling will NOT be used' 
     495         ENDIF 
     496      ENDIF 
     497 
    419498      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    420499         lrxios = ln_xios_read.AND.ln_rstart 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/TRA/traldf.F90

    r12377 r12766  
    4545CONTAINS 
    4646 
    47    SUBROUTINE tra_ldf( kt, Kbb, Kmm, pts, Krhs ) 
     47   SUBROUTINE tra_ldf(ktile, kt, Kbb, Kmm, pts, Krhs ) 
    4848      !!---------------------------------------------------------------------- 
    4949      !!                  ***  ROUTINE tra_ldf  *** 
     
    5151      !! ** Purpose :   compute the lateral ocean tracer physics. 
    5252      !!---------------------------------------------------------------------- 
     53      TYPE(TILE),                                INTENT(in   ) :: ktile           ! Tile indices 
    5354      INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index 
    5455      INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! ocean time level indices 
     
    5859      !!---------------------------------------------------------------------- 
    5960      ! 
    60       IF( ln_timing )   CALL timing_start('tra_ldf') 
     61      IF( ktile % ntile == 1 )  THEN              ! Do only on the first tile 
     62         ! TODO: TO BE TILED 
     63         IF( ln_timing )   CALL timing_start('tra_ldf') 
     64      ENDIF 
    6165      ! 
    62       IF( l_trdtra )   THEN                    !* Save ta and sa trends 
    63          ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) )  
    64          ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs)  
    65          ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 
     66      IF( ktile % ntile == jpnijtile )  THEN      ! Do only after all tiles finish 
     67         IF( l_trdtra )   THEN                    !* Save ta and sa trends 
     68            ! TODO: TO BE TILED 
     69            ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 
     70            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 
     71            ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 
     72         ENDIF 
    6673      ENDIF 
    6774      ! 
     
    7077         CALL tra_ldf_lap  ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs),                   jpts,  1 ) 
    7178      CASE ( np_lap_i )                                  ! laplacian: standard iso-neutral operator (Madec) 
    72          CALL tra_ldf_iso  ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 ) 
     79         CALL tra_ldf_iso  ( ktile, kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 ) 
    7380      CASE ( np_lap_it )                                 ! laplacian: triad iso-neutral operator (griffies) 
    7481         CALL tra_ldf_triad( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts,  1 ) 
     
    7784      END SELECT 
    7885      ! 
    79       IF( l_trdtra )   THEN                    !* save the horizontal diffusive trends for further diagnostics 
    80          ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 
    81          ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:) 
    82          CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, ztrdt ) 
    83          CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, ztrds ) 
    84          DEALLOCATE( ztrdt, ztrds )  
     86      IF( ktile % ntile == jpnijtile )  THEN      ! Do only after all tiles finish 
     87         IF( l_trdtra )   THEN                    !* save the horizontal diffusive trends for further diagnostics 
     88            ! TODO: TO BE TILED 
     89            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 
     90            ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:) 
     91            ! TODO: TO BE TILED 
     92            CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, ztrdt ) 
     93            CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, ztrds ) 
     94            DEALLOCATE( ztrdt, ztrds ) 
     95         ENDIF 
     96 
     97         !                                        !* print mean trends (used for debugging) 
     98         ! TODO: TO BE TILED 
     99         IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' ldf  - Ta: ', mask1=tmask,               & 
     100            &                                  tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     101         ! 
     102         ! TODO: TO BE TILED 
     103         IF( ln_timing )   CALL timing_stop('tra_ldf') 
    85104      ENDIF 
    86       !                                        !* print mean trends (used for debugging) 
    87       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' ldf  - Ta: ', mask1=tmask,               & 
    88          &                                  tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    89       ! 
    90       IF( ln_timing )   CALL timing_stop('tra_ldf') 
    91105      ! 
    92106   END SUBROUTINE tra_ldf 
  • 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         !                                                        ! =============== 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/TRA/traldf_lap_blp.F90

    r12377 r12766  
    171171      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend 
    172172      ! 
     173      TYPE(TILE)                            :: ktile        ! Tile indices 
    173174      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices 
    174175      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt) :: zlap         ! laplacian at t-point 
     
    194195         CALL tra_ldf_lap  ( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt,     zlap, kjpt, 1 ) 
    195196      CASE ( np_blp_i  )               ! rotated   bilaplacian : standard operator (Madec) 
    196          CALL tra_ldf_iso  ( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 ) 
     197         CALL tra_ldf_iso  ( ktile, kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 ) 
    197198      CASE ( np_blp_it )               ! rotated  bilaplacian : triad operator (griffies) 
    198199         CALL tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 ) 
     
    210211         CALL tra_ldf_lap  ( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt_rhs,         kjpt, 2 ) 
    211212      CASE ( np_blp_i  )               ! rotated   bilaplacian : standard operator (Madec) 
    212          CALL tra_ldf_iso  ( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt    , pt_rhs, kjpt, 2 ) 
     213         CALL tra_ldf_iso  ( ktile, kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt    , pt_rhs, kjpt, 2 ) 
    213214      CASE ( np_blp_it )               ! rotated  bilaplacian : triad operator (griffies) 
    214215         CALL tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt    , pt_rhs, kjpt, 2 ) 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/do_loop_substitute.h90

    r12377 r12766  
    102102#define END_2D   END DO   ;   END DO 
    103103#define END_3D   END DO   ;   END DO   ;   END DO 
     104 
     105#define __kIs_T     ktile % ntsi 
     106#define __kJs_T     ktile % ntsj 
     107#define __kIsm1_T   ktile % ntsim1 
     108#define __kJsm1_T   ktile % ntsjm1 
     109 
     110#define __kIe_T     ktile % ntei 
     111#define __kJe_T     ktile % ntej 
     112#define __kIep1_T   ktile % nteip1 
     113#define __kJep1_T   ktile % ntejp1 
     114 
     115#define IND_2D          __kIsm1_T:__kIep1_T,__kJsm1_T:__kJep1_T 
     116 
     117#define DO_2D_00_00_T   DO jj = __kJs_T, __kJe_T   ;   DO ji = __kIs_T, __kIe_T 
     118#define DO_2D_00_01_T   DO jj = __kJs_T, __kJe_T   ;   DO ji = __kIs_T, __kIep1_T 
     119#define DO_2D_00_10_T   DO jj = __kJs_T, __kJe_T   ;   DO ji = __kIsm1_T, __kIe_T 
     120#define DO_2D_00_11_T   DO jj = __kJs_T, __kJe_T   ;   DO ji = __kIsm1_T, __kIep1_T 
     121 
     122#define DO_2D_01_00_T   DO jj = __kJs_T, __kJep1_T   ;   DO ji = __kIs_T, __kIe_T 
     123#define DO_2D_01_01_T   DO jj = __kJs_T, __kJep1_T   ;   DO ji = __kIs_T, __kIep1_T 
     124#define DO_2D_01_10_T   DO jj = __kJs_T, __kJep1_T   ;   DO ji = __kIsm1_T, __kIe_T 
     125#define DO_2D_01_11_T   DO jj = __kJs_T, __kJep1_T   ;   DO ji = __kIsm1_T, __kIep1_T 
     126 
     127#define DO_2D_10_00_T   DO jj = __kJsm1_T, __kJe_T   ;   DO ji = __kIs_T, __kIe_T 
     128#define DO_2D_10_10_T   DO jj = __kJsm1_T, __kJe_T   ;   DO ji = __kIsm1_T, __kIe_T 
     129#define DO_2D_10_11_T   DO jj = __kJsm1_T, __kJe_T   ;   DO ji = __kIsm1_T, __kIep1_T 
     130 
     131#define DO_2D_11_00_T   DO jj = __kJsm1_T, __kJep1_T   ;   DO ji = __kIs_T, __kIe_T 
     132#define DO_2D_11_01_T   DO jj = __kJsm1_T, __kJep1_T   ;   DO ji = __kIs_T, __kIep1_T 
     133#define DO_2D_11_10_T   DO jj = __kJsm1_T, __kJep1_T   ;   DO ji = __kIsm1_T, __kIe_T 
     134#define DO_2D_11_11_T   DO jj = __kJsm1_T, __kJep1_T   ;   DO ji = __kIsm1_T, __kIep1_T 
     135 
     136#define DO_3D_00_00_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_00_T 
     137#define DO_3D_00_10_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_00_10_T 
     138 
     139#define DO_3D_01_01_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_01_01_T 
     140 
     141#define DO_3D_10_00_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_00_T 
     142#define DO_3D_10_10_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_10_T 
     143#define DO_3D_10_11_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_10_11_T 
     144 
     145#define DO_3D_11_11_T(ks,ke)   DO jk = ks, ke   ;   DO_2D_11_11_T 
     146 
     147#define DO_3DS_00_00_T(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_00_00_T 
     148#define DO_3DS_01_01_T(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_01_01_T 
     149#define DO_3DS_10_10_T(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_10_10_T 
     150#define DO_3DS_11_11_T(ks,ke,ki)   DO jk = ks, ke, ki   ;   DO_2D_11_11_T 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/par_oce.F90

    r12377 r12766  
    6262   INTEGER, PUBLIC ::   jpjmax! = ( jpjglo-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls !: maximum jpj 
    6363 
     64   ! Tiling decomposition 
     65   INTEGER, PUBLIC ::   jpnitile                !: number of tiles following i 
     66   INTEGER, PUBLIC ::   jpnjtile                !: number of tiles following j 
     67   INTEGER, PUBLIC ::   jpnijtile               !: number of tiles in total (jpnitile x jpnjtile) 
     68 
    6469   !!--------------------------------------------------------------------- 
    6570   !! Active tracer parameters 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/step.F90

    r12650 r12766  
    8181      !!              -8- Outputs and diagnostics 
    8282      !!---------------------------------------------------------------------- 
    83       INTEGER ::   ji, jj, jk   ! dummy loop indice 
     83      TYPE(TILE)   :: stile     ! Tile indices 
     84      INTEGER ::   ji, jj, jk, jtile   ! dummy loop indice 
    8485      INTEGER ::   indic        ! error indicator if < 0 
    8586!!gm kcall can be removed, I guess 
     
    264265      IF( lrst_oce .AND. ln_zdfosm ) & 
    265266           &             CALL osm_rst    ( kstp,      Nnn, 'WRITE'  )  ! write OSMOSIS outputs + ww (so must do here) to restarts 
    266                          CALL tra_ldf    ( kstp, Nbb, Nnn, ts, Nrhs )  ! lateral mixing 
    267  
     267 
     268      ! Loop over tile domains 
     269      DO jtile = 1, jpnijtile 
     270                         CALL dom_tile( jtile, stile ) 
     271                         CALL tra_ldf    ( stile, kstp, Nbb, Nnn, ts, Nrhs ) ! lateral mixing 
     272      END DO 
    268273                         CALL tra_zdf    ( kstp, Nbb, Nnn, Nrhs, ts, Naa  )  ! vertical mixing and after tracer fields 
    269274      IF( ln_zdfnpc  )   CALL tra_npc    ( kstp,      Nnn, Nrhs, ts, Naa  )  ! update after fields by non-penetrative convection 
  • NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_structure/src/OCE/step_oce.F90

    r12377 r12766  
    6262   USE domvvl          ! variable vertical scale factors  (dom_vvl_sf_nxt routine) 
    6363   !                                                       (dom_vvl_sf_swp routine) 
     64   USE domain   , ONLY : dom_tile 
    6465 
    6566   USE ldfslp          ! iso-neutral slopes               (ldf_slp routine) 
Note: See TracChangeset for help on using the changeset viewer.