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

import json

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

# 1. 创建二维矩形流道及三角形网格
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, indent=2))

if not isinstance(mesh_info, dict) or not mesh_info.get("mesh_file"):
    raise RuntimeError("未返回有效的 Fluent 网格文件，停止后续操作。")

# 2. 导入 Fluent 网格并检查
solver.settings.file.read_mesh(file_name=mesh_info["mesh_file"])
solver.settings.mesh.check()

# 3. 设置空气层流
solver.settings.setup.models.viscous.model = "laminar"

# 4. 读取实际边界名称
bc = solver.settings.setup.boundary_conditions
inlet_zones = bc.velocity_inlet
outlet_zones = bc.pressure_outlet
wall_zones = bc.wall

inlet_names = list(inlet_zones.keys())
outlet_names = list(outlet_zones.keys())
wall_names = list(wall_zones.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 压力出口，请根据上方实际边界名称检查网格。")

if not wall_names:
    raise RuntimeError("没有识别到壁面区，停止计算。")

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

# build_planar 会将未指定的边界归入 walls。
# 上下壁面默认采用静止无滑移条件，不强行设置未知字段。
for name in wall_names:
    print("保留静止无滑移壁面默认设置：", name)

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

# 7. 分批迭代，每批保存计算状态
batch_sizes = [50, 50, 50, 50, 50]
batch_results = []

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

    solver.settings.file.write_case_data(
        file_name=task_directory + r"\channel_latest.cas.h5"
    )

    record = {
        "batch": batch_index,
        "iterations_requested": count,
        "case_data_saved": True
    }
    batch_results.append(record)
    print(json.dumps(record, ensure_ascii=False))

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

# 9. 导出可用的压力和速度结果
export_result = fluentagi.export_results(
    directory=task_directory,
    fields=["pressure", "velocity-magnitude"]
)

print("结果导出反馈：")
print(json.dumps(export_result, ensure_ascii=False, default=str, indent=2))

print("计算批次记录：")
print(json.dumps(batch_results, ensure_ascii=False, indent=2))

print("脚本执行流程结束；需要依据实际残差、质量守恒和导出反馈判断收敛。")