pyexodiff compares two Exodus II files to determine
whether they are identical. It is intended as a python replacement of the Exodiff utility, allowing two Exodus II files to be compared without the need to install SEACAS.
pyexodiff requires the following python packages to be installed:
- numpy
- netCDF4
- argparse
- re
These can be installed using pip if they are not already installed
pip install numpyfor example.
Two additional python package are required to run the test script:
- pytest
- pyYAML
Again, these can be installed using
pip install pytestfor example.
pyexodiff can be used as a standalone utility to compare two Exoduss II files on the commandline using
./pyexodiff.py file1 file2If the two Exodus II files are identical, pyexodiff reports that they are the same:
$ pyexodiff.py test/simple_cube.e test/simple_cube.e
pyexodiff: files are identicalIf the files are different, however, pyexodiff will report that they are not identical and will provide a brief summary of the differences.
For example, if the dimensions of the Exodus II files are different, then pyexodiff will report the difference:
$ pyexodiff.py test/simple_cube.e test/simple_cube_missing_prop.e
pyexodiff: difference summary:
Dimensions:
num_elem_var is different: file1 size is 6; file2 size is 5
num_sset_var is different: file1 size is 6; file2 size is 5
Variables:
name_elem_var is different: variable poro not in both files
name_sset_var is different: variable poro not in both files
pyexodiff: files are differentIf the variables of both files are not equal (to within the given tolerances), then pyexodiff will print out the maximum difference for each variable that is different as well as its position (node or element id):
$ pyexodiff.py test/simple_cube.e test/simple_cube_incorrect_coordx.e
pyexodiff: difference summary:
Variables:
coordx is different:
max absolute diff 1.0000e+00 at position 12
max relative diff 6.6667e-01 at position 12
pyexodiff: files are differentpyexodiff can also be used as a module in a python script using
from pyexodiff import exodiff
diff = exodiff(file1, file2, atol, rtol)to return a dictionary of the differences.
In this case, the pyexodiff repository should be added to the PYTHONPATH
environment variable
export PYTHONPATH=$PYTHONPATH:/path/to/pyexodiffSome parameters can be overwritten using the commandline options.
$ pyexodiff.py --help
usage: pyexodiff.py [-h] [--rtol RTOL] [--atol ATOL] file1 file2
Compares two Exodus II files
positional arguments:
file1
file2
optional arguments:
-h, --help show this help message and exit
--rtol RTOL Relative tolerance (default: 1e-06)
--atol ATOL Absolute tolerance (default: 1e-06)
-q, --quiet Quiet mode (only prints final message) (default: False)pyexodiff includes a python script run_tests.py which uses the pytest framework to run the included tests. The test suite can be run using
./run_tests.pyNew tests can be added anywhere within the test directory. The test harness recurses through this directory and all subdirectories looking for all instances of a tests file. This YAML file contains the details of each test in that directory.
The tests file syntax is basic YAML, and looks like:
simple_cube:
file1: simple_cube.e
file2: simple_cube.eIn this example, the test harness will run
pyexodiff simple_cube.e simple_cube.eand determine whether the two files are identical.
The test harness can also test for expected error messages. For example, the following block in a tests file
simple_cube_missing_prop:
file1: simple_cube.e
file2: simple_cube_missing_prop.e
expected_error: variable poro not in both fileswill run
pyexodiff simple_cube.e simple_cube_missing_prop.eand then check that the error message contains the string variable poro not in both files.
Each tests files can contain multiple individual tests. When pytest runs the test suite, the top-level label for each individual test in the tests file (for example, the labels simple_cube and missing_specgrid in the above examples) will be printed to the commandline, along with the status of each test run.
The test suite is run automatically on all pull requests to ensure that pyexodiff continues to work as expected.
pyexodiff has been developed by
- Chris Green, CSIRO (cpgr)
New contributions are welcome, using the pull request feature of GitHub.
Any feature requests or bug reports should be made using the issues feature of GitHub. Pull requests are always welcome!