06-POLYMESH- _use_and_tricks_guide(未实现)


<center>06-POLYMESH_use_and_tricks_guide</center>

参考资料

POLYMESH_use_and_tricks_guide.pdf


内容

Polymesh被用来生成 非结构化网格,通常使用3个基本输入数据:xyz水深数据、一组 海岸线多边形和一个定义 模型域界限的边界多边形。这些数据分别在3个不同的文件中,例如:xyz.dat(水深数据)、insel.dat(海岸线多边形)和 rand.dat(边界多边形)。

此外,还需要一个 commandinput文件来指定网格化设置。这个文件被称为 meshin.nml,它定义了输入数据的使用方式。在其他方面,它可以设置一些与 CFL和/或 深度变化值波速最小和最大三角形边缘尺寸等有关的 网格划分约束条件。同样重要的是,polymesh调用网格划分软件 Triangle来生成三角形,因此,Triangle的调用方式与命令文件 Meshin.nml对最终得到的网格非常重要。

本文旨在为输入数据文件的准备提供一些指导,以及为 meshin.nml命令文件的设置提供一些有用的提示。所有的例子都是关于创建一个网格,作为 WAWEWATCH III的输入,但主要的工作思路可以应用于任何建模项目。

2-准备输入文件

对输入文件的透彻准备,可以避免 不想要的结果中断网格划分过程中的常见错误,这可以允许我们在调整正确的网格划分设置和优化最终网格所需的细化上花费更多时间(根据其使用目的)。

水深数据(bathymetric data)

最简单的引入测深数据的方法是xyz类型的文件(从这里开始是 xyz.dat)。要使用这种文件,在 meshin.nml 中设置 LXYZ = T。如果xyz文件使用 地理坐标(经度,纬度,深度),则在 meshin.nml中设置 LLL = T

水深数据应至少覆盖边界多边形(rand.dat)所定义的表面,或者延伸到比 rand.dat所定义的模型域更大的区域。这种做法将确保在 三角化过程中(triangulation)对深度进行适当的内插。

避免 双重节点(2个具有相同xyz数据的点),最重要的是避免出现2个在空间位置相同但深度值不同的节点。通常情况下,polymesh可以处理这个问题,但过多的这种点会导致三角计算错误或代码崩溃。

海岸线多边形内的水深数据的存在不应该是一个问题,但是过多的水深数据会延长创建这些多边形所定义的 holes所需的时间。

最后,请记住,WW3的深度参考(垂直基准),应该是 平均海平面(mean sea level)

xyz.dat的结构非常简单。文本文件的第一行必须是有xyz信息的点(或节点)的数量,然后,写出所有xyz列表。坐标之间的分隔可以是一个空格、多个空格或表格。(见图1)

边界多边形(boundary polygon)

默认情况下,边界多边形文件被命名为 rand.dat,并且在 meshin.nml文件中用变量 BOUNDARYNAME = "rand.dat "来定义它。如果需要,可以改变默认名称。

边界多边形(从这里开始是 rand.dat)定义了模型的 外部界限(outer limits)。最简单的情况是,所有的边界点都是湿点(海洋、湖泊等),但实际上大多数情况都包括湿点和海岸线(可以有 深度 depth和/或 海拔值elevation,见图2)。rand.dat中的结点可以 顺时针或逆时针组织。建议使多边形的最后一个结点与第一个结点相等。

边界多边形,是所有边界结点联合形成的一个封闭多边形,如图2的左右两个多边形图。

左边是水深-边界多边形,右边是海拔-边界多边形

图2中的例子可以看出,沿边界的 深度depth会根据 水深bathymetry/海岸线的特征而变化,在这个特殊情况下,海岸线(苏格兰东北部北爱尔兰)的数值有 海拔值(在 WW3的惯例中为负值)。这个数值是根据该区域的 潮汐 tidal条件估算出来的。也可以根据模型的要求,为海岸线设置一个固定的常数值。

深度depth既可以指 水深bathymetry,也可以指 海岸线-海拔elevation

作为对多边形结点分布(rand.datinsel.dat)的总体建议,验证是否满足以下内容:

  • 如果沿着 海岸线的结点之间的距离小于这些地区所需的网格分辨率,请过滤一些结点,试图保持它们之间的均匀距离。这与 浅水区域 shallower areas所需的细节水平直接相关。
  • 避免沿海岸线多边形的 极度锐角(例如小于30度的角)extremely acute angles,这将改善边长相近的三角形的生成。尽管可以在 meshin.nmlCOARSENING部分为 边界上的最小角度定义一个阈值(设置 LBOUNDARYCOARS = TPEAKANGLE = 30),但建议对多边形的结点进行预处理。
  • 建议多边形的结点在 开放的海洋边界两侧有较大的间距,例如,保持与所需的最低分辨率(最大三角形边)相等的均匀间距。这是一个普遍的建议,因为分段分割(或不分割),可以通过 meshin.nml文件中的 TRIANGLEOPTIONS来定义,它将影响沿多边形(rand.datinsel.dat)的三角形生成。
  • 确认沿着多边形没有 自我交叉线段 self-crossing segments。即使代码没有崩溃,交叉段的存在总是会产生不好的结果。可以通过在 meshin.nmlDEBUG部分设置 LCHECKPOLYGONS = T,激活对 自我交叉线段的验证。

rand.dat文件以一个注释(C Randpolygon ,默认情况下)开始,然后是一个有四列的结点列表:从 0开始的结点编号、x坐标、y坐标和深度。文件的最后一行必须是一个 -2,以确定结点列表的结束。列的分隔可以是一个空格、多个空格或制表。(见图3)

岛屿多边形(island polygon)

包含 rand.dat内的 多边形列表的文件默认名为 insel.dat,它在 meshin.nml文件中用变量 ISLANDNAME = 'insel.dat'定义。至于边界多边形文件,如果需要,可以改变默认名称(但从现在开始,它将被称为 insel.dat)。

insel.dat文件包含定义模型域内岛屿的所有 海岸线多边形列表。每个岛的结点可以有一个 深度depth海拔值elevation,节点可以顺时针或逆时针指定。

图4中的例子显示了 insel.dat内定义的所有岛屿。在这种情况下,所有多边形的海拔值都是根据该地区的 潮汐条件估算的。正如之前提到的 rand.dat,可以为每个多边形的结点定义一个恒定的深度/海拔值。同样,这将取决于模型的 要求和/或 目的

insel.dat的结构与 rand.dat的结构相似,但在这种情况下,通常有几个多边形。每个多边形必须以 注释 comment标题行 header line开始(以 C开头),其声明以 -1结束,但最后一个多边形除外,其声明以 -2结束。对多边形进行编号是很好的做法,这样可以 跟踪变化和潜在的错误(例如:C Island 1C Island 2,…)。每个多边形由四列列表组成,第一列对应于结点编号(最好从 0开始),第二列是x坐标,第三列是y坐标,最后一列是深度/海拔值。列的分隔可以是一个空间、多个空间或制表,多边形的第一个和最后一个节点必须是相同的(即封闭性)。(见图5)。

meshin.nml

如前所述,polymesh输入或命令文件(从这里开始 meshin.nml)是指定所有网格划分考虑因素的地方,因此,它影响到代码使用数据文件的方式(例如 第2.12.22.3节中描述的那些)。

meshin.nml中定义的 sectionsoptionsvariables的完整描述可以在Polymesh用户手册中找到。在本文中,我们将重点介绍一些关于 插值 interpolation全局(然后是局部)细化 refinementPolymesh调用Triangle的方式的实用建议,这对最终的网格有很大影响。

Triangle Option

了解 Polymesh如何调用 Triangle是很重要的,因为这段代码负责 三角形的划分 triangulation多边形的分割 splitting和大部分生成的 三角形约束 constrains

Triangletriangulation选项可以在 meshin.nml中的 &TRIANGLEOPTIONS部分设置。该部分中的所有变量都是 Triangle的命令开关。例如:

Polymesh的变量 PARABATHYORIGPARAINIT是创建的原始水深数据和初始网格,它被用作 PARAITER定义的迭代网格化过程的基础。在这个例子中(图6),这些是 Polymesh调用 Triangle的指令开关:

  • j:从 输出.node文件抛弃 jettison不属于最终 triangulation顶点 vertice。默认情况下,Triangle输入.node文件中的所有顶点以相同的顺序复制到 输出.node文件中,因此它们的 指标 indices不会改变。-j 开关防止 重复的输入顶点被洞 "吃掉"的顶点出现在 输出.node文件中。因此,如果两个输入顶点的坐标完全相同,那么只有第一个会出现在输出中。如果存在顶点被抛弃,输出.node文件中的顶点编号与 输入.node文件中的顶点编号将变得不同。
  • c: 在 三角化 triangulation凸壳 convex hull创建 create分段。
    • 如果你正在三角化一个 顶点集,这个开关会导致写入一个 .poly文件,其中包含凸壳的所有边。
    • 如果你正在对 PSLG进行三角化,这个开关指定PSLG的整个凸壳应该被三角化,不管PSLG有哪些段。
    • 如果你在三角化 PSLG时不使用这个开关,Triangle会假定你已经通过 用输入PSLG的段包围它来确定要被三角化的区域。注意:如果你不小心,这个开关会导致在 PSLG段凸面体段之间引入一个极小的角度,这可能会导致过度细化(如果 Triangle的精度用尽,可能会失败)。
    • 如果你正在细化一个网格,-c开关的作用是不同的:它会导致写入一个包含网格边界边缘的 .poly文件(如果没有读取到 .poly文件,则很有用)。
  • Y
  • a
  • p
  • r
  • q

这些命令开关定义了 Triangle的使用方式,因此,其重要性高于 Polymesh中的任何一般或局部细化设置。关于 Triangle命令开关和一般信息的更多细节可以在 Polymesh安装文件中的 Triangle文件夹中阅读(尝试使用 triangle -h)。

General Setup

meshin.nml文件的 &GENERAL部分,定义了输入和输出文件,以及一些基本的配置设置。在本文件的例子中,一些 最常用的参数包括:

  • 配置设置:
    LXYZ = T,! 如果为真,水深文件的格式为xyz,否则为xfn ;
    LISLAND = T, ! 读取岛屿多边形(从 insel.dat文件);
    LPOLY = T, ! 使用多边形进行分区细化 ;
    LLL = T, ! 如果为真,则坐标为经度和纬度 ;
    OUTPUTFORMAT = "MSH", (网格输出格式)! 包含的选项有:XFN, TRIANGLE, GR3MSH ;
  • 基本输入文件名:
    FNAMEPOLYREFINE = "polygon.dat", 用于分区细化的多边形(需要 LPOLY = T) ;
    BOUNDARYNAME = "rand.dat", ! 边界多边形的输入文件名 ;
    DEPTHFILE = "xyz.dat", ! 水深测量的输入文件名 ;
    ISLANDNAME = "insel.dat", ! 岛屿多边形的输入文件名 ;
  • 输出文件名:
    FNAMEFINAL = "final", ! 最终网格的输出文件名 ;
    FNAMEBATHY = "bathy", ! 水深测量文件的输出文件名 ;
    FNAMEINIT = 'init ', ! 初始网格的输出文件名 ;

如果需要,所有的输入和输出文件名都可以改变(根据用户提供的文件)。

Interpolation Options

迭代细化和迭代次数,使用来自多边形(randinsel)的深度值,域 domain中的最小和最大深度,是 meshin.nml&INTERPOLATION部分中的一些选项。

  • 以下是本指南中的例子中使用的一些标准值:
    LITER = T, !启用迭代细化功能。
    NITER = 5, !迭代次数。
    LTAKEISLANDDEPTH = T, ! 获取岛屿的深度坐标来生成网格。
    LTAKEBOUNDDEPTH = T, ! 获取边界多边形的深度坐标来生成网格。
    LFASTSEARCH = T, ! 如果为真,则使用 bucketsearch

一般来说,插值选项与 meshin.nml&GENERAL部分提供和激活的信息(文件)有关,因此,这些设置必须根据每个具体的情况进行审查。更多细节请参考用户手册。

Refinement Options

polymesh中,可以设置一些一般的细化选项,这些选项将应用于整个模型域。这些参数设置在 meshin.nml&INTERPOLATION部分之后的第一个 &REFINEMENT部分。如果所选区域需要特定的细化处理,可以通过在 &GENERAL中设置 LPOLY = T来完成,提供一个包含定义感兴趣区域的多边形的 polygon.dat文件,并在 meshin.nml的最后放置与 polygon.dat中定义的细化多边形一样多的 &REFINEMENT块(这是一个通用名称,可以更改)。这样,就有可能对每个特定区域应用不同的细化标准

更多的细节将根据所提供的每个例子给出。

Debug Option

&DEGUG部分,有两个选项被推荐在 第一次网格划分尝试中使用:

  • LCHECKDOUBLENODES = T,! 检查双结点上的 hole 结点数据库;
  • LCHECKPOLYGONS = T, ! 检查 insel.datrand.dat中的多边形是否相交或为空。

激活这两个选项后,Polymesh将处理检测到的 双节点,并在屏幕上打印与多边形中的 自相交段或多边形之间的相交有关的错误。(见图8)。

图8的错误怎么解决?

一旦验证了多边形输入文件的 合理性 sanity,就可以设置 LCHECKPOLYGONS = F,这样可以减少进一步调整测试的计算时间。

建议一直保持 LCHECKDOUBLENODES = T,以处理潜在的 双重节点

3-网格化例子

3.0-输入文件

接下来关于例子的输入文件包括:

  • 水深的xyz型数据文件:xyz.dat
  • 边界多边形:rand.dat
  • 岛屿多边形:insel.dat

多边形取自 Openstreetmap,水深数据取自 HOMONIM,使用 FES2014潮汐谐波将深度/高度加入多边形。

按照WW3的惯例,深度为正值,海拔高度为负值,都是相对于 平均海平面而言的。水深数据的分辨率为 ~210[米],边界和岛屿多边形的 海岸线已经事先 同质化 homogenized最小结点分辨率~400[米]。此外,所有的多边形都被检查了自交段和多边形之间的交叉,以避免网格化问题(图8)。

综合输入文件见图9

请注意,在域的东南角有水深数据的空白,那里没有定义 岛屿多边形。这样做的目的是为了显示使用或不使用岛屿多边形的效果。

例子在 MESH_EDIT教程文件夹下。

example 1 :没有分割片段

为了避免在所有使用的多边形(边界和 insel.dat中列出的多边形)中出现分割,必须在 meshin.nml&TRIANGLEOPTIONS部分的 PARAITERPARAINIT变量中包含 YY选项。为了避免仅在边界多边形处分割线段,必须指定 Y

当结点之间的距离已经在 输入文件的预处理中得到适当处理,并且这是在这些地方所期望的分辨率时,建议避免在多边形中进行分割。这个选项(YY)确保海岸线和公海边界的分辨率保持在多边形输入文件(rand.datinsel.dat)中的状态。

MIN_EDGEMAX_EDGEMIN_EDGE_DZ等指定的全局细化约束可能有 不寻常的值。这是由于在选择地理坐标时使用 Polymesh的一个 bug。建议检验这个约束条件,并将其改为 以米为单位的数值,以验证输出网格的变化。原始的全局细化设置和 三角化选项显示在图10中。关于这个例子设置的完整细节请参考提供的 meshin.nml文件。生成的网格如图11所示。

图10中可以看出,三角化命令中选取了 q25选项。在 meshin.nml&COARSENING部分,通过设置 LISLANDCOARS = T, LANGLE_METHOD_3P = T, ANGLE = 25PEAKANGLE = 25,加强了对岛屿多边形的最小角度限制。在所使用的 Polymesh版本中,当 LBOUNDARYCOARS =T时有一个问题。它修改了在 rand.dat读取的深度,它沿着边界产生了不好的结果,因此,<font color='red'>建议在开始调整细化前进行检查</font>。在所有情况下,通过使用 q25(或任何需要的角度),为网格中的三角形生成创造了一个良好的限制。

怎么检查,检查完后怎么修改?

不在多边形中分割线段的缺点之一,是有可能迫使 polymesh在没有完成均匀间距或适当的逐步改变结点间距的部分时,创建 扭曲的三角形。在这个例子中,有很多情况下会出现这种效果(见图12)。尽管如此,在完全改变设置之前,建议验证这些 扭曲的 三角形是否影响 模型结果和/或产生 时间步长限制

怎么看三角形是不是 扭曲的

example 2:允许分割片段

为了允许在多边形中进行分割,在 meshin.nml&TRIANGLEOPTIONS部分的 PARAITERPARAINIT变量中必须不包括 YYY选项。在本例中,所有其他参数将保持与例1(图10)一样,但三角化选项除外(见图13)。试着改变最小角度的限制来验证它对最终网格的影响。

使用这个例子中的 meshin.nml设置,可以解决沿多边形强制生成 扭曲三角形的问题(图14),它允许沿 开阔海域边界使用更粗的 rand多边形部分,这同时也允许在 更深的区域 deeper areas进行三角化时 关于三角形尺寸有更多的自由度(当然,要符合 meshin.nml中的细化条件)。

这种设置的一个潜在缺点是在狭窄区域生成小的三角形。换句话说,当两个多边形之间的距离太近,或者多边形的一些海岸线特征本身,形成一个狭窄的 凹面 concave(如图15所示的例子)。如果存在这些情况,并且产生了小的三角形,就有可能出现 数值稳定性的最小时间步长(这个网格就是这种情况)。

小三角形导致的 数值稳定性的最小时间步长有什么不好影响?

为了避免这种问题,建议在预处理阶段验证多边形,根据模型的目的决定需要沿多边形的哪些特征,如果需要,可以修剪、合并多边形,或者修改有问题的部分以 增加最小时间步长。当有问题的部分远离分析区域时,解决方案变得更加容易。

example 3:固定的 insel.dat

本例使用与 例2相同的 meshin.nml设置,其中 例2解释了多边形的分段分割。在 例2图15中出现的有问题的部分(有小三角形)将被修剪并重新做成网格。

呈现这种狭窄凹陷特征的多边形是 C Island 58:

一旦确定了这个多边形,就会对该部分进行 修剪 trimmed。如果多边形易于阅读,可以在 insel.dat文件中手动完成,但建议使用某种视觉帮助(如 matlabpython代码)来选择定义要删除或修改的部分的结点。(见图17)。

最后,用更新的 insel.dat文件,重新运行 Polymesh

试着用 IDL工具来验证最小时间步数,并检查是否需要更多的编辑多边形。


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