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 13514 for NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/DOM/domain.F90 – NEMO

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

Tiling variables, functions and namelist

File:
1 edited

Legend:

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

    r13286 r13514  
    5555   PUBLIC   dom_init     ! called by nemogcm.F90 
    5656   PUBLIC   domain_cfg   ! called by nemogcm.F90 
     57   PUBLIC   dom_tile     ! called by step.F90 
    5758 
    5859   !!------------------------------------------------------------------------- 
     
    125126      !           !==  Reference coordinate system  ==! 
    126127      ! 
    127       CALL dom_glo                     ! global domain versus local domain 
    128       CALL dom_nam                     ! read namelist ( namrun, namdom ) 
     128      CALL dom_glo                            ! global domain versus local domain 
     129      CALL dom_nam                            ! read namelist ( namrun, namdom ) 
     130      CALL dom_tile( ntsi, ntsj, ntei, ntej ) ! Tile domain 
     131 
    129132      ! 
    130133      IF( lwxios ) THEN 
     
    287290 
    288291 
     292   SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile ) 
     293      !!---------------------------------------------------------------------- 
     294      !!                     ***  ROUTINE dom_tile  *** 
     295      !! 
     296      !! ** Purpose :   Set tile domain variables 
     297      !! 
     298      !! ** Action  : - ktsi, ktsj     : start of internal part of domain 
     299      !!              - ktei, ktej     : end of internal part of domain 
     300      !!              - ntile          : current tile number 
     301      !!              - nijtile        : total number of tiles 
     302      !!---------------------------------------------------------------------- 
     303      INTEGER, INTENT(out) :: ktsi, ktsj, ktei, ktej      ! Tile domain indices 
     304      INTEGER, INTENT(in), OPTIONAL :: ktile              ! Tile number 
     305      INTEGER ::   jt                                     ! dummy loop argument 
     306      INTEGER ::   iitile, ijtile                         ! Local integers 
     307      !!---------------------------------------------------------------------- 
     308      IF( PRESENT(ktile) .AND. ln_tile ) THEN 
     309         ntile = ktile                 ! Set domain indices for tile 
     310         ktsi = ntsi_a(ktile) 
     311         ktsj = ntsj_a(ktile) 
     312         ktei = ntei_a(ktile) 
     313         ktej = ntej_a(ktile) 
     314      ELSE 
     315         ntile = 0                     ! Initialise to full domain 
     316         nijtile = 1 
     317         ktsi = Nis0 
     318         ktsj = Njs0 
     319         ktei = Nie0 
     320         ktej = Nje0 
     321 
     322         IF( ln_tile ) THEN            ! Calculate tile domain indices 
     323            iitile = Ni_0 / nn_ltile_i       ! Number of tiles 
     324            ijtile = Nj_0 / nn_ltile_j 
     325            IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 
     326            IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1 
     327 
     328            nijtile = iitile * ijtile 
     329            ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile) ) 
     330 
     331            ntsi_a(0) = ktsi                 ! Full domain 
     332            ntsj_a(0) = ktsj 
     333            ntei_a(0) = ktei 
     334            ntej_a(0) = ktej 
     335 
     336            DO jt = 1, nijtile               ! Tile domains 
     337               ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile) 
     338               ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile) 
     339               ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0) 
     340               ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0) 
     341            ENDDO 
     342         ENDIF 
     343 
     344         IF(lwp) THEN                  ! control print 
     345            WRITE(numout,*) 
     346            WRITE(numout,*) 'dom_tile : Domain tiling decomposition' 
     347            WRITE(numout,*) '~~~~~~~~' 
     348            IF( ln_tile ) THEN 
     349               WRITE(numout,*) iitile, 'tiles in i' 
     350               WRITE(numout,*) '    Starting indices' 
     351               WRITE(numout,*) '        ', (ntsi_a(jt), jt=1, iitile) 
     352               WRITE(numout,*) '    Ending indices' 
     353               WRITE(numout,*) '        ', (ntei_a(jt), jt=1, iitile) 
     354               WRITE(numout,*) ijtile, 'tiles in j' 
     355               WRITE(numout,*) '    Starting indices' 
     356               WRITE(numout,*) '        ', (ntsj_a(jt), jt=1, nijtile, iitile) 
     357               WRITE(numout,*) '    Ending indices' 
     358               WRITE(numout,*) '        ', (ntej_a(jt), jt=1, nijtile, iitile) 
     359            ELSE 
     360               WRITE(numout,*) 'No domain tiling' 
     361               WRITE(numout,*) '    i indices =', ktsi, ':', ktei 
     362               WRITE(numout,*) '    j indices =', ktsj, ':', ktej 
     363            ENDIF 
     364         ENDIF 
     365      ENDIF 
     366   END SUBROUTINE dom_tile 
     367 
     368 
    289369   SUBROUTINE dom_nam 
    290370      !!---------------------------------------------------------------------- 
     
    295375      !! ** input   : - namrun namelist 
    296376      !!              - namdom namelist 
     377      !!              - namtile namelist 
    297378      !!              - namnc4 namelist   ! "key_netcdf4" only 
    298379      !!---------------------------------------------------------------------- 
     
    307388         &             ln_cfmeta, ln_xios_read, nn_wxios 
    308389      NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask 
     390      NAMELIST/namtile/ ln_tile, nn_ltile_i, nn_ltile_j 
    309391#if defined key_netcdf4 
    310392      NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip 
     
    443525      r1_Dt = 1._wp / rDt 
    444526 
     527      READ  ( numnam_ref, namtile, IOSTAT = ios, ERR = 905 ) 
     528905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtile in reference namelist' ) 
     529      READ  ( numnam_cfg, namtile, IOSTAT = ios, ERR = 906 ) 
     530906   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtile in configuration namelist' ) 
     531      IF(lwm) WRITE( numond, namtile ) 
     532 
     533      IF(lwp) THEN 
     534         WRITE(numout,*) 
     535         WRITE(numout,*)    '   Namelist : namtile   ---   Domain tiling decomposition' 
     536         WRITE(numout,*)    '      Tiling (T) or not (F)                ln_tile    = ', ln_tile 
     537         WRITE(numout,*)    '      Length of tile in i                  nn_ltile_i = ', nn_ltile_i 
     538         WRITE(numout,*)    '      Length of tile in j                  nn_ltile_j = ', nn_ltile_j 
     539         WRITE(numout,*) 
     540         IF( ln_tile ) THEN 
     541            WRITE(numout,*) '      The domain will be decomposed into tiles of size', nn_ltile_i, 'x', nn_ltile_j 
     542         ELSE 
     543            WRITE(numout,*) '      Domain tiling will NOT be used' 
     544         ENDIF 
     545      ENDIF 
     546 
    445547      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    446548         lrxios = ln_xios_read.AND.ln_rstart 
Note: See TracChangeset for help on using the changeset viewer.