四叉树型网格

计算科学 网格生成 多重网格 网格
2021-12-18 12:45:06

我想为四叉树类型网格编写代码,但不知道该怎么做。如果有人可以提供帮助或可以分享任何起始代码?

1个回答

从头开始编写 C++ 代码以进行自适应网格细化(作为 PDE 求解器的一部分)是一项相对复杂的工作,即使是简单的问题也很容易涉及数千行代码。根据评论,您可能对编程很陌生(例如不确定如何实现二叉树)。当然,在某事上保持新鲜并没有错——我们都曾有过这样的经历——但我认为重要的是要明白这是一个需要承担的相当大的项目。

就对您有用的资源而言,我强烈建议您在此处查看 Wolfgang Bangerth 的视频教程这些视频实际上贯穿了有限元代码是如何从头开始开发的。尽管它们以有限元为中心(而不是像您正在做的有限差分),但它们通常包含许多与自适应网格细化和 PDE 求解器代码相关的有价值信息。除此之外,任何优秀的 C++ 书籍都可以教您有关树数据结构的知识……而且还有 stackoverflow。

我在我的一条评论中提到了名为 Gmsh 的网格生成工具,出于多种原因,我强烈建议您下载:

  1. 首先,它易于使用,甚至有一个 GUI,可以在 Windows、Linux 和可能的 Mac 上使用(没有亲自检查过 Mac)。
  2. 它将让您了解网格的存储方式以及网格中的重要信息。
  3. 它可以使用三角形、四边形、四面体等创建 1D、2D 和 3D 网格
  4. 您可以在代码中使用的一种策略是从使用 Gmsh 创建的粗网格开始,然后将其作为程序的输入。然后,您的程序在求解 PDE 时对该粗网格执行自适应网格细化。这样做有利于简化网格生成过程,因为您不必担心如何在可能复杂的几何体上生成初始网格。

现在关于您关于四叉树数据结构的具体问题,我要做的是在 C++ 中创建一个模板 QuadTree 类。例如,不完整的代码可能类似于:

#ifndef QUADTREE_H
#define QUADTREE_H

template<class T>
class Node
{
  public:
    T object;
    Node *parent;
    Node *topLeft;
    Node *topRight;
    Node *bottomLeft;
    Node *bottomRight;

    Node(T obj) : object(obj), parent(NULL), topLeft(NULL), topRight(NULL), bottomLeft(NULL), bottomRight(NULL)
    {
    }

    T* get_T();
    bool isLeaf();
    //   .
    //   .
    // more methods etc
};


template<class T>
class QuadTree
{
  private:
    int numNodes;      //number of node in tree
    int numLeafNodes   //number of leaf nodes in tree
    Node<T> *root;
    Node<T> *iterator;

  public:
    QuadTree();
    QuadTree(T obj);

    void deleteQuadTree(Node<T> *leaf);
    void setTopLeft(T obj);
    void setTopRight(T obj);
    void setBottomLeft(T obj);
    void setBottomRight(T obj);
    Node<T>* get_Node();
    T* get_T();
    bool isLeaf();
    //   .
    //   .
    //   more methods etc
};


//---------------------------------------------------------
// writing out all your implementations for each constructor, method, etc
//---------------------------------------------------------
//  .
//  .
//  .

#endif

通过对这个 QuadTree 进行模板化,我们可以将它用于简单的整数(非常适合测试!)或复杂的对象(...可能存储有关四边形元素的信息...)。我希望这个答案能有所帮助。如果您对我所写的内容有具体问题,如果需要,我可能会提供更多建议。你的问题有点宽泛,所以我不完全确定从哪里开始,但祝你的项目好运。