From 2c85db30f69707825bea799c075f6e4a0fca873e Mon Sep 17 00:00:00 2001 From: minghangli-uni Date: Mon, 22 Apr 2024 11:12:07 +1000 Subject: [PATCH] update max_blocks in ice_domain.F90, enabling max_blocks set on the fly Co-authored-by: anton-seaice --- .../cicedyn/infrastructure/ice_domain.F90 | 27 +++++++++++-------- cicecore/shared/ice_distribution.F90 | 3 ++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/cicecore/cicedyn/infrastructure/ice_domain.F90 b/cicecore/cicedyn/infrastructure/ice_domain.F90 index 8b680f2d4..87d181a51 100644 --- a/cicecore/cicedyn/infrastructure/ice_domain.F90 +++ b/cicecore/cicedyn/infrastructure/ice_domain.F90 @@ -90,6 +90,7 @@ module ice_domain integer (int_kind) :: & nprocs ! num of processors + !*********************************************************************** contains @@ -101,7 +102,7 @@ subroutine init_domain_blocks ! This routine reads in domain information and calls the routine ! to set up the block decomposition. - use ice_distribution, only: processor_shape + use ice_distribution, only: processor_shape, proc_decomposition use ice_domain_size, only: ncat, nilyr, nslyr, max_blocks, & nx_global, ny_global, block_size_x, block_size_y use ice_fileunits, only: goto_nml @@ -112,7 +113,8 @@ subroutine init_domain_blocks !---------------------------------------------------------------------- integer (int_kind) :: & - nml_error ! namelist read error flag + nml_error, & ! namelist read error flag + nprocs_x, nprocs_y ! procs decomposed into blocks character(len=char_len) :: nml_name ! text namelist name character(len=char_len_long) :: tmpstr2 ! for namelist check @@ -216,21 +218,24 @@ subroutine init_domain_blocks call broadcast_scalar(maskhalo_bound, master_task) call broadcast_scalar(add_mpi_barriers, master_task) call broadcast_scalar(debug_blocks, master_task) - if (my_task == master_task) then - if (max_blocks < 1) then - max_blocks=( ((nx_global-1)/block_size_x + 1) * & - ((ny_global-1)/block_size_y + 1) - 1) / nprocs + 1 - max_blocks=max(1,max_blocks) - write(nu_diag,'(/,a52,i6,/)') & - '(ice_domain): max_block < 1: max_block estimated to ',max_blocks - endif - endif call broadcast_scalar(max_blocks, master_task) call broadcast_scalar(block_size_x, master_task) call broadcast_scalar(block_size_y, master_task) call broadcast_scalar(nx_global, master_task) call broadcast_scalar(ny_global, master_task) + ! Automatically determine max_blocks if not set. + if (my_task == master_task) then + if (max_blocks < 1) then + call proc_decomposition(nprocs, nprocs_x, nprocs_y) + max_blocks=((nx_global-1)/block_size_x/nprocs_x+1) * & + ((ny_global-1)/block_size_y/nprocs_y+1) + max_blocks=max(1,max_blocks) + write(nu_diag,'(/,a52,i6,/)') & + '(ice_domain): max_block < 1: max_block estimated to ',max_blocks + endif + endif + !---------------------------------------------------------------------- ! ! perform some basic checks on domain diff --git a/cicecore/shared/ice_distribution.F90 b/cicecore/shared/ice_distribution.F90 index 0f3f6c198..0ba62f4a2 100644 --- a/cicecore/shared/ice_distribution.F90 +++ b/cicecore/shared/ice_distribution.F90 @@ -41,7 +41,8 @@ module ice_distribution ice_distributionGet, & ice_distributionGetBlockLoc, & ice_distributionGetBlockID, & - create_local_block_ids + create_local_block_ids, & + proc_decomposition ! mli: add character (char_len), public :: & processor_shape ! 'square-pop' (approx) POP default config