FEM: issue #3038 Fenics integration

- minor changes in xdmf saving dialog
- fixed missing locals() reference in get_FemMeshObjectElementTypes for python3 compatiblity in xml/xdmf import/export
- fixed open() and write() commands for python3 compatiblity in xml/xdmf export
- fixed further python3 issues in xml/xdmf import/export
This commit is contained in:
joha2
2018-01-01 18:03:16 +01:00
committed by wmayer
parent 004206aa0b
commit 6aa8c6b00d
5 changed files with 33 additions and 20 deletions

View File

@@ -84,18 +84,30 @@ class WriteXDMFTaskPanel:
# group elements
self.form.tableGroups.setItem(ind, 2, ro(QtGui.QTableWidgetItem(fem_mesh.getGroupElementType(gind))))
# default value for not marked elements
self.form.tableGroups.setItem(ind, 3, QtGui.QTableWidgetItem(str(-1)))
self.form.tableGroups.setItem(ind, 3, QtGui.QTableWidgetItem(str(0)))
# default value for marked elements
self.form.tableGroups.setItem(ind, 4, QtGui.QTableWidgetItem(str(gind)))
self.form.tableGroups.setItem(ind, 4, QtGui.QTableWidgetItem(str(1)))
header = self.form.tableGroups.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(3, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(4, QtGui.QHeaderView.Stretch)
def convert_table_to_group_dict(self):
group_values_dict = {}
num_rows = self.form.tableGroups.rowCount()
for r in range(num_rows):
g = int(self.form.tableGroups.item(r, 0).text())
default_value = int(self.form.tableGroups.item(r, 3).text())
marked_value = int(self.form.tableGroups.item(r, 4).text())
g = int(self.form.tableGroups.item(r, 0).text()) # read-only no prob
default_value = 0
marked_value = 1
try:
default_value = int(self.form.tableGroups.item(r, 3).text())
marked_value = int(self.form.tableGroups.item(r, 4).text())
except:
print("ERROR: value conversion failed in table to dict: assuming 0 for default, 1 for marked.")
group_values_dict[g] = (marked_value, default_value)

View File

@@ -100,7 +100,8 @@ def get_FemMeshObjectElementTypes(fem_mesh_obj, remove_zero_element_entries=True
"Node": 0, "Edge": 1, "Hexa": 3, "Polygon": 2, "Polyhedron": 3,
"Prism": 3, "Pyramid": 3, "Quadrangle": 2, "Tetra": 3, "Triangle": 2}
elements_list_with_zero = [(eval("fem_mesh_obj.FemMesh." + s + "Count"), s, d) for (s, d) in FreeCAD_element_names_dims.iteritems()]
eval_dict = locals() # to access local variables from eval
elements_list_with_zero = [(eval("fem_mesh_obj.FemMesh." + s + "Count", eval_dict), s, d) for (s, d) in FreeCAD_element_names_dims.items()]
# ugly but necessary
if remove_zero_element_entries:
elements_list = [(num, s, d) for (num, s, d) in elements_list_with_zero if num > 0]

View File

@@ -125,7 +125,7 @@ def read_fenics_mesh_xml(xmlfilename):
Works only with tet4 and tri3 elements at the moment
'''
if dim == 3:
for (ind, tet) in element_dict['tetra4'].iteritems():
for (ind, tet) in list(element_dict['tetra4'].items()):
v0 = nodes[tet[0]]
v1 = nodes[tet[1]]
v2 = nodes[tet[2]]
@@ -137,7 +137,7 @@ def read_fenics_mesh_xml(xmlfilename):
element_dict['tetra4'][ind] = (tet[1], tet[0], tet[2], tet[3])
if dim == 2:
nz = FreeCAD.Vector(0., 0., 1.)
for (ind, tria) in element_dict['tria3'].iteritems():
for (ind, tria) in list(element_dict['tria3'].items()):
v0 = nodes[tria[0]]
v1 = nodes[tria[1]]
v2 = nodes[tria[2]]
@@ -150,7 +150,7 @@ def read_fenics_mesh_xml(xmlfilename):
element_counter = {}
# TODO: remove upper level lookup
for (key, val) in Fenics_to_FreeCAD_dict.iteritems():
for (key, val) in list(Fenics_to_FreeCAD_dict.items()):
element_dict[val] = {}
element_counter[key] = 0 # count every distinct element and sub element type
@@ -163,7 +163,7 @@ def read_fenics_mesh_xml(xmlfilename):
def invertdict(dic):
invdic = {}
for (key, it) in dic.iteritems():
for (key, it) in list(dic.items()):
invdic[it] = key
return invdic
@@ -178,7 +178,7 @@ def read_fenics_mesh_xml(xmlfilename):
'hexahedron': ['quadrilateral', 'interval'],
'quadrilateral': ['interval']}
for (cell_index, cell) in cell_dict.iteritems():
for (cell_index, cell) in list(cell_dict.items()):
cell_lower_dims = lower_dims_dict[cell_type]
element_counter[cell_type] += 1
element_dict[Fenics_to_FreeCAD_dict[cell_type]][cell] = element_counter[cell_type]
@@ -190,9 +190,9 @@ def read_fenics_mesh_xml(xmlfilename):
element_counter[ld])
length_counter = len(nodes)
for (key, val_dict) in element_dict.iteritems():
for (key, val_dict) in list(element_dict.items()):
# to ensure distinct indices for FreeCAD
for (vkey, it) in val_dict.iteritems():
for (vkey, it) in list(val_dict.items()):
val_dict[vkey] = it + length_counter
length_counter += len(val_dict)
# inverse of the dict (dict[key] = val -> dict[val] = key)
@@ -205,7 +205,7 @@ def read_fenics_mesh_xml(xmlfilename):
nodes = {}
element_dict = {}
# TODO: remove two times initialization
for val in Fenics_to_FreeCAD_dict.itervalues():
for val in list(Fenics_to_FreeCAD_dict.values()):
element_dict[val] = {}
tree = ET.parse(xmlfilename)

View File

@@ -101,7 +101,7 @@ def write_fenics_mesh_points_xdmf(fem_mesh_obj, geometrynode, encoding=ENCODING_
if encoding == ENCODING_ASCII:
dataitem = ET.SubElement(geometrynode, "DataItem", Dimensions="%d %d" % (numnodes, effective_dim), Format="XML")
nodes = []
for (ind, (key, node)) in enumerate(fem_mesh_obj.FemMesh.Nodes.iteritems()):
for (ind, (key, node)) in enumerate(list(fem_mesh_obj.FemMesh.Nodes.items())):
nodes.append(node)
recalc_nodes_ind_dict[key] = ind
@@ -282,7 +282,7 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, group_values_dict={}, encod
mesh_function_attribute = ET.SubElement(mesh_function_grid, "Attribute")
elem_dict = {}
(elem_mark_group, elem_mark_default) = group_values_dict.get(g, (g, -1))
(elem_mark_group, elem_mark_default) = group_values_dict.get(g, (1, 0))
# TODO: is it better to save all groups each at once or collect all codim equal
# groups to put them into one function?
@@ -299,8 +299,8 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, group_values_dict={}, encod
# TODO: improve cell functions support
fp = open(outputfile, "w")
fp.write('''<?xml version="1.0"?>\n<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>\n''')
fp = open(outputfile, "wb")
fp.write(b'''<?xml version="1.0"?>\n<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>\n''')
fp.write(ET.tostring(root))
# xml core functionality does not support pretty printing
# so the output file looks quite ugly

View File

@@ -68,7 +68,7 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
meshchild = ET.SubElement(root, "mesh", celltype=cellname_fenics, dim=str(dim_cell))
vertices = ET.SubElement(meshchild, "vertices", size=str(fem_mesh_obj.FemMesh.NodeCount))
for (nodeind, fc_vec) in fem_mesh_obj.FemMesh.Nodes.iteritems(): # python2
for (nodeind, fc_vec) in list(fem_mesh_obj.FemMesh.Nodes.items()):
ET.SubElement(
vertices, "vertex", index=str(nodeind - 1),
# FC starts from 1, fenics starts from 0 to size-1
@@ -97,7 +97,7 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
ET.SubElement(meshchild, "data")
fp = open(outputfile, "w")
fp = open(outputfile, "wb")
fp.write(ET.tostring(root))
# xml core functionality does not support pretty printing
# so the output file looks quite ugly