# Use the existing connected PyFluent variable solver.
# Continue with the complete executable script here.

import math
import json

task_directory = r"C:\Users\13977\AppData\Local\FluentAGI\data\runs\20261017-103656-ef1aaf"

# 1. 检查已有连接，不启动或关闭 Fluent
if not fluentagi.is_active():
    raise RuntimeError("Fluent 当前没有可用的活动模型，停止后续操作。")

# 2. 构建二维矩形流道
# 顶点按逆时针顺序排列：
# 0=(0,0), 1=(0.2,0), 2=(0.2,0.02), 3=(0,0.02)
# 边0=下壁面，边1=出口，边2=上壁面，边3=入口
mesh_info = fluentagi.build_planar(
    directory=task_directory,
    points=[
        [0.0, 0.0],
        [0.2, 0.0],
        [0.2, 0.02],
        [0.0, 0.02]
    ],
    inlet_edges=[3],
    outlet_edges=[1],
    size=0.001
)
print("几何与网格生成结果：")
print(json.dumps(mesh_info, ensure_ascii=False, default=str))

if not isinstance(mesh_info, dict) or not mesh_info.get("mesh_file"):
    raise RuntimeError("未取得有效的 Fluent 网格文件，停止求解。")

# 3. 导入真实 Fluent 网格并检查
solver.settings.file.read_mesh(file_name=mesh_info["mesh_file"])
solver.settings.mesh.check()
print("Fluent 网格导入与检查完成。")

# 4. 配置空气层流模型
solver.settings.setup.models.viscous.model = "laminar"

# 确认网格边界名称，避免静默设置错误
boundary_conditions = solver.settings.setup.boundary_conditions
velocity_inlets = boundary_conditions.velocity_inlet
pressure_outlets = boundary_conditions.pressure_outlet
walls = boundary_conditions.wall

inlet_names = list(velocity_inlets.keys())
outlet_names = list(pressure_outlets.keys())
wall_names = list(walls.keys())

print("入口边界：", inlet_names)
print("出口边界：", outlet_names)
print("壁面边界：", wall_names)

if "inlet" not in inlet_names:
    raise RuntimeError("网格中未找到 inlet，不能安全设置入口条件。")
if "outlet" not in outlet_names:
    raise RuntimeError("网格中未找到 outlet，不能安全设置出口条件。")

# 5. 设置入口速度与出口表压
velocity_inlets["inlet"].momentum.velocity.value = 0.1
pressure_outlets["outlet"].momentum.gauge_pressure.value = 0.0

# 确认上下壁面均存在并保持默认无滑移条件
if len(wall_names) < 2:
    raise RuntimeError("未识别到上下两个壁面，请检查网格物理分组。")

for wall_name in wall_names:
    walls[wall_name].momentum.wall_motion = "stationary"
    walls[wall_name].momentum.velocity.value = 0.0

# 6. 初始化新建模型
solver.settings.solution.initialization.hybrid_initialize()

# 7. 分批迭代并记录每批实际运行情况
# 采用较小批次，避免一次性长时间计算
batch_sizes = [100, 100, 100, 100, 100]
batch_results = []

for batch_index, iteration_count in enumerate(batch_sizes, start=1):
    solver.settings.solution.run_calculation.iterate(
        iter_count=iteration_count
    )

    batch_results.append({
        "batch": batch_index,
        "iterations_requested": iteration_count
    })

    print("迭代批次结果：")
    print(json.dumps(batch_results[-1], ensure_ascii=False))

    # 每批保存 Case/Data，保留当前计算进度
    solver.settings.file.write_case_data(
        file_name=task_directory + r"\channel_latest.cas.h5"
    )

# 8. 最终保存
solver.settings.file.write_case_data(
    file_name=task_directory + r"\channel_final.cas.h5"
)

print("批次执行记录：")
print(json.dumps(batch_results, ensure_ascii=False, indent=2))
print("已执行保存命令；请结合实际残差和质量守恒检查判断收敛性。")