用matlab绘制任意三维有限元网格

时间:2017-08-14 08:48:13

标签: matlab plot

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

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

2 个答案:

答案 0 :(得分:0)

所以你可以拥有tetramesh

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

答案 1 :(得分:0)

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

#portfolio {
   background-color: : white;
   padding-bottom: 100px;
}

#portfolio h1 {
  font-size: 30px;
  font-weight: 400px;
  letter-spacing: 5px;
  text-align: center;
  color: #000;
}

#portfolio h2 {
  font-size: 15px;
  letter-spacing: 2px;
  text-align: center;
  color: #000;
}

.project {
  display: inline-block;
  width: 33.33%;
  margin-right: -4px;
}

.img-box {
  padding: 20px;
  position: relative;
}

.project img {
  width: 100%;
  display: block;
  border-radius: 12px;
}

.img-box img:hover {
  transform: scale(1.1);
  transition: 0.5s;
  opacity: 0.5;
}

.img-box .hovertext {
  display: none;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.img-box:hover .hovertext {
  display: block;
}