首页/文章/ 详情

基于paraview的有限元模型可视化

1小时前浏览10
   

概述

       

作为最早进入中国市场的商业有限元软件之一,abaqus以其强大的非线性方程组求解能力为广大的业界工程师、科研学者等广泛使用,该软件自带的前后处理功能也为有限元法的广泛使用提供了极大的方便。随着使用者对后处理的定制需求逐渐增多,abaqus自带的后处理功能逐渐不能完全满足,例如,abaqus自带的功能不能对用户自定义单元进行可视化,为了进一步提升有限元计算结果的可视化效果,便于展示计算成果,可以在abaqus计算结果的基础上,借用第三方软件对计算结果进行可视化。

paraview是一款开源的图形处理软件,其在标量、矢量和高维张量的可视化方面具有极大的优势,该软件提供了串行和并行数据处理方式,可以采用大型机对百万级别的网格数据进行并行处理,也可采用小型机对数据进行串行处理,满足不同计算速度的需求。

帖子探索了采用paraview对abaqus中的有限元计算模型进行可视化,其中包括abaqus内置的单元,以及abaqus无法进行可视化的用户自定义单元。

二维有限元模型

     

首先以一个椭圆形几何为例

   

采用任意多边形网格进行离散,其中任意多边形网格为用户自定义单元,而用户自定义单元无法在abaqus中进行可视化。

   

下面是某混凝土重力坝几何图形

   

采用多边形网格对重力坝进行网格划分,共计多边形单元数目为:5944,共计节点数目为:117592,其中坝体单元数目为:737,坝基单元数目为:5207。共计五种多边形,边数为5~9。

   

单独显示坝体。

   

单独显示坝基。

   

三维网格模型

       

以东方明珠塔为例,首先采用六面体和四面体混合网格进行划分,共计单元数目:954029,共计节点数目:198089,其中,六面体单元数目为:228,四面体单元数目为:95380,paraview(左)与abaqus(右)的全局模型可视化对比为:

   

paraview(左)与abaqus(右)的局部模型可视化对比为:

   
   

然后采用任意多面体网格离散,任意多面体网格在abaqus中无法进行可视化,下面是paraview中的可视化效果:

   

下面采用八叉树体网格离散,八叉树多面体网格同样无法在abaqus中可视化,八叉树网格在paraview中的可视化效果为:

   

任意多面体网格,顾名思义,即为表面数目任意,表面多边形的边数任意,下面展示几个任意多面体单元:(下方数字为多面体单元的面数目)

   

下面展示几个八叉树单元:(下方数字为多面体单元的面数目)

   

下面以一个子弹为例,创建几何模型,并分别采用不同的网格离散。子弹的几何尺寸为:

   

下面是不同单元离散的网格在paraview中的效果图,从左到右,从上到下依次为:四面体单元、六面体单元、任意多面体单元和八叉树单元。

   

下面以实际地形为例。地形为小湾拱坝所在的位置,实地地形如:

   

画网格之前先创建几何模型

   

采用六面体网格对该几何模型进行离散,然后将abaqus(右)的模型处理成paraview(左)可识别的vtk文件,下面是效果图:

   

下面采用任意多面体网格离散,abaqus无法对用户自定义单元进行可视化,因此,在paraview中的可视化效果为

   

STL点云数据可视化

       

点云数据是用于3D打印的一种数据格式,该数据采用扫描仪对模型实体表面进行扫描采集表面点云-坐标数据。该数据只记录了模型的表面数据,将模型表面离散为三角形面片数据。帖子以一个孙悟空的模型为例,将stl数据在paraview中显示,该模型表面共计三角形面片:680006个,点个数为:340200个,下面是显示的效果

   
     

   

   


来源:有限元先生
Abaqus非线性ParaView
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-09-29
最近编辑:1小时前
外太空土豆儿
硕士 我们穷极一生,究竟在追寻什么?
获赞 2粉丝 0文章 22课程 0
点赞
收藏
作者推荐

C++程序流程控制

