如何从 Abaqus inp 文件中存在的节点坐标及其连接数据重建 Python/Matlab 中的网格?

问题描述

我正在研究一种机器学习模型,该模型可以预测施加力后对象中节点的位移。 我的模型是用 FEM Abaqus 生成的数据训练的,我想根据 ML 模型预测的节点坐标重建网格。到目前为止,我已经能够从节点坐标重新创建一个带有绘图 3D 散点图的表示,但它不是一个网格。我拥有的数据存在于 Abaqus inp 文件中,包括节点的坐标以及哪些节点对哪些元素有贡献(下图)。

Abaqus inp file

如果有人能帮我解决这个问题,我将不胜感激。 谢谢。

解决方法

鉴于您有一个四面体元素,我可以从您的 .inp 文件中看到,您可以使用所谓的 delaunay 三角剖分。这基本上是用于四面体网格生成的方法。重点是:两个输出网格不能完全相同。 MATLAB 有一个内置的 delaunay 示例,看看那个。您也可以尝试从 Abaqus 读取连接表并使用此表。

例如MATLAB:

trimesh(T,x,y,z)

其中 T 是连接矩阵(从 abaqus 读取或使用 delaunay 函数),x,z 是节点的相应坐标。

对于python,有像trimesh这样的可能性,我希望scipy也有一些网格划分能力。

,

如果我理解正确,您有一个要可视化的 3d 四面体列表。在 python 中,您可以使用以下函数执行此操作(从 my previous answer 修改,请参阅那里的说明)。

def plot_tetra(ax,points,tetra_list):
    edges = collect_edges(tetra_list)
    x = np.array([])
    y = np.array([])
    z = np.array([])
    for (i,j) in edges:
        x = np.append(x,[points[i,0],points[j,np.nan])      
        y = np.append(y,1],np.nan])      
        z = np.append(z,2],np.nan])
    ax.plot3D(x,z,color='g',lw='0.1')

    ax.scatter(points[:,points[:,color='b')


def collect_edges(tetra_list):
    edges = set()
    for (i0,i1,i2,i3) in tetra_list:
        edges.add((i0,i1))
        edges.add((i0,i2))
        edges.add((i0,i3))
        edges.add((i1,i2))
        edges.add((i1,i3))
        edges.add((i2,i3))
    return edges

使用下面的代码调用这个函数的可能结果如下图所示(也取自那里):

enter image description here

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure()
ax = plt.axes(projection='3d')
plot_tetra(ax,tetra_list)