Heat Transfer

Contents

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 the models list of SimulationParams.

  • Solid material properties, such as thermal_conductivity, and internal heat generation, like volumetric_heat_source, are specified within the fl.Solid model configuration.

  • Specific thermal boundary conditions, such as adiabatic walls, are applied using the heat_spec parameter within the fl.Wall model, utilizing conditions like fl.HeatFlux.