portedportable, not yet portedexecuted, not portableexecutable, not hit by this run
| 1 | ! This file is part of MOM6, the Modular Ocean Model version 6. | |
| 2 | ! See the LICENSE file for licensing information. | |
| 3 | ! SPDX-License-Identifier: Apache-2.0 | |
| 4 | ||
| 5 | !> A simple (very thin) wrapper for managing ensemble member layout information | |
| 6 | module MOM_ensemble_manager_infra | |
| 7 | ||
| 8 | use ensemble_manager_mod, only : FMS_ensemble_manager_init => ensemble_manager_init | |
| 9 | use ensemble_manager_mod, only : FMS_ensemble_pelist_setup => ensemble_pelist_setup | |
| 10 | use ensemble_manager_mod, only : FMS_get_ensemble_id => get_ensemble_id | |
| 11 | use ensemble_manager_mod, only : FMS_get_ensemble_size => get_ensemble_size | |
| 12 | use ensemble_manager_mod, only : FMS_get_ensemble_pelist => get_ensemble_pelist | |
| 13 | use ensemble_manager_mod, only : FMS_get_ensemble_filter_pelist => get_ensemble_filter_pelist | |
| 14 | use fms2_io_mod, only : fms2_io_set_filename_appendix=>set_filename_appendix | |
| 15 | ||
| 16 | implicit none ; private | |
| 17 | ||
| 18 | public :: ensemble_manager_init, ensemble_pelist_setup | |
| 19 | public :: get_ensemble_id, get_ensemble_size | |
| 20 | public :: get_ensemble_pelist, get_ensemble_filter_pelist | |
| 21 | ||
| 22 | contains | |
| 23 | ||
| 24 | !> Initializes the ensemble manager which divides available resources | |
| 25 | !! in order to concurrently execute an ensemble of model realizations. | |
| 26 | 1 | subroutine ensemble_manager_init(ensemble_suffix) |
| 27 | character(len=*), optional, intent(in) :: ensemble_suffix !> Ensemble suffix provided by the cap. This may be | |
| 28 | !! provided to bypass FMS ensemble manager. | |
| 29 | ||
| 30 | 1 | if (present(ensemble_suffix)) then |
| 31 | 0 | call fms2_io_set_filename_appendix(trim(ensemble_suffix)) |
| 32 | else | |
| 33 | 1 | call FMS_ensemble_manager_init() |
| 34 | endif | |
| 35 | ||
| 36 | 1 | end subroutine ensemble_manager_init |
| 37 | ||
| 38 | !> Create a list of processing elements (PEs) across components | |
| 39 | !! associated with the current ensemble member. | |
| 40 | 0 | subroutine ensemble_pelist_setup(concurrent, atmos_npes, ocean_npes, land_npes, ice_npes, & |
| 41 | 0 | Atm_pelist, Ocean_pelist, Land_pelist, Ice_pelist) |
| 42 | logical, intent(in) :: concurrent !< A logical flag, if True, then ocean fast | |
| 43 | !! PEs are run concurrently with | |
| 44 | !! slow PEs within the coupler. | |
| 45 | integer, intent(in) :: atmos_npes !< The number of atmospheric (fast) PEs | |
| 46 | integer, intent(in) :: ocean_npes !< The number of ocean (slow) PEs | |
| 47 | integer, intent(in) :: land_npes !< The number of land PEs (fast) | |
| 48 | integer, intent(in) :: ice_npes !< The number of ice (fast) PEs | |
| 49 | integer, dimension(:), intent(inout) :: Atm_pelist !< A list of Atm PEs | |
| 50 | integer, dimension(:), intent(inout) :: Ocean_pelist !< A list of Ocean PEs | |
| 51 | integer, dimension(:), intent(inout) :: Land_pelist !< A list of Land PEs | |
| 52 | integer, dimension(:), intent(inout) :: Ice_pelist !< A list of Ice PEs | |
| 53 | ||
| 54 | ||
| 55 | call FMS_ensemble_pelist_setup(concurrent, atmos_npes, ocean_npes, land_npes, ice_npes, & | |
| 56 | 0 | Atm_pelist, Ocean_pelist, Land_pelist, Ice_pelist) |
| 57 | ||
| 58 | 0 | end subroutine ensemble_pelist_setup |
| 59 | ||
| 60 | !> Returns the numeric id for the current ensemble member | |
| 61 | 0 | function get_ensemble_id() |
| 62 | integer :: get_ensemble_id | |
| 63 | ||
| 64 | 0 | get_ensemble_id = FMS_get_ensemble_id() |
| 65 | ||
| 66 | 0 | end function get_ensemble_id |
| 67 | ||
| 68 | !> Returns ensemble information as follows, | |
| 69 | !! index (1) :: ensemble size | |
| 70 | !! index (2) :: Number of PEs per ensemble member | |
| 71 | !! index (3) :: Number of ocean PEs per ensemble member | |
| 72 | !! index (4) :: Number of atmos PEs per ensemble member | |
| 73 | !! index (5) :: Number of land PEs per ensemble member | |
| 74 | !! index (6) :: Number of ice PEs per ensemble member | |
| 75 | 1 | function get_ensemble_size() |
| 76 | integer, dimension(6) :: get_ensemble_size | |
| 77 | ||
| 78 | 1 | get_ensemble_size = FMS_get_ensemble_size() |
| 79 | ||
| 80 | end function get_ensemble_size | |
| 81 | ||
| 82 | !> Returns the list of PEs associated with all ensemble members | |
| 83 | !! Results are stored in the argument array which must be large | |
| 84 | !! enough to contain the list. If the optional name argument is present, | |
| 85 | !! the returned processor list are for a particular component (atmos, ocean ,land, ice) | |
| 86 | 0 | subroutine get_ensemble_pelist(pelist, name) |
| 87 | integer, intent(inout) :: pelist(:,:) !< A processor list for all ensemble members | |
| 88 | character(len=*), optional, intent(in) :: name !< An optional component name (atmos, ocean, land, ice) | |
| 89 | ||
| 90 | 0 | call FMS_get_ensemble_pelist(pelist, name) |
| 91 | ||
| 92 | 0 | end subroutine get_ensemble_pelist |
| 93 | ||
| 94 | !> Returns the list of PEs associated with the named ensemble filter application. | |
| 95 | !! Valid component names include ('atmos', 'ocean', 'land', and 'ice') | |
| 96 | 0 | subroutine get_ensemble_filter_pelist(pelist, name) |
| 97 | integer, intent(inout) :: pelist(:) !< A processor list for the ensemble filter | |
| 98 | character(len=*), intent(in) :: name !< The component name (atmos, ocean, land, ice) | |
| 99 | ||
| 100 | 0 | call FMS_get_Ensemble_filter_pelist(pelist, name) |
| 101 | ||
| 102 | 0 | end subroutine get_ensemble_filter_pelist |
| 103 | ||
| 104 | end module MOM_ensemble_manager_infra |