-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbdyStressExport.py
More file actions
149 lines (113 loc) · 5.75 KB
/
bdyStressExport.py
File metadata and controls
149 lines (113 loc) · 5.75 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Export the body stress from the fluid result
# calculated by SimVascular.
import numpy as np
from bdyStressExport import BdyStressExport
from vtk.util.numpy_support import vtk_to_numpy
from vtk.util.numpy_support import numpy_to_vtk
import vtk
# 1. Read in the fluid result containing velocity and pressure.
# 2. Read in the fluid file for geometry.
# 3. Read in the solid file for geometry.
# 4. Find the geometry connection.
# 5. Call the cython function to export the body stress.
class Fluid:
def __init__(self, fluidFile, vName, pName):
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName(fluidFile)
reader.Update()
polyDataModel = reader.GetOutput()
self.nNodes = polyDataModel.GetNumberOfPoints() # _nNodes
self.nodes = np.copy(vtk_to_numpy(polyDataModel.GetPoints().GetData())) # _nodes
self.nodes = self.nodes.astype(float)
self.glbNodeIds = vtk_to_numpy(polyDataModel.GetPointData().GetArray('GlobalNodeID'))
self.glbElementIds = vtk_to_numpy(polyDataModel.GetCellData().GetArray('GlobalElementID'))
# Set the element groups, will be updated to sub-group after partition.
self.nElements = polyDataModel.GetNumberOfCells()
elements = np.empty((self.nElements, 4), dtype=np.int64)
for iElm in range(self.nElements):
vtkCell = polyDataModel.GetCell(iElm)
elements[iElm] = np.array([vtkCell.GetPointId(ipt) for ipt in range(4)])
# Pullout the nodes of each element to construct element's nodes matrix.
self.elementNodeIds = elements
# Read the velocity and pressure result.
self.du = vtk_to_numpy(polyDataModel.GetPointData().GetArray(vName))
self.p = vtk_to_numpy(polyDataModel.GetPointData().GetArray(pName))
class Solid:
"""docstring for solid"""
def __init__(self, solidFile):
reader = vtk.vtkXMLPolyDataReader()
reader.SetFileName(solidFile)
reader.Update()
polyDataModel = reader.GetOutput()
self.nNodes = polyDataModel.GetNumberOfPoints() # _nNodes
self.nodes = np.copy(vtk_to_numpy(polyDataModel.GetPoints().GetData())) # _nodes
self.nodes = self.nodes.astype(float)
self.glbNodeIds = vtk_to_numpy(polyDataModel.GetPointData().GetArray('GlobalNodeID'))
self.glbElementIds = vtk_to_numpy(polyDataModel.GetCellData().GetArray('GlobalElementID'))
# Set the element groups, will be updated to sub-group after partition.
self.nElements = polyDataModel.GetNumberOfCells()
elements = np.empty((self.nElements, 3), dtype=np.int64)
for iElm in range(self.nElements):
vtkCell = polyDataModel.GetCell(iElm)
elements[iElm] = np.array([vtkCell.GetPointId(ipt) for ipt in range(3)])
# Pullout the nodes of each element to construct element's nodes matrix.
self.elementNodeIds = elements
self.polyDataModel = polyDataModel
def SaveVtp(val, uname, polyDataModel, filename):
uTuples = numpy_to_vtk(val)
uTuples.SetName(uname)
polyDataModel.GetPointData().AddArray(uTuples)
writer = vtk.vtkXMLPolyDataWriter()
writer.SetInputData(polyDataModel)
writer.SetFileName(filename)
writer.Write()
print('Write result to {}.'.format(filename))
def main(solidFile, fluidFile, vName, pName, exportFilename):
lumen = Fluid(fluidFile, vName, pName)
wall = Solid(solidFile)
# Identify wall nodes on lumen border.
sorter = np.argsort(lumen.glbNodeIds)
lumenWallNodeIds = sorter[np.searchsorted(lumen.glbNodeIds, wall.glbNodeIds, sorter=sorter)]
# Identify elements attached on the wall.
sorter = np.argsort(lumen.glbElementIds)
elementIds = sorter[np.searchsorted(lumen.glbElementIds, wall.glbElementIds, sorter=sorter)]
lumenWallElements = lumen.elementNodeIds[elementIds]
lDN = np.array([[-1.0, 1.0, 0.0, 0.0],
[-1.0, 0.0, 1.0, 0.0],
[-1.0, 0.0, 0.0, 1.0]])
wallStress = np.zeros((wall.nNodes, 3), dtype=np.float)
BdyStressExport(lumen.nodes, lumenWallElements, lumenWallNodeIds,
wall.nodes, wall.elementNodeIds,
lumen.du, lumen.p, lDN, wallStress)
np.save(exportFilename, wallStress)
# Write to the vtp files.
SaveVtp(wallStress, 'f', wall.polyDataModel, '{}.vtp'.format(exportFilename))
if __name__ == '__main__':
# solidFile = 'Examples/CylinderProject/refine-more-mesh-complete-732470/walls_combined.vtp'
# fluidFile = 'Examples/CylinderProject/MoreFineResults/solution_01500.vtu'
# vName = 'velocity'
# pName = 'pressure'
# exportFilename = 'Examples/CylinderProject/MoreFineResults/cySS_wallStress'
# main(solidFile, fluidFile, vName, pName, exportFilename)
# solidFile = 'Examples/CylinderProject/refine-more-mesh-complete-732470/walls_combined.vtp'
# fluidFile = 'Examples/CylinderProject/MoreFineResults/solution_'
# vName = 'velocity'
# pName = 'pressure'
# exportFilename = 'Examples/CylinderProject/MoreFineResults/cySS_wallStress_'
# expIndex = 0
# for i in range(2700, 3001, 10):
# ffile = '{}{:05d}.vtu'.format(fluidFile, i)
# expfile = '{}{}'.format(exportFilename, expIndex)
# expIndex += 1
# main(solidFile, ffile, vName, pName, expfile)
solidFile = 'Examples/lc/lcSparse-mesh-complete/walls_combined.vtp'
fluidFile = 'Examples/lc/ResultsFourier40/solution_'
vName = 'velocity'
pName = 'pressure'
exportFilename = 'Examples/lc/ResultsFourier40/lcPuls_wallStress_'
expIndex = 0
for i in range(7000, 8401, 10):
ffile = '{}{:05d}.vtu'.format(fluidFile, i)
expfile = '{}{}'.format(exportFilename, expIndex)
expIndex += 1
main(solidFile, ffile, vName, pName, expfile)