From a749486cd1c1033a2890d69576de7f880a05561b Mon Sep 17 00:00:00 2001 From: alperaltuntas Date: Fri, 16 May 2025 17:41:01 -0600 Subject: [PATCH 1/3] add the instance suffix to the correct part of the restart filename and do not re-add it later on --- config_src/drivers/nuopc_cap/mom_cap.F90 | 16 +++++++++------- src/framework/MOM_restart.F90 | 12 +++++++----- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/config_src/drivers/nuopc_cap/mom_cap.F90 b/config_src/drivers/nuopc_cap/mom_cap.F90 index e0e618c76e..0f132b1ab4 100644 --- a/config_src/drivers/nuopc_cap/mom_cap.F90 +++ b/config_src/drivers/nuopc_cap/mom_cap.F90 @@ -1930,8 +1930,12 @@ subroutine ModelAdvance(gcomp, rc) rpointer_filename = trim(rpointer_filename//timestamp) endif - write(restartname,'(A,".mom6.r",A)') & - trim(casename), timestamp + if (len_trim(inst_suffix) == 0) then + write(restartname,'(A,".mom6.r",A)') trim(casename), timestamp + else + write(restartname,'(A,".mom6",A,".r",A)') trim(casename), trim(inst_suffix), timestamp + endif + call ESMF_LogWrite("MOM_cap: Writing restart : "//trim(restartname), ESMF_LOGMSG_INFO) ! write restart file(s) call ocean_model_restart(ocean_state, restartname=restartname, num_rest_files=num_rest_files) @@ -1943,11 +1947,9 @@ subroutine ModelAdvance(gcomp, rc) msg=subname//' ERROR opening '//rpointer_filename, line=__LINE__, file=u_FILE_u, rcToReturn=rc) return endif - if (len_trim(inst_suffix) == 0) then - write(writeunit,'(a)') trim(restartname)//'.nc' - else - write(writeunit,'(a)') trim(restartname)//'.'//trim(inst_suffix)//'.nc' - endif + + ! write the restart file name to rpointer + write(writeunit,'(a)') trim(restartname)//'.nc' if (num_rest_files > 1) then ! append i.th restart file name to rpointer diff --git a/src/framework/MOM_restart.F90 b/src/framework/MOM_restart.F90 index 8152564b4f..3b1f79ae3d 100644 --- a/src/framework/MOM_restart.F90 +++ b/src/framework/MOM_restart.F90 @@ -1410,11 +1410,13 @@ subroutine save_restart(directory, time, G, CS, time_stamped, filename, GV, num_ ! Determine if there is a filename_appendix (used for ensemble runs). call get_filename_appendix(filename_appendix) if (len_trim(filename_appendix) > 0) then - length = len_trim(restartname) - if (restartname(length-2:length) == '.nc') then - restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' - else - restartname = restartname(1:length) //'.'//trim(filename_appendix) + if (index(restartname, trim(filename_appendix)) == 0) then ! appendix not yet added + length = len_trim(restartname) + if (restartname(length-2:length) == '.nc') then + restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' + else + restartname = restartname(1:length) //'.'//trim(filename_appendix) + endif endif endif From d5e5a4c3ff9000beab4190955234cf540876fe70 Mon Sep 17 00:00:00 2001 From: alperaltuntas Date: Sat, 17 May 2025 18:02:13 -0600 Subject: [PATCH 2/3] Revert "add the instance suffix to the correct part of the restart filename and do not re-add it later on" This reverts commit a749486cd1c1033a2890d69576de7f880a05561b. --- config_src/drivers/nuopc_cap/mom_cap.F90 | 16 +++++++--------- src/framework/MOM_restart.F90 | 12 +++++------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/config_src/drivers/nuopc_cap/mom_cap.F90 b/config_src/drivers/nuopc_cap/mom_cap.F90 index 0f132b1ab4..e0e618c76e 100644 --- a/config_src/drivers/nuopc_cap/mom_cap.F90 +++ b/config_src/drivers/nuopc_cap/mom_cap.F90 @@ -1930,12 +1930,8 @@ subroutine ModelAdvance(gcomp, rc) rpointer_filename = trim(rpointer_filename//timestamp) endif - if (len_trim(inst_suffix) == 0) then - write(restartname,'(A,".mom6.r",A)') trim(casename), timestamp - else - write(restartname,'(A,".mom6",A,".r",A)') trim(casename), trim(inst_suffix), timestamp - endif - + write(restartname,'(A,".mom6.r",A)') & + trim(casename), timestamp call ESMF_LogWrite("MOM_cap: Writing restart : "//trim(restartname), ESMF_LOGMSG_INFO) ! write restart file(s) call ocean_model_restart(ocean_state, restartname=restartname, num_rest_files=num_rest_files) @@ -1947,9 +1943,11 @@ subroutine ModelAdvance(gcomp, rc) msg=subname//' ERROR opening '//rpointer_filename, line=__LINE__, file=u_FILE_u, rcToReturn=rc) return endif - - ! write the restart file name to rpointer - write(writeunit,'(a)') trim(restartname)//'.nc' + if (len_trim(inst_suffix) == 0) then + write(writeunit,'(a)') trim(restartname)//'.nc' + else + write(writeunit,'(a)') trim(restartname)//'.'//trim(inst_suffix)//'.nc' + endif if (num_rest_files > 1) then ! append i.th restart file name to rpointer diff --git a/src/framework/MOM_restart.F90 b/src/framework/MOM_restart.F90 index 3b1f79ae3d..8152564b4f 100644 --- a/src/framework/MOM_restart.F90 +++ b/src/framework/MOM_restart.F90 @@ -1410,13 +1410,11 @@ subroutine save_restart(directory, time, G, CS, time_stamped, filename, GV, num_ ! Determine if there is a filename_appendix (used for ensemble runs). call get_filename_appendix(filename_appendix) if (len_trim(filename_appendix) > 0) then - if (index(restartname, trim(filename_appendix)) == 0) then ! appendix not yet added - length = len_trim(restartname) - if (restartname(length-2:length) == '.nc') then - restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' - else - restartname = restartname(1:length) //'.'//trim(filename_appendix) - endif + length = len_trim(restartname) + if (restartname(length-2:length) == '.nc') then + restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' + else + restartname = restartname(1:length) //'.'//trim(filename_appendix) endif endif From cbcbc7a652790dc265ad3c2e19d74a262a061ff3 Mon Sep 17 00:00:00 2001 From: alperaltuntas Date: Sun, 18 May 2025 21:42:22 -0600 Subject: [PATCH 3/3] fix multiinstance restart filename --- config_src/drivers/nuopc_cap/mom_cap.F90 | 10 ++++--- src/framework/MOM_restart.F90 | 33 +++++++++++++++++++++--- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/config_src/drivers/nuopc_cap/mom_cap.F90 b/config_src/drivers/nuopc_cap/mom_cap.F90 index e0e618c76e..2c8271a028 100644 --- a/config_src/drivers/nuopc_cap/mom_cap.F90 +++ b/config_src/drivers/nuopc_cap/mom_cap.F90 @@ -1943,12 +1943,14 @@ subroutine ModelAdvance(gcomp, rc) msg=subname//' ERROR opening '//rpointer_filename, line=__LINE__, file=u_FILE_u, rcToReturn=rc) return endif - if (len_trim(inst_suffix) == 0) then - write(writeunit,'(a)') trim(restartname)//'.nc' - else - write(writeunit,'(a)') trim(restartname)//'.'//trim(inst_suffix)//'.nc' + + ! update restart file name to include the instance suffix + if (len_trim(inst_suffix) > 0) then + write(restartname, '(A,".mom6",A,".r",A)') trim(casename), trim(inst_suffix), timestamp endif + write(writeunit,'(a)') trim(restartname)//'.nc' + if (num_rest_files > 1) then ! append i.th restart file name to rpointer do i=1, num_rest_files-1 diff --git a/src/framework/MOM_restart.F90 b/src/framework/MOM_restart.F90 index 8152564b4f..69466b5fdb 100644 --- a/src/framework/MOM_restart.F90 +++ b/src/framework/MOM_restart.F90 @@ -119,6 +119,7 @@ module MOM_restart type(p4d), pointer :: var_ptr4d(:) => NULL() !>@} integer :: max_fields !< The maximum number of restart fields + character(len=32) :: restartfile_appx_prefix !< The prefix for the restart file appendix (i.e., ensemble id) end type MOM_restart_CS !> Register fields for restarts @@ -1371,6 +1372,8 @@ subroutine save_restart(directory, time, G, CS, time_stamped, filename, GV, num_ integer :: turns integer, parameter :: nmax_extradims = 5 type(axis_info), dimension(:), allocatable :: extra_axes + integer :: prefix_index ! The index of the first occurrence of prefix in the restart filename. + integer :: prefix_length ! The length of the prefix string. turns = CS%turns @@ -1411,10 +1414,26 @@ subroutine save_restart(directory, time, G, CS, time_stamped, filename, GV, num_ call get_filename_appendix(filename_appendix) if (len_trim(filename_appendix) > 0) then length = len_trim(restartname) - if (restartname(length-2:length) == '.nc') then - restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' - else - restartname = restartname(1:length) //'.'//trim(filename_appendix) + + ! Determine if a valid prefix for appendix is provided. + prefix_index = 0 + prefix_length = len_trim(CS%restartfile_appx_prefix) + if (prefix_length > 0) prefix_index = index(restartname, trim(CS%restartfile_appx_prefix)) + + if (prefix_index == 0) then ! No prefix is found + if (restartname(length-2:length) == '.nc') then + restartname = restartname(1:length-3)//'.'//trim(filename_appendix)//'.nc' + else + restartname = restartname(1:length) //'.'//trim(filename_appendix) + endif + else ! Prefix is found + if (restartname(length-2:length) == '.nc') then + restartname = restartname(1:prefix_index-1+prefix_length) // & + trim(filename_appendix) // restartname(prefix_index+prefix_length:length-3) // '.nc' + else + restartname = restartname(1:prefix_index-1+prefix_length) // & + trim(filename_appendix) // restartname(prefix_index+prefix_length:) + endif endif endif @@ -2054,6 +2073,12 @@ subroutine restart_init(param_file, CS, restart_root) "made from a run with a different mask_table than the current run, "//& "in which case the checksums will not match and cause crash.",& default=.true.) + call get_param(param_file, mdl, "RESTARTFILE_APPENDIX_PREFIX", CS%restartfile_appx_prefix, & + "The prefix for the restart file appendix (i.e., ensemble id for ensemble runs). "// & + "If this prefix is found in the restart file name, the appendix is added right after the "// & + "first occurrence of the prefix. If not found, the appendix is added to the end of the "// & + "file name. This parameter is ignored for non-ensemble runs.", & + default="") ! Maybe not the best place to do this? call get_param(param_file, mdl, "ROTATE_INDEX", rotate_index, &