From 78531189448337d87df5b80b507e8feb78849ab8 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Tue, 27 Jan 2026 08:46:39 -0700 Subject: [PATCH 01/22] Basic checksum example. --- tests/interface/CMakeLists.txt | 9 ++++++ tests/interface/MOM_field_checksum.pf | 41 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/interface/MOM_field_checksum.pf diff --git a/tests/interface/CMakeLists.txt b/tests/interface/CMakeLists.txt index 5e84ff30..19bd9c11 100644 --- a/tests/interface/CMakeLists.txt +++ b/tests/interface/CMakeLists.txt @@ -6,5 +6,14 @@ add_pfunit_ctest(infra_tests # Temporary fix to force cmake to use the Fortran linker set_property(TARGET infra_tests PROPERTY LINKER_LANGUAGE Fortran) +add_pfunit_ctest(checksum_tests + TEST_SOURCES MOM_field_checksum.pf MOM_test_case.pf + LINK_LIBRARIES NetCDF_Fortran NetCDF FMS_Infra FMS ${AMREX_LIB} + MAX_PES 4 +) +# Temporary fix to force cmake to use the Fortran linker +set_property(TARGET checksum_tests PROPERTY LINKER_LANGUAGE Fortran) +target_compile_options(checksum_tests PRIVATE -r8) + # Copy namelist file to output directory to satisfy FMS requirement configure_file(${CONFIG_FILES}/input.nml input.nml COPYONLY) diff --git a/tests/interface/MOM_field_checksum.pf b/tests/interface/MOM_field_checksum.pf new file mode 100644 index 00000000..1ac37f24 --- /dev/null +++ b/tests/interface/MOM_field_checksum.pf @@ -0,0 +1,41 @@ +module MOM_field_checksum + use iso_fortran_env, only : int32, int64 + + use pfunit + + use MOM_coms_infra, only: field_chksum + use MOM_test_case + + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: MOM_comms_infra_test_case + end type MOM_comms_infra_test_case + +contains + + @test(npes=[4]) + subroutine test_field_checksum(this) + class (MOM_comms_infra_test_case), intent(inout) :: this + real :: field + integer(kind=int64) :: checksum + + field = 0.5 + checksum = field_chksum(field) + + @assertEqual(-36028797018963968, checksum) + end subroutine test_field_checksum + +end module MOM_field_checksum + +! #include +! #include +! #include + +! int main() +! { +! double a = 0.5; +! auto a_int = std::bit_cast(a); +! a_int *= 4; +! std::cout << a_int << std::endl; +! } \ No newline at end of file From e9f1ccaecf08a4c0aa48bb5fef13a8cbdae4890b Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 16:46:46 -0700 Subject: [PATCH 02/22] Initial field_checksum plus pfunit support for larger strings. --- .../pfunit-utils/AssertIntFix_v4.15.0.patch | 13 +++++++++ build-utils/pfunit-utils/Makefile | 5 ++++ build.sh | 1 + .../interface/MOM_comms_infra/CMakeLists.txt | 6 +++++ .../test_field_checksum_real640d.pf | 27 +++++++++++++++++++ .../test_field_checksum_real641d.pf | 26 ++++++++++++++++++ .../test_field_checksum_real642d.pf | 27 +++++++++++++++++++ .../test_field_checksum_real643d.pf | 26 ++++++++++++++++++ .../test_field_checksum_real644d.pf | 26 ++++++++++++++++++ 9 files changed, 157 insertions(+) create mode 100644 build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch create mode 100644 tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf create mode 100644 tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf create mode 100644 tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf create mode 100644 tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf create mode 100644 tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf diff --git a/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch b/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch new file mode 100644 index 00000000..73d8385f --- /dev/null +++ b/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch @@ -0,0 +1,13 @@ +diff --git a/src/funit/asserts/Assert_Integer.tmpl b/src/funit/asserts/Assert_Integer.tmpl +index dcc38ee..e6fba92 100644 +--- a/src/funit/asserts/Assert_Integer.tmpl ++++ b/src/funit/asserts/Assert_Integer.tmpl +@@ -69,7 +69,7 @@ module pf_AssertInteger_{rank}d + + + +- integer, parameter :: MAX_LEN_INT_AS_STRING = 20 ++ integer, parameter :: MAX_LEN_INT_AS_STRING = 21 + + contains + diff --git a/build-utils/pfunit-utils/Makefile b/build-utils/pfunit-utils/Makefile index 6da3da6b..8bc78922 100644 --- a/build-utils/pfunit-utils/Makefile +++ b/build-utils/pfunit-utils/Makefile @@ -1,5 +1,10 @@ include $(TEMPLATE) +PATCH_NOT_APPLIED := $(shell git -C ${PFUNIT_ROOT} apply --quiet --reverse --check ${PATCH_FILE}; echo $$?) +ifneq ($(PATCH_NOT_APPLIED), 0) + _ := $(shell git -C ${PFUNIT_ROOT} apply --quiet ${PATCH_FILE}) +endif + # Need -DSKIP_OPENMP=YES to support clang compiler bug # not being able to find OpenMP through CMake when calling find_package(PFUNIT) build_pfunit: diff --git a/build.sh b/build.sh index 814c16b9..0df8882b 100755 --- a/build.sh +++ b/build.sh @@ -307,6 +307,7 @@ if [[ "${UNIT_TESTS_ONLY}" == "1" ]]; then PFUNIT_BLD_PATH=$(pwd)/build \ CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ PFUNIT_INSTALL_PATH=${PFUNIT_INSTALL_PATH} \ + PATCH_FILE=${ROOTDIR}/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch \ make -j${JOBS} -C ${ROOTDIR}/build-utils/pfunit-utils/ build_pfunit fi fi diff --git a/tests/interface/MOM_comms_infra/CMakeLists.txt b/tests/interface/MOM_comms_infra/CMakeLists.txt index 03f1b472..d9645e9b 100644 --- a/tests/interface/MOM_comms_infra/CMakeLists.txt +++ b/tests/interface/MOM_comms_infra/CMakeLists.txt @@ -1,4 +1,10 @@ add_mom_test(test_num_pes PFUNIT_FILE test_num_pes.pf) +add_mom_test(test_field_checksum_real640d PFUNIT_FILE test_field_checksum_real640d.pf) +add_mom_test(test_field_checksum_real641d PFUNIT_FILE test_field_checksum_real641d.pf) +add_mom_test(test_field_checksum_real642d PFUNIT_FILE test_field_checksum_real642d.pf) +add_mom_test(test_field_checksum_real643d PFUNIT_FILE test_field_checksum_real643d.pf) +add_mom_test(test_field_checksum_real644d PFUNIT_FILE test_field_checksum_real644d.pf) + # Copy namelist file to output directory to satisfy FMS requirement configure_file(${CONFIG_FILES}/input.nml input.nml COPYONLY) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf new file mode 100644 index 00000000..1337819b --- /dev/null +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -0,0 +1,27 @@ +module test_field_checksum_real640d + use pfunit + use MOM_coms_infra + use MOM_test_case + use iso_fortran_env, only : int64 + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: testcase_broadcast + end type testcase_broadcast + +contains + + @test(npes=[4]) + subroutine field_checksum_real640d(this) + class (testcase_broadcast), intent(inout) :: this + + real, parameter :: field = 0.5 + integer(kind=int64), parameter :: expected_checksum = -36028797018963968 + integer(kind=int64) :: actual_checksum + + actual_checksum = field_chksum(field) + + @assertEqual(expected_checksum, checksum) + end subroutine field_checksum_real640d + +end module test_field_checksum_real640d \ No newline at end of file diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf new file mode 100644 index 00000000..897138ff --- /dev/null +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -0,0 +1,26 @@ +module test_field_checksum_real641d + use pfunit + use MOM_coms_infra + use MOM_test_case + use iso_fortran_env, only : int64, real64 + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: testcase_broadcast + end type testcase_broadcast + +contains + + @test(npes=[4]) + subroutine field_checksum_real641d(this) + class (testcase_broadcast), intent(inout) :: this + + real, parameter :: field(5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64) :: actual_checksum + + actual_checksum = field_chksum(field) + + @assertEqual(expected_checksum, actual_checksum) + end subroutine field_checksum_real641d +end module test_field_checksum_real641d \ No newline at end of file diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf new file mode 100644 index 00000000..728b5634 --- /dev/null +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -0,0 +1,27 @@ +module test_field_checksum_real642d + use pfunit + use MOM_coms_infra + use MOM_test_case + use iso_fortran_env, only : int64, real64 + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: testcase_broadcast + end type testcase_broadcast + +contains + + @test(npes=[4]) + subroutine field_checksum_real642d(this) + class (testcase_broadcast), intent(inout) :: this + + real, parameter :: field(5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64) :: actual_checksum + + + actual_checksum = field_chksum(field) + + @assertEqual(expected, checksum) + end subroutine field_checksum_real642d +end module test_field_checksum_real642d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf new file mode 100644 index 00000000..f4d78754 --- /dev/null +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -0,0 +1,26 @@ +module test_field_checksum_real643d + use pfunit + use MOM_coms_infra + use MOM_test_case + use iso_fortran_env, only : int64, real64 + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: testcase_broadcast + end type testcase_broadcast + +contains + + @test(npes=[4]) + subroutine field_checksum_real643d(this) + class (testcase_broadcast), intent(inout) :: this + + real, parameter :: field(5,5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64) :: actual_checksum + + actual_checksum = field_chksum(field) + + @assertEqual(expected_checksum, actual_checksum) + end subroutine field_checksum_real643d +end module test_field_checksum_real643d \ No newline at end of file diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf new file mode 100644 index 00000000..e9ad0333 --- /dev/null +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -0,0 +1,26 @@ +module test_field_checksum_real644d + use pfunit + use MOM_coms_infra + use MOM_test_case + use iso_fortran_env, only : int64, real64 + implicit none + + @testCase() + type, extends(MOM_MPI_test_case) :: testcase_broadcast + end type testcase_broadcast + +contains + + @test(npes=[4]) + subroutine field_checksum_real644d(this) + class (testcase_broadcast), intent(inout) :: this + + real, parameter :: field(5,5,5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64) :: actual_checksum + + actual_checksum = field_chksum(field) + + @assertEqual(expected_checksum, actual_checksum) + end subroutine field_checksum_real644d +end module test_field_checksum_real644d \ No newline at end of file From 2d41871f6cd892126ce06385468e9ce9365a0ea1 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 16:55:55 -0700 Subject: [PATCH 03/22] Fix variable name mismatches and explicit _int64 declarations for portability. --- .../interface/MOM_comms_infra/test_field_checksum_real640d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real641d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real642d.pf | 4 ++-- .../interface/MOM_comms_infra/test_field_checksum_real643d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real644d.pf | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf index 1337819b..f14bf2d0 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -21,7 +21,7 @@ contains actual_checksum = field_chksum(field) - @assertEqual(expected_checksum, checksum) + @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real640d end module test_field_checksum_real640d \ No newline at end of file diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 897138ff..21c66bdc 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 728b5634..07aa2873 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -16,12 +16,12 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) - @assertEqual(expected, checksum) + @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real642d end module test_field_checksum_real642d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index f4d78754..3f389bf8 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index e9ad0333..063b9963 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) From 7348ab5ae89c72035f82d3c4a0f146b0d1615a39 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 16:58:50 -0700 Subject: [PATCH 04/22] Answer fixes. --- tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf | 2 +- tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf | 2 +- tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf index f14bf2d0..8c5d7ccf 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field = 0.5 - integer(kind=int64), parameter :: expected_checksum = -36028797018963968 + integer(kind=int64), parameter :: expected_checksum = -36028797018963968_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 07aa2873..9a763200 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 + integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index 063b9963..bcca0a30 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -16,7 +16,7 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 + integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) From cae8c12c0470c8d8d9c00e72f5c8dfc5245dac00 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:03:17 -0700 Subject: [PATCH 05/22] Fix answers and extend string representation. --- build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real643d.pf | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch b/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch index 73d8385f..0453c1ae 100644 --- a/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch +++ b/build-utils/pfunit-utils/AssertIntFix_v4.15.0.patch @@ -7,7 +7,7 @@ index dcc38ee..e6fba92 100644 - integer, parameter :: MAX_LEN_INT_AS_STRING = 20 -+ integer, parameter :: MAX_LEN_INT_AS_STRING = 21 ++ integer, parameter :: MAX_LEN_INT_AS_STRING = 22 contains diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index 3f389bf8..f15ed0df 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -16,10 +16,11 @@ contains class (testcase_broadcast), intent(inout) :: this real, parameter :: field(5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 + integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) + write (*,*) actual_checksum @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real643d From 825eed87b859e68c0828a34959ff82ef13e2d4bb Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:11:35 -0700 Subject: [PATCH 06/22] Update testcase names to match subroutines. --- .../MOM_comms_infra/test_field_checksum_real640d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real641d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real642d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real643d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real644d.pf | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf index 8c5d7ccf..91d760ac 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -6,14 +6,14 @@ module test_field_checksum_real640d implicit none @testCase() - type, extends(MOM_MPI_test_case) :: testcase_broadcast - end type testcase_broadcast + type, extends(MOM_MPI_test_case) :: field_checksum_0d_testcase + end type field_checksum_0d_testcase contains @test(npes=[4]) subroutine field_checksum_real640d(this) - class (testcase_broadcast), intent(inout) :: this + class (field_checksum_0d_testcase), intent(inout) :: this real, parameter :: field = 0.5 integer(kind=int64), parameter :: expected_checksum = -36028797018963968_int64 diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 21c66bdc..959695a6 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -6,14 +6,14 @@ module test_field_checksum_real641d implicit none @testCase() - type, extends(MOM_MPI_test_case) :: testcase_broadcast - end type testcase_broadcast + type, extends(MOM_MPI_test_case) :: field_checksum_1d_testcase + end type field_checksum_1d_testcase contains @test(npes=[4]) subroutine field_checksum_real641d(this) - class (testcase_broadcast), intent(inout) :: this + class (field_checksum_1d_testcase), intent(inout) :: this real, parameter :: field(5) = 1.0 integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 9a763200..02c25140 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -6,14 +6,14 @@ module test_field_checksum_real642d implicit none @testCase() - type, extends(MOM_MPI_test_case) :: testcase_broadcast - end type testcase_broadcast + type, extends(MOM_MPI_test_case) :: field_checksum_2d_testcase + end type field_checksum_2d_testcase contains @test(npes=[4]) subroutine field_checksum_real642d(this) - class (testcase_broadcast), intent(inout) :: this + class (field_checksum_2d_testcase), intent(inout) :: this real, parameter :: field(5,5) = 1.0 integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index f15ed0df..894a9318 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -6,14 +6,14 @@ module test_field_checksum_real643d implicit none @testCase() - type, extends(MOM_MPI_test_case) :: testcase_broadcast - end type testcase_broadcast + type, extends(MOM_MPI_test_case) :: field_checksum_3d_testcase + end type field_checksum_3d_testcase contains @test(npes=[4]) subroutine field_checksum_real643d(this) - class (testcase_broadcast), intent(inout) :: this + class (field_checksum_3d_testcase), intent(inout) :: this real, parameter :: field(5,5,5) = 1.0 integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index bcca0a30..8915ae7e 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -6,14 +6,14 @@ module test_field_checksum_real644d implicit none @testCase() - type, extends(MOM_MPI_test_case) :: testcase_broadcast - end type testcase_broadcast + type, extends(MOM_MPI_test_case) :: field_checksum_4d_testcase + end type field_checksum_4d_testcase contains @test(npes=[4]) subroutine field_checksum_real644d(this) - class (testcase_broadcast), intent(inout) :: this + class (field_checksum_4d_testcase), intent(inout) :: this real, parameter :: field(5,5,5,5) = 1.0 integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 From a8ba3c97049dae5fb9c740c2cef2932f62cbbc24 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:12:42 -0700 Subject: [PATCH 07/22] Add patch documentation. --- build-utils/pfunit-utils/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build-utils/pfunit-utils/Makefile b/build-utils/pfunit-utils/Makefile index 8bc78922..39fd2d23 100644 --- a/build-utils/pfunit-utils/Makefile +++ b/build-utils/pfunit-utils/Makefile @@ -1,5 +1,7 @@ include $(TEMPLATE) +# Required temporary patch to update MAX_LEN_INT_AS_STRING to +# prevent runtime crashes when writing too large of int64 values. PATCH_NOT_APPLIED := $(shell git -C ${PFUNIT_ROOT} apply --quiet --reverse --check ${PATCH_FILE}; echo $$?) ifneq ($(PATCH_NOT_APPLIED), 0) _ := $(shell git -C ${PFUNIT_ROOT} apply --quiet ${PATCH_FILE}) From 917d0f145dc38ea72e4d790ef7a086f86b277bae Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:13:35 -0700 Subject: [PATCH 08/22] Remove old unit test file. --- tests/interface/MOM_field_checksum.pf | 41 --------------------------- 1 file changed, 41 deletions(-) delete mode 100644 tests/interface/MOM_field_checksum.pf diff --git a/tests/interface/MOM_field_checksum.pf b/tests/interface/MOM_field_checksum.pf deleted file mode 100644 index 1ac37f24..00000000 --- a/tests/interface/MOM_field_checksum.pf +++ /dev/null @@ -1,41 +0,0 @@ -module MOM_field_checksum - use iso_fortran_env, only : int32, int64 - - use pfunit - - use MOM_coms_infra, only: field_chksum - use MOM_test_case - - implicit none - - @testCase() - type, extends(MOM_MPI_test_case) :: MOM_comms_infra_test_case - end type MOM_comms_infra_test_case - -contains - - @test(npes=[4]) - subroutine test_field_checksum(this) - class (MOM_comms_infra_test_case), intent(inout) :: this - real :: field - integer(kind=int64) :: checksum - - field = 0.5 - checksum = field_chksum(field) - - @assertEqual(-36028797018963968, checksum) - end subroutine test_field_checksum - -end module MOM_field_checksum - -! #include -! #include -! #include - -! int main() -! { -! double a = 0.5; -! auto a_int = std::bit_cast(a); -! a_int *= 4; -! std::cout << a_int << std::endl; -! } \ No newline at end of file From b0e235020fcd223e3961bbf7572b3cebd5026938 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:15:13 -0700 Subject: [PATCH 09/22] Fix missing blankline. --- tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf | 2 +- tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf | 2 +- tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf | 2 +- tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf index 91d760ac..d5b808be 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -24,4 +24,4 @@ contains @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real640d -end module test_field_checksum_real640d \ No newline at end of file +end module test_field_checksum_real640d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 959695a6..c090d23b 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -23,4 +23,4 @@ contains @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real641d -end module test_field_checksum_real641d \ No newline at end of file +end module test_field_checksum_real641d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index 894a9318..529cc6ee 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -24,4 +24,4 @@ contains @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real643d -end module test_field_checksum_real643d \ No newline at end of file +end module test_field_checksum_real643d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index 8915ae7e..dac4d43a 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -23,4 +23,4 @@ contains @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real644d -end module test_field_checksum_real644d \ No newline at end of file +end module test_field_checksum_real644d From 3fb4b9f1f8bc842896d67eb2cabd913284a39e91 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 17:44:31 -0700 Subject: [PATCH 10/22] Fix to support intel and gnu. --- .../MOM_comms_infra/test_field_checksum_real641d.pf | 2 +- .../MOM_comms_infra/test_field_checksum_real642d.pf | 7 +++---- .../MOM_comms_infra/test_field_checksum_real643d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real644d.pf | 6 +++--- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index c090d23b..f88d6235 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real, parameter :: field(5) = 1.0 + real, dimension(5), parameter :: field = 1.0 integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 02c25140..52e04508 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -15,10 +15,9 @@ contains subroutine field_checksum_real642d(this) class (field_checksum_2d_testcase), intent(inout) :: this - real, parameter :: field(5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 - integer(kind=int64) :: actual_checksum - + real, dimension(5,5), parameter :: field = 1.0 + integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index 529cc6ee..1abd7696 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -15,9 +15,9 @@ contains subroutine field_checksum_real643d(this) class (field_checksum_3d_testcase), intent(inout) :: this - real, parameter :: field(5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 - integer(kind=int64) :: actual_checksum + real, dimension(5,5,5), parameter :: field = 1.0 + integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) write (*,*) actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index dac4d43a..e6f85317 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -15,9 +15,9 @@ contains subroutine field_checksum_real644d(this) class (field_checksum_4d_testcase), intent(inout) :: this - real, parameter :: field(5,5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 - integer(kind=int64) :: actual_checksum + real, dimension(5,5,5,5), parameter :: field = 1.0 + integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) From b4a69f7b46f29860aade380ab96f120e99457128 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 18:23:59 -0700 Subject: [PATCH 11/22] Attempt to fix gcc. --- .../interface/MOM_comms_infra/test_field_checksum_real642d.pf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 52e04508..ee2b0689 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -15,8 +15,8 @@ contains subroutine field_checksum_real642d(this) class (field_checksum_2d_testcase), intent(inout) :: this - real, dimension(5,5), parameter :: field = 1.0 - integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 + real, parameter :: field(*,*) = reshape([1.0], [5,5], pad=[1.0]) + integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) From a07f717c96a39e18d97ba02702b6a8befbaebd59 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 18:29:20 -0700 Subject: [PATCH 12/22] Potenital cross compiler fix. --- .../MOM_comms_infra/test_field_checksum_real641d.pf | 2 +- .../MOM_comms_infra/test_field_checksum_real642d.pf | 2 +- .../MOM_comms_infra/test_field_checksum_real643d.pf | 6 +++--- .../MOM_comms_infra/test_field_checksum_real644d.pf | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index f88d6235..344d2055 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real, dimension(5), parameter :: field = 1.0 + real, parameter :: field(*) = reshape([1.0], [5], pad=[1.0]) integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index ee2b0689..d265d1ea 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -17,7 +17,7 @@ contains real, parameter :: field(*,*) = reshape([1.0], [5,5], pad=[1.0]) integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 - integer(kind=int64) :: actual_checksum + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index 1abd7696..813a0274 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -15,9 +15,9 @@ contains subroutine field_checksum_real643d(this) class (field_checksum_3d_testcase), intent(inout) :: this - real, dimension(5,5,5), parameter :: field = 1.0 - integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 - integer(kind=int64) :: actual_checksum + real, parameter :: field(*,*,*) = reshape([1.0], [5,5,5], pad=[1.0]) + integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) write (*,*) actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index e6f85317..4d7b7b9b 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -15,9 +15,9 @@ contains subroutine field_checksum_real644d(this) class (field_checksum_4d_testcase), intent(inout) :: this - real, dimension(5,5,5,5), parameter :: field = 1.0 - integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 - integer(kind=int64) :: actual_checksum + real, parameter :: field(*,*,*,*) = reshape([1.0], [5,5,5,5], pad=[1.0]) + integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) From 72fa824a81e2b438c51344f6002c84ca0abeb70a Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 18:50:25 -0700 Subject: [PATCH 13/22] Another gnu fix. --- .../interface/MOM_comms_infra/test_field_checksum_real640d.pf | 3 +-- .../interface/MOM_comms_infra/test_field_checksum_real641d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real642d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real643d.pf | 2 +- .../interface/MOM_comms_infra/test_field_checksum_real644d.pf | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf index d5b808be..c77d2db3 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real640d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real640d(this) class (field_checksum_0d_testcase), intent(inout) :: this - real, parameter :: field = 0.5 + real :: field = 0.5 integer(kind=int64), parameter :: expected_checksum = -36028797018963968_int64 integer(kind=int64) :: actual_checksum @@ -23,5 +23,4 @@ contains @assertEqual(expected_checksum, actual_checksum) end subroutine field_checksum_real640d - end module test_field_checksum_real640d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 344d2055..5f52aee5 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real, parameter :: field(*) = reshape([1.0], [5], pad=[1.0]) + real :: field(5) = reshape([1.0], [5], pad=[1.0]) integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index d265d1ea..3e5d297d 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real642d(this) class (field_checksum_2d_testcase), intent(inout) :: this - real, parameter :: field(*,*) = reshape([1.0], [5,5], pad=[1.0]) + real :: field(5,5) = reshape([1.0], [5,5], pad=[1.0]) integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index 813a0274..be0d2714 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real643d(this) class (field_checksum_3d_testcase), intent(inout) :: this - real, parameter :: field(*,*,*) = reshape([1.0], [5,5,5], pad=[1.0]) + real :: field(5,5,5) = reshape([1.0], [5,5,5], pad=[1.0]) integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 integer(kind=int64) :: actual_checksum diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index 4d7b7b9b..2a3b5276 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -15,7 +15,7 @@ contains subroutine field_checksum_real644d(this) class (field_checksum_4d_testcase), intent(inout) :: this - real, parameter :: field(*,*,*,*) = reshape([1.0], [5,5,5,5], pad=[1.0]) + real :: field(5,5,5,5) = 1.0 integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 integer(kind=int64) :: actual_checksum From e57ba169337a6768d485b7a8444e7ae4f2bee7c7 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 19:05:05 -0700 Subject: [PATCH 14/22] Another gnu fix. --- .../MOM_comms_infra/test_field_checksum_real641d.pf | 11 ++++++++--- .../MOM_comms_infra/test_field_checksum_real642d.pf | 11 ++++++++--- .../MOM_comms_infra/test_field_checksum_real643d.pf | 12 ++++++++---- .../MOM_comms_infra/test_field_checksum_real644d.pf | 11 ++++++++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 5f52aee5..103ebcef 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,12 +15,17 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real :: field(5) = reshape([1.0], [5], pad=[1.0]) - integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 - integer(kind=int64) :: actual_checksum + real, allocatable :: field(:) + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 + integer(kind=int64) :: actual_checksum + + allocate(field(5)) + field = 1.0 actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) + + deallocate(field) end subroutine field_checksum_real641d end module test_field_checksum_real641d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index 3e5d297d..dc84ac4d 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -15,12 +15,17 @@ contains subroutine field_checksum_real642d(this) class (field_checksum_2d_testcase), intent(inout) :: this - real :: field(5,5) = reshape([1.0], [5,5], pad=[1.0]) - integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 - integer(kind=int64) :: actual_checksum + real, allocatable :: field(:,:) + integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 + integer(kind=int64) :: actual_checksum + + allocate(field(5,5)) + field = 1.0 actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) + + deallocate(field) end subroutine field_checksum_real642d end module test_field_checksum_real642d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index be0d2714..d871f7b4 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -15,13 +15,17 @@ contains subroutine field_checksum_real643d(this) class (field_checksum_3d_testcase), intent(inout) :: this - real :: field(5,5,5) = reshape([1.0], [5,5,5], pad=[1.0]) - integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 - integer(kind=int64) :: actual_checksum + real, allocatable :: field(:,:,:) + integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 + integer(kind=int64) :: actual_checksum + + allocate(field(5,5,5)) + field = 1.0 actual_checksum = field_chksum(field) - write (*,*) actual_checksum @assertEqual(expected_checksum, actual_checksum) + + deallocate(field) end subroutine field_checksum_real643d end module test_field_checksum_real643d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index 2a3b5276..e901ac9e 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -15,12 +15,17 @@ contains subroutine field_checksum_real644d(this) class (field_checksum_4d_testcase), intent(inout) :: this - real :: field(5,5,5,5) = 1.0 - integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 - integer(kind=int64) :: actual_checksum + real, allocatable :: field(:,:,:,:) + integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 + integer(kind=int64) :: actual_checksum + + allocate(field(5,5,5,5)) + field = 1.0 actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) + + deallocate(field) end subroutine field_checksum_real644d end module test_field_checksum_real644d From d8a0843666bdf330ee750cfe40f9cf317d4869b8 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Wed, 4 Feb 2026 19:16:11 -0700 Subject: [PATCH 15/22] Another gcc test. --- .../interface/MOM_comms_infra/test_field_checksum_real641d.pf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 103ebcef..3f74d2bf 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,13 +15,12 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real, allocatable :: field(:) + real, dimension(:), allocatable :: field integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 integer(kind=int64) :: actual_checksum allocate(field(5)) field = 1.0 - actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) From 54c06319df77d1230412c4ad9419309f79186d61 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Thu, 5 Feb 2026 09:17:23 -0700 Subject: [PATCH 16/22] Fix gcc container flags to match ncar flags. --- build-utils/makefile-templates/container-gcc.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-utils/makefile-templates/container-gcc.mk b/build-utils/makefile-templates/container-gcc.mk index 7176f287..9c36383d 100644 --- a/build-utils/makefile-templates/container-gcc.mk +++ b/build-utils/makefile-templates/container-gcc.mk @@ -17,7 +17,8 @@ MAKEFLAGS += --jobs=4 FPPFLAGS := -FFLAGS := -fcray-pointer -fdefault-double-8 -fdefault-real-8 -Waliasing -ffree-line-length-none -fno-range-check +FC_AUTO_R8 := -fdefault-double-8 -fdefault-real-8 +FFLAGS :=$(FC_AUTO_R8) -fcray-pointer -Waliasing -ffree-line-length-none -fno-range-check CFLAGS := -D__IFC From 9fcf53d0ba4b128c173006643b3a37572b27505b Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Thu, 5 Feb 2026 09:38:23 -0700 Subject: [PATCH 17/22] Reverting to simple static initialization. --- .../MOM_comms_infra/test_field_checksum_real641d.pf | 10 +++------- .../MOM_comms_infra/test_field_checksum_real642d.pf | 11 +++-------- .../MOM_comms_infra/test_field_checksum_real643d.pf | 11 +++-------- .../MOM_comms_infra/test_field_checksum_real644d.pf | 11 +++-------- 4 files changed, 12 insertions(+), 31 deletions(-) diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf index 3f74d2bf..e7a38407 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real641d.pf @@ -15,16 +15,12 @@ contains subroutine field_checksum_real641d(this) class (field_checksum_1d_testcase), intent(inout) :: this - real, dimension(:), allocatable :: field - integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 - integer(kind=int64) :: actual_checksum + real :: field(5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -90071992547409920_int64 + integer(kind=int64) :: actual_checksum - allocate(field(5)) - field = 1.0 actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) - - deallocate(field) end subroutine field_checksum_real641d end module test_field_checksum_real641d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf index dc84ac4d..ddff3c78 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real642d.pf @@ -15,17 +15,12 @@ contains subroutine field_checksum_real642d(this) class (field_checksum_2d_testcase), intent(inout) :: this - real, allocatable :: field(:,:) - integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 - integer(kind=int64) :: actual_checksum - - allocate(field(5,5)) - field = 1.0 + real :: field(5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -450359962737049600_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) - - deallocate(field) end subroutine field_checksum_real642d end module test_field_checksum_real642d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf index d871f7b4..cdff19a6 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real643d.pf @@ -15,17 +15,12 @@ contains subroutine field_checksum_real643d(this) class (field_checksum_3d_testcase), intent(inout) :: this - real, allocatable :: field(:,:,:) - integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 - integer(kind=int64) :: actual_checksum - - allocate(field(5,5,5)) - field = 1.0 + real :: field(5,5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = -2251799813685248000_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) - - deallocate(field) end subroutine field_checksum_real643d end module test_field_checksum_real643d diff --git a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf index e901ac9e..2a3b5276 100644 --- a/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf +++ b/tests/interface/MOM_comms_infra/test_field_checksum_real644d.pf @@ -15,17 +15,12 @@ contains subroutine field_checksum_real644d(this) class (field_checksum_4d_testcase), intent(inout) :: this - real, allocatable :: field(:,:,:,:) - integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 - integer(kind=int64) :: actual_checksum - - allocate(field(5,5,5,5)) - field = 1.0 + real :: field(5,5,5,5) = 1.0 + integer(kind=int64), parameter :: expected_checksum = 7187745005283311616_int64 + integer(kind=int64) :: actual_checksum actual_checksum = field_chksum(field) @assertEqual(expected_checksum, actual_checksum) - - deallocate(field) end subroutine field_checksum_real644d end module test_field_checksum_real644d From 51c52044a252cfb4a5c90a22ee5f95691f1353f3 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Thu, 5 Feb 2026 10:48:11 -0700 Subject: [PATCH 18/22] Initial cleanup and refactor of templates. --- build-utils/makefile-templates/container-nvhpc.mk | 3 ++- build-utils/makefile-templates/ncar-nvhpc.mk | 3 ++- build-utils/makefile-templates/ubuntu-gnu.mk | 3 ++- tests/Makefile | 1 + tests/cmake/add_mom_test.cmake | 3 ++- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/build-utils/makefile-templates/container-nvhpc.mk b/build-utils/makefile-templates/container-nvhpc.mk index 686cf159..f702aedf 100644 --- a/build-utils/makefile-templates/container-nvhpc.mk +++ b/build-utils/makefile-templates/container-nvhpc.mk @@ -18,8 +18,9 @@ MAKEFLAGS += --jobs=4 LDFLAGS := FC_AUTO_R8 = -r8 +FC_AUTO_I4 = -i4 FPPFLAGS := $(shell pkg-config --cflags yaml-0.1) -FFLAGS = $(FC_AUTO_R8) -Mnofma -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee +FFLAGS = $(FC_AUTO_R8) -Mnofma $(FC_AUTO_I4) -gopt -time -Mextend -byteswapio -Mflushz -Kieee FFLAGS_DEBUG = -O0 -g # -Mbounds fails compilation and -KTrap=fp fails run! seems like there is a floating point exception in netcdf_io_mod FFLAGS_REPRO = -O1 -tp=x86-64-v3 diff --git a/build-utils/makefile-templates/ncar-nvhpc.mk b/build-utils/makefile-templates/ncar-nvhpc.mk index 1b59d647..0897af16 100644 --- a/build-utils/makefile-templates/ncar-nvhpc.mk +++ b/build-utils/makefile-templates/ncar-nvhpc.mk @@ -19,8 +19,9 @@ MAKEFLAGS += --jobs=8 LDFLAGS := FC_AUTO_R8 = -r8 +FC_AUTO_I4 = -i4 FPPFLAGS := $(shell pkg-config --cflags yaml-0.1) -FFLAGS = $(FC_AUTO_R8) -Mnofma -i4 -gopt -time -Mextend -byteswapio -Mflushz -Kieee -tp=zen3 +FFLAGS = $(FC_AUTO_R8) -Mnofma $(FC_AUTO_I4) -gopt -time -Mextend -byteswapio -Mflushz -Kieee -tp=zen3 CFLAGS = -gopt -time -Mnofma diff --git a/build-utils/makefile-templates/ubuntu-gnu.mk b/build-utils/makefile-templates/ubuntu-gnu.mk index 2bf78727..d7aa28e2 100644 --- a/build-utils/makefile-templates/ubuntu-gnu.mk +++ b/build-utils/makefile-templates/ubuntu-gnu.mk @@ -18,7 +18,8 @@ MAKEFLAGS += --jobs=2 FPPFLAGS := -FFLAGS := -fcray-pointer -fdefault-double-8 -fdefault-real-8 -Waliasing -ffree-line-length-none -fno-range-check +FC_AUTO_R8 = -fdefault-double-8 -fdefault-real-8 +FFLAGS := -fcray-pointer $(FC_AUTO_R8) -Waliasing -ffree-line-length-none -fno-range-check FFLAGS_REPRO = -O2 -fbounds-check FFLAGS_DEBUG = -O0 -g -W -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow diff --git a/tests/Makefile b/tests/Makefile index 881c55a6..6658b8b7 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -6,6 +6,7 @@ include $(TEMPLATE) build_unit_tests: export BLD_PATH=$(BLD_PATH_ROOT) build_unit_tests: export INFRA=$(LIB_INFRA) build_unit_tests: export Fortran_REAL_FLAG=$(FC_AUTO_R8) +build_unit_tests: export Fortran_INT_FLAG=$(FC_AUTO_I4) build_unit_tests: cmake -S . -B ${TEST_BUILD_DIR} \ diff --git a/tests/cmake/add_mom_test.cmake b/tests/cmake/add_mom_test.cmake index fde39fd2..da2a1af2 100644 --- a/tests/cmake/add_mom_test.cmake +++ b/tests/cmake/add_mom_test.cmake @@ -36,6 +36,7 @@ function(add_mom_test TEST_TARGET_NAME) # (ex. when `FC_AUTO_R8 = -fdefault-real-8 -fdefault-double-8` needs # to be passed as two seperate string arguments and not one string) separate_arguments(R8_FLAGS_EXPANDED UNIX_COMMAND "$ENV{Fortran_REAL_FLAG}") - target_compile_options(${TEST_TARGET_NAME} PRIVATE ${R8_FLAGS_EXPANDED}) + separate_arguments(I4_FLAGS_EXPANDED UNIX_COMMAND "$ENV{Fortran_INT_FLAG}") + target_compile_options(${TEST_TARGET_NAME} PRIVATE ${R8_FLAGS_EXPANDED} ${I4_FLAGS_EXPANDED}) endfunction() From 054edc7432055c548b05bc63a4d2acfcdd8a970a Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Thu, 5 Feb 2026 10:57:18 -0700 Subject: [PATCH 19/22] Try adding back support for nvhpc and flang. --- .github/workflows/unit-tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index 0a67e0d1..c53b92f6 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - compiler: [ oneapi, gcc14 ] + compiler: [ oneapi, gcc14, nvhpc, clang ] mpi: [ mpich ] gpu: [ nogpu ] arch: [ x86_64 ] From 00fff2835b5f0ce4db216c3ec999aaee03d6071e Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Tue, 10 Feb 2026 10:58:34 -0700 Subject: [PATCH 20/22] Removing missed lines from merge conflict resolution. --- tests/interface/MOM_comms_infra/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/interface/MOM_comms_infra/CMakeLists.txt b/tests/interface/MOM_comms_infra/CMakeLists.txt index 80c99619..fa33c16d 100644 --- a/tests/interface/MOM_comms_infra/CMakeLists.txt +++ b/tests/interface/MOM_comms_infra/CMakeLists.txt @@ -18,11 +18,5 @@ set(MOM_COMS_INFRA_TESTS add_mom_tests(${MOM_COMS_INFRA_TESTS}) -add_mom_test(test_field_checksum_real640d PFUNIT_FILE test_field_checksum_real640d.pf) -add_mom_test(test_field_checksum_real641d PFUNIT_FILE test_field_checksum_real641d.pf) -add_mom_test(test_field_checksum_real642d PFUNIT_FILE test_field_checksum_real642d.pf) -add_mom_test(test_field_checksum_real643d PFUNIT_FILE test_field_checksum_real643d.pf) -add_mom_test(test_field_checksum_real644d PFUNIT_FILE test_field_checksum_real644d.pf) - # Copy namelist file to output directory to satisfy FMS requirement configure_file(${CONFIG_FILES}/input.nml input.nml COPYONLY) From 79bc474013089a6f76bf22b94c0e5fbe64a37fbe Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Thu, 19 Feb 2026 09:11:18 -0700 Subject: [PATCH 21/22] Fix NCAR NVHPC C++ wrapper. --- build-utils/makefile-templates/ncar-nvhpc.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-utils/makefile-templates/ncar-nvhpc.mk b/build-utils/makefile-templates/ncar-nvhpc.mk index 0897af16..1836d457 100644 --- a/build-utils/makefile-templates/ncar-nvhpc.mk +++ b/build-utils/makefile-templates/ncar-nvhpc.mk @@ -6,7 +6,7 @@ FC = ftn CC = cc -CXX = c++ +CXX = CC LD = ftn $(MAIN_PROGRAM) ############ From ef17d69dc476c814f4c9c616b328d8d125cab123 Mon Sep 17 00:00:00 2001 From: Michael Waxmonsky Date: Tue, 14 Apr 2026 10:15:03 -0600 Subject: [PATCH 22/22] Update pFUnit. --- submodules/pFUnit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/pFUnit b/submodules/pFUnit index 581cd32b..bb987e74 160000 --- a/submodules/pFUnit +++ b/submodules/pFUnit @@ -1 +1 @@ -Subproject commit 581cd32be937df1922ce50fb06ddbc5522e6ce66 +Subproject commit bb987e74ede31d163a0ae553c052887ddbc4e7be