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