06-PolyMesh手册(未实现)


<center>06-PolyMesh手册</center>

参考资料

PolyMesh.pdf;(2012)

PolyMesh2015.pdf;(2015)


内容

PolyMesh是一个 Fortran程序,它使用 Jonathan Richard Shewchuk (jrs@cs.berkeley.edu)的 Triangle网格生成器生成二维分辨率的非结构化网格。该软件可以创建一个满足若干要求的网格,特别是在边界条件方面。该软件是为 Linux开发的,但理论上应该可以在任何一种平台上工作。

PolyMesh对边界、岛屿、多边形、结构进行预处理,并进行水深内插。此外,它还提供网格生成和不同的网格优化的可能性。PolyMesh是由用户在执行前设置的一般 选项(option)控制的。这个配置被存储在一个叫做 meshin.nml的文本输入文件中。

2-安装

下载

从我们的 GIT 仓库下载最新版本的 PolyMesh,并将其克隆到你的 私有基础目录中。使用 git clone polyuser@ite-solutions.de:/home/git/polymesh 命令。
<img src="https://raw.githubusercontent.com/Liu-Jincan/PicGo/main/img/20220107175909.png" alt=" " style="zoom:70%;" />

其它两种下载方式:

  • ftp下载(polymesh教程提供的下载方式)

    cd ~
    mkdir POLYMESH
    
    ##	$WAVE_COURSE 是 ftp 中的一个文件夹
    cp -r $WAVE_COURSE/TOOLS/POLYMESH/* POLYMESH/
    
    ##	polymesh文件夹就是所需下载的文件夹
    cd POLYMESH/polymesh
  • 百度网盘
    链接: https://pan.baidu.com/s/1q5eYWRGqKNSNfmiwxyRsSA 密码: 48t3polymesh文件夹内容:25项

    src文件夹 (source code, mostly in Fortran90)

    triangle文件夹 (the actual meshing program, in C, by J R Shewchuk)

编译

我们使用 GNU编译器(在4.6-4.9版本中测试)intel编译器(在14和15版本中测试)。编辑 Rules.make文件,选择你的编译器,并打开/关闭调试和优化模式。

选择GNU编辑器,需要安装gfortran,gcc,g++

在下载包中提供了一个完全预先配置的 Makefile。要开始编译过程,请进入你的本地 PolyMesh文件夹,然后输入 make即可。请检查编译器的输出是否有错误,如果是否定的,编译实例就完全完成了。默认情况下,make完成后,可执行文件将被复制到你的 BIN目录:/home/yourusername/bin

make后bin目录生成的可执行文件

3-程序功能

读取已有的网格

这个函数的工作是读取已经网格化的现有网格。例如,从另一个网格生成器读取已经网格化的网格。有必要读取坐标,特别是读取坐标下的元素信息。因此,PolyMesh可以与现有的网格一起工作,用户可以 细化(refine)网格的特殊区域。
主要的优点是 时间上的优势。因此,在节点数量超过一百万的大网格上,运行时间可以减少到一半,因为 PolyMesh可以跳过第一个三角计算。
还有一个函数可以将最终结果写成二进制文件。二进制文件可以像文本文件那样更快地被读取,并节省大量的磁盘空间。通过这种方式,PolyMesh能够减少生成网格的运行时间,因为读取时间减少了。

插值

  • 水深
    LXYZ, FNAMEBATHY

  • 基础数据结构(Underlying data structure)
    LFASTSEARCH, LFASTSEARCH2, SMEMORY

  • 边界,岛屿,结构
    要启用边界的水深插值,将 LBOUNDARYINTER设置为 true。对于岛屿,将 LISLANDLISLANDINTER设置为 true。对于 结构,变量被命名为 LSTRUCTLSTRUCTINTER。最后,为了插值读入 段(segments),将 LREADSEGMENTSLSEGMENTINTER设置为 true

  • 预定义深度

    LTAKEBOUNDDEPTH, LBOUNDPRDEP, DEPTHBOUND

    LTAKEISLANDDEPTH, LISLANDPRDEP, DEPTHISLAND

    LTAKESTRUCTDEPTH, LSTRUCTPRDEP, DEPTHSTRUCT

    LSEGMENTINTER

网格细化

PolyMesh有三个细化选项来考虑网格生成过程中的边界条件,即 CFL-准则 (CFL-Criterion)DZ-准则 (DZ-Criterion)多边形细化 (polygon refinement)。在 特定区域的网格细化与其他区域的网格细化不同,其原因是预测变量变化的地理尺度不同。例如,波浪特性的变化在沿海地区发生的时间和空间尺度要比在深海地区小得多。

因此,海洋近岸部分的网格也必须比深海部分的网格更细。但也可能有其他的要求,例如在使用流体力学模型时,海流速度的变化,或者在一些特殊的地方需要高分辨率,因为在那个地方要进行一些建设,等等。

基本上我们为非结构化网格的细化定义了两个不同的准则。这些准则我们称之为 CFL准则MAXDZ准则。以下是对这准则的描述。

  • CFL准则
    CFL准则是根据所关注的 特定量的速度自然地减少网格长度,例如,对于 水波(water waves)来说,这是波浪的群速度,对于 海流(currents)来说,这是浅水的波速,如公式2所示。CFL条件也是显式数值方法的 稳定性标准,例如,它必须低于1才能实现稳定的积分。因此,通过强制执行 CFL<1,我们可以根据公式1估计每个元素的稳定最大边缘长度,以获得稳定的积分。从图2-4可以看出,在 波罗的海的浅水区,网格长度根据公式1减少,不需要减少 积分时间步长DT

  • DZ准则
    DZ准则取决于某个三角形元素中的 高程(elevation)变化。如果某个元素中的 深度变化大于用户给定的 阈值,那么这个比率就被用来强制减少或增加元素面积(见公式3)。这样,元素网格中的 坡度(slope)就根据输入文件中的设置来解决,并可以根据用户的需要和某些感兴趣的问题进行 无缝(seamlessly)调整见图2-6)。

  • BZR 边界区域细化

    使用 BZR可以在没有任何水深信息的情况下,在边界附近创建一个具有较高分辨率的网格。分辨率由 MIN_EDGE_BZRMAX_EDGE_BZR变量控制,这两个变量大约规定了边界上的最小边长和网格中部的最大边长。

  • 多边形细化

    这个选项使用户可以细化域的一个特殊区域。这可以像编辑器中的结构多边形一样完成。用户必须定义细化多边形的边界,在多边形内部,用户可以在输入文件中定义特殊的细化标准。如第2.3.3章所述,多边形细化过程与 CFLMAX DZ准则一起工作。

  • 修复边界分辨率

    人们可以通过在三角参数中设置 Y标志来强制 Polymesh不细化边界:PARAITER="Darpq20Y"

网格平滑(Mesh Smothing)

从现实世界的数据中重建的三角网格通常包含不受欢迎的 噪声(noise)。在保留三角网格的几何特征的同时,平滑其上的噪声是一个重要的要求。让我们考虑三角形网格上的噪声的定义。在一个没有 额外噪声(additive noise)的三角形网格上,每个三角形的顶点都存在于适当的位置,特别是在网格表面的接触。

如果一个三角形网格有一些噪声,顶点就会被打乱,其位置与网格分离。我们将 噪声定义为网格顶点从其在网格表面的适当位置分离。因此,噪声抑制过程等同于对网格顶点位置的修正

边界粗化(Coarsening on boundary)

为了生成一个 有限元网格(finite element mesh),你需要代表一个域的 边界坐标,如果存在一个岛的话。太近的节点可以用新开发的算法进行 粗化。在这个过程中,非常重要的一点是,线条的特性将被保留。

在从 PolyMesh中读入 边界多边形后,将调用 粗化的初始化。随后,由用户启用的 粗化程序(coarsening routine)将在 节点列表中运行。这些算法将根据用户定义的 准则决定是否删除每个点。在运行过程中,程序将存储 决定在一个单独的数组中,以便在以后的过程中删除选定的点。

粗化的详细用法在 第4.3章的一个特殊测试案例 Testgrid中显示。

排序(Sorting)

排序选项的目的是在计算过程中减少 chashe dismisses,并进行 cash localization
这是用不同的排序算法完成的,比如 希尔伯特排序(hilbert sort),或一些为 WWMWWIIIWAM中使用的 波动分割方案(fluctuation spiltting schemes)定制的排序。

河流网格化(River mesh)

See #5.3.6.River meshing|outline


4-PolyMesh 处理(Handling)

在运行 PolyMesh 之前,有一些步骤必须在执行 PolyMesh 之前完成。 以下子章节描述了它们。

输入文件

为了使 PolyMesh能够工作,用户必须提供输入文件。至少需要:

  • rand.dat (边界信息的)
  • xyz.dat (水深数据)

文件(rand.dat)包含关于边界节点的坐标。第二个文件(xyz.dat)包含水深数据。另外需要的文件(仅当该特征被启用时)是:

  • insel.dat (如果该区域有岛屿)
  • struct.dat (如果你要将一个结构加载到网格中)
  • polygon.dat (如果你想细化一个特殊区域的多边形)

所有这些输入文件都有一个特殊的格式,在运行 PolyMesh之前,应在 附录A中详细确认。必须提供正确的格式,否则 PolyMesh会中止。

POLYMESH_use_and_tricks_guide.pdf貌似包含 polymesh的输入文件创建。

xyz.dat(xf格式)

附录A-xyz.dat(xf格式)-水深数据

  • RandknotenBoundarynodes, 即边界点;
  • GebietsknotenAreanodes, 即区域(内)点;
  • x-Koord.lon, 即经度;
  • y-Koord.lat, 即纬度;
  • Skalarwertmeasurementvalue, 即对应坐标系下的测量水深;
  • Anzahl der ElementeNumber of Elements ,即 Element的数量;
  • KnotenNotes, 即点;

xyz.dat(xyz格式)

附录A-xyz.dat(xyz格式)-水深数据

  • 第一行:6表示有6个水深数据点;
  • 数据形式为(x,y,z):(lon,lat,measurement)

xyz.dat文件创建–待实现

  1. 获取全球水深数据文件,例如 ETOPO1ETOPO2等,可用水深数据集在GRIDGEN教程中有链接,GRIDGEN教程包含 ETOPO1ETOPO2

  2. MATLABPYTHON提取所需数据,输出生成 xyz.dat文件

    具体程序待制作上传;

insel.dat / polygon.dat / struct.dat

附录A-insel.dat/polygon.dat/struct.dat-岛屿数据/多边形数据/结构数据

  • 第一行:注释行 - 第一个字符必须是 Cc,后面是一个 字符串(名称)
  • 数据形式为 (标号,经度,纬度,测量值)
  • 数据集必须以 -1关闭;
  • 文件必须包含至少1个 岛屿(island)多边形(polygon),其中每组数据集至少有2个以上测量值。

rand.dat

insel.dat等文件格式相同,但只包含一组测量数据。

insel.dat / polygon.dat / struct.dat / rand.dat 文件创建–待实现

输入文件可用 Google-Earth kml polygon 形式提供。

INOUT教程 提供了 google-earthubuntu 上的下载安装。

名单变量 IBOUNDFORMAT必须设置为1。

IBOUNDFORMAT 是哪里的名单变量?

输入参数

为了得到最好的结果,必须在 meshin.nml文件中正确定义 triangulation的输入参数。PolyMesh会从这个文件中读取所有必要的输入参数。只能在你的命令提示符下编辑它并设置你的标准,否则 PolyMesh将使用默认参数。在 附录C 42中附有一个完整描述的输入文件。

或者使用编辑器 kater-Toolbox作为图形界面。只要用 ToolBox启动 kater-Toolbox,在下拉菜单中编辑参数。

kater-Toolbox是什么软件?

为了更好地理解,我们将输入文件分成了不同的 部分,这些 部分命名是直观的(intuitive)。这些 部分是:

 General 
 Interpolation
 Refinement 
 Triangleoptions
 Smooth 
 Coarsening 
 Regmesh 
 Sorting 
 Debug 

在输入文件每个 部分中,有三种形式的输入参数。

  • logical switches,用于启用或禁用 PolyMesh的某项功能,以 L 开头,例如 LISLAND
  • 字符串,为 PolyMesh的代码提供文件名(即输出文件)的。
  • 参数值,为测试案例设定值。

GENERAL

附录C-42-GENERAL 部分</code>

INTERPOLATION

附录C-42-INTERPOLATION 部分</code>

REFINEMENT

附录C-42-REFINEMENT 部分

TRIANGLEOPTIONS

SMOOTH

COARSENING

REGMESH

SORTING

RIVER

DEBUG

输出文件

PolyMesh能够以四种不同的文件格式写出结果:

  • XFN
  • TRIANGLE
  • GR3
  • MSH

要改变输出格式,请编辑输入文件 meshin.nml,并进入 General部分。这里你可以改变变量 OUTPUTFORMAT
额外的描述位于完全推荐的 meshin_example.nml 文件中(/polymesh/manual/meshin_example.nml)。

第一次运行

要运行 PolyMesh,请在你的 本地测试案例文件夹中输入 polymesh,这个文件夹包含了从 档案中提取的输入文件。在 PolyMesh中运行的过程如下:

  1. 水深数据边界文件读入几个数组。
  2. 水深数据提供给要网格化的三角形。水深网格的结果可以在 bathyorig.nodebathyorig.ele文件中查看。
  3. 第一版 常规网格是由 三角区进行三角化的。因此,PolyMesh从文件中读取额外的数据,例如岛屿信息,并以正确的格式提供给三角形。结果被写入 init.nodeinit.ele文件中。
  4. 此后,迭代过程开始。迭代和细化参数必须在输入文件部分正确设置。这些部分的名称是直观的。
  5. 编写最终输出文件。
  6. Hier muss der Prozess noch genauer besrieben werden.(德语:这里需要更详细地描述这个过程。)

观察结果

网格生成的最终结果写在 final.nodefinal.ele 文件中。三角形网格生成器提供了一个程序来观察结果。它被称为 showme

可能需要安装 apt-get install triangle-bin

只要输入 showme final.node 就可以看到结果。
此外,你还可以观看初始的水深网格。输出文件被命名为 bathy.1.nodeinit.1.node。在迭代过程中,你可以通过 iter.1.nodeiter.2.node观察结果。文件名中的数字代表迭代号。

5-PolyMesh练习

为了使 PolyMesh的使用更容易一些,我们提供了一些应用实例。只要遵循这些步骤,你就可以看到,使用该程序是非常容易的。

Example 1 – HISWA

在这个例子中,你可以按照步骤,学习如何使用 PolyMesh。只需阅读这些章节,最后尝试制作你自己的网格

定义边界,水深数据

使用 PolyMesh生成网格的第一步是加载水深数据库。水深文件的主文件名可以在输入文件中设置。水深文件 xyz.dat的变量被称为 Depthfile。在接下来的步骤中,PolyMesh会自动读取这些数据,因为水深总是被启用的。

此外,PolyMesh需要边界坐标,这也应该存储在一个单独的文件中,否则 PolyMesh会中止。默认名称是 rand.dat。你可以在输入文件中设置你喜欢的文件名。如果你已经设置了所有的输入参数,你就可以往前走一步了。

xyz.datrand.dat文件怎么生成?

开始程序,可视化结果

在你的 私人文件夹中下载并解压 PolyMesh。如果你需要进一步的帮助,请先阅读 第2.1章,以后再继续。

将编译生成的可执行文件,在 程序文件夹,创建软连接

ln -s /home/jincanliu/bin/* .

在你的命令提示符下用 polymesh 运行可执行程序。该程序将读取数据并生成网格。考虑到开关 LINSELLSTRUCTLPOLYFalse。结果将被写入 final.dat 文件中。要查看结果,请使用 showme或类似的程序。

用结构多边形生成网格

下一步是整合一个 结构多边形(struct polygon)。使用与之前章节中相同的选项。只需在 程序文件夹中提供结构数据库文件。现在设置结构文件的文件名,并将输入文件中的 LSTRUCT切换为true。至少要再次运行 PolyMesh并查看结果。

用结构、岛屿多边形生成网格

本章将演示如何在现有的网格中添加岛屿。这个域的网格生成将由 Triangle完成。第一步是设置开关 LISLAND True,并在你的 程序文件夹中提供岛屿数据库。不要忘记在输入文件 meshin.nml中输入正确的文件名。接下来只需运行 PolyMesh并查看最终结果,该结果已被写入你的 程序文件夹中的 final.dat

用结构、岛屿、细化多边形生成网格

本子章演示了多边形细化的过程。在 inputfile中启用开关 LPOLYpolymesh将读入多边形文件。文件名是 polygon.dat


Example 2 - Baltic See

下面几章将以 波罗的海(Baltic See)为测试案例,详细展示 PolyMesh的功能。

生成受约束的Delaunay网格

在这个案例中,我们只提供水深数据 xyz.dat 和边界数据 rand.dat。此外,输入文件可以被修改,允许每个用户按照自己的意愿设置 三角形选项

该图显示了三角化后的 波罗的海网格。三角化是在没有任何细化选项的情况下完成的。


Author: Jincan
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Jincan !
  TOC