Validation Case: Heat Transfer in a Composite Wall
Problem statement
This thermal simulation is part of the series of validation cases performed using OnScale Solve. In this case, a composite wall consisting of two layers (an insulating brick on the outside and a fire brick on the inside) surrounds a furnace. Thermal convection boundary conditions are used on the inside of the fire brick wall and on the outside of the insulating brick wall to represent the transfer of heat from the brick to the air. The predicted temperatures on the outside of the insulating brick, between the insulating brick and fire brick and on the inside of the fire brick from the simulation results are compared against the reference solution given by Kreith’s Principles of Heat transfer [1].
Geometry
The geometry is a 0.03 \times 0.03 m thick composite wall made up of two brick layers of length 0.1 m and 0.2 m respectively as shown in fig. 1. The CAD file for this geometry is available as an Onshape document.
Boundary Conditions
Thermal convection boundary conditions are imposed on the inside of the fire brick wall and on the outside of the insulating brick wall with a convection coefficient and far-field reference temperature of 68~\text{W/(m$^2 \cdot$ C)} and 1700 ºC and 11~\text{W/(m$^2 \cdot$ C)} and 26 ºC respectively.
Material Properties
The thermal conductivity material property is defined for the fire brick and the insulating brick.
Material | Thermal Conductivity [\text{W/(m$^2 \cdot$ C)}] |
---|---|
Fire Brick | 1.38 |
Insulating Brick | 0.17 |
Mesh
OnScale Solve generated a second-order tetrahedral mesh. Five simulations are run with the mesh density ranging from very coarse to very fine.
Mesh density | # of elements | # of dofs |
---|---|---|
very coarse | 652 | 1,368 |
coarse | 2,325 | 4,246 |
medium | 6,077 | 10,392 |
fine | 14,564 | 23,779 |
very fine | 74,108 | 115,495 |
Results
The thermal resistance at each point of the composite wall is given by the following equations.
R_0 = \frac{1}{h_1A}
R_1 = \frac{L_1}{k_1A}
R_2 = \frac{L_2}{k_2A}
R_3 = \frac{1}{h_2A}
Where A is the cross-sectional area of the wall which in this case is constant, L is the length of the brick layers, h is the convection coefficients of the brick materials and k is the thermal conductivity of the brick materials. The total thermal resistance of the composite wall is given by
R_\text{total} = R_0 + R_1 + R_2 + R_3
The heat transfer rate through the composite wall is given by
Q = \frac{T_\text{in} - T_\text{out}}{R_\text{total}}
Calculating the heat transfer rate through the composite wall allows the calculation of the temperature at each point of the wall using the following set of equations. The points at which the temperatures are measured are as shown in fig. 1.
T_1 = T_\text{in} - \frac{Q}{h_1A}
T_2 = T_1 - \frac{QL_1}{k_1A}
T_3 = T_2 - \frac{QL_2}{k_2A}
The calculated temperatures from the reference solution are found in the table below.
Ref Name. | Ref Value. [ºC] |
---|---|
T_1 | 1670.650574022314004 |
T_2 | 1381.409854242221172 |
T_3 | 207.4328151347856419 |
The absolute difference of the numerical solution with respect to the reference solution for all five mesh densities are in the table below. Note that the numerical solution can recover the reference solution (minus numerical accuracy) with any mesh size or element order. Note that Onscale Solve automatically switched from a direct solver to an iterative one in the very fine mesh case to optimize memory usage. This explains the slighly larger absolute differences seen in the last row of the table.
Mesh density | # of dofs | Abs Diff. T_1 [ºC] | Abs Diff. T_2 [ºC] | Abs Diff. T_3 [ºC] |
---|---|---|---|---|
very coarse | 4,413 | 1.7 \times 10^{-5} | 1.7 \times 10^{-5} | 8.1 \times 10^{-12} |
coarse | 4,246 | 1.7 \times 10^{-5} | 1.7 \times 10^{-5} | 8.6 \times 10^{-12} |
medium | 10,392 | 1.7 \times 10^{-5} | 1.7 \times 10^{-5} | 7.4 \times 10^{-12} |
fine | 23,779 | 1.7 \times 10^{-5} | 1.7 \times 10^{-5} | 1.9 \times 10^{-12} |
very fine | 115,495 | 2.1 \times 10^{-4} | 3.1 \times 10^{-3} | 6.8 \times 10^{-4} |
Simulation Definition
The complete simulation definition is given below. The metadata tags for parts and faces correspond to the version of the CAD file that was imported from Onshape.
""" Auto-generated simulation code. """
import onscale as on
with
on.Simulation('Simulation', 'Generated in SOLVE', version = '0.8.1') as sim:
# General simulation settings
on.settings.EnabledPhysics(["thermal"]) on.settings.AmbientTemperature(20)
# Define geometry
geometry = on.CadFile('Assembly_1.x_t', unit="m") point = on.Point(0, 0, 0.1) point_2 = on.Point(0, 0, 0.3) point_3 = on.Point(0, 0, 0)
# Define meshing
on.meshes.MeshFile('very_fine_mesh_volume.msh')
# Define material database and materials
materials = on.CloudMaterials('onscale') silicon_nitride = materials['Silicon nitride'] thermal_grease = materials['Thermal grease'] brick = materials['Brick'] brick.alias = 'Fire Brick' brick >> geometry.parts.search('MsybGxB++OGYH9HTZ', field='partIDTag') brick.set('thermal_conductivity_x', 1.38) brick_2 = materials['Brick'] brick_2.alias = 'Insulating Brick' brick_2 >> geometry.parts.search('M2AxZFgsZoSSR12p0', field='partIDTag') brick_2.set('thermal_conductivity_x', 0.17)
# Define and apply loads
convection = on.loads.Convection(68, reference_temp=1700, alias='Convection 1') convection >> geometry.parts.search('MsybGxB++OGYH9HTZ', field='partIDTag').faces.search('JKK', field='faceIDTag') convection_2 = on.loads.Convection(11, reference_temp=26, alias='Convection 2') convection_2 >> geometry.parts.search('M2AxZFgsZoSSR12p0', field='partIDTag').faces.search('JHG', field='faceIDTag')
# Define output variables
field_sensor = on.sensors.FieldSensor(data="Temperature", alias='Global Sensor') field_sensor >> geometry probe_sensor = on.sensors.ProbeSensor(data="Temperature", alias='Sensor 1') probe_sensor >> point probe_sensor_2 = on.sensors.ProbeSensor(data="Temperature", alias='Sensor 2') probe_sensor_2 >> point_2 probe_sensor_3 = on.sensors.ProbeSensor(data="Temperature", alias='Sensor Origin') probe_sensor_3 >> point_3
# For OnScale System use only
geometry.set('onshape_workspace_id', "cce9c272aff690265277edb6") geometry.set('onshape_doc_id', "8706a468aad47d1879376f7d") geometry.set('onshape_doc_microversion', "29dded87cc762aed5992d805") geometry.set('onshape_assembly_id', "927d7270428b61643eef5160") geometry.set('onshape_assembly_microversion', "d71efac7979215a4a82622bc")