-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathPyMeshGen_mixed.py
More file actions
208 lines (165 loc) · 6.47 KB
/
PyMeshGen_mixed.py
File metadata and controls
208 lines (165 loc) · 6.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent / "fileIO"))
sys.path.append(str(Path(__file__).parent / "data_structure"))
sys.path.append(str(Path(__file__).parent / "meshsize"))
sys.path.append(str(Path(__file__).parent / "visualization"))
sys.path.append(str(Path(__file__).parent / "adfront2"))
sys.path.append(str(Path(__file__).parent / "optimize"))
sys.path.append(str(Path(__file__).parent / "utils"))
from read_cas import parse_fluent_msh
from front2d import construct_initial_front
# Add the project directories to Python path to allow imports
from adfront2_hybrid import Adfront2Hybrid
sys.path.append(str(Path(__file__).parent / "data_structure"))
sys.path.append(str(Path(__file__).parent / "meshsize"))
sys.path.append(str(Path(__file__).parent / "visualization"))
sys.path.append(str(Path(__file__).parent / "adfront2"))
sys.path.append(str(Path(__file__).parent / "optimize"))
sys.path.append(str(Path(__file__).parent / "utils"))
from adlayers2 import Adlayers2
from mesh_visualization import Visualization
from parameters import Parameters
from adfront2 import Adfront2
from adfront2_hybrid import Adfront2Hybrid
from optimize import (
edge_swap,
laplacian_smooth,
hybrid_smooth,
optimize_hybrid_grid,
)
from adlayers2 import Adlayers2
from mesh_visualization import Visualization
from parameters import Parameters
from utils.timer import TimeSpan
from utils.message import info, gui_log
from meshsize import QuadtreeSizing
# 全局GUI引用
_global_gui_instance = None
def set_gui_instance(gui_instance):
"""设置全局GUI实例"""
global _global_gui_instance
_global_gui_instance = gui_instance
def PyMeshGen_mixed(parameters=None):
# 开始计时
global_timer = TimeSpan("PyMeshGen开始运行...")
# 建立参数管理对象
# if parameters is None:
# parameters = Parameters("FROM_MAIN_JSON")
# 建立可视化对象
visual_obj = Visualization(parameters.viz_enabled)
# 输出信息到GUI
gui_log(_global_gui_instance, "开始生成混合网格...")
# 读入边界网格
input_grid = parse_fluent_msh(parameters.input_file)
# 在GUI模式下清除之前的绘图内容
if _global_gui_instance and hasattr(_global_gui_instance, 'ax') and _global_gui_instance.ax:
_global_gui_instance.ax.clear()
visual_obj.plot_mesh(input_grid, boundary_only=True)
# 输出信息到GUI
gui_log(_global_gui_instance, f"已读取输入网格文件: {parameters.input_file}")
# 构造初始阵面
front_heap = construct_initial_front(input_grid)
# 输出信息到GUI
gui_log(_global_gui_instance, "初始阵面构造完成")
# 计算网格尺寸场
sizing_system = QuadtreeSizing(
initial_front=front_heap,
max_size=4,
resolution=0.1,
decay=1.2,
visual_obj=visual_obj,
)
# sizing_system.draw_bgmesh()
# 输出信息到GUI
gui_log(_global_gui_instance, "网格尺寸场计算完成")
unstr_grid_list = []
# 推进生成边界层网格
adlayers = Adlayers2(
boundary_front=front_heap,
sizing_system=sizing_system,
param_obj=parameters,
visual_obj=visual_obj,
)
# Adlayers2的generate_elements总是返回两个值
boundary_grid, front_heap = adlayers.generate_elements()
unstr_grid_list.append(boundary_grid)
# 输出信息到GUI
gui_log(_global_gui_instance, "边界层网格生成完成")
# 推进生成网格
if parameters.mesh_type <= 2:
adfront2 = Adfront2(
boundary_front=front_heap,
sizing_system=sizing_system,
node_coords=boundary_grid.node_coords,
param_obj=parameters,
visual_obj=visual_obj,
)
triangular_grid = adfront2.generate_elements()
elif parameters.mesh_type == 3:
adfront2 = Adfront2Hybrid(
boundary_front=front_heap,
sizing_system=sizing_system,
node_coords=boundary_grid.node_coords,
param_obj=parameters,
visual_obj=visual_obj,
)
triangular_grid = adfront2.generate_elements()
# 输出信息到GUI
gui_log(_global_gui_instance, "网格生成完成")
# 网格质量优化
triangular_grid = edge_swap(triangular_grid)
if parameters.mesh_type <= 2:
triangular_grid = laplacian_smooth(triangular_grid, 3)
unstr_grid_list.append(triangular_grid)
elif parameters.mesh_type == 3:
hybrid_grid = triangular_grid.merge_elements()
# hybrid_grid = hybrid_smooth(hybrid_grid, 3)
hybrid_grid = optimize_hybrid_grid(hybrid_grid)
unstr_grid_list.append(hybrid_grid)
# 输出信息到GUI
gui_log(_global_gui_instance, "网格质量优化完成")
# 合并各向同性网格和边界层网格
global_unstr_grid = unstr_grid_list[0]
for unstr_grid in unstr_grid_list[1:]:
global_unstr_grid.merge(unstr_grid)
# 输出信息到GUI
gui_log(_global_gui_instance, "网格合并完成")
# 可视化
global_unstr_grid.visualize_unstr_grid_2d(visual_obj)
# 在GUI模式下更新画布
if _global_gui_instance:
_global_gui_instance.canvas.draw()
# 输出网格信息
global_unstr_grid.summary()
# global_unstr_grid.quality_histogram(_global_gui_instance.ax if _global_gui_instance else None)
# 输出信息到GUI
gui_log(_global_gui_instance, "网格信息输出完成")
# 输出网格文件
global_unstr_grid.save_to_vtkfile(parameters.output_file)
# 输出信息到GUI
gui_log(_global_gui_instance, f"网格文件已保存至: {parameters.output_file}")
# 将优化后的网格对象设置到GUI实例中
_global_gui_instance.mesh_data = global_unstr_grid
# 结束计时
global_timer.show_to_console("程序运行正常退出.")
# 输出信息到GUI
gui_log(_global_gui_instance, "程序运行正常退出")
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="PyMeshGen 非结构网格生成器")
parser.add_argument(
"--case",
type=str,
default="",
help="算例文件路径 (默认: 空)",
)
args = parser.parse_args()
# 创建参数对象并应用命令行参数
params = (
Parameters("FROM_CASE_JSON", args.case)
if args.case
else Parameters("FROM_MAIN_JSON")
)
PyMeshGen_mixed(params)
input("Press Enter to continue...")