
import flow360 as fl

project = fl.Project.from_cloud(project_id="prj-98fb1425-2354-42c2-81f8-75f890ccfe29")
mesh_object = project.volume_mesh

time_stepping = fl.Unsteady(
    max_pseudo_steps=35,
    steps=600,
    step_size=0.001 * fl.u.s,
    CFL=fl.AdaptiveCFL(),  # Optionally switch to CFL=fl.RampCFL()
)

turbulence_model_solver = fl.SpalartAllmaras(
    absolute_tolerance=1e-8,
    relative_tolerance=1e-2,
    linear_solver=fl.LinearSolver(max_iterations=25),
    hybrid_model=fl.DetachedEddySimulation(shielding_function="DDES"),
    rotation_correction=True,
    equation_evaluation_frequency=1,
)

volume_outputs = fl.VolumeOutput(
    name="volume_outputs",
    output_fields=["SpalartAllmaras_hybridModel"],
    output_format="tecplot",
)

iso_surface = fl.IsosurfaceOutput(
    isosurfaces=[
        fl.Isosurface(
            name="Isosurface_Q_cri",
            iso_value=1e-6,
            field="qcriterion",
        ),
    ],
    output_format="tecplot",
    output_fields=["Mach"],
    frequency=20,
    frequency_offset=0,
)

with fl.SI_unit_system:
    params = fl.SimulationParams(
        time_stepping=time_stepping,
        operating_condition=fl.AerospaceCondition.from_mach(
            mach=0.2,
            alpha=17.05 * fl.u.deg,
            thermal_state=fl.ThermalState(
                temperature=289.44 * fl.u.K,
                density=0.002063 * fl.u.kg / fl.u.m**3,
                material=fl.Air(),
            ),
            reference_mach=0.2,
        ),
        reference_geometry=fl.ReferenceGeometry(),
        models=[
            fl.Wall(
                surfaces=[
                    mesh_object["1"],
                    mesh_object["3"],
                    mesh_object["4"],
                    mesh_object["5"],
                    mesh_object["6"],
                    mesh_object["7"],
                    mesh_object["8"],
                    mesh_object["9"],
                    mesh_object["11"],
                ],
            ),
            fl.Freestream(surfaces=mesh_object["2"]),
            fl.SlipWall(surfaces=mesh_object["10"]),
            fl.Fluid(
                navier_stokes_solver=fl.NavierStokesSolver(
                    absolute_tolerance=1e-10,
                    relative_tolerance=1e-2,
                    linear_solver=fl.LinearSolver(max_iterations=35),
                    kappa_MUSCL=-1,
                    numerical_dissipation_factor=1.0,
                ),
                turbulence_model_solver=turbulence_model_solver,
            ),
        ],
        outputs=[volume_outputs, iso_surface],
    )

case = project.run_case(params=params, name="DDES HLPW4 from Python")
