用deal.II生成炫酷网格:从基础立方体到环形结构的完整代码解析
网格是有限元计算的基石,一个清晰、高效且适应问题几何特征的网格,往往能让你的数值模拟事半功倍。对于许多科研工作者和工程师来说,将抽象的数学模型转化为直观、美观的网格可视化图形,不仅能验证模型设置的正确性,更是论文和报告中极具说服力的素材。今天,我们就深入 deal.II 这个强大的开源有限元库,手把手带你从最基础的立方体网格出发,一路玩转到复杂的环形结构,并解锁生成高质量矢量图形、实现局部加密等进阶技巧。无论你是刚接触计算力学的学生,还是希望提升结果展示效果的研究者,这篇文章都将为你提供一套可直接上手的“工具箱”。
1. 启程:搭建你的第一个deal.II网格世界
在开始编写任何一行网格生成代码之前,确保你的开发环境已经就绪。deal.II 是一个基于 C++ 的库,因此你需要一个合适的编译器(如 g++、clang++)和 CMake 构建系统。假设你已经按照官方指南成功安装 deal.II,并将其库路径配置好。接下来,我们从一个最简单的项目结构开始。
创建一个新的项目目录,例如 my_cool_mesh,并在其中创建 CMakeLists.txt 和主程序文件 mesh_demo.cc。CMake 文件是与构建系统沟通的桥梁,一个最小化的版本可能如下所示:
cmake_minimum_required(VERSION 3.10)
project(CoolMeshDemo)
# 寻找 deal.II 包,这是最关键的一步
find_package(deal.II 9.0 REQUIRED
CONFIG
PATHS ${DEAL_II_DIR} # 如果设置了环境变量 DEAL_II_DIR
)
# 如果 find_package 失败,可以尝试显式指定路径
# set(DEAL_II_DIR "/path/to/your/deal.II/installation")
# find_package(deal.II 9.0 REQUIRED CONFIG)
dealii_initialize_cached_variables()
dealii_setup_target()
注意:
find_package命令的成功与否直接决定了后续编译的成败。如果系统没有全局安装 deal.II,最常见的方式是设置环境变量DEAL_II_DIR,指向你的 deal.II 安装目录的根路径。
现在,让我们把目光投向 C++ 代码。任何 deal.II 程序的开头,几乎都是一系列头文件的引入,它们像乐高积木一样,为我们提供了构建网格所需的各种组件。
#include <deal.II/grid/tria.h>
#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 <fstream>
#include <cmath>
triangulation.h:定义了Triangulation类,它是整个网格数据的容器。模板参数<2>表示我们创建的是一个二维三角剖分(实际上在 deal.II 中,Triangulation<2>默认由四边形单元组成)。grid_generator.h:提供了一系列生成标准几何形状网格的函数,例如我们马上要用到的hyper_cube和hyper_shell。grid_out.h:这个头文件包含了将网格输出为各种图形格式的类,是我们实现可视化的关键。fstream和cmath则是后续文件输出和数学计算所必需的。
万事俱备,我们开始创建第一个网格。
2. 从标准立方体开始:理解网格的生成与全局加密
在 deal.II 中,生成一个矩形域(二维)或立方体域(三维)的网格是最直接的操作。GridGenerator::hyper_cube 函数就是为此而生。下面这个函数 create_basic_square_grid 演示了完整流程:
void create_basic_square_grid() {
// 1. 声明一个二维三角剖分对象
Triangulation<2> triangulation;
// 2. 生成一个边长为1,左下角位于原点的正方形网格
// 初始时,它只包含一个四边形单元
GridGenerator::hyper_cube(triangulation);
// 3. 全局加密网格
// 参数 4 表示将每个单元均匀细分4次
// 加密次数与最终单元数量的关系是:单元数


1207

被折叠的 条评论
为什么被折叠?



