【问题标题】:Plotting arbitrary 3d finite element mesh with matlab用 matlab 绘制任意 3d 有限元网格
【发布时间】:2018-01-22 01:35:42
【问题描述】:

大家好,我正在尝试从 MSC Patran 导出网格,然后在 Matlab 中绘制它。网格可以是任意形状。我有所有节点的 x、y 和 z 坐标。到目前为止,我已经尝试了许多不同的选项,这就是 他们失败的原因:

  1. Surfc() 与 meshgrid 和 griddata: 我用 meshgrid 在 x-y 平面上生成了一个网格,然后使用 griddata 来获得 z 矩阵。但是这个图只有在只有 1 个 z 值对应于 x-y 对时才有效。换句话说,要使其工作,z 必须是 z = f(x,y) 类型。
  2. pdegplot() :我发现 matlab 可以导入和绘制 .stl 文件。我尝试转换我的坐标矩阵格式并用这个函数绘制它,但它也不起作用。因为显然在 .stl 文件中,一条边不能被超过 2 个元素共享。但是我的 FEM 文件总是(我希望)壳元素。这意味着 3 个或更多元素可以共享相同的元素。
  3. Surfc() with 3d meshgrid:我发现 meshgrid() 可以接受 3 个输入 (x,y,z) 并创建一个 3d 网格。然而,这也不起作用。我使用了一个非常小的网格,大约有 1000 个节点,代码试图生成 3 个具有 1000x1000x1000 元素的矩阵。这意味着 1000 个节点的网格需要大约 3 GB 的内存。更重要的是,surfc 甚至无法绘制。
  4. 以某种方式自动导入其他文件格式:到目前为止,我一直在使用 patran 中性文件 (.out)。我手动读取文件并从中提取 x,y,z 数据。 Patran 还可以导出为 parasolid、iges 和 step 文件格式。我在 matlab 中寻找直接导入和绘制这些函数的方法,但就我所见而言,这些函数并不存在。
  5. 手动生成网格: Matlab 可以创建 3D 对象(如 [x,y,z] = sphere()),Surfc() 可以绘制这些对象,尽管我在 (1.) 中说过,x ,y,z 由 sphere() 生成的矩阵不像 (3.) 中那样是 3 维的,所以我尝试遵循这个并从我的 FEM 文件手动生成一个 3d 网格,仅用于测试。我发现 z 有重复的列,并且在每一列(作为一个层)中有 x 和 y 的 n 个值。当我尝试手动为我的网格做同样的事情时,surfc() 不再起作用。它绘制了一个我什至无法描述的非常奇怪的形状。
  6. 寻找第 3 方绘图软件:我尝试使用 gnuplot 之类的(轻量级)软件并访问,但到目前为止我都湿透了。如果您知道任何可以直接绘制 p​​atran 中性文件的软件(最好是开源),我愿意接受建议。但该软件还必须能够绘制等高线图。因为我在 Matlab 中计算每个节点的数量,然后在网格上绘制其轮廓。

【问题讨论】:

  • 网格(除非完全规则)不仅由点定义,而且由点之间的连接定义。您是否有连接信息,或者您正在处理常规网格?您还非常坚定地描述了它为什么起作用,但忘记描述您的数据!我只能从您的第一个函数中暗示每个 x,y 都有多个 Z 吗?怎么样?
  • @Ander Biguri 我的网格不规则,是的,我有连接信息。目前我的网格都是二次的(尽管它也可能是三等)。我有一个矩阵给出每个元素的 4 个节点(m x 4)和一个矩阵,给出每个节点的 x、y、z 坐标(n x 3)。其中 m 是元素数,n 是节点数。
  • 所以你可以有一个tetramesh?
  • 至于您的下一个问题,是的,每个 x,y 都有多个 z。这就是我所说的任意。但我想我应该更清楚。想想 x-z 平面上的一个盘子。在这种情况下,所有节点的 y 坐标相同。如果两个节点有相同的 x,那么这意味着两个节点的 x 和 y 相同,但 z 不同。
  • 我明白你的意思,但你描述错误。您的数据是[x,y,z],即使有时某些值被多次使用。看看建议的功能。我不认为有一个用于四边形的,我认为你只需要编写自己的

标签: matlab plot


【解决方案1】:

所以你可以有一个tetramesh

您似乎正在使用 FEM-stile 网格,因此标准的表面绘图功能不起作用。对于不同形状(不是四边形)的 FEM 网格,您可能需要编写自己的函数...

【讨论】:

    【解决方案2】:

    如果您在说变量 pc 中有网格点和网格单元连接,则可以使用外部 Matlab FEA 工具箱到 plot both structured and unstructured grids,例如plotgrid 命令

    % Cread grid struct.
    grid.p = p;
    grid.c = c;
    grid.a = gridadj(p,c,size(p,1));   % Reconstruct grid cell adjacencies.
    grid.b = gridbdr(p,c,grid.a);      % Reconstruct boundary information.
    grid.s = ones(1,size(c,2));        % Set subdomain numbers to 1 for all grid cells.
    
    % Plot grid.
    plotgrid( grid )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多