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
andresults.bet_forces_radial_distribution
provide access to integrated and distributed BET performance data, supporting unit conversion via.to_base()
.