From 8267f0b3bcdd58fec716486cc4ee0ab8d28b5bea Mon Sep 17 00:00:00 2001 From: kdraeder Date: Fri, 27 Mar 2026 16:12:23 -0600 Subject: [PATCH 1/3] Made coarse-resolution larg-ensemble MCC, ERI tests work. Changes are needed in multiple components: cesm, cime, cmeps, mom/MOM6. The branches are labeled with DART_lowres_{component}. cesm/driver/ensemble_driver.F90 Remove PETcount versus NINST test to let middle-sized tests work. if(modulo(PetCount-pio_asyncio_ntasks*number_of_members, & number_of_members) .ne. 0) then --- cesm/driver/ensemble_driver.F90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cesm/driver/ensemble_driver.F90 b/cesm/driver/ensemble_driver.F90 index 5ca17b1b4..4593eadc4 100644 --- a/cesm/driver/ensemble_driver.F90 +++ b/cesm/driver/ensemble_driver.F90 @@ -254,12 +254,13 @@ subroutine SetModelServices(ensemble_driver, rc) if (chkerr(rc,__LINE__,u_FILE_u)) return ntasks_per_member = PetCount/number_of_members - pio_asyncio_ntasks - if(modulo(PetCount-pio_asyncio_ntasks*number_of_members, number_of_members) .ne. 0) then - write (msgstr,'(a,i5,a,i3,a,i3,a)') & - "PetCount (",PetCount,") - Async IOtasks (",pio_asyncio_ntasks*number_of_members,") must be evenly divisable by number of members (",number_of_members,")" - call ESMF_LogSetError(ESMF_RC_ARG_BAD, msg=msgstr, line=__LINE__, file=__FILE__, rcToReturn=rc) - return - endif +! if(modulo(PetCount-pio_asyncio_ntasks*number_of_members, number_of_members) .ne. 0) then +! write (msgstr,'(a,i5,a,i3,a,i3,a)') & +! "PetCount (",PetCount,") - Async IOtasks (",pio_asyncio_ntasks*number_of_members, & +! ") must be evenly divisable by number of members (",number_of_members,")" +! call ESMF_LogSetError(ESMF_RC_ARG_BAD, msg=msgstr, line=__LINE__, file=__FILE__, rcToReturn=rc) +! return +! endif !------------------------------------------- ! Loop over number of ensemblel members @@ -280,7 +281,7 @@ subroutine SetModelServices(ensemble_driver, rc) asyncio_task = .false. ! Determine pet list for driver instance if(pio_asyncio_ntasks > 0) then - do n=pio_asyncio_rootpe,pio_asyncio_rootpe+pio_asyncio_stride*(pio_asyncio_ntasks-1),pio_asyncio_stride + do n= pio_asyncio_rootpe, pio_asyncio_rootpe+pio_asyncio_stride*(pio_asyncio_ntasks-1), pio_asyncio_stride asyncio_petlist(iopetcnt) = (inst-1)*(ntasks_per_member+pio_asyncio_ntasks) + n if(asyncio_petlist(iopetcnt) == localPet) asyncio_task = .true. iopetcnt = iopetcnt+1 From 4cc3183cf4f51d74d41a2875500555768f09f178 Mon Sep 17 00:00:00 2001 From: kdraeder Date: Tue, 26 May 2026 14:45:25 -0600 Subject: [PATCH 2/3] Removed spaces which snuck into recent commit --- cesm/driver/ensemble_driver.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cesm/driver/ensemble_driver.F90 b/cesm/driver/ensemble_driver.F90 index 4593eadc4..8e72a6ae7 100644 --- a/cesm/driver/ensemble_driver.F90 +++ b/cesm/driver/ensemble_driver.F90 @@ -281,7 +281,7 @@ subroutine SetModelServices(ensemble_driver, rc) asyncio_task = .false. ! Determine pet list for driver instance if(pio_asyncio_ntasks > 0) then - do n= pio_asyncio_rootpe, pio_asyncio_rootpe+pio_asyncio_stride*(pio_asyncio_ntasks-1), pio_asyncio_stride + do n=pio_asyncio_rootpe,pio_asyncio_rootpe+pio_asyncio_stride*(pio_asyncio_ntasks-1),pio_asyncio_stride asyncio_petlist(iopetcnt) = (inst-1)*(ntasks_per_member+pio_asyncio_ntasks) + n if(asyncio_petlist(iopetcnt) == localPet) asyncio_task = .true. iopetcnt = iopetcnt+1 From 52a32ee5cb883535bf21aaf4109fcd52bcd50762 Mon Sep 17 00:00:00 2001 From: kdraeder Date: Wed, 8 Jul 2026 11:39:52 -0600 Subject: [PATCH 3/3] Replace error message about PetCount v instances When a test uses an ensemble size + model size which requires > 1 node, and multiple instances can fit on a node, then the previous message didn't provide enough information to guide the choice of layout parameters. The additional info makes the error message too long for ESMF to handle. The original message is now written to cesm.log. The added information is written to the PET file(s). --- cesm/driver/ensemble_driver.F90 | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cesm/driver/ensemble_driver.F90 b/cesm/driver/ensemble_driver.F90 index 8e72a6ae7..49f2ae078 100644 --- a/cesm/driver/ensemble_driver.F90 +++ b/cesm/driver/ensemble_driver.F90 @@ -254,13 +254,18 @@ subroutine SetModelServices(ensemble_driver, rc) if (chkerr(rc,__LINE__,u_FILE_u)) return ntasks_per_member = PetCount/number_of_members - pio_asyncio_ntasks -! if(modulo(PetCount-pio_asyncio_ntasks*number_of_members, number_of_members) .ne. 0) then -! write (msgstr,'(a,i5,a,i3,a,i3,a)') & -! "PetCount (",PetCount,") - Async IOtasks (",pio_asyncio_ntasks*number_of_members, & -! ") must be evenly divisable by number of members (",number_of_members,")" -! call ESMF_LogSetError(ESMF_RC_ARG_BAD, msg=msgstr, line=__LINE__, file=__FILE__, rcToReturn=rc) -! return -! endif + if(modulo(PetCount-pio_asyncio_ntasks*number_of_members, number_of_members) .ne. 0) then + write (msgstr,'(a,i5,a,i3,a,i3,a)') & + "PetCount (",PetCount,") - Async IOtasks (",pio_asyncio_ntasks*number_of_members, & + ") must be evenly divisable by number of members (",number_of_members, ")." + call ESMF_LogWrite(trim(subname)//": "//trim(msgstr), ESMF_LOGMSG_INFO) + write (msgstr,'(3a)') & + "Multi-instance (multi-driver): set NINST, NTASKS and MAX_TASKS_PER_NODE ", & + "so that the instances are evenly divided across the implied number of nodes ", & + "and no extra tasks are requested." + call ESMF_LogSetError(ESMF_RC_ARG_BAD, msg=msgstr, line=__LINE__, file=__FILE__, rcToReturn=rc) + return + endif !------------------------------------------- ! Loop over number of ensemblel members