本文主要介绍知名商业有限元软件abaqus与知名开源有限元软件Deal.II的联合使用。
Deal.II是一个用C++编写的开源自适应有限元程序库,其在学术界得到广泛的应用。Deal.II采用现代C++语法编写,广泛使用模板等现代C++技术,在性能和可扩展性上均极为优秀。Deal.ii支持共享内存和分布式内存MPI并行,在分布式内存并行方面,Deal.II既可以仅在线性方程组求解中采用mpi并行求解,也可以基于区域分解,每个进程仅保存和计算一部分网格,从而实现单元计算,刚度矩阵组装和方程组求解中均实现MPI并行。实践表明,Deal.ii可以在上万核上实现并行求解,求解的未知数个数可达到亿级。
Deal.ii实际上还支持网格的自适应,通过网格自适应,实现自动在敏感区域实现网格加密。
Deal.ii一个限制是之前版本不支持三角形网格和四面体网格,其自适应网格的内核为P4est,因此自适应只能如上图所示采用在现有网格中点处增加节点从而形成下一层加密网格,这种方法带来的问题是中点的节点形成了hanging node,因此还需要对这些hanging点进行限制。后来版本增加了三角形和四面体网格,但是这种网格的单个单元似乎本质上也是由多个四边形或者六面体组成。
在Deal.ii中,网格被保存在一个叫 triangulation的类中,Deal.ii提供了一些基础的建模方式。如长方形,立方体,圆等,同时其提供了几个其他有限元软件/网格划分软件的接口,如abaqus,comsol和gmsh等,通过grid_in读入网格,通过接口,实现复杂模型在Deal.ii中运算也不是难事。
本文提供一个采用abaqus建模导入Deal.ii的例子:
using namespace dealii;
template <int dim>
class step_in
{
public:
//step_in();
void run();
private:
Triangulation<dim> triangulation;
};
template<int dim>
void step_in<dim>::run()
{
GridIn<dim> grid_in;
grid_in.attach_triangulation(triangulation);
std::ifstream input_file("Job-1.inp");
grid_in.read_abaqus(input_file);
std::ofstream out("grid-in-abaqus.vtk");
GridOut grid_out;
grid_out.write_vtk(triangulation, out);
for (auto &cell : triangulation.active_cell_iterators())
{
for (auto number:cell->vertex_indices())
{
auto p=cell->vertex(number);
std::cout<<"p "<<number<<" "<<p[0]<<" "<<p[1]<<std::endl;
}
}
for (auto v=triangulation.begin_vertex();v!=triangulation.end_vertex();v++ )
{
std::cout<<"node "<<v->vertex(1)<<std::endl;
}
}
int main()
{
step_in<3> step_in1;
step_in1.run();
}
运行后,会生成VTK文件输出,用paraview打开后和原始的abaqus模型显示如下:
以上,即是本文的全部内容,感谢您的阅读!