开源有限元dealii学习——step-1

简介

dealii是一款开源的求解偏微分方程的有限元软件,它优点:
1.多种单元类型
2.可以自适应网格
3.文档和范例齐全
4.与其它库有良好的接口
5.使用c++编写

安装

dealii可以在官网上或者github上下载源码,解压后进入源文件目录安装。


mkdir build

cd build

cmake -DCMAKE_INSTALL_PREFIX=/path/to/install/dir ../deal.II

make install

make test

自行安装其他一些依赖。

编译与运行

dealii的文档和实例比较多,可以点击此处查看。
编译命令为:

cmake .
make
make run

第一条命令用来创建Makefile文件,指明程序所依赖的文件、怎样编译和运行。此命令应该能找到之前安装deal.II后的库文件,如果不能找到,需要人为指定路径:

cmake -DDEAL_II_DIR=/path/to/installed/deal.II 

第二条命令将源文件编译成可执行文件,第三条是运行该可执行文件。

第一个教学算例–step-1

first_grid

#include<deal.II/grid/tria.h>

此头文件声明了Triangulation类模板,Triangulation<1>表示1维的线。

#include <deal.II/grid/tria_accessor.h>
#include <deal.II/grid/tria_iterator.h>

第一个头文件表示存取器,第二个是迭代器,用于对单元进行循环遍历。

#include <deal.II/grid/grid_generator.h>

用于生成标准网格。

#include <deal.II/grid/grid_out.h>

用于各种网格图形的输出。

#include <iostream>
#include <fstream>

用于c++的的输出。

#include <cmath>

导入各种数学公式。

using namespace dealii;

使用命名空间,避免变量名的冲突,以及简化dealii中类的使用。

创建第一个网格

创建一个四边形的全局细化的网格:

void first_grid()
{

第一件事是定义一个二维的对象:

Triangulation<2>  triangulation;

使用hyper_cube初始化对象triangulation,现在只有一个四边形单元,边长默认为1,可以使用refine_global来全局细化该单包,加密4次:

  GridGenerator::hyper_cube (triangulation);
  triangulation.refine_global (4);

输出eps格式的图形:

std::ofstream out ("grid-1.eps");
GridOut grid_out;
grid_out.write_eps (triangulation, out);
std::cout << "Grid written to grid-1.eps" << std::endl;
}

second_grid

指定圆环的圆心以及圆环的两个半径,使用hyper_shell生成三维的壳体或者二维的环。

 const Point<2> center(1, 0);
  const double   inner_radius = 0.5, outer_radius = 1.0;
  GridGenerator::hyper_shell(
	  triangulation, center, inner_radius, outer_radius, 10)

为了减少图形的锯齿,加密了5次,使用auto迭代器,使用vertices_per_cell获得每个单元顶点坐标,与中心点距离做判断,决定是否加密。

for (unsigned int step = 0; step < 5; ++step)
      for (auto &cell : triangulation.active_cell_iterators())
            {
                 for (unsigned int v = 0; v < GeometryInfo<2>::vertices_per_cell; ++v)
                      {
                        const double distance_from_center =
                          center.distance(cell->vertex(v));
                         if (std::fabs(distance_from_center - inner_radius) < 1e-10)
                             {
                              cell->set_refine_flag();
                              break;
                               }
                        }
            }
       triangulation.execute_coarsening_and_refinement();
    }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值