Skip to content

Commit

Permalink
Write restart at end of run via NUOPC component attribute & Initializ…
Browse files Browse the repository at this point in the history
…e cpl_scalar field when created for UFS (CICE-Consortium#969)


These are two commits cherry-picked from as in UFS and needed to close #84.

This PR adds the ability for CICE to write restart files at the end of the run (independent of other settings) and controlled via the CMEPS configuration option write_restart_at_endofrun. Setting this configuration option to True creates a restart file in the same way for CMEPS, MOM6, and CICE.

This PR also initializes the scalar field value for the index for NTile (implemented for FV3) not used or set in CICE. In certain cases, the scalar field value for this index has been found to be non-zero (NaN in debug compiles). This is the cause of the failure reported in ufs-community/ufs-weather-model#2338.

* Add end of run functionality to CICE (#77)
* initialize cpl_scalar field when created (#83)

---------

Co-authored-by: Daniel Sarmiento <[email protected]>
Co-authored-by: Denise Worthen <[email protected]>
  • Loading branch information
3 people authored Aug 16, 2024
1 parent 64b6aa3 commit 9c4334a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion cicecore/drivers/nuopc/cmeps/cice_wrapper_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ subroutine ufs_logfhour(msg,hour)
real(dbl_kind), intent(in) :: hour
character(len=char_len) :: filename
integer(int_kind) :: nunit
write(filename,'(a,i3.3)')'log.ice.f',int(hour)
write(filename,'(a,i4.4)')'log.ice.f',int(hour)
open(newunit=nunit,file=trim(filename))
write(nunit,'(a)')'completed: cice'
write(nunit,'(a,f10.3)')'forecast hour:',hour
Expand Down
23 changes: 21 additions & 2 deletions cicecore/drivers/nuopc/cmeps/ice_comp_nuopc.F90
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ module ice_comp_nuopc
logical :: profile_memory = .false.
logical :: mastertask
logical :: runtimelog = .false.
logical :: restart_eor = .false. !End of run restart flag
integer :: start_ymd ! Start date (YYYYMMDD)
integer :: start_tod ! start time of day (s)
integer :: curr_ymd ! Current date (YYYYMMDD)
Expand Down Expand Up @@ -316,6 +317,12 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc)
write(logmsg,*) runtimelog
call ESMF_LogWrite('CICE_cap:RunTimeLog = '//trim(logmsg), ESMF_LOGMSG_INFO)

call NUOPC_CompAttributeGet(gcomp, name="write_restart_at_endofrun", value=cvalue, isPresent=isPresent, isSet=isSet, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (isPresent .and. isSet) then
if (trim(cvalue) .eq. '.true.') restart_eor = .true.
endif

!----------------------------------------------------------------------------
! generate local mpi comm
!----------------------------------------------------------------------------
Expand Down Expand Up @@ -1139,6 +1146,8 @@ subroutine ModelAdvance(gcomp, rc)
call ESMF_ClockGetAlarm(clock, alarmname='alarm_restart', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return

force_restart_now = .false.

if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
force_restart_now = .true.
Expand All @@ -1152,8 +1161,18 @@ subroutine ModelAdvance(gcomp, rc)

write(restart_date,"(i4.4,a,i2.2,a,i2.2,a,i5.5)") yy, '-', mm, '-',dd,'-',tod
write(restart_filename,'(4a)') trim(restart_dir), trim(restart_file), '.', trim(restart_date)
else
force_restart_now = .false.
endif

! Handle end of run restart
if (restart_eor) then
call ESMF_ClockGetAlarm(clock, alarmname='alarm_stop', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
force_restart_now = .true.
call ESMF_AlarmRingerOff( alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
endif

!--------------------------------
Expand Down
6 changes: 6 additions & 0 deletions cicecore/drivers/nuopc/cmeps/ice_import_export.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1495,6 +1495,7 @@ subroutine SetScalarField(field, flds_scalar_name, flds_scalar_num, rc)
! local variables
type(ESMF_Distgrid) :: distgrid
type(ESMF_Grid) :: grid
real(ESMF_KIND_R8), pointer :: fldptr2d(:,:)
character(len=*), parameter :: subname='(ice_import_export:SetScalarField)'
! ----------------------------------------------

Expand All @@ -1511,6 +1512,11 @@ subroutine SetScalarField(field, flds_scalar_name, flds_scalar_num, rc)
ungriddedLBound=(/1/), ungriddedUBound=(/flds_scalar_num/), gridToFieldMap=(/2/), rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return

! initialize fldptr to zero
call ESMF_FieldGet(field, farrayPtr=fldptr2d, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
fldptr2d(:,:) = 0.0

end subroutine SetScalarField

end subroutine fldlist_realize
Expand Down

0 comments on commit 9c4334a

Please sign in to comment.