<center>
06-POLYMESH_use_and_tricks_guide</center>
参考资料
POLYMESH_use_and_tricks_guide.pdf
;
- 是
COURS/WAVES_SHORT_COURSE/TUTORIALS/TUTORIAL-MESH-EDIT
里面的内容;TUTORIALS
目录的链接: https://pan.baidu.com/s/1S4qGSGGyJizdSAeFIerewA 密码: jpi1- TUTORIAL 是会更新的,关于 2019 版本的;
- 链接:https://pan.baidu.com/s/1bQVgtVP8k5r8ZJxRNHGWjA
提取码:1soa
–来自百度网盘
内容
Polymesh
被用来生成 非结构化网格
,通常使用3个基本输入数据:xyz水深数据
、一组 海岸线多边形
和一个定义 模型域界限的边界多边形
。这些数据分别在3个不同的文件中,例如:xyz.dat
(水深数据)、insel.dat
(海岸线多边形)和 rand.dat
(边界多边形)。
此外,还需要一个 command
或 input
文件来指定网格化设置。这个文件被称为 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.dat
和 insel.dat
)的总体建议,验证是否满足以下内容:
- 如果沿着
海岸线的结点之间的距离
小于这些地区所需的网格分辨率,请过滤一些结点,试图保持它们之间的均匀距离。这与浅水区域 shallower areas
所需的细节水平直接相关。 - 避免沿海岸线多边形的
极度锐角(例如小于30度的角)extremely acute angles
,这将改善边长相近的三角形的生成。尽管可以在meshin.nml
的COARSENING
部分为边界上的最小角度
定义一个阈值(设置LBOUNDARYCOARS = T
和PEAKANGLE = 30
),但建议对多边形的结点进行预处理。 - 建议多边形的结点在
开放的海洋边界两侧
有较大的间距,例如,保持与所需的最低分辨率(最大三角形边)相等的均匀间距。这是一个普遍的建议,因为分段分割(或不分割),可以通过meshin.nml
文件中的TRIANGLEOPTIONS
来定义,它将影响沿多边形(rand.dat
和insel.dat
)的三角形生成。 - 确认沿着多边形没有
自我交叉线段 self-crossing segments
。即使代码没有崩溃,交叉段的存在总是会产生不好的结果。可以通过在meshin.nml
的DEBUG部分
设置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 1
,C Island 2
,…)。每个多边形由四列列表组成,第一列对应于结点编号(最好从 0
开始),第二列是x坐标,第三列是y坐标,最后一列是深度/海拔值。列的分隔可以是一个空间、多个空间或制表,多边形的第一个和最后一个节点必须是相同的(即封闭性)。(见图5)。
meshin.nml
如前所述,polymesh
输入或命令文件(从这里开始 meshin.nml
)是指定所有网格划分考虑因素的地方,因此,它影响到代码使用数据文件的方式(例如 第2.1
,2.2
和 2.3节
中描述的那些)。
meshin.nml
中定义的 sections
、options
和 variables
的完整描述可以在Polymesh用户手册中找到。在本文中,我们将重点介绍一些关于 插值 interpolation
、全局(然后是局部)细化 refinement
和 Polymesh调用Triangle的方式
的实用建议,这对最终的网格有很大影响。
Triangle Option
了解 Polymesh
如何调用 Triangle
是很重要的,因为这段代码负责 三角形的划分 triangulation
,多边形的分割 splitting
和大部分生成的 三角形约束 constrains
。
Triangle
的 triangulation
选项可以在 meshin.nml
中的 &TRIANGLEOPTIONS
部分设置。该部分中的所有变量都是 Triangle
的命令开关。例如:
Polymesh
的变量 PARABATHYORIG
和 PARAINIT
是创建的原始水深数据和初始网格,它被用作 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
,GR3
和MSH
; - 基本输入文件名:
FNAMEPOLYREFINE = "polygon.dat"
, 用于分区细化的多边形(需要LPOLY = T
) ;BOUNDARYNAME = "rand.dat"
, ! 边界多边形的输入文件名 ;DEPTHFILE = "xyz.dat"
, ! 水深测量的输入文件名 ;ISLANDNAME = "insel.dat"
, ! 岛屿多边形的输入文件名 ; - 输出文件名:
FNAMEFINAL = "final"
, ! 最终网格的输出文件名 ;FNAMEBATHY = "bathy"
, ! 水深测量文件的输出文件名 ;FNAMEINIT = 'init '
, ! 初始网格的输出文件名 ;
如果需要,所有的输入和输出文件名都可以改变(根据用户提供的文件)。
Interpolation Options
迭代细化和迭代次数,使用来自多边形(rand
或 insel
)的深度值,域 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.dat
、rand.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
部分的 PARAITER
和 PARAINIT
变量中包含 YY
选项。为了避免仅在边界多边形处分割线段,必须指定 Y
。
当结点之间的距离已经在 输入文件的预处理
中得到适当处理,并且这是在这些地方所期望的分辨率时,建议避免在多边形中进行分割。这个选项(YY
)确保海岸线和公海边界的分辨率保持在多边形输入文件(rand.dat
和 insel.dat
)中的状态。
为 MIN_EDGE
、MAX_EDGE
、MIN_EDGE_DZ
等指定的全局细化约束可能有 不寻常的值
。这是由于在选择地理坐标时使用 Polymesh
的一个 bug
。建议检验这个约束条件,并将其改为 以米为单位的数值
,以验证输出网格的变化。原始的全局细化设置和 三角化
选项显示在图10中。关于这个例子设置的完整细节请参考提供的 meshin.nml
文件。生成的网格如图11所示。
从图10中可以看出,三角化
命令中选取了 q25
选项。在 meshin.nml
的 &COARSENING
部分,通过设置 LISLANDCOARS = T
, LANGLE_METHOD_3P = T
, ANGLE = 25
和 PEAKANGLE = 25
,加强了对岛屿多边形的最小角度限制。在所使用的 Polymesh
版本中,当 LBOUNDARYCOARS =T
时有一个问题。它修改了在 rand.dat
读取的深度,它沿着边界产生了不好的结果,因此,<font color='red'>
建议在开始调整细化前进行检查</font>
。在所有情况下,通过使用 q25
(或任何需要的角度),为网格中的三角形生成创造了一个良好的限制。
怎么检查,检查完后怎么修改?
不在多边形中分割线段的缺点之一,是有可能迫使 polymesh
,在没有完成均匀间距或适当的逐步改变结点间距的部分时
,创建 扭曲的
三角形。在这个例子中,有很多情况下会出现这种效果(见图12)。尽管如此,在完全改变设置之前,建议验证这些 扭曲的
三角形是否影响 模型结果
和/或产生 时间步长限制
。
怎么看三角形是不是
扭曲的
?
example 2:允许分割片段
为了允许在多边形中进行分割,在 meshin.nml
的 &TRIANGLEOPTIONS
部分的 PARAITER
和 PARAINIT
变量中必须不包括 YY
或 Y
选项。在本例中,所有其他参数将保持与例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
文件中手动完成,但建议使用某种视觉帮助(如 matlab
或 python
代码)来选择定义要删除或修改的部分的结点。(见图17)。
最后,用更新的 insel.dat
文件,重新运行 Polymesh
:
试着用 IDL
工具来验证最小时间步数,并检查是否需要更多的编辑多边形。