From b00505eca6566737820c9f4c8ff1c841533c3760 Mon Sep 17 00:00:00 2001 From: Tiffany Chhim Date: Tue, 16 May 2023 12:06:25 +0200 Subject: [PATCH] FRD to VTK: Read the first timestep for the first data array This is for illustration purposes. The actual results also contain several timesteps. --- frd2vtk.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/frd2vtk.py b/frd2vtk.py index 8e6b2e5..d0d7bc6 100644 --- a/frd2vtk.py +++ b/frd2vtk.py @@ -1,6 +1,7 @@ from vtk import vtkUnstructuredGrid from vtk import vtkXMLUnstructuredGridWriter from vtk import vtkPoints +from vtk import vtkDoubleArray from vtk import VTK_QUADRATIC_HEXAHEDRON @@ -11,10 +12,12 @@ with open("result.frd", 'r') as f: while line: if line[0:6] == ' 1C': data['calc name'] = line[6:] + elif line[0:6] == ' 1U': if not 'user informations' in data: data['user informations'] = [] data['user informations'].append(line[6:]) + elif line[0:6] == ' 2C': number_of_nodes = int(line[7:37]) node_format = int(line[38:]) @@ -34,6 +37,7 @@ with open("result.frd", 'r') as f: line = f.readline() if line[0:3] != ' -3': raise("Missing end record for node block: the line does not start with ' -3'.") + elif line[0:6] == ' 3C': number_of_elements = int(line[7:37]) element_format = int(line[38:]) @@ -77,34 +81,89 @@ with open("result.frd", 'r') as f: if line[0:3] != ' -3': print(line[0:3]) raise("Missing end record for element block: the line does not start with ' -3'.") + + elif line[0:6] == ' 100C': + number_of_values = int(line[24:36]) + + line = f.readline() + if line[0:3] != ' -4': + raise("Missing array info record for node block: the line does not start with ' -4'.") + name = line[3:17].strip() + + number_of_components = 0 + line = f.readline() + while line[0:3] == ' -5': + if line[5:8] != 'ALL': + number_of_components = number_of_components + 1 + line = f.readline() + array = {} + array[name] = [] + + for value_index in range(number_of_values): + if line[0:3] != ' -1': + raise("Wrong record in data section: the line does not start with ' -1'.") + node_number = int(line[3:13]) + values = [] + + for comp in range(number_of_components): + values.append(float(line[(12*comp+13):(12*(comp+1)+13)])) + + array[name].append([node_number, values]) + line = f.readline() + + data['arrays'] = array + + # Stop reading here for this example + break + line = f.readline() # Create VTK data object. -vtk_unstructured_grid = vtkUnstructuredGrid() +my_vtk_dataset = vtkUnstructuredGrid() +# Create points. points = vtkPoints() nodes = data['nodes'] node_map = {} + for node_id in range(len(nodes)): points.InsertPoint(node_id, nodes[node_id][1]) node_map[nodes[node_id][0]] = node_id -vtk_unstructured_grid.SetPoints(points) +my_vtk_dataset.SetPoints(points) + +# Create cells. elements = data['elements'] -vtk_unstructured_grid.Allocate(len(elements)) +my_vtk_dataset.Allocate(len(elements)) + for element_id in range(len(elements)): if elements[element_id][1] != 4: raise("Unsupported element type, he20 element supported only (type 4).") + nodes = [node_map[id] for id in elements[element_id][4]] node_numbers = [nodes[0],nodes[1],nodes[2],nodes[3], nodes[4],nodes[5],nodes[6],nodes[7], nodes[8],nodes[9],nodes[10],nodes[11], nodes[16],nodes[17],nodes[18],nodes[19], nodes[12],nodes[13],nodes[14],nodes[15]] - vtk_unstructured_grid.InsertNextCell(VTK_QUADRATIC_HEXAHEDRON, 20, node_numbers) + my_vtk_dataset.InsertNextCell(VTK_QUADRATIC_HEXAHEDRON, 20, node_numbers) + +# Create data array. +name = list(data['arrays'].keys())[0] +array_values = data['arrays'][name] + +array = vtkDoubleArray() +array.SetNumberOfComponents(3) +array.SetNumberOfTuples(len(array_values)) +array.SetName(name) + +for values in array_values: + array.SetTuple(values[0] - 1, values[1]) + +my_vtk_dataset.GetPointData().AddArray(array) # Write VTK data object. writer = vtkXMLUnstructuredGridWriter() writer.SetFileName("output.vtu") -writer.SetInputData(vtk_unstructured_grid) +writer.SetInputData(my_vtk_dataset) writer.Write() -- GitLab