/usr/bin/form2ufl is in python-ufl 1.6.0-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #! /usr/bin/python
#
# Simple conversion script from old FFC .form format to UFL format
__authors__ = "Anders Logg"
__date__ = "2008-08-01 -- 2009-03-15"
import sys
import re
from os.path import exists
def help():
print("Simple conversion script from old FFC .form format to UFL format.")
print("")
print("Usage: form2ufl <filename>.form")
def error(message=None):
if not message is None:
print(message)
else:
help()
sys.exit(1)
def split_at_closing_brace(s):
num_left = num_right = 0
for (i, c) in enumerate(s):
if c == "(":
num_left += 1
elif c == ")":
num_right += 1
if num_left == num_right:
return s[:i + 1], s[i + 1:]
return s, ""
def replace_transp(match):
expr1, expr2 = split_at_closing_brace(match.groups()[0])
return expr1 + ".T" + expr2
def replace_mult(match):
start, end = split_at_closing_brace(match.groups()[0])
expr1 = start.split(",")[0][1:].strip()
expr2 = start.split(",")[1][:-1].strip()
if "+" in expr1:
expr1 = "(%s)" % expr1
if "+" in expr2:
expr2 = "(%s)" % expr2
return expr1 + "*" + expr2 + end
def form2ufl(code):
# List of simple replacements
simple_replacements = ((r"\.form", ".ufl"),
(r"\bdot\b", "inner"),
(r"\bD\b", "Dx"),
(r"\bmodulus\b", "abs"),
(r'"interval"', "interval"),
(r'"triangle"', "triangle"),
(r'"tetrahedron"', "tetrahedron"),
(r'MeshSize', "Constant"),
(r'FacetNormal', "VectorConstant"),
(r"Nedelec", "N1curl"),
(r"VectorQuadratureElement\(", 'VectorElement("Quadrature", '),
(r"QuadratureElement\(", 'FiniteElement("Quadrature", '))
# List of complex replacements
complex_replacements = ((r"\btransp(.*)", replace_transp),
(r"\bmult(.*)", replace_mult))
# Iterate over replacemens
for (a, b) in simple_replacements + complex_replacements:
code = re.sub(a, b, code)
return code
def main(args):
# Check command-line arguments
if not len(args) == 1:
error()
# Get prefix and filenames
words = args[0].split(".form")
if not (len(words) == 2 and words[1] == ""):
error()
prefix = words[0]
form_filename = prefix + ".form"
ufl_filename = prefix + ".ufl"
# Check if outfile exists
if exists(ufl_filename):
error("File already exists: " + ufl_filename)
print("Converting %s --> %s" % (form_filename, ufl_filename))
# Read file
try:
file = open(form_filename, "r")
code = file.read()
file.close()
except:
error("Unable to read file: " + form_filename)
# Convert to UFL
code = form2ufl(code)
# Write file
try:
file = open(ufl_filename, "w")
file.write(code)
file.close()
except:
error("Unable to write to file: " + ufl_filename)
if __name__ == "__main__":
main(sys.argv[1:])
sys.exit(0)
|