diff --git a/CMakeLists.txt b/CMakeLists.txt index 45246ae096a1c8717c650f2bcd3a65a90398d708..10581353dc6e869cbd95370fd2e37a488e6743af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -355,11 +355,11 @@ file(COPY test/decoupled/2p/test_impes-reference.vtu DESTINATION test/decoupled/ file(COPY test/decoupled/2p2c/test_dec2p2c-reference.vtu DESTINATION test/decoupled/2p2c) file(COPY test/common/generalproblem/generallens_box-reference.vtu DESTINATION test/common/generalproblem) file(COPY test/common/generalproblem/generallens_decoupled-reference.vtu DESTINATION test/common/generalproblem) -if(SUPERLU_FOUND AND DUNE_pdelab_FOUND) +if(SUPERLU_FOUND) file(COPY test/freeflow/stokes/stokes-reference.vtu DESTINATION test/freeflow/stokes) file(COPY test/freeflow/stokes2c/stokes2c-reference.vtu DESTINATION test/freeflow/stokes2c) file(COPY test/freeflow/stokes2cni/stokes2cni-reference.vtu DESTINATION test/freeflow/stokes2cni) -endif(SUPERLU_FOUND AND DUNE_pdelab_FOUND) +endif(SUPERLU_FOUND) # set up CTest enable_testing() diff --git a/bin/fuzzycomparevtu.py b/bin/fuzzycomparevtu.py new file mode 100644 index 0000000000000000000000000000000000000000..fc7fb777d8a01580e0614af284137e3f25694b9d --- /dev/null +++ b/bin/fuzzycomparevtu.py @@ -0,0 +1,71 @@ +import argparse +from xml.dom import minidom + +# fuzzy compare XML tree from XML strings +def isFuzzyEqualXml(xml1, xml2, absolute, relative): + dom1 = minidom.parseString(xml1) + dom2 = minidom.parseString(xml2) + return isFuzzyEqualNode(dom1.documentElement, dom2.documentElement, absolute, relative) + +# fuzzy compare of XML nodes +def isFuzzyEqualNode(node1, node2, absolute, relative): + if node1.tagName != node2.tagName: + print 'The name of the node differs in ', node1.tagName, ' and ', node2.tagName + return False + if sorted(node1.attributes.items()) != sorted(node2.attributes.items()): + print 'Attributs differ in node ', node1.tagName + return False + if len(node1.childNodes) != len(node2.childNodes): + print 'Number of children differs in node ', node1.tagName + return False + for node1child, node2child in zip(node1.childNodes, node2.childNodes): + if node1child.nodeType != node2child.nodeType: + print 'Node type differs in ', note1.tagName + return False + if node1child.nodeType == node1child.TEXT_NODE and not isFuzzyEqualText(node1child.data, node2child.data, absolute, relative): + print 'Data differs in node ', node1.tagName + return False + if node1child.nodeType == node1child.ELEMENT_NODE and not isFuzzyEqualNode(node1child, node2child, absolute, relative): + return False + return True + +# fuzzy compare of text consisting of whitespace separated numbers +def isFuzzyEqualText(text1, text2, absolute, relative): + list1 = text1.split() + list2 = text2.split() + # difference only in whitespace? + if (list1 == list2): + return True + # compare number by number + for number1, number2 in zip(list1, list2): + number1 = float(number1) + number2 = float(number2) + if (abs(number1 - number2) > absolute + and (number2 == 0.0 or abs(abs(number1 / number2) - 1.0) > relative)): + print 'Difference to large between', number1, ' and ', number2 + return False + return True + +# main programm +# handle arguments and print help message +parser = argparse.ArgumentParser(description='Fuzzy compare two VTK\ + (Visualization Toolkit) files. The files are accepted if for every\ + value the difference is below the absolute error or below the\ + relative error or below both.') +parser.add_argument('vtu_file_1', type=open, + help='first file to compare') +parser.add_argument('vtu_file_2', type=open, + help='second file to compare') +parser.add_argument('-r', '--relative', type=float, default=1e-2, + help='maximum relative error (default=1e-2)') +parser.add_argument('-a', '--absolute', type=float, default=1e-9, + help='maximum relative error (default=1e-9)') +args = parser.parse_args() + +# fuzzy compare +if (isFuzzyEqualXml(args.vtu_file_1.read(), args.vtu_file_2.read(), args.absolute, args.relative)): + exit +else: + exit(1) + +