BET Disk

Contents

BET Disk#

This example script demonstrates setting up and running a steady-state simulation involving a Blade Element Theory (BET) disk using the Flow360 Python API. It covers loading rotor geometry and aerodynamic data from external files, configuring simulation parameters, submitting the case, retrieving results such as forces and radial distributions, performing unit conversions, and generating a visualization report.

  1import os
  2
  3from pylab import show
  4
  5import flow360 as fl
  6from flow360.examples import BETExampleData
  7from flow360.plugins.report.report import ReportTemplate
  8from flow360.plugins.report.report_items import (
  9    Chart3D,
 10    FrontCamera,
 11    Inputs,
 12    Settings,
 13    Summary,
 14)
 15from flow360.version import __solver_version__
 16
 17BETExampleData.get_files()
 18
 19project = fl.Project.from_volume_mesh(
 20    BETExampleData.mesh_filename,
 21    name="BET Disk results from Python",
 22    length_unit="inch",
 23)
 24
 25vm = project.volume_mesh
 26
 27bet = fl.BETDisk.from_file(BETExampleData.extra["disk0"])
 28
 29with fl.SI_unit_system:
 30    params = fl.SimulationParams(
 31        reference_geometry=fl.ReferenceGeometry(
 32            area=16286.016316209487 * fl.u.inch**2,
 33            moment_center=[450, 0, 0] * fl.u.inch,
 34            moment_length=[72, 1200, 1200] * fl.u.inch,
 35        ),
 36        operating_condition=fl.AerospaceCondition.from_mach(mach=0.04),
 37        time_stepping=fl.Steady(),
 38        models=[
 39            fl.Fluid(
 40                navier_stokes_solver=fl.NavierStokesSolver(
 41                    absolute_tolerance=1e-11,
 42                    linear_solver=fl.LinearSolver(max_iterations=35),
 43                    kappa_MUSCL=0.33,
 44                ),
 45                turbulence_model_solver=fl.SpalartAllmaras(
 46                    absolute_tolerance=1e-10,
 47                    linear_solver=fl.LinearSolver(max_iterations=25),
 48                    update_jacobian_frequency=2,
 49                    equation_evaluation_frequency=1,
 50                ),
 51            ),
 52            bet,
 53            fl.Wall(surfaces=vm["fluid/body"]),
 54            fl.Freestream(surfaces=vm["fluid/farfield"]),
 55        ],
 56        outputs=[
 57            fl.SliceOutput(
 58                slices=[fl.Slice(name="slice_x", normal=(1, 0, 0), origin=(0, 0, 0))],
 59                output_fields=["betMetrics"],
 60            )
 61        ],
 62    )
 63
 64case = project.run_case(params, "BET Disk case from Python")
 65
 66
 67case.wait()
 68
 69results = case.results
 70bet_forces_non_dim = results.bet_forces.as_dataframe()
 71print(results.bet_forces)
 72
 73# convert results to SI system:
 74results.bet_forces.to_base("SI")
 75bet_forces_si = results.bet_forces.as_dataframe()
 76print(results.bet_forces)
 77
 78bet_forces_radial_distribution = results.bet_forces_radial_distribution.as_dataframe()
 79print(results.bet_forces_radial_distribution)
 80
 81bet_forces_radial_distribution.plot(
 82    x="Disk0_All_Radius",
 83    y=["Disk0_Blade0_All_ThrustCoeff", "Disk0_Blade0_All_TorqueCoeff"],
 84    xlim=(0, 150),
 85    xlabel="Radius",
 86    figsize=(10, 7),
 87    title="BET Disk radial distribution",
 88)
 89show()
 90
 91# download resuts:
 92results.set_destination(use_case_name=True)
 93results.download(bet_forces=True, bet_forces_radial_distribution=True, overwrite=True)
 94
 95# save converted results to a new CSV file:
 96results.bet_forces.to_file(os.path.join(case.name, "bet_forces_in_SI.csv"))
 97
 98cases = [case]
 99
100front_camera_slice = FrontCamera(dimension=350, dimension_dir="height")
101
102bet_slice_screenshot = Chart3D(
103    section_title="BET effective AoA",
104    items_in_row=2,
105    force_new_page=True,
106    show="slices",
107    include=["slice_x"],
108    field="betMetrics_AlphaDegrees",
109    limits=(-18, 0),
110    camera=front_camera_slice,
111    fig_name="slice_x",
112)
113
114report = ReportTemplate(
115    title="BET results screenshots",
116    items=[Summary(), Inputs(), bet_slice_screenshot],
117    settings=Settings(dpi=150),
118)
119
120report = report.create_in_cloud("BET, dpi=default", cases, solver_version=__solver_version__)
121
122report.wait()
123report.download("report.pdf")

Notes#

  • Rotor definition and aerodynamic coefficients are loaded using fl.BETDisk.from_file.

  • The betMetrics output field allows visualization of BET-specific quantities like effective angle of attack on slices.

  • Results objects like results.bet_forces and results.bet_forces_radial_distribution provide access to integrated and distributed BET performance data, supporting unit conversion via .to_base().