ucftools/python/programs/ucf_file_diff

65 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
import ucf
import argparse
import os
import sys
import traceback
import numpy as np
parser = argparse.ArgumentParser(description='Tests basic integrity of a UCF file')
parser.add_argument('file1', metavar='file1',help='input file #1')
parser.add_argument('file2', metavar='file2',help='input file #2')
parser.add_argument("--debug", help="enable debug output? [default: False]", action="store_true")
parser.add_argument("--stop", help="stop as soon as an error has been detected? [default: False]", action="store_true")
parser.add_argument("--tolerance", metavar='tol', help="floating point tolerance for comparison [default: 1e-12]", type=float)
parser.add_argument("-v","--verbose", help="enable verbose output? [default: False]", action="store_true")
args = parser.parse_args()
file_in1 = args.file1
file_in2 = args.file2
flag_debug = args.debug
flag_verbose = args.verbose
fptol = args.tolerance
flag_stop = args.stop
if fptol is None:
fptol = 1e-12
if os.path.isfile(file_in1)==False:
print('File not found:',file_in1)
sys.exit(1)
if os.path.isfile(file_in2)==False:
print('File not found:',file_in2)
sys.exit(1)
obj1 = ucf.UCF(file=file_in1,verbosity=flag_verbose,debug=flag_debug)
obj2 = ucf.UCF(file=file_in2,verbosity=flag_verbose,debug=flag_debug)
if obj1.NumTimestep!=obj2.NumTimestep:
print("Number of time steps differ: {:d}, {:d}".format(obj1.NumTimestep,obj2.NumTimestep))
sys.exit(2)
errfound=False
for istep in range(0,obj1.NumTimestep):
for iset in range(0,obj1._UCF__numSetPerStep[istep]):
(data1,param1) = obj1.readSet(step=istep+1,dset=iset+1)
(data2,param2) = obj2.readSet(step=istep+1,dset=iset+1)
if not param1==param2:
print('Step #{:d}, set #{:d}: parameter mismatch. {}, {}'.format(istep,iset,param1,param2))
if flag_stop:
sys.exit(3)
else:
errfound=True
if not np.allclose(data1,data2,rtol=fptol):
data_diff = np.abs(data1-data2)
idx = np.argmax(data_diff)
vald = data_diff.flatten()[idx]
val1 = data1.flatten()[idx]
val2 = data2.flatten()[idx]
print('Step #{:d}, set #{:d}: difference in FP data above tolerance. idx={}, diff={}, val1={}, val2={}'.format(istep,iset,idx,vald,val1,val2))
if flag_stop:
sys.exit(4)
else:
errfound=True
if errfound:
sys.exit(5)