Skip to content

Commit 8dcd0e8

Browse files
committed
Fix check_field_4d with nan_count feature
1 parent 033e390 commit 8dcd0e8

1 file changed

Lines changed: 47 additions & 16 deletions

File tree

src/physics/utils/physics_data.F90

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)