Scientific data often uses sentinel values before a richer missing-data format is introduced. A validation pass can count the usable readings.

Program

Play the program to choose the sentinel code and see how the valid-count summary changes.

missing_code_filter.f90
program missing_code_filter_demo
    implicit none
    integer :: readings(5)
    integer :: missing_code
    integer :: usable_count
    integer :: usable_total
    logical :: usable(5)

    readings = [12, -99, 15, 18, -99]
    missing_code = 
    usable = readings /= missing_code
    usable_count = count(usable)
    usable_total = sum(readings, mask=usable)
    print '(I0, 1X, I0)', usable_count, usable_total
end program missing_code_filter_demo
program missing_code_filter_demo
    implicit none
    integer :: readings(5)
    integer :: missing_code
    integer :: usable_count
    integer :: usable_total
    logical :: usable(5)

    readings = [12, -99, 15, 18, -99]
    missing_code = 
    usable = readings /= missing_code
    usable_count = count(usable)
    usable_total = sum(readings, mask=usable)
    print '(I0, 1X, I0)', usable_count, usable_total
end program missing_code_filter_demo
program missing_code_filter_demo
    implicit none
    integer :: readings(5)
    integer :: missing_code
    integer :: usable_count
    integer :: usable_total
    logical :: usable(5)

    readings = [12, -99, 15, 18, -99]
    missing_code = 
    usable = readings /= missing_code
    usable_count = count(usable)
    usable_total = sum(readings, mask=usable)
    print '(I0, 1X, I0)', usable_count, usable_total
end program missing_code_filter_demo
sentinel A sentinel value marks readings that should be excluded.
logical mask `readings /= missing_code` creates a mask of usable positions.
masked sum `sum(readings, mask=usable)` ignores values that are not usable.