向网格点添加位移数据

Add displacement data to mesh points

假设我有一个包含 Tet4 元素的网格。该网格共有 1695 个节点和 7726 个元素。现在我可以使用 pyvista 创建未变形的网格,如下所示:

points = Node_Data[:,1:4]
cells = EL_Data[:, 1:5]
cells= np.insert(cells, 0, 4, axis = 1)
celltypes = np.empty(7726, dtype=np.float32)
celltypes[:] = vtk.VTK_TETRA
grid = pv.UnstructuredGrid(cells, celltypes, points)
mesh = grid
mesh.n_cells
mesh.n_points
mesh.bounds
mesh.save("test1234.vtk")

我的问题是如何将位移数据添加到此网格中?所以在 paraview 中,它看起来像这样:

我目前的数据是这样的:

或者有其他方法可以解决这个问题吗?

我不熟悉 ParaView,但您似乎想将矢量值点数据添加到网格中。 PyVista 的许多示例都隐含地这样做了,但是在文档的 the Basic API Usage 页中也提到了这一点。

假设您有一个名为 displacements 的数组,其形状为 (mesh.n_points, 3)(即网格中每个点的一个 3 维向量),其中向量与网格点的顺序相同,你只需要做

mesh.point_data['U'] = displacements
mesh.active_vectors_name = 'U'  # make these active vectors

这将定义此数组与您的点相关联,标签为 'U'。对于单元格数据,您需要 mesh.cell_data[...] = ...,但显然相应数据数组的形状必须是 (mesh.n_cells, 3)(对于向量值数据)。

这是一个简单的例子:

>>> import numpy as np
>>> import pyvista as pv
>>> mesh = pv.Box()  # no arrays here
>>> mesh.point_data['U'] = np.arange(mesh.n_points * 3).reshape(-1, 3)
>>> mesh.active_vectors_name = 'U'
>>> mesh.point_data
pyvista DataSetAttributes
Association     : POINT
Active Scalars  : U
Active Vectors  : U
Active Texture  : None
Active Normals  : None
Contains arrays :
    U                       int64    (8, 3)               VECTORS

您可以在打印输出中看到 point_data 包含一个带有标签 'U'、int dtype 和形状 (8, 3) 的数据集,设置为活动向量。各种过滤器要么使用活动向量,要么接受明确的标签用作向量(即本例中的 'U')。

更新: 我设法写了一个 vtk 文件来显示矢量值。

Outputfile = open('test.vtk','w')
Outputfile.write('# vtk DataFile Version 3.8\n')
Outputfile.write('test.vtk\n')
Outputfile.write('ASCII\n')
Outputfile.write('DATASET UNSTRUCTURED_GRID\n')
Outputfile.write('POINTS ' + str(len(nodes)) + ' float\n')
for i in range(0,len(nodes)):
    Outputfile.write(str(x[i] + curr_U[idxnodes[i] * 3 + 0]) +' '\
                     + str(y[i] + curr_U[idxnodes[i] * 3 + 1])+ ' '\
                     +str(z[i] + curr_U[idxnodes[i] * 3 + 2])+'\n' )
Outputfile.write('CELLS ' + str(len(tets)) +' '+str((len(tets) * 5))+'\n')
for i in range(0,len(tets)):
    Outputfile.write('4 ' + str(n_idx[i][0]) +' '\
                     + str(n_idx[i][1])+' '+ str(n_idx[i][2])+' '+ str(n_idx[i][3])+ '\n' )   
Outputfile.write('CELL_TYPES ' + str(len(tets)) +' \n')
for i in range(0,len(tets)):
    Outputfile.write('10'+'\n' )
Outputfile.write('POINT_DATA ' + str(len(nodes)) +' \n')
Outputfile.write('VECTORS ' + 'test.vtk ' +' float\n')
for i in range(0,len(nodes)):
    Outputfile.write(str(curr_U[m_idxnodes[i] * 3 + 0]) +' '\
                     + str(curr_U[m_idxnodes[i] * 3 + 1])+ ' '\
                     +str(curr_U[m_idxnodes[i] * 3 + 2])+'\n' )
Outputfile.close()

如果有人需要帮助,我只是 post 它在那里。