Gmsh 用于包含内含物的 3D 体积

计算科学 有限元 网格生成 gmsh
2021-12-10 19:53:31

在尝试在 Gmsh 中创建包含包含的三维体积时,我偶然发现了一个在二维情况下不存在的问题。

我正在使用 OpenCASCADE 几何内核,因为这有助于方便的布尔运算来删除我考虑的域框之外的部分包含。

简而言之,问题归结为:

  • 每当我合并包含物时,我都会执行一个统一的步骤,以便识别不同的几何特征,但界面会连接到网格中。这就像 2D 中的魅力,但是,当我在 3D 中进行等效操作时,我的体积几何信息会丢失,并且体积实际上是完全统一的,完全移除了界面。

我可以通过在 2D 和 3D 中执行 2D 网格步骤以图形方式描述这一点:

二维联合网格 3D联合网格

上面展示的是 2D 中保留(连续)界面的预期行为,但尽管在 3D 中球体位置仍然从外部可见,但内表面不再存在,即外部球体没有网格化,只有切段。我应该注意,我相信我需要统一步骤将不同的几何特征联系在一起,我已经尝试了许多不同的微小变化来产生像上面描述的那样的 3D 结果,但没有一个产生预期的网格,我的网络搜索是无济于事。

我希望有人对在哪里找到问题的解决方案有一个具体的想法甚至预感。


为了完整起见,我添加了用于获取上述图表的简化 .geo 示例。

对于 2D:

SetFactory("OpenCASCADE");

Point(1) = {0, 0, 0};
Point(2) = {2, 0, 0};
Point(3) = {2, 2, 0};
Point(4) = {0, 2, 0};

Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};

Line Loop(1) = {1, 2, 3, 4};

Plane Surface(1) = {1};

Periodic Line{1} = {-3};
Periodic Line{2} = {-4};

Disk(2) = {0, 0, 0, 0.5};
Disk(3) = {2, 0, 0, 0.5};
Disk(4) = {0, 2, 0, 0.5};
Disk(5) = {2, 2, 0, 0.5};
Disk(6) = {1, 1, 0, 0.5};

f1() = BooleanDifference{ Surface{1}; }{ Surface{2:6}; };
f2() = BooleanIntersection{ Surface{1}; Delete; }{ Surface{2:6}; Delete; };
BooleanUnion{ Surface{ f1() }; Delete; }{ Surface{ f2() }; Delete; }

对于 3D:

SetFactory("OpenCASCADE");

incRadi = 0.5;
boxSize = 1.5;

Box(1) = {0,0,0, boxSize,boxSize,boxSize};

Periodic Surface{2} = {1} Translate{boxSize,0,0};
Periodic Surface{4} = {3} Translate{0,boxSize,0};
Periodic Surface{6} = {5} Translate{0,0,boxSize};

Sphere(2) = {0, 0.5*boxSize, 0.5*boxSize, incRadi, -Pi/2, Pi/2, 2*Pi};
Sphere(3) = {boxSize, 0.5*boxSize, 0.5*boxSize, incRadi, -Pi/2, Pi/2, 2*Pi};

f1() = BooleanDifference{ Volume{1}; }{ Volume{2:3}; };
f2() = BooleanIntersection{ Volume{1}; Delete; }{ Volume{2:3}; Delete; };
BooleanUnion{ Volume{ f1() }; Delete; }{ Volume{ f2() }; Delete; }
0个回答
没有发现任何回复~