diff --git a/coupler/ensemble_manager.F90 b/coupler/ensemble_manager.F90 index e31105ddb8..1057804cae 100644 --- a/coupler/ensemble_manager.F90 +++ b/coupler/ensemble_manager.F90 @@ -49,6 +49,26 @@ module ensemble_manager_mod integer :: ensemble_size = 1 integer :: ensemble_id = 1 +!> @brief Starting index for ensemble numbering in I/O filenames. +!! +!! Defines an offset applied to the local ensemble_id when constructing +!! filename appendices via fms2_io_set_filename_appendix. +!! +!! The effective ensemble index used in filenames is: +!! global_ens = starting_ensemble_id + ensemble_id - 1 +!! +!! For example: +!! ensemble_size = 2 +!! starting_ensemble_id = 10 +!! results in filenames using ens_10 and ens_11. +!! +!! @note This parameter affects only I/O filename construction (e.g., +!! restart and diagnostic files). It does not affect ensemble-specific +!! input selection such as data_override, which uses explicit filenames +!! or data_table.ens_XX.yaml. +!! +!! @default 1 + integer :: starting_ensemble_id = 1 integer :: pe, total_npes_pm=0,ocean_npes_pm=0,atmos_npes_pm=0 integer :: land_npes_pm=0,ice_npes_pm=0 @@ -75,7 +95,11 @@ subroutine ensemble_manager_init() integer :: i, io_status, npes, ierr - namelist /ensemble_nml/ ensemble_size + !> @namelist ensemble_nml + !! @param ensemble_size Number of ensemble members. + !! @param starting_ensemble_id Offset applied to ensemble_id when + !! constructing I/O filename appendices. + namelist /ensemble_nml/ ensemble_size, starting_ensemble_id read (input_nml_file, ensemble_nml, iostat=io_status) ierr = check_nml_error(io_status, 'ensemble_nml') @@ -85,6 +109,8 @@ subroutine ensemble_manager_init() if(ensemble_size > max_ensemble_size) call mpp_error(FATAL, & 'ensemble_manager_mod: ensemble_nml variable ensemble_size should be no larger than MAX_ENSEMBLE_SIZE, '// & 'change ensemble_size or increase MAX_ENSEMBLE_SIZE') + if(starting_ensemble_id < 1) call mpp_error(FATAL, & + 'ensemble_manager_mod: ensemble_nml variable starting_ensemble_id must be a positive integer') pe = mpp_pe() npes = mpp_npes() @@ -238,7 +264,7 @@ subroutine ensemble_pelist_setup(concurrent, atmos_npes, ocean_npes, land_npes, integer :: atmos_pe_start, atmos_pe_end, ocean_pe_start, ocean_pe_end integer :: land_pe_start, land_pe_end, ice_pe_start, ice_pe_end character(len=10) :: pelist_name, text - integer :: npes, n, m ,i + integer :: npes, n, m ,i, global_ens npes = total_npes_pm @@ -401,7 +427,8 @@ subroutine ensemble_pelist_setup(concurrent, atmos_npes, ocean_npes, land_npes, !can be used for non-ensemble experiments ! if (ensemble_size > 1) then - write( text,'(a,i2.2)' ) 'ens_', ensemble_id + global_ens = starting_ensemble_id + ensemble_id - 1 + write( text,'(a,i2.2)' ) 'ens_', global_ens !Append ensemble_id to the restart filenames call fms2_io_set_filename_appendix(trim(text)) endif