从 abaqus inp 文件写入 VTK 文件

问题描述 投票:0回答:1

我正在尝试使用 python scirpt 从 abaqus .inp 文件写入 VTK 文件。将其转换为 vtk 的目的是可视化根据应变变化的材料属性。由于我没有使用 VTK 文件的经验,因此我在 abaqus 中创建了一个小立方体并导出了 .inp 文件。 FE 模型有 125 个六角形单元 (C3D8),有 216 个节点。 编写 vtk 后,每当我尝试在 paraview 中打开 vtk 文件时,模型中都会缺少几个元素。

我编写了一个Python脚本,它从inp中提取所有节点坐标和与其节点相关的元素连通性,并写入一个vtk文件。我遵循了 vtk 文档中提到的语法,但我无法弄清楚哪里出了问题。看来我在编写VTK文件的CELLS部分的部分有一些错误。

with open('Job-1.inp','r') as f:
    contents = f.readlines()
node = '*Node'
node_conn = contents[9:225]

node_id, x, y, z = ([] for i in range(4))

for i in range(len(node_conn)):
    node_id.append(int(node_conn[i].split(',')[0].replace(' ','')))
    x.append(float(node_conn[i].split(',')[1].replace(' ','')))
    y.append(float(node_conn[i].split(',')[2].replace(' ','')))
    z.append(float(node_conn[i].split(',')[3].replace(' ','')))

elem_conn = contents[226:351]
elem_id,e1, e2, e3, e4, e5, e6, e7, e8 = ([] for i in range(9))

for i in range(len(elem_conn)):
    elem_id.append(int(elem_conn[i].split(',')[0].replace(' ', '')))
    e1.append(int(elem_conn[i].split(',')[1].replace(' ', '')) - 1)
    e2.append(int(elem_conn[i].split(',')[2].replace(' ', '')) - 1)
    e3.append(int(elem_conn[i].split(',')[3].replace(' ', '')) - 1)
    e4.append(int(elem_conn[i].split(',')[4].replace(' ', '')) - 1)
    e5.append(int(elem_conn[i].split(',')[5].replace(' ', '')) - 1)
    e6.append(int(elem_conn[i].split(',')[6].replace(' ', '')) - 1)
    e7.append(int(elem_conn[i].split(',')[7].replace(' ', '')) - 1)
    e8.append(int(elem_conn[i].split(',')[8].replace(' ', '')) - 1)

with open("test.vtk",'w') as f:
    f.write('# vtk DataFile Version 2.0\n')
    f.write('ASCII\n')
    f.write('DATASET UNSTRUCTURED_GRID\n')
    f.write('POINTS {} FLOAT\n'.format(len(node_id)))
    
    for i in range(len(node_id)):
        f.write('{} {} {}\n'.format(x[i],y[i],z[i]))
        
    f.write('CELLS {} {}\n'.format(len(elem_id),len(elem_id)*9))
    
    for i in range(len(elem_id)):
        f.write('8 {} {} {} {} {} {} {} {}\n'.format(e1[i],e2[i],e3[i],e4[i],
                                                     e5[i],e6[i],e7[i],e8[i]))
    
    f.write('CELL_TYPES {}\n'.format(len(elem_id)))
    for i in range(len(elem_id)):
        f.write('12\n')```

Your help is greatly appreciated.

P.S: 
The python code is not well written as I am a beginner.

Thank you
python vtk abaqus
1个回答
0
投票

虽然我无法直接回答如何解决编写 VTK 文件的问题,但我可以为您提供两个先前构建的存储库,用于将 .odb 结果转换为 .vtk 文件类型。并非所有元素类型都受支持,但相当数量的常见元素都受支持。希望您的用例是其中之一

我之前使用过的带有用户指南的存储库 https://github.com/Liujie-SYSU/odb2vtk

我最近偶然发现可以提供扩展功能的 Repo https://codebase.helmholtz.cloud/ingo.scheider/abaqus_plugins/-/blob/master/odb2vtk.py

© www.soinside.com 2019 - 2024. All rights reserved.