0

假设我有一个带有 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 中,它看起来像这样:

最终数据

我当前的数据如下所示:

当前数据

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

4

2 回答 2

1

我不熟悉 ParaView,但看起来您想将矢量值点数据添加到网格中。PyVista 的许多示例都隐含地做到了这一点,但在文档的基本 API 使用页面中也提到了这一点。

displacements假设您有一个名为shape的数组(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包含一个带有 label 'U'、 int dtype 和 shape的数据集(8, 3),设置为活动向量。各种过滤器要么使用活动向量,要么接受明确的标签以用作向量(即'U'在这种情况下)。

于 2022-01-19T10:54:52.287 回答
0

更新:我设法编写了一个 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()

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

于 2022-01-20T01:51:08.627 回答