Skip to content

Commit 09173f7

Browse files
committed
Only write checksums from root PE for FMS_cap
Modified the routines that write out the checksums of various types related to the surface ocean state so that only the root PE writes the checksums. The modified routines are ocn_ice_bnd_type_chksum and ocean_public_type_chksum in config_src/infra/FMS_cap. The analogous routines with the nuopc_cap and mct_cap have not been modified; although doing so would be a very good idea, it should be done by someone who is actively testing them. In some large-PE tests cases this reduces the volume of output to stdout by over 90% without any loss of information. All solutions are bitwise identical, but there may be minor white-space reformatting of the output in some cases.
1 parent 8dd9072 commit 09173f7

2 files changed

Lines changed: 48 additions & 35 deletions

File tree

config_src/drivers/FMS_cap/MOM_surface_forcing_gfdl.F90

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ module MOM_surface_forcing_gfdl
3636
use MOM_variables, only : surface
3737
use user_revise_forcing, only : user_alter_forcing, user_revise_forcing_init
3838
use user_revise_forcing, only : user_revise_forcing_CS
39+
use iso_fortran_env, only : int64
3940

4041
implicit none ; private
4142

@@ -1622,32 +1623,39 @@ subroutine ice_ocn_bnd_type_chksum(id, timestep, iobt)
16221623
type(ice_ocean_boundary_type), &
16231624
intent(in) :: iobt !< An ice-ocean boundary type with fluxes to drive the
16241625
!! ocean in a coupled model whose checksums are reported
1625-
integer :: n,m, outunit
1626+
! Local variables
1627+
integer(kind=int64) :: chks ! A checksum for the field
1628+
logical :: root ! True only on the root PE
1629+
integer :: outunit ! The output unit to write to
16261630

16271631
outunit = stdout
1628-
1629-
write(outunit,*) "BEGIN CHECKSUM(ice_ocean_boundary_type):: ", id, timestep
1630-
write(outunit,100) 'iobt%u_flux ', field_chksum( iobt%u_flux )
1631-
write(outunit,100) 'iobt%v_flux ', field_chksum( iobt%v_flux )
1632-
write(outunit,100) 'iobt%t_flux ', field_chksum( iobt%t_flux )
1633-
write(outunit,100) 'iobt%q_flux ', field_chksum( iobt%q_flux )
1634-
write(outunit,100) 'iobt%salt_flux ', field_chksum( iobt%salt_flux )
1635-
write(outunit,100) 'iobt%lw_flux ', field_chksum( iobt%lw_flux )
1636-
write(outunit,100) 'iobt%sw_flux_vis_dir', field_chksum( iobt%sw_flux_vis_dir)
1637-
write(outunit,100) 'iobt%sw_flux_vis_dif', field_chksum( iobt%sw_flux_vis_dif)
1638-
write(outunit,100) 'iobt%sw_flux_nir_dir', field_chksum( iobt%sw_flux_nir_dir)
1639-
write(outunit,100) 'iobt%sw_flux_nir_dif', field_chksum( iobt%sw_flux_nir_dif)
1640-
write(outunit,100) 'iobt%lprec ', field_chksum( iobt%lprec )
1641-
write(outunit,100) 'iobt%fprec ', field_chksum( iobt%fprec )
1642-
write(outunit,100) 'iobt%runoff ', field_chksum( iobt%runoff )
1643-
write(outunit,100) 'iobt%calving ', field_chksum( iobt%calving )
1644-
write(outunit,100) 'iobt%p ', field_chksum( iobt%p )
1645-
if (associated(iobt%ustar_berg)) &
1646-
write(outunit,100) 'iobt%ustar_berg ', field_chksum( iobt%ustar_berg )
1647-
if (associated(iobt%area_berg)) &
1648-
write(outunit,100) 'iobt%area_berg ', field_chksum( iobt%area_berg )
1649-
if (associated(iobt%mass_berg)) &
1650-
write(outunit,100) 'iobt%mass_berg ', field_chksum( iobt%mass_berg )
1632+
root = is_root_pe()
1633+
1634+
if (root) write(outunit,*) "BEGIN CHECKSUM(ice_ocean_boundary_type):: ", id, timestep
1635+
chks = field_chksum( iobt%u_flux ) ; if (root) write(outunit,100) 'iobt%u_flux ', chks
1636+
chks = field_chksum( iobt%v_flux ) ; if (root) write(outunit,100) 'iobt%v_flux ', chks
1637+
chks = field_chksum( iobt%t_flux ) ; if (root) write(outunit,100) 'iobt%t_flux ', chks
1638+
chks = field_chksum( iobt%q_flux ) ; if (root) write(outunit,100) 'iobt%q_flux ', chks
1639+
chks = field_chksum( iobt%salt_flux ) ; if (root) write(outunit,100) 'iobt%salt_flux ', chks
1640+
chks = field_chksum( iobt%lw_flux ) ; if (root) write(outunit,100) 'iobt%lw_flux ', chks
1641+
chks = field_chksum( iobt%sw_flux_vis_dir) ; if (root) write(outunit,100) 'iobt%sw_flux_vis_dir', chks
1642+
chks = field_chksum( iobt%sw_flux_vis_dif) ; if (root) write(outunit,100) 'iobt%sw_flux_vis_dif', chks
1643+
chks = field_chksum( iobt%sw_flux_nir_dir) ; if (root) write(outunit,100) 'iobt%sw_flux_nir_dir', chks
1644+
chks = field_chksum( iobt%sw_flux_nir_dif) ; if (root) write(outunit,100) 'iobt%sw_flux_nir_dif', chks
1645+
chks = field_chksum( iobt%lprec ) ; if (root) write(outunit,100) 'iobt%lprec ', chks
1646+
chks = field_chksum( iobt%fprec ) ; if (root) write(outunit,100) 'iobt%fprec ', chks
1647+
chks = field_chksum( iobt%runoff ) ; if (root) write(outunit,100) 'iobt%runoff ', chks
1648+
chks = field_chksum( iobt%calving ) ; if (root) write(outunit,100) 'iobt%calving ', chks
1649+
chks = field_chksum( iobt%p ) ; if (root) write(outunit,100) 'iobt%p ', chks
1650+
if (associated(iobt%ustar_berg)) then
1651+
chks = field_chksum( iobt%ustar_berg ) ; if (root) write(outunit,100) 'iobt%ustar_berg ', chks
1652+
endif
1653+
if (associated(iobt%area_berg)) then
1654+
chks = field_chksum( iobt%area_berg ) ; if (root) write(outunit,100) 'iobt%area_berg ', chks
1655+
endif
1656+
if (associated(iobt%mass_berg)) then
1657+
chks = field_chksum( iobt%mass_berg ) ; if (root) write(outunit,100) 'iobt%mass_berg ', chks
1658+
endif
16511659
100 FORMAT(" CHECKSUM::",A20," = ",Z20)
16521660

16531661
call coupler_type_write_chksums(iobt%fluxes, outunit, 'iobt%')

config_src/drivers/FMS_cap/ocean_model_MOM.F90

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ module ocean_model_mod
5656
use MOM_ice_shelf, only : add_shelf_forces, ice_shelf_end, ice_shelf_save_restart
5757
use MOM_wave_interface, only: wave_parameters_CS, MOM_wave_interface_init
5858
use MOM_wave_interface, only: MOM_wave_interface_init_lite, Update_Surface_Waves
59+
use iso_fortran_env, only : int64
5960

6061
#include <MOM_memory.h>
6162

@@ -1094,25 +1095,29 @@ subroutine ocean_model_data1D_get(OS, Ocean, name, value)
10941095

10951096
end subroutine ocean_model_data1D_get
10961097

1097-
!> Write out FMS-format checsums on fields from the ocean surface state
1098+
!> Write out checksums for fields from the ocean surface state
10981099
subroutine ocean_public_type_chksum(id, timestep, ocn)
10991100

11001101
character(len=*), intent(in) :: id !< An identifying string for this call
11011102
integer, intent(in) :: timestep !< The number of elapsed timesteps
11021103
type(ocean_public_type), intent(in) :: ocn !< A structure containing various publicly
11031104
!! visible ocean surface fields.
1104-
integer :: n, m, outunit
1105+
! Local variables
1106+
integer(kind=int64) :: chks ! A checksum for the field
1107+
logical :: root ! True only on the root PE
1108+
integer :: outunit ! The output unit to write to
11051109

11061110
outunit = stdout
1107-
1108-
write(outunit,*) "BEGIN CHECKSUM(ocean_type):: ", id, timestep
1109-
write(outunit,100) 'ocean%t_surf ', field_chksum(ocn%t_surf )
1110-
write(outunit,100) 'ocean%s_surf ', field_chksum(ocn%s_surf )
1111-
write(outunit,100) 'ocean%u_surf ', field_chksum(ocn%u_surf )
1112-
write(outunit,100) 'ocean%v_surf ', field_chksum(ocn%v_surf )
1113-
write(outunit,100) 'ocean%sea_lev ', field_chksum(ocn%sea_lev)
1114-
write(outunit,100) 'ocean%frazil ', field_chksum(ocn%frazil )
1115-
write(outunit,100) 'ocean%melt_potential ', field_chksum(ocn%melt_potential)
1111+
root = is_root_pe()
1112+
1113+
if (root) write(outunit,*) "BEGIN CHECKSUM(ocean_type):: ", id, timestep
1114+
chks = field_chksum(ocn%t_surf ) ; if (root) write(outunit,100) 'ocean%t_surf ', chks
1115+
chks = field_chksum(ocn%s_surf ) ; if (root) write(outunit,100) 'ocean%s_surf ', chks
1116+
chks = field_chksum(ocn%u_surf ) ; if (root) write(outunit,100) 'ocean%u_surf ', chks
1117+
chks = field_chksum(ocn%v_surf ) ; if (root) write(outunit,100) 'ocean%v_surf ', chks
1118+
chks = field_chksum(ocn%sea_lev) ; if (root) write(outunit,100) 'ocean%sea_lev ', chks
1119+
chks = field_chksum(ocn%frazil ) ; if (root) write(outunit,100) 'ocean%frazil ', chks
1120+
chks = field_chksum(ocn%melt_potential) ; if (root) write(outunit,100) 'ocean%melt_potential ', chks
11161121
call coupler_type_write_chksums(ocn%fields, outunit, 'ocean%')
11171122
100 FORMAT(" CHECKSUM::",A20," = ",Z20)
11181123

0 commit comments

Comments
 (0)