deal.II Step-2教程笔记

本文介绍如何使用DoFHandler类在网格上定义自由度,并通过有限元对象分配自由度。同时,讨论了稀疏矩阵的创建和优化,包括使用DynamicSparsityPattern和SparsityPattern类来存储非零元素的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

用于枚举基函数(形函数)的类称为DoFHandler。

要在网格上定义自由度,先要创建一个有限元对象,然后通过DoFHandler::distribute_dofs 函数传给DoFHandler。(distribute DoFs 代表了枚举基函数的过程。)DoFHandler 会提供总体装配信息。

稀疏矩阵

DoFHandler 默认以随机方式枚举自由度,因此相应的稀疏矩阵也是随机排列的。一般来说随机性不影响求解,但某些预处理例如SSOR在特定排列下会更快些。

程序

网格库

#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/manifold_lib.h>

把自由度关联到单元上的库

#include <deal.II/dofs/dof_handler.h>

描述双线性单元(包括1至3维)的库

#include <deal.II/fe/fe_q.h>

处理自由度的若干工具

#include <deal.II/dofs/dof_tools.h>

稀疏矩阵

#include <deal.II/lac/sparse_matrix.h>

动态(即瞬时)稀疏矩阵

#include <deal.II/lac/dynamic_sparsity_pattern.h>

重排列

#include <deal.II/dofs/dof_renumbering.h>

输出

#include <fstream>

命名空间

using namespace dealii;

网格生成

void make_grid(Triangulation<2> &triangulation)
{
  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, 5);
  for (unsigned int step = 0; step < 3; ++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();
    }
}

创建DoFHandler。首先要创建一个拉格朗日单元FE_Q,它的唯一参数表示多项式次数,双线性为1。接着把它传给DoFHandler。

void distribute_dofs(DoFHandler<2> &dof_handler)
{
  const FE_Q<2> finite_element(1);
  dof_handler.distribute_dofs(finite_element);

然后考虑稀疏矩阵。存储非零元素位置的类是SparsityPattern。这个类有一个毛病,必须先给定单行最大存储数。二维时可以用DoFHandler::max_couplings_between_dofs()函数自动获取,但三维时总是会过分估计。为此我们可以用一个DynamicSparsityPattern,再复制到SparsityPattern里。DynamicSparsityPattern 需要输入矩阵大小。

DynamicSparsityPattern dynamic_sparsity_pattern(dof_handler.n_dofs(),
                                                dof_handler.n_dofs());

用自由度填充DynamicSparsityPattern。

DoFTools::make_sparsity_pattern(dof_handler, dynamic_sparsity_pattern);

最后曲线救国,把位置信息复制到SparsityPattern。

SparsityPattern sparsity_pattern;
sparsity_pattern.copy_from(dynamic_sparsity_pattern);

把SparsityPattern输出到图片。

std::ofstream out("sparsity_pattern1.svg");
sparsity_pattern.print_svg(out);
<think>嗯,用户想在Visual Studio中安装和配置deal.II库。首先,我需要回忆一下deal.II的安装流程。之前用户提到过在WSL子系统里安装时,错误地进行了整个项目的CMake并行配置,导致问题。正确的步骤应该是先安装deal.II库,再对单个算例进行编译。所以,在Windows下的Visual Studio环境下,可能需要类似的步骤,但具体步骤会不同。 接下来,我需要考虑Windows系统下安装deal.II的依赖项。比如,可能需要安装CMake、Git,还有Visual Studio的C++工具集。另外,deal.II依赖一些第三方库,比如Boost、UMFPACK等,用户可能需要通过vcpkg来管理这些依赖,这样比较方便。 然后,编译deal.II库的步骤。用户需要从GitHub克隆仓库,使用CMake生成解决方案,这里要注意选择正确的生成器,比如Visual Studio的版本,以及是否启用MPI等特性。用户之前提到并行配置的问题,所以需要提醒他们在CMake配置时不要提前并行处理整个项目,而是先正确设置路径和选项。 配置Visual Studio项目部分,可能需要指导用户如何将deal.II的头文件和库路径添加到项目属性中,同时链接必要的库。这里需要确保用户知道如何在Visual Studio中设置包含目录和库目录,以及添加依赖库。 测试部分,提供一个简单的示例代码,并说明如何编译运行。如果有错误,可能需要检查路径是否正确,或者第三方库是否配置正确。 用户可能的疑问点包括:如何处理第三方依赖,CMake生成时的具体选项,以及项目属性设置中的路径问题。另外,可能还需要提醒用户注意Visual Studio的版本兼容性,比如是否使用MSVC编译器,以及C++标准的设置。 参考之前的引用,用户提到在安装deal.II之前不应执行并行配置,所以步骤中需要强调先正确安装deal.II,再处理具体项目。同时,用户可能对并行计算有需求,所以需要确认是否启用了MPI支持,并确保相关依赖已安装。 最后,生成的相关问题需要围绕安装中的常见问题、依赖管理、配置错误等,帮助用户进一步解决可能遇到的困难。</think>以下是在Visual Studio中安装和配置deal.II库的详细指南: ### 一、环境准备 1. **安装Visual Studio 2022** - 勾选"使用C++的桌面开发"组件 - 确保包含MSVC编译器和Windows 10/11 SDK - 建议安装CMake集成支持(默认已包含) 2. **安装依赖工具链** - [CMake 3.20+](https://cmake.org/download/) - [Git for Windows](https://git-scm.com/) - 推荐使用[vcpkg](https://vcpkg.io/)管理第三方库: ```powershell git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat ``` ### 二、编译deal.II库 1. **获取源代码** ```powershell git clone https://github.com/dealii/dealii.git cd dealii ``` 2. **配置CMake(管理员权限运行)** ```powershell mkdir build cd build cmake .. -G "Visual Studio 17 2022" -DDEAL_II_WITH_MPI=OFF -DCMAKE_INSTALL_PREFIX="D:\Libs\dealii-9.4" -DCMAKE_TOOLCHAIN_FILE="[vcpkg根目录]\scripts\buildsystems\vcpkg.cmake" ``` *关键参数说明:* - `-G` 指定VS版本 - `-DCMAKE_INSTALL_PREFIX` 设置安装路径 - `-DCMAKE_TOOLCHAIN_FILE` 启用vcpkg依赖管理[^2] 3. **编译安装** ```powershell cmake --build . --config Release --target install ``` ### 三、Visual Studio项目配置 1. **创建新CMake项目** ```cmake cmake_minimum_required(VERSION 3.20) project(dealii_test) find_package(dealii REQUIRED) add_executable(main main.cpp) target_link_libraries(main PRIVATE dealii::dealii) ``` 2. **配置CMakePresets.json** ```json { "configurePresets": [{ "name": "windows-base", "hidden": true, "generator": "Visual Studio 17 2022", "toolchainFile": "[vcpkg路径]/scripts/buildsystems/vcpkg.cmake" }] } ``` ### 四、验证安装 创建测试文件`main.cpp`: ```cpp #include <deal.II/base/logstream.h> using namespace dealii; int main() { deallog << "Hello from deal.II " << DEAL_II_VERSION << std::endl; return 0; } ``` 编译运行应输出类似: ``` Hello from deal.II 9.4.0 ``` ### 常见问题处理 1. **依赖库缺失**:通过vcpkg安装所需库 ```powershell vcpkg install boost:x64-windows trilinos:x64-windows ``` 2. **路径配置错误**:检查`CMAKE_PREFIX_PATH`是否包含deal.II安装路径 3. **版本冲突**:确保所有组件使用一致的x64架构配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值