这一节为什么要讲使用Paraview进行有限元云图显示呢?当模型自由度规模不断增大时,使用绘图函数进行绘制时会出现渲染延迟,或者拖动起来没有那么丝滑,这时候就需要借助优秀的第三方工具咯 我选择Paraview,读者也可以基于同样的原理应用到别的软件中。
先来一个官方介绍吧:Paraview是一款优秀且开源的后处理软件,是一个用于可视化大型数据集的开源、跨平台的数据分析和可视化应用程序。它最初是由美国国家实验室管理的开源软件团队开发的,用于处理和可视化计算机模拟数据,特别是在科学和工程领域中生成的大规模数据集。ParaView支持并行处理和分布式计算,使其能够有效地处理大规模数据,从而使用户能够在可视化中探索复杂的数据集。
Paraview可接受众多数据格式,我以.vtk数据结构为例,介绍其有限元后处理过程中常用到的功能,官方参考手册可见:https://docs.vtk.org/en/latest/。
本小节只介绍VTK的基础语法,高级语法请移步官方文档进行学习。读者可先阅读以下的数据结构:
# vtk DataFile Version 3.0
Finite Element Results
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 节点数 float
x1 y1 z1
x2 y2 z2
...
CELLS 单元数 (每个单元的节点数+1)*单元数
每个单元的节点数 节点1 节点2 节点3 节点4
每个单元的节点数 节点1 节点2 节点3 节点4
...
CELL_TYPES 单元数
单元1类型
单元2类型
...
POINT_DATA 节点个数
SCALARS 节点场变量名字 float 分量个数
LOOKUP_TABLE default
分量1 分量2
分量1 分量2
...
SCALARS 节点场变量名字 float 分量个数
LOOKUP_TABLE default
分量1 分量2
分量1 分量2
...
CELL_DATA 单元个数
SCALARS 单元场变量名字 float 分量个数
LOOKUP_TABLE default
分量1 分量2
分量1 分量2
...
SCALARS 单元场变量名字 float 分量个数
LOOKUP_TABLE default
分量1 分量2
分量1 分量2
...
需要注意的是:
POINT_DATA
下方数据行,如:位移、反力;有关单元的场变量都放在CELL_DATA
下方数据行,如:应变、应力以等参四边形单元为例,编制相应的函数,将有限元场变量结果写入vtk文件中,其他单元相同的道理,读者可依葫芦画瓢。
function Q42vtk(filename,Node,Element,U,RF,Scale)
U = full(U);RF = full(RF);
element_info =Element;
node_coords = Node + Scale * reshape(U, 2, size(Node, 1))';
num_nodes = size(node_coords, 1);
num_elements = size(element_info, 1);
filePath1 = fullfile('output', strcat(filename,'-Scale-',num2str(Scale),'.vtk'));
vtk_file = fopen(filePath1,'w');
fprintf(vtk_file, '# vtk DataFile Version 3.0\n');
fprintf(vtk_file, 'Finite Element Results\n');
fprintf(vtk_file, 'ASCII\n');
fprintf(vtk_file, 'DATASET UNSTRUCTURED_GRID\n');
fprintf(vtk_file, 'POINTS %d float\n', num_nodes);
for i = 1:num_nodes
fprintf(vtk_file, '%f %f 0.0\n', node_coords(i, 1), node_coords(i, 2));
end
fprintf(vtk_file, 'CELLS %d %d\n', num_elements, num_elements * 5);
for i = 1:num_elements
fprintf(vtk_file, '4 %d %d %d %d\n', element_info(i, 1) - 1, element_info(i, 2) - 1,element_info(i, 3) - 1,element_info(i, 4) - 1);
end
fprintf(vtk_file, 'CELL_TYPES %d\n', num_elements);
for i = 1:num_elements
fprintf(vtk_file, '9\n');
end
%%%%%%%%%%%%%%%%%%%%%%%%POINT_DAT%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf(vtk_file, 'POINT_DATA %d\n', num_nodes);
fprintf(vtk_file, 'SCALARS Displacement float 2\n');
fprintf(vtk_file, 'LOOKUP_TABLE default\n');
for i = 1:num_nodes
fprintf(vtk_file, '%f %f \n', displacement_info(i * 2 - 1), displacement_info(i * 2));
end
fprintf(vtk_file, 'SCALARS RF float 2\n');
fprintf(vtk_file, 'LOOKUP_TABLE default\n');
for i = 1:num_nodes
fprintf(vtk_file, '%f %f \n', RF(i * 2 - 1), RF(i * 2));
end
fclose(vtk_file);
end
将vtk文件导入Paraview中后,可能如下图所示:
这时以Abaqus的云图显示为例,我们将Paraview中的显示对标Abaqus。
经过上述的一系列操作就可初步修改云图显示啦,还有很多修改方法,读者可自行琢磨。