def compute_values(ufl_element): "Compute values of basis functions for given element." # Get relevant element name element_name = get_element_name(ufl_element) # Create g++ code options = {"element": element_name} code = evaluate_basis_code % options f = open("evaluate_basis.cpp", "w") f.write(code) f.close() # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Compile g++ code c = "g++ %s -Wall -Werror -o evaluate_basis evaluate_basis.cpp" % ufc_cflags error, output = get_status_output(c) if error: gcc_failed.append(repr(ufl_element)) return None # Run compiled code and get values error, output = get_status_output(".%sevaluate_basis" % os.path.sep) if error: run_failed.append(repr(ufl_element)) return None values = [float(value) for value in output.split(" ") if len(value) > 0] return numpy.array(values)
def compute_values(ufl_element, deriv_order): "Compute values of basis functions for given element." # Get relevant element name element_name = get_element_name(ufl_element) # Create g++ code cell = ufl_element.cell() num_derivs = cell.topological_dimension()**deriv_order options = {"element": element_name, "derivative_order":deriv_order, "num_derivatives":num_derivs} code = evaluate_basis_derivatives_code % options f = open("evaluate_basis_derivatives.cpp", "w") f.write(code) f.close() # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Compile g++ code c = "g++ %s -Wall -Werror -o evaluate_basis_derivatives evaluate_basis_derivatives.cpp" % ufc_cflags error, output = get_status_output(c) if error: gcc_failed.append(repr(ufl_element)) return None # Run compiled code and get values error, output = get_status_output(".%sevaluate_basis_derivatives" % os.path.sep) if error: run_failed.append(repr(ufl_element)) return None values = [float(value) for value in output.strip("\n").split(" ") if len(value) > 0] return numpy.array(values)
def compile_element(ufl_element): "Create UFL form file with a single element in it and compile it with FFC" f = open("test.ufl", "w") if isinstance(ufl_element, (FiniteElement, MixedElement)): f.write("element = " + repr(ufl_element)) f.close() error, out = get_status_output("ffc test.ufl") if error: ffc_failed.append(repr(ufl_element)) return error
def compile_element(ufl_element, ffc_fail, log_file): "Create UFL form file with a single element in it and compile it with FFC" f = open("test.ufl", "w") f.write("element = " + repr(ufl_element)) f.close() error, output = get_status_output("ffc test.ufl") if error: info_red("FFC compilation failed.") log_error("element: %s,\n%s\n" % (str(ufl_element), output), log_file) ffc_fail.append(str(ufl_element)) return error
def run_code(ufl_element, deriv_order, run_fail, log_file): "Compute values of basis functions for given element." # Run compiled code and get values error, output = get_status_output(".%sevaluate_basis %d" % (os.path.sep, deriv_order)) if error: info_red("Runtime error (segmentation fault?).") log_error("element: %s,\n%s\n" % (str(ufl_element), output), log_file) run_fail.append(str(ufl_element)) return None values = [[float(value) for value in line.strip().split(" ") if value] for line in output.strip().split("\n")] return numpy.array(values)
def compute_values(ufl_element, deriv_order): "Compute values of basis functions for given element." # Get relevant element name element_name = get_element_name(ufl_element) # Create g++ code cell = ufl_element.cell() num_derivs = cell.topological_dimension()**deriv_order options = { "element": element_name, "derivative_order": deriv_order, "num_derivatives": num_derivs } code = evaluate_basis_derivatives_code % options f = open("evaluate_basis_derivatives.cpp", "w") f.write(code) f.close() # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Compile g++ code c = "g++ %s -Wall -Werror -o evaluate_basis_derivatives evaluate_basis_derivatives.cpp" % ufc_cflags error, output = get_status_output(c) if error: gcc_failed.append(repr(ufl_element)) return None # Run compiled code and get values error, output = get_status_output(".%sevaluate_basis_derivatives" % os.path.sep) if error: run_failed.append(repr(ufl_element)) return None values = [ float(value) for value in output.strip("\n").split(" ") if len(value) > 0 ] return numpy.array(values)
def run_command(command): "Run command and collect errors in log file." t1 = time.time() (status, output) = get_status_output(command) t2 = time.time() global _command_timings _command_timings.append((command, t2 - t1)) if status == 0: return True global logfile if logfile is None: logfile = open("../../error.log", "w") logfile.write(output + "\n") print output return False
def run_command(command): "Run command and collect errors in log file." t1 = time.time() (status, output) = get_status_output(command) t2 = time.time() global _command_timings _command_timings.append((command, t2-t1)) if status == 0: return True global logfile if logfile is None: logfile = open("../../error.log", "w") logfile.write(output + "\n") print output return False
def compile_gcc_code(ufl_element, code, gcc_fail, log_file): # Write code. f = open("evaluate_basis.cpp", "w") f.write(code) f.close() # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Compile g++ code c = "g++ %s -Wall -Werror -o evaluate_basis evaluate_basis.cpp" % ufc_cflags f = open("compile.sh", "w") f.write(c + "\n") f.close() error, output = get_status_output(c) if error: info_red("GCC compilation failed.") log_error("element: %s,\n%s\n" % (str(ufl_element), output), log_file) gcc_fail.append(str(ufl_element)) if error and ("-f" in sys.argv or "--failfast" in sys.argv): print("FAIL") exit(1) return error
def run_command(command): "Run command and collect errors in log file." # Debugging: #print "IN DIRECTORY:", os.path.abspath(os.curdir) #print "RUNNING COMMAND:", command t1 = time.time() (status, output) = get_status_output(command) t2 = time.time() global _command_timings _command_timings.append((command, t2-t1)) if status == 0: return True global logfile if logfile is None: logfile = open("../../error.log", "w") logfile.write(output + "\n") print(output) return False
def run_command(command): "Run command and collect errors in log file." # Debugging: #print "IN DIRECTORY:", os.path.abspath(os.curdir) #print "RUNNING COMMAND:", command t1 = time.time() (status, output) = get_status_output(command) t2 = time.time() global _command_timings _command_timings.append((command, t2 - t1)) if status == 0: return True global logfile if logfile is None: logfile = open("../../error.log", "w") logfile.write(output + "\n") print(output) return False
def build_programs(bench, permissive): "Build test programs for all test cases." # Get a list of all files header_files = [f for f in os.listdir(".") if f.endswith(".h")] header_files.sort() begin("Building test programs (%d header files found)" % len(header_files)) # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Get Boost dir (code copied from ufc/src/utils/python/ufc_utils/build.py) # Set a default directory for the boost installation if sys.platform == "darwin": # Use Brew as default default = os.path.join(os.path.sep, "usr", "local") else: default = os.path.join(os.path.sep, "usr") # If BOOST_DIR is not set use default directory boost_inc_dir = "" boost_lib_dir = "" boost_math_tr1_lib = "boost_math_tr1" boost_dir = os.getenv("BOOST_DIR", default) boost_is_found = False for inc_dir in ["", "include"]: if os.path.isfile( os.path.join(boost_dir, inc_dir, "boost", "version.hpp")): boost_inc_dir = os.path.join(boost_dir, inc_dir) break for lib_dir in ["", "lib", "lib/x86_64-linux-gnu"]: for ext in [".so", "-mt.so", ".dylib", "-mt.dylib"]: _lib = os.path.join(boost_dir, lib_dir, "lib" + boost_math_tr1_lib + ext) if os.path.isfile(_lib): if "-mt" in _lib: boost_math_tr1_lib += "-mt" boost_lib_dir = os.path.join(boost_dir, lib_dir) break if boost_inc_dir != "" and boost_lib_dir != "": boost_is_found = True if not boost_is_found: raise OSError("""The Boost library was not found. If Boost is installed in a nonstandard location, set the environment variable BOOST_DIR. """) ufc_cflags += " -I%s -L%s" % (boost_inc_dir, boost_lib_dir) # Set compiler options compiler_options = "%s -Wall" % ufc_cflags if not permissive: compiler_options += " -Werror -pedantic" if bench: info("Benchmarking activated") # Takes too long to build with -O2 #compiler_options += " -O2" compiler_options += " -O3" #compiler_options += " -O3 -fno-math-errno -march=native" if debug: info("Debugging activated") compiler_options += " -g -O0" info("Compiler options: %s" % compiler_options) # Iterate over all files for f in header_files: # Generate test code filename = generate_test_code(f) # Compile test code prefix = f.split(".h")[0] command = "g++ %s -o %s.bin %s.cpp -l%s" % \ (compiler_options, prefix, prefix, boost_math_tr1_lib) ok = run_command(command) # Check status if ok: info_green("%s OK" % prefix) else: info_red("%s failed" % prefix) end()
def main(args): "Run all regression tests." # Check command-line arguments TODO: Use getargs or something generate_only = "--generate-only" in args fast = "--fast" in args bench = "--bench" in args use_quad = "--skip-quad" not in args use_ext_quad = "--ext-quad" in args use_ext_uflacs = "--ext-uflacs" in args permissive = "--permissive" in args tolerant = "--tolerant" in args print_timing = "--print-timing" in args skip_download = "--skip-download" in args flags = ( "--generate-only", "--fast", "--bench", "--skip-quad", "--ext-quad", "--ext-uflacs", "--permissive", "--tolerant", "--print-timing", "--skip-download", ) args = [arg for arg in args if not arg in flags] # Extract .ufl names from args only_forms = set([arg for arg in args if arg.endswith(".ufl")]) args = [arg for arg in args if arg not in only_forms] # Download reference data if skip_download: info_blue("Skipping reference data download") else: failure, output = get_status_output("./scripts/download") print(output) if failure: info_red("Download reference data failed") else: info_green("Download reference data ok") if tolerant: global output_tolerance output_tolerance = 1e-3 # Clean out old output directory output_directory = "output" clean_output(output_directory) os.chdir(output_directory) # Adjust which test cases (combinations of compile arguments) to # run here test_cases = ["-r auto"] if use_quad and (not bench and not fast): test_cases += ["-r quadrature", "-r quadrature -O"] if use_ext_quad: test_cases += ext_quad if use_ext_uflacs: test_cases = ext_uflacs test_cases += ["-r quadrature"] #test_cases += ["-r quadrature -O"] for argument in test_cases: begin("Running regression tests with %s" % argument) # Clear and enter output sub-directory sub_directory = "_".join(argument.split(" ")).replace("-", "") clean_output(sub_directory) os.chdir(sub_directory) # Generate test cases generate_test_cases(bench, only_forms) # Generate code generate_code(args + [argument], only_forms) # Location of reference directories reference_directory = os.path.abspath("../../ffc-reference-data/") code_reference_dir = os.path.join(reference_directory, sub_directory) # Note: We use the r_auto references for all test cases. This # ensures that we continously test that the codes generated by # all different representations are equivalent. output_reference_dir = os.path.join(reference_directory, "r_auto") # Validate code by comparing to code generated with this set # of compiler parameters if not bench and argument not in ext_quad: validate_code(code_reference_dir) # Build and run programs and validate output to common # reference if fast or generate_only: info("Skipping program validation") elif bench: build_programs(bench, permissive) run_programs(bench) else: build_programs(bench, permissive) run_programs(bench) validate_programs(output_reference_dir) # Go back up os.chdir(os.path.pardir) end() # Print results if print_timing: timings = '\n'.join("%10.2e s %s" % (t, name) for (name, t) in _command_timings) info_green("Timing of all commands executed:") info(timings) if logfile is None: info_green("Regression tests OK") return 0 else: info_red("Regression tests failed") info("Error messages stored in error.log") return 1
def main(args): "Run all regression tests." # Check command-line arguments TODO: Use argparse generate_only = "--generate-only" in args fast = "--fast" in args bench = "--bench" in args use_auto = "--skip-auto" not in args use_quad = "--skip-quad" not in args use_ext_quad = "--ext-quad" in args use_ext_uflacs = "--ext-uflacs" in args permissive = "--permissive" in args tolerant = "--tolerant" in args print_timing = "--print-timing" in args skip_download = "--skip-download" in args ignore_code_diff = "--ignore-code-diff" in args pyop2 = "--pyop2" in args flags = ( "--generate-only", "--fast", "--bench", "--skip-auto", "--skip-quad", "--ext-quad", "--ext-uflacs", "--permissive", "--tolerant", "--print-timing", "--skip-download", "--ignore-code-diff", "--pyop2", ) args = [arg for arg in args if not arg in flags] # Extract .ufl names from args only_forms = set([arg for arg in args if arg.endswith(".ufl")]) args = [arg for arg in args if arg not in only_forms] # Download reference data if skip_download: info_blue("Skipping reference data download") else: failure, output = get_status_output("./scripts/download") print(output) if failure: info_red("Download reference data failed") else: info_green("Download reference data ok") if tolerant: global output_tolerance output_tolerance = 1e-3 # Clean out old output directory output_directory = "output" clean_output(output_directory) os.chdir(output_directory) # Adjust which test cases (combinations of compile arguments) to # run here test_cases = [] if use_auto: test_cases += ["-r auto"] if use_quad and (not bench and not fast): test_cases += ["-r quadrature", "-r quadrature -O"] if use_ext_quad: test_cases += ext_quad if use_ext_uflacs: test_cases = ext_uflacs test_cases += ["-r quadrature"] #test_cases += ["-r quadrature -O"] if pyop2: test_cases += ext_pyop2 for argument in test_cases: begin("Running regression tests with %s" % argument) # Clear and enter output sub-directory sub_directory = "_".join(argument.split(" ")).replace("-", "") clean_output(sub_directory) os.chdir(sub_directory) # Generate test cases generate_test_cases(bench, only_forms) # Generate code generate_code(args + [argument], only_forms) # Location of reference directories reference_directory = os.path.abspath("../../ffc-reference-data/") code_reference_dir = os.path.join(reference_directory, sub_directory) # Note: We use the r_auto references for all test cases. This # ensures that we continously test that the codes generated by # all different representations are equivalent. output_reference_dir = os.path.join(reference_directory, "r_auto") # Validate code by comparing to code generated with this set # of compiler parameters if not bench and (argument not in ext_quad) and not ignore_code_diff: validate_code(code_reference_dir) # Build and run programs and validate output to common # reference if fast or generate_only: info("Skipping program validation") elif bench: if argument in ext_pyop2: build_pyop2_programs(bench, permissive, debug=debug) else: build_ufc_programs(bench, permissive, debug=debug) run_programs(bench) else: if argument in ext_pyop2: build_pyop2_programs(bench, permissive, debug=debug) else: build_ufc_programs(bench, permissive, debug=debug) run_programs(bench) validate_programs(output_reference_dir) # Go back up os.chdir(os.path.pardir) end() # Print results if print_timing: timings = '\n'.join("%10.2e s %s" % (t, name) for (name, t) in _command_timings) info_green("Timing of all commands executed:") info(timings) if logfile is None: info_green("Regression tests OK") return 0 else: info_red("Regression tests failed") info("Error messages stored in error.log") return 1
def build_programs(bench, permissive): "Build test programs for all test cases." # Get a list of all files header_files = [f for f in os.listdir(".") if f.endswith(".h")] header_files.sort() begin("Building test programs (%d header files found)" % len(header_files)) # Get UFC flags ufc_cflags = get_status_output("pkg-config --cflags ufc-1")[1].strip() # Get Boost dir (code copied from ufc/src/utils/python/ufc_utils/build.py) # Set a default directory for the boost installation if sys.platform == "darwin": # Use Brew as default default = os.path.join(os.path.sep, "usr", "local") else: default = os.path.join(os.path.sep, "usr") # If BOOST_DIR is not set use default directory boost_inc_dir = "" boost_lib_dir = "" boost_math_tr1_lib = "boost_math_tr1" boost_dir = os.getenv("BOOST_DIR", default) boost_is_found = False for inc_dir in ["", "include"]: if os.path.isfile(os.path.join(boost_dir, inc_dir, "boost", "version.hpp")): boost_inc_dir = os.path.join(boost_dir, inc_dir) break libdir_multiarch = "lib/" + sysconfig.get_config_vars().get("MULTIARCH", "") for lib_dir in ["", "lib", libdir_multiarch, "lib64"]: for ext in [".so", "-mt.so", ".dylib", "-mt.dylib"]: _lib = os.path.join(boost_dir, lib_dir, "lib" + boost_math_tr1_lib + ext) if os.path.isfile(_lib): if "-mt" in _lib: boost_math_tr1_lib += "-mt" boost_lib_dir = os.path.join(boost_dir, lib_dir) break if boost_inc_dir != "" and boost_lib_dir != "": boost_is_found = True if not boost_is_found: raise OSError("""The Boost library was not found. If Boost is installed in a nonstandard location, set the environment variable BOOST_DIR. """) ufc_cflags += " -I%s -L%s" % (boost_inc_dir, boost_lib_dir) # Set compiler options compiler_options = "%s -Wall " % ufc_cflags if not permissive: compiler_options += " -Werror -pedantic" if bench: info("Benchmarking activated") # Takes too long to build with -O2 #compiler_options += " -O2" compiler_options += " -O3" #compiler_options += " -O3 -fno-math-errno -march=native" if debug: info("Debugging activated") compiler_options += " -g -O0" info("Compiler options: %s" % compiler_options) # Iterate over all files for f in header_files: # Generate test code filename = generate_test_code(f) # Compile test code prefix = f.split(".h")[0] command = "g++ %s -o %s.bin %s.cpp -l%s" % \ (compiler_options, prefix, prefix, boost_math_tr1_lib) ok = run_command(command) # Check status if ok: info_green("%s OK" % prefix) else: info_red("%s failed" % prefix) end()