Heat Transfer#
This script demonstrates the setup and processing of a Conjugate Heat Transfer (CHT) simulation involving both fluid and solid domains using the Flow360 Python API. It outlines the procedure for loading a mesh, defining simulation parameters including fluid and solid models with material properties and heat sources, configuring outputs, running the simulation, and generating a post-processing report with visualizations.
1import flow360 as fl
2from flow360 import u
3from flow360.examples import TutorialCHTSolver
4from flow360.plugins.report.report import ReportTemplate
5from flow360.plugins.report.report_items import (
6 Camera,
7 Chart3D,
8 FrontCamera,
9 Inputs,
10 LeftCamera,
11 Settings,
12 Summary,
13)
14from flow360.version import __solver_version__
15
16TutorialCHTSolver.get_files()
17
18project = fl.Project.from_volume_mesh(
19 TutorialCHTSolver.mesh_filename, name="CHT results from Python"
20)
21
22volume_mesh = project.volume_mesh
23
24with fl.SI_unit_system:
25 params = fl.SimulationParams(
26 reference_geometry=fl.ReferenceGeometry(
27 moment_center=[0, 0, 0] * fl.u.m,
28 moment_length=[1, 1, 1] * fl.u.m,
29 area=1 * fl.u.m**2,
30 ),
31 operating_condition=fl.AerospaceCondition.from_mach(mach=0.1),
32 time_stepping=fl.Steady(
33 max_steps=10000, CFL=fl.RampCFL(initial=1, final=100, ramp_steps=1000)
34 ),
35 models=[
36 fl.Fluid(
37 navier_stokes_solver=fl.NavierStokesSolver(
38 absolute_tolerance=1e-9,
39 linear_solver=fl.LinearSolver(max_iterations=35),
40 order_of_accuracy=2,
41 kappa_MUSCL=-1,
42 ),
43 turbulence_model_solver=fl.SpalartAllmaras(
44 absolute_tolerance=1e-8,
45 linear_solver=fl.LinearSolver(max_iterations=25),
46 equation_evaluation_frequency=4,
47 order_of_accuracy=2,
48 ),
49 ),
50 fl.Solid(
51 entities=volume_mesh["solid"],
52 heat_equation_solver=fl.HeatEquationSolver(
53 absolute_tolerance=1e-11,
54 linear_solver=fl.LinearSolver(
55 max_iterations=25,
56 absolute_tolerance=1e-12,
57 ),
58 equation_evaluation_frequency=10,
59 ),
60 material=fl.SolidMaterial(
61 name="copper",
62 thermal_conductivity=398 * fl.u.W / (fl.u.m * fl.u.K),
63 ),
64 volumetric_heat_source=5e3 * fl.u.W / (0.01257 * fl.u.m**3),
65 ),
66 fl.Wall(
67 surfaces=volume_mesh["fluid/centerbody"],
68 ),
69 fl.Freestream(
70 surfaces=volume_mesh["fluid/farfield"],
71 ),
72 fl.Wall(
73 surfaces=volume_mesh["solid/adiabatic"],
74 heat_spec=fl.HeatFlux(0 * fl.u.W / fl.u.m**2),
75 ),
76 ],
77 outputs=[
78 fl.VolumeOutput(
79 output_format="both",
80 output_fields=[
81 "primitiveVars",
82 "T",
83 "Cp",
84 "Mach",
85 ],
86 ),
87 fl.SurfaceOutput(
88 surfaces=volume_mesh["*"],
89 output_format="both",
90 output_fields=["primitiveVars", "T", "Cp", "Cf", "CfVec"],
91 ),
92 fl.SliceOutput(
93 entities=[
94 fl.Slice(
95 name="slice_x",
96 normal=(1, 0, 0),
97 origin=(0.35, 0, 0),
98 ),
99 fl.Slice(
100 name="slice_y",
101 normal=(0, 1, 0),
102 origin=(0, 0, 0),
103 ),
104 ],
105 output_fields=["T", "Mach"],
106 ),
107 ],
108 )
109
110case = project.run_case(params=params, name="CHT case from Python")
111
112case.wait()
113
114results = case.results
115
116surface_heat_transfer = results.surface_heat_transfer.as_dataframe()
117print(surface_heat_transfer)
118
119cases = [case]
120
121exclude = ["fluid/farfield", "solid/interface_fluid", "solid/adiabatic"]
122
123front_camera_slice = FrontCamera(dimension=1, dimension_dir="width")
124side_camera_slice = LeftCamera(pan_target=(0.35, 0, 0), dimension=2, dimension_dir="width")
125front_right_top_camera = Camera(
126 position=(-1, -1, 1), look_at=(0.35, 0, 0), dimension=1, dimension_dir="width"
127)
128
129x_slice_screenshot = Chart3D(
130 section_title="Slice temperature at x=0.35",
131 items_in_row=2,
132 force_new_page=True,
133 show="slices",
134 include=["slice_x"],
135 field="T",
136 limits=(285 * u.K, 395 * u.K),
137 camera=front_camera_slice,
138 fig_name="slice_x",
139)
140
141y_slice_screenshot = Chart3D(
142 section_title="Slice temperature at y=0",
143 items_in_row=2,
144 force_new_page=True,
145 show="slices",
146 include=["slice_y"],
147 field="T",
148 limits=(285 * u.K, 395 * u.K),
149 camera=side_camera_slice,
150 fig_name="slice_y",
151)
152
153surface_screenshot = Chart3D(
154 section_title="Surface temperature",
155 items_in_row=2,
156 force_new_page=True,
157 show="boundaries",
158 field="T",
159 limits=(285 * u.K, 395 * u.K),
160 exclude=exclude,
161 camera=front_right_top_camera,
162)
163
164report = ReportTemplate(
165 title="CHT results screenshots",
166 items=[Summary(), Inputs(), x_slice_screenshot, y_slice_screenshot, surface_screenshot],
167 settings=Settings(dpi=150),
168)
169
170report = report.create_in_cloud(
171 "CHT, dpi=default",
172 cases,
173 solver_version=__solver_version__,
174)
175
176report.wait()
177report.download("report.pdf")
Notes#
Conjugate Heat Transfer is enabled by defining a
fl.Solid
model within themodels
list ofSimulationParams
.Solid material properties, such as
thermal_conductivity
, and internal heat generation, likevolumetric_heat_source
, are specified within thefl.Solid
model configuration.Specific thermal boundary conditions, such as adiabatic walls, are applied using the
heat_spec
parameter within thefl.Wall
model, utilizing conditions likefl.HeatFlux
.