簡介
dealii是一款開源的求解偏微分方程的有限元軟件息拜,它優(yōu)點(diǎn):
1.多種單元類型
2.可以自適應(yīng)網(wǎng)格
3.文檔和范例齊全
4.與其它庫有良好的接口
5.使用c++編寫
安裝
dealii可以在官網(wǎng)上或者github上下載源碼赞别,解壓后進(jìn)入源文件目錄安裝堤撵。
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/path/to/install/dir ../deal.II
make install
make test
自行安裝其他一些依賴荒给。
編譯與運(yùn)行
dealii的文檔和實(shí)例比較多蛔趴,可以點(diǎn)擊此處查看。
編譯命令為:
cmake .
make
make run
第一條命令用來創(chuàng)建Makefile文件羔挡,指明程序所依賴的文件氯哮、怎樣編譯和運(yùn)行玛追。此命令應(yīng)該能找到之前安裝deal.II后的庫文件,如果不能找到,需要人為指定路徑:
cmake -DDEAL_II_DIR=/path/to/installed/deal.II
第二條命令將源文件編譯成可執(zhí)行文件档冬,第三條是運(yùn)行該可執(zhí)行文件驮配。
第一個(gè)教學(xué)算例--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>
第一個(gè)頭文件表示存取器灾部,第二個(gè)是迭代器叠荠,用于對單元進(jìn)行循環(huán)遍歷。
#include <deal.II/grid/grid_generator.h>
用于生成標(biāo)準(zhǔn)網(wǎng)格者娱。
#include <deal.II/grid/grid_out.h>
用于各種網(wǎng)格圖形的輸出框沟。
#include <iostream>
#include <fstream>
用于c++的的輸出。
#include <cmath>
導(dǎo)入各種數(shù)學(xué)公式。
using namespace dealii;
使用命名空間蔫敲,避免變量名的沖突裙犹,以及簡化dealii中類的使用掺冠。
創(chuàng)建第一個(gè)網(wǎng)格
創(chuàng)建一個(gè)四邊形的全局細(xì)化的網(wǎng)格:
void first_grid()
{
第一件事是定義一個(gè)二維的對象:
Triangulation<2> triangulation;
使用hyper_cube初始化對象triangulation服球,現(xiàn)在只有一個(gè)四邊形單元斩熊,邊長默認(rèn)為1,可以使用refine_global來全局細(xì)化該單包,加密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
指定圓環(huán)的圓心以及圓環(huán)的兩個(gè)半徑蒸健,使用hyper_shell生成三維的殼體或者二維的環(huán)座享。
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獲得每個(gè)單元頂點(diǎn)坐標(biāo)丈秩,與中心點(diǎn)距離做判斷,決定是否加密淳衙。
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();
}