@@ -1015,6 +1015,9 @@ subroutine check_field_4d(file, var_names, vcoord_name, timestep, &
10151015 integer :: max_diff_gl_lev
10161016 integer :: max_diff_gl_extra_dim
10171017 integer :: diff_count_gl
1018+ integer :: nan_count
1019+ integer :: nan_count_gl
1020+ logical :: has_nan
10181021
10191022 ! Initialize output variables
10201023 ierr = 0
@@ -1029,6 +1032,8 @@ subroutine check_field_4d(file, var_names, vcoord_name, timestep, &
10291032 max_diff(1 ) = 0._kind_phys
10301033 max_diff(2 ) = real (iam, kind_phys) ! MPI rank for this task
10311034 diff_found = .false.
1035+ nan_count = 0
1036+ has_nan = .false.
10321037
10331038 call cam_pio_find_var(file, var_names, found_name, vardesc, var_found)
10341039 if (.not. var_found) then
@@ -1054,28 +1059,53 @@ subroutine check_field_4d(file, var_names, vcoord_name, timestep, &
10541059 do extra_dim = 1 , size (buffer, 3 )
10551060 do lev = 1 , num_levs
10561061 do col = 1 , size (buffer(:,lev,extra_dim))
1057- if (abs (current_value(col, lev, extra_dim)) < min_relative_value) then
1058- ! Calculate absolute difference:
1059- diff = abs (current_value(col, lev, extra_dim) - buffer(col, lev, extra_dim))
1062+ ! Check for NaNs first
1063+ if (current_value(col, lev, extra_dim) /= current_value(col, lev, extra_dim) .or. &
1064+ buffer(col, lev, extra_dim) /= buffer(col, lev, extra_dim)) then
1065+ nan_count = nan_count + 1
1066+ if (.not. has_nan) then
1067+ has_nan = .true.
1068+
1069+ ! Force max_diff to NaN to signal NaN found
1070+ max_diff(1 ) = current_value(col, lev, extra_dim) - &
1071+ buffer(col, lev, extra_dim)
1072+ max_diff_col = col
1073+ max_diff_lev = lev
1074+ max_diff_extra_dim = extra_dim
1075+ end if
10601076 else
1061- ! Calculate relative difference:
1062- diff = abs (current_value(col, lev, extra_dim) - buffer(col, lev, extra_dim)) / &
1063- abs (current_value(col, lev, extra_dim))
1064- end if
1065- if (diff > max_diff(1 )) then
1066- max_diff(1 ) = diff
1067- max_diff_col = col
1068- max_diff_lev = lev
1069- max_diff_extra_dim = extra_dim
1070- end if
1071- ! Determine if diff is large enough to be considered a "hit"
1072- if (diff > min_difference) then
1073- diff_count = diff_count + 1
1077+ if (abs (current_value(col, lev, extra_dim)) < min_relative_value) then
1078+ ! Absolute difference
1079+ diff = abs (current_value(col, lev, extra_dim) - &
1080+ buffer(col, lev, extra_dim))
1081+ else
1082+ ! Relative difference
1083+ diff = abs (current_value(col, lev, extra_dim) - &
1084+ buffer(col, lev, extra_dim)) / &
1085+ abs (current_value(col, lev, extra_dim))
1086+ end if
1087+
1088+ if (diff > max_diff(1 )) then
1089+ max_diff(1 ) = diff
1090+ max_diff_col = col
1091+ max_diff_lev = lev
1092+ max_diff_extra_dim = extra_dim
1093+ end if
1094+
1095+ if (diff > min_difference) then
1096+ diff_count = diff_count + 1
1097+ end if
10741098 end if
10751099 end do
10761100 end do
10771101 end do
10781102
1103+ ! Add NaN count to total difference count:
1104+ diff_count = diff_count + nan_count
1105+
1106+ call mpi_reduce(nan_count, nan_count_gl, 1 , mpi_integer, &
1107+ mpi_sum, masterprocid, mpicom, ierr)
1108+
10791109 ! Make relevant MPI calls to get global values:
10801110 call mpi_reduce(diff_count, diff_count_gl, 1 , mpi_integer, &
10811111 mpi_sum, masterprocid, mpicom, ierr)
@@ -1118,6 +1148,7 @@ subroutine check_field_4d(file, var_names, vcoord_name, timestep, &
11181148 if (masterproc) then
11191149 if (diff_count_gl > 0 ) then
11201150 call write_check_field_entry(stdname, diff_count_gl, &
1151+ nan_count_gl, &
11211152 max_diff_gl(1 ), &
11221153 int (max_diff_gl(2 )), &
11231154 max_diff_gl_col, &
0 commit comments