27 | | {{{#!box width=35em help |
28 | | Describe flow chart of the changes in the code. \\ |
29 | | List the Fortran modules and subroutines to be created/edited/deleted. \\ |
30 | | Detailed list of new variables to be defined (including namelists), \\ |
31 | | give for each the chosen name and description wrt coding rules. |
| 27 | A trial implementation of `tra_ldf_iso` is described in [https://forge.ipsl.jussieu.fr/nemo/attachment/wiki/2020WP/HPC-02_Daley_Tiling/tra_ldf_iso%20trial.pdf this document]. |
| 28 | |
| 29 | The main code changes in the preferred approach (using public variables) are described below. |
| 30 | |
| 31 | __Summary of method__ |
| 32 | |
| 33 | The full processor domain (1:jpi, 1:jpj) is split into one or more subdomains (tiles). |
| 34 | |
| 35 | To work on a tile, the DO loop macros in `do_loop_substitute` are modified to use a new set of domain indices. A new subroutine `DOM/domain/dom_tile` sets the values of these indices and is also used to initialise the tile to the full domain in `DOM/domain/dom_init`. |
| 36 | |
| 37 | A loop over tiles is implemented at the timestepping level in `OCE/step/stp`. The domain indices for the tile subdomain are set within this loop by `dom_tile`, then 'unset' (set back to the full domain) after exiting the loop. All DO loops within the tiling loop therefore work on the current tile, instead of the full processor domain. |
| 38 | |
| 39 | The number of tiles is determined by the tile lengths, `nn_tile_i` and `nn_tile_j` defined in a new namelist `namtile`, with respect to the full domain. |
| 40 | |
| 41 | __Branch__ |
| 42 | |
| 43 | [http://forge.ipsl.jussieu.fr/nemo/browser/NEMO/branches/UKMO/dev_r12745_HPC-02_Daley_Tiling_trial_public dev_r12745_HPC-02_Daley_Tiling_trial_public] |
| 44 | |
| 45 | __New subroutines__ |
| 46 | |
| 47 | * `dom_tile` - Set domain indices |
| 48 | |
| 49 | __Modified modules__ |
| 50 | |
| 51 | ''NOTE: the number of affected modules is expected to be much larger in the final implementation'' |
| 52 | |
| 53 | * `cfgs/SHARED/namelist_ref` - Add namelist `namtile` |
| 54 | * `OCE/DOM/dom_oce` - Declare namelist variables |
| 55 | * `OCE/DOM/domain` - Read `namtile` namelist and calculate tiling decomposition, add `dom_tile`, initialise domain indices |
| 56 | * `OCE/TRA/traldf` - Changes to account for domain indices |
| 57 | * `OCE/TRA/traldf_iso` - Changes to account for domain indices |
| 58 | * `OCE/do_loop_substitute` - Implement domain indices |
| 59 | * `OCE/par_oce` - Declare domain indices and tiling decomposition parameters |
| 60 | * `OCE/step` - Add tiling loop and set domain indices using `dom_tile` |
| 61 | * `OCE/step_oce` - Import `dom_tile` |
| 62 | |
| 63 | __Variables__ |
| 64 | |
| 65 | * Global variables |
| 66 | * `ntsi`, `ntsj`- start index of tile |
| 67 | * `ntei`, `ntej`- end index of tile |
| 68 | * `ntsim1`, `ntsjm1`- start index of tile, minus 1 |
| 69 | * `nteip1`, `ntejp1`- end index of tile, plus 1 |
| 70 | * `ntile`- tile number |
| 71 | * Parameters |
| 72 | * `jpnitile`, `jpnjtile`, `jpnijtile`- number of tiles |
| 73 | * Loop indices |
| 74 | * `jtile`- loop over tiles |
| 75 | * Namelist |
| 76 | * `ln_tile`- Logical control on use of tiling |
| 77 | * `nn_tile_i`, `nn_tile_j`- tile length |
| 78 | * Pre-processor macros |
| 79 | * `IND_2D`- substitution for ALLOCATE or DIMENSION arguments |
| 80 | * Working variables |
| 81 | * `iitile`, `ijtile`- tile number |
| 82 | * Dummy arguments |
| 83 | * `kntile` (`ntile`) |
| 84 | |
| 85 | __Namelist__ |
| 86 | |
| 87 | {{{ |
| 88 | !----------------------------------------------------------------------- |
| 89 | &namtile ! parameters of the tiling |
| 90 | !----------------------------------------------------------------------- |
| 91 | ln_tile = .false. ! Use tiling (T) or not (F) |
| 92 | nn_tile_i = 10 ! Length of tiles in i |
| 93 | nn_tile_j = 10 ! Length of tiles in j |
| 94 | / |