零概述 编程的核心在于处理数据,即玩转数据,如何操控数据,涉及到程序的流程控制,就像是走路一样,选择哪一条路才能更方便的走到目的地是一门技术活,程序中的流程控制就是指引数据最终走到目的地。C++提供了三种程序流程:顺序结构、选择结构和循环结构,下面依次讲解这三种程序控制结构。壹顺序结构 从程序语句的执行来看,顺序结构是逐行执行语句,一直执行到程序结束,不走回头路。本系列帖子之前的大部分程序都是顺序结构。#include <iostream>#include<string>using namespace std;int main(){ cout << "这是程序的第七行" << endl; cout << "这是程序的第九行" << endl; cout << "这是程序的第十一行" << endl; system("pause"); return 0;} 上面的程序会依次输出这是程序的第七行这是程序的第九行这是程序的第十一行 这就是顺序执行结构,一根直肠子,一杆子捅到底,不跳过任何语句,下面就开始有花花肠子了。贰选择结构 选择结构,顾名思义,就是依据数据选择性的执行一些语句,这就意味着有些语句是会被跳过的#include <iostream>#include<string>using namespace std;int main(){ float a = 0; cout << "Please input your data:\t" << endl; cin >> a; if (a > 600){ cout << "你的分数在600以上" << endl; } else if (500 < a && a < 600){ cout << "你的分数在500~600" << endl; } else if (a < 500){ cout << "你的分数在500以下" << endl; } system("pause"); return 0;} 上面的程序依据输入的分数而选择性的执行一些数据,如果输入的数据是1000,则会有以下输出Please input your data:10000你的分数在600以上 如果输入的数据是1,则会有以下输出Please input your data:1你的分数在500以下 下面介绍switch语句,这种选择结构根据一个整型数值或者一个字符执行一些语句,下面的程序根据输入的分数判断电影的质量#include <iostream>#include<string>using namespace std;int main() { //请给电影评分 //10 ~ 9 经典 // 8 ~ 7 非常好 // 6 ~ 5 一般 // 5分以下 烂片 int score = 0; cout << "请给电影打分" << endl; cin >> score; switch (score) { case 10: case 9: cout << "经典" << endl; break; case 8: cout << "非常好" << endl; break; case 7: case 6: cout << "一般" << endl; break; default: cout << "烂片" << endl; break; } system("pause"); return 0;} 如果输入的是10,输出如下请给电影打分10经典 以上是选择结构,需要注意的是,switch选择结构中,case后面的只能是整型数据和单个字符;并且程序中一定要有break语句,不然会顺序执行所有程序。下面介绍循环结构,这就能完成更加复杂的功能了。叁循环结构 循环结构有好几种,首先介绍for型循环,for型循环的语句为for(起始表达式;条件表达式;末尾循环体){\\程序语句} 下面以一个输出9*9乘法表的程序为例讲解#include <iostream>#include<string>using namespace std;int main() { int i = 0; int ii = 0; for (i = 1; i < 10; i++){ for (ii = 1; ii <= i; ii++){ if (ii == i){ cout << "\t" << i << "*" << ii << "=" << i*ii << endl; } else{ cout <<"\t"<< i<<"*"<<ii<<"=" << i*ii; } } } system("pause"); return 0;} 下面是输出的结果 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 上面的程序设置了两层循环,第一层循环决定了乘法表中第几行数据,第二层循环决定了每一行输出的终止位置注意for语句后面的括号(ii = 1; ii <= i; ii++) 这里的意思是,当ii大于i时候,跳出循环,在每一次循环中ii递增1;如果我们想要反向输出乘法表呢,即第一行输出九个数字,那么我们只需要修改for循环中的语句为 for (i = 9; i >=1; i--){ for (ii = i; ii >=1; ii--){ if (ii == 1){ cout << "\t" << i << "*" << ii << "=" << i*ii << endl; } else{ cout << "\t" << i << "*" << ii << "=" << i*ii; } } } 输出的结果就变成 9*9=81 9*8=72 9*7=63 9*6=54 9*5=45 9*4=36 9*3=27 9*2=18 9*1=9 8*8=64 8*7=56 8*6=48 8*5=40 8*4=32 8*3=24 8*2=16 8*1=8 7*7=49 7*6=42 7*5=35 7*4=28 7*3=21 7*2=14 7*1=7 6*6=36 6*5=30 6*4=24 6*3=18 6*2=12 6*1=6 5*5=25 5*4=20 5*3=15 5*2=10 5*1=5 4*4=16 4*3=12 4*2=8 4*1=4 3*3=9 3*2=6 3*1=3 2*2=4 2*1=2 1*1=1 循环结构中还有do...while循环,当满足某种条件时候,循环开始执行,如#include <iostream>#include<string>using namespace std;int main() { int a = 0; do { cout << "输入一个x小于10的数字,不然会一直输出这一句话!" << endl; cin >> a; } while (a > 10); system("pause"); return 0;} 当while语句后括号的值为1时候,程序会一直执行do后括号内的内容,当输入的数字小于10的时候,循环结束,如输入一个小于10的数字,不然会一直输出这一句话!22输入一个小于10的数字,不然会一直输出这一句话!33输入一个小于10的数字,不然会一直输出这一句话!888输入一个小于10的数字,不然会一直输出这一句话!1 以上就是C++中经常使用的程序控制结构。 来源:有限元先生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