Skip to content

Commit bba26da

Browse files
committed
add verbose option
1 parent 2da4504 commit bba26da

File tree

2 files changed

+60
-11
lines changed

2 files changed

+60
-11
lines changed

src/shared_utilities/utils.jl

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ function isdivisible(
494494
end
495495

496496
"""
497-
count_nans_state(state, mask::ClimaCore.Fields.Field = nothing)
497+
count_nans_state(state, mask::ClimaCore.Fields.Field = nothing, verbose = false)
498498
499499
Count the number of NaNs in the state, e.g. the FieldVector given by
500500
`sol.u[end]` after calling `solve`. This function is useful for
@@ -508,24 +508,35 @@ If a ClimaCore Field is provided as `mask`, the function will only count NaNs
508508
in the state variables where the mask is 1. This is intended to be used with
509509
the land/sea mask, to avoid counting NaNs over the ocean. Note this assumes
510510
the mask is 1 over land and 0 over ocean.
511+
512+
The `verbose` argument toggles whether the function produces output when no
513+
NaNs are found.
511514
"""
512-
function count_nans_state(state::ClimaCore.Fields.FieldVector, mask = nothing)
515+
function count_nans_state(
516+
state::ClimaCore.Fields.FieldVector;
517+
mask = nothing,
518+
verbose = false,
519+
)
513520
for pn in propertynames(state)
514521
state_new = getproperty(state, pn)
515522
@info "Checking NaNs in $pn"
516-
count_nans_state(state_new, mask)
523+
count_nans_state(state_new; mask, verbose)
517524
end
518525
return nothing
519526
end
520527

521-
function count_nans_state(state::ClimaCore.Fields.Field, mask = nothing)
528+
function count_nans_state(
529+
state::ClimaCore.Fields.Field;
530+
mask = nothing,
531+
verbose = false,
532+
)
522533
num_nans =
523534
isnothing(mask) ? count(==(1), isnan.(parent(state))) :
524535
count(==(1), isnan.(parent(state)) .* parent(mask))
525536
if num_nans > 0
526537
@warn "$num_nans NaNs found"
527538
else
528-
@info "No NaNs found"
539+
verbose && @info "No NaNs found"
529540
end
530541
return nothing
531542
end

test/shared_utilities/utilities.jl

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,21 @@ end
275275
# Construct a FieldVector containing the fields and a nested FieldVector
276276
Y = Fields.FieldVector(var1 = var1, fieldvec = fieldvec)
277277

278-
# Count and log the number of NaNs in the state
278+
# Count and log the number of NaNs in the state (test verbose and non-verbose cases)
279279
@test_logs (:info, "Checking NaNs in var1") (:info, "No NaNs found") (
280280
:info,
281281
"Checking NaNs in fieldvec",
282282
) (:info, "Checking NaNs in var2") (:info, "No NaNs found") (
283283
:info,
284284
"Checking NaNs in var3",
285-
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y)
285+
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y, verbose = true)
286+
287+
@test_logs (:info, "Checking NaNs in var1") (
288+
:info,
289+
"Checking NaNs in fieldvec",
290+
) (:info, "Checking NaNs in var2") (:info, "Checking NaNs in var3") ClimaLand.count_nans_state(
291+
Y,
292+
)
286293

287294
# Add some NaNs to the fields without scalar indexing
288295
ArrayType = ClimaComms.array_type(ClimaComms.device())
@@ -294,14 +301,22 @@ end
294301
var2_copy[2] = NaN
295302
parent(var2) .= ArrayType(var2_copy)
296303

297-
# Count and log the number of NaNs in the state
304+
# Count and log the number of NaNs in the state (test verbose and non-verbose cases)
305+
@test_logs (:info, "Checking NaNs in var1") (:warn, "1 NaNs found") (
306+
:info,
307+
"Checking NaNs in fieldvec",
308+
) (:info, "Checking NaNs in var2") (:warn, "2 NaNs found") (
309+
:info,
310+
"Checking NaNs in var3",
311+
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y, verbose = true)
312+
298313
@test_logs (:info, "Checking NaNs in var1") (:warn, "1 NaNs found") (
299314
:info,
300315
"Checking NaNs in fieldvec",
301316
) (:info, "Checking NaNs in var2") (:warn, "2 NaNs found") (
302317
:info,
303318
"Checking NaNs in var3",
304-
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y)
319+
) ClimaLand.count_nans_state(Y)
305320

306321
# Test with a mask
307322
mask_zeros = Fields.zeros(space)
@@ -311,7 +326,18 @@ end
311326
) (:info, "Checking NaNs in var2") (:info, "No NaNs found") (
312327
:info,
313328
"Checking NaNs in var3",
314-
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y, mask_zeros)
329+
) (:info, "No NaNs found") ClimaLand.count_nans_state(
330+
Y,
331+
mask = mask_zeros,
332+
verbose = true,
333+
)
334+
@test_logs (:info, "Checking NaNs in var1") (
335+
:info,
336+
"Checking NaNs in fieldvec",
337+
) (:info, "Checking NaNs in var2") (:info, "Checking NaNs in var3") ClimaLand.count_nans_state(
338+
Y,
339+
mask = mask_zeros,
340+
)
315341

316342
mask_ones = Fields.ones(space)
317343
@test_logs (:info, "Checking NaNs in var1") (:warn, "1 NaNs found") (
@@ -320,5 +346,17 @@ end
320346
) (:info, "Checking NaNs in var2") (:warn, "2 NaNs found") (
321347
:info,
322348
"Checking NaNs in var3",
323-
) (:info, "No NaNs found") ClimaLand.count_nans_state(Y, mask_ones)
349+
) (:info, "No NaNs found") ClimaLand.count_nans_state(
350+
Y,
351+
mask = mask_ones,
352+
verbose = true,
353+
)
354+
355+
@test_logs (:info, "Checking NaNs in var1") (:warn, "1 NaNs found") (
356+
:info,
357+
"Checking NaNs in fieldvec",
358+
) (:info, "Checking NaNs in var2") (:warn, "2 NaNs found") (
359+
:info,
360+
"Checking NaNs in var3",
361+
) ClimaLand.count_nans_state(Y, mask = mask_ones)
324362
end

0 commit comments

Comments
 (0)