Files
mkdocs/doc/meshkernelpy/examples/08_mesh2d_orthogonalization.md
T
2026-10-10 21:56:35 +08:00

2.8 KiB

大型网格正交化

返回示例目录

以下保留原笔记本的代码和已保存输出;转换过程中未重新执行代码。

本示例演示如何加载大型二维网格并进行正交化。首先导入所需的库。这里还使用 UGrid 库正确加载二维网格。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from meshkernel import (
    GeometryList,
    MeshKernel,
    OrthogonalizationParameters,
    ProjectionType,
    Mesh2d,
)
from ugrid import UGrid, UGridMesh2D

定义正交性阈值和文件名。

orthogonality_criteria = 0.3
input_file = "./Michigan_Huron_ORTHO_mc025_mn5_net.nc"
output_file = "./Michigan_Huron_orthogonality_issues.xyz"

读取网格几何数据。

with UGrid(input_file, "r") as ug:
    num_mesh2d_topologies = ug.mesh2d_get_num_topologies()
    mesh2d_ugrid = ug.mesh2d_get(num_mesh2d_topologies - 1)

根据节点和边创建 meshkernel 的二维网格。

mesh2d_mk = Mesh2d()
mesh2d_mk.node_x = mesh2d_ugrid.node_x
mesh2d_mk.node_y = mesh2d_ugrid.node_y
mesh2d_mk.edge_nodes = mesh2d_ugrid.edge_nodes

创建 MeshKernel 实例。

mk = MeshKernel(ProjectionType.SPHERICAL)

设置网格,此调用计算开销较大。

mk.mesh2d_set(mesh2d_mk)

获取网格。

mesh2d_output = mk.mesh2d_get()
fig, ax = plt.subplots()
mesh2d_output.plot_edges(ax, color="black")

单元格 15 的绘图输出

查询正交性,此调用计算开销较大。

orthogonality = mk.mesh2d_get_orthogonality().values

提取正交性指标值高于 orthogonality_criteria 的边。

criteria_indices = np.where(orthogonality > orthogonality_criteria)[0]

将提取的边保存到文件。

xyz_df = pd.DataFrame([])
xyz_df["edge_x"] = mesh2d_output.edge_x[criteria_indices]
xyz_df["edge_y"] = mesh2d_output.edge_y[criteria_indices]
xyz_df["orthogonality"] = orthogonality[criteria_indices]
xyz_df.to_csv(output_file, index=False, header=False, sep=" ")

执行正交化

selecting_polygon = GeometryList(
    np.empty(0, dtype=np.double), np.empty(0, dtype=np.double)
)
land_boundaries = GeometryList(
    np.empty(0, dtype=np.double), np.empty(0, dtype=np.double)
)
mk.mesh2d_compute_orthogonalization(
    project_to_land_boundary_option=0,
    orthogonalization_parameters=OrthogonalizationParameters(outer_iterations=1),
    selecting_polygon=selecting_polygon,
    land_boundaries=land_boundaries,
)
mesh2d_output = mk.mesh2d_get()
fig, ax = plt.subplots()
mesh2d_output.plot_edges(ax, color="black")

单元格 26 的绘图输出