TA13: Thermal Stresses in a Long Cylinder (Under Revision)

1. PROBLEM DESCRIPTION

In this problem, inner and outer surface temperatures of a cylinder is given to make thermal and static analysis. With defined properties and specified temperatures, it is aimed to find the temperature distribution through the wall thickness and stresses at the inner and outer surfaces of the cylinder. The illustration of the problem and given values can be seen in the figure and table below:

../_images/ThermalStressesinaLongCylinder1.png
Given Properties and Loading

Material Properties

Geometric Properties

Loading

Thermal conductivity k = 8.333e-4 Btu/s-in-°F

Inner radius r_in = 0.1875 in

Inner temperature T_in = -1°F

Thermal expansion α = 1.435e-5 1/°F

Outer radius r_out = 0.625 in

Outer temperature T_out = 0°F

Young’s modulus E = 30e6 psi

Poissons ratio ν = 0.3

Note

Axial length is arbitrary and it is chosen as 0.2 inches for the problem.

1. MODEL SETUP AND SOLUTION

The following sections describe the setup and solution steps for this tutorial:

2.1. Preparation

2.2. General Settings

2.3. Geometry/Mesh

2.4. Material

2.5. Boundary Conditions

2.6. Solution

2.7. Processing

2.8. Post-Processing

3. Summary

4. Source Code

2.1. Preparation

To run this tutorial;

  1. First of all, TwinAPI is opened and a new project is created as described in the previous tutorials.

  2. Then we import our libraries from the Simularge Libraries. In this project; Solver, Mesher, and Material libraries will be needed. They can be added as before:

1from TwinAPI.SimulationTools import Solver
2from TwinAPI.SimulationTools import Mesher
3from TwinAPI.MaterialLibrary import MaterialManager
4from TwinAPI.MaterialLibrary.Units import units

2.2. General Settings

After the necessary libraries are imported into the code;

  1. The analysis is defined and a name is given. We name our analysis as “ThermalStress”.

  2. Then, solver type is chosen. In this problem, Calculix is preferred for the analysis as a solver.

1ThermalStress = Solver.Analysis(Verbose=True)
2ThermalStress.SetSolver('Calculix')

2.3. Geometry/Mesh

To create a cylinder, one can use the Mesher Library or upload a .step file of their own CAD geometry. It is more feasible and easier to create 2D pipe and then extrude it to make 3D cylinder geometry. For this purpose, we will use Pipe2D and node2Nurbs in Mesher Library to draw a cylinder.

Then, the geometry and mesh of the cylinder can be created by giving the values in the problem.

 1r_i = 0.1875
 2r_o = 0.625
 3n_hoop = 250
 4n_rad = 50
 5typeHoop = "uniform"
 6typeRad = "uniform"
 7dirHoop = ""
 8dirRad = ""
 9angle = 360
10
11pipe=Mesher.Pipe2D(r_i, r_o, n_hoop, typeHoop, dirHoop, angle, n_rad, typeRad, dirRad)
12Path=Mesher.node2Nurbs([[0,0,0],[0,0,0.1],[0,0,0.2]],2,3,4)
13cyl=Mesher.extrusionPath(pipe,Path)

Note

If there are unclear parts in creating geometry, you can check the Mesher section under the Simulation Tools.

Thus, the cylinder is created with a name “cyl” using 2D pipe mesher and extrusion path from the given inputs.

Note

The geometry can be also created by importing a CAD file as mentioned. Its code could be written like this after uploading a “cylinder.step” file to the system:

1Plate = Mesher.MeshFromCad('cylinder.step',20000,1,1,SurfaceExtract=True)

The created geometry can be viewed to check before moving to the analysis by clicking the Preview button.

../_images/ThermalStressesinaLongCylinder2.png ../_images/ThermalStressesinaLongCylinder3.png

2.4. Material

Material properties are the other type of parameters affecting results. Using the Material Manager library, a type of the material can be specified.

In this problem, properties of the material are predefined. So, the values in the created material class are written with proper units.

1material = MaterialManager.Material("TwinAPI","metal")
2
3material.SetMechanicData("youngsModulus",3e7,units["psi"])
4material.SetMechanicData("poissonsRatio",0.3)
5material.SetThermalData("conductivity",8.333e-4*3600*12,units["btu/hrftf"])
6material.SetThermalData("expansionCoefficient",1.435e-5,units["1/f"])

After defining the material with needed properties for the problem, the geometry and material are combined for the analysis. Then, the analysis is assembled with the defined setup.

1ThermalStress.AddPart(cyl,material)
2ThermalStress.Assemble()

2.5. Boundary Conditions

After adding material and geometry to the analysis, we are ready to set the boundary conditions.

  1. First of all, we need to call a method to create a step. Step1’s name can be change.

1Step1=Solver.CreateStep("new")
  1. Then, the time dependence of the problem should be stated. We seek the values at steady-state. Therefore, it is stated as:

1Step1.Time("SteadyState")

Note

If a problem is transient, time dependency of the analysis can be written in a similar manner via the code below. For more detail, you can check the Solver under the Simulation Tools section.

1Step1.Time("Transient",[0,10,0.1])
  1. After that, boundary conditions of the problem should be defined. In our problem, we use inner and outer temperatures of the cylinder as boundary conditions. So, by writing convenient values with proper units at inner and outer surfaces, boundary conditions are defined. Also, the cylinder is fixed in the Z direction to restrict its movement in axial direction to see stresses on the geometry.

1T_in = -1
2T_out = 0
3
4Step1.AddBC("Temperature",[cyl.inner],[T_in],"F")
5Step1.AddBC("Temperature",[cyl.outer],[T_out],"F")
6Step1.AddBC("Fix",[cyl.All],[("Z",0)],"")

Note

Selecting the appropriate side of the plate geometry while giving the boundary values is important. For the names of surfaces, mesher section can be inspected under the Simulation Tools.

2.6. Solution

After defining our boundary conditions, we need to combine our defined domain and the steps containing boundary conditions. To complete this task;

1ThermalStress.Build([Step1])

Now, the problem is ready to be solved.

1ThermalStress.Solve()

2.7. Processing

  1. Click Run Button and gears will rotate on the right side while problem is being solved. If you have any errors in the code, it will be shown under the Error tab of the Model Output section. By correcting the mistakes, you can get the result.

../_images/ThermalStressesinaLongCylinder4.png

2.8. Post-Processing

  1. After Problem solved, we can see the results by clicking the Result button.

../_images/ThermalStressesinaLongCylinder5.png
  1. If we want to see detailed results about the problem, Output Tab shows us the results that we desire to see.

To see specific outputs of the analysis, we can take desired results at desired locations. By printing selected results, they can be viewed in the output tab.

 1Temp1=ThermalStress.Result(Variable="Temperature", Loc=[r_i,0,0])
 2Temp2=ThermalStress.Result(Variable="Temperature", Loc=[0.2788,0,0])
 3Temp3=ThermalStress.Result(Variable="Temperature", Loc=[r_o,0,0])
 4StressAxial1=ThermalStress.Result(Variable="Axial Stress", Loc=[r_i,0,0])
 5StressAxial2=ThermalStress.Result(Variable="Axial Stress", Loc=[r_o,0,0])
 6StressHoop1=ThermalStress.Result(Variable="Hoop Stress", Loc=[r_i,0,0])
 7StressHoop2=ThermalStress.Result(Variable="Hoop Stress", Loc=[r_o,0,0])
 8
 9print("T @r = r_in:",max(Temp1))
10print("T @r = 0.2788 in:",max(Temp2))
11print("T @r = r_out:",max(Temp3))
12print("Axial Stress @r = r_in:",max(StressAxial1))
13print("Tangential Stress @r = r_in:",max(StressHoop1))
14print("Axial Stress @r = r_out:",max(StressAxial2))
15print("Tangential Stress @r = r_out:",max(StressHoop2))
../_images/ThermalStressesinaLongCylinder6.png

Log tab tells us respectively what happened in analysis.

Error tab shows us if there is an error in script, It tells us what the error is and where it is.

Files tab can upload the files to be imported from the Upload command and check them from Files.

Graph tab shows us graphical analysis results if it is indicated in the code.

3. SUMMARY

In this tutorial, we learned how to set up cylindrical geometry and solve a problem involving fixed boundary temperatures to find temperature and stress distributions by using TwinAPI. We also learned how to perform postprocessing in an engineering manner.

Table given below shows the comparasion of Ansys Mechanical and TwinAPI results.

Comparasion of Results

Analysed Model

Target

ANSYS

TwinAPI

ANSYS Error (%):

TwinAPI Error (%):

Temperature at r = r_in (°F)

-1

-1

-1

0.00

0.00

Temperature at r = 0.2788 in (°F)

-0.67037

-0.67052

-0.6703

0.022

0.010

Temperature at r = r_out (°F)

0

0

0

0.00

0.00

Axial stress at r = r_in (psi)

420.42

416.06

419.16

1.037

0.3

Tangential stress at r = r_in (psi)

420.42

405.31

419.59

3.594

0.197

Axial stress at r = r_out (psi)

-194.58

-195.06

-193.54

0.247

0.534

Tangential stress at r = r_out (psi)

-194.58

-195.01

-193.74

0.221

0.432

4. SOURCE CODE

 1from TwinAPI.SimulationTools import Solver
 2from TwinAPI.SimulationTools import Mesher
 3from TwinAPI.MaterialLibrary import MaterialManager
 4from TwinAPI.MaterialLibrary.Units import units
 5
 6ThermalStress = Solver.Analysis(Verbose=True)
 7ThermalStress.SetSolver('Calculix')
 8
 9r_i = 0.1875
10r_o = 0.625
11n_hoop = 250
12n_rad = 50
13typeHoop = "uniform"
14typeRad = "uniform"
15dirHoop = ""
16dirRad = ""
17angle = 360
18
19pipe=Mesher.Pipe2D(r_i, r_o, n_hoop, typeHoop, dirHoop, angle, n_rad, typeRad, dirRad)
20Path=Mesher.node2Nurbs([[0,0,0],[0,0,0.1],[0,0,0.2]],2,3,4)
21cyl=Mesher.extrusionPath(pipe,Path)
22
23material = MaterialManager.Material("TwinAPI","metal")
24material.SetMechanicData("youngsModulus",3e7,units["psi"])
25material.SetMechanicData("poissonsRatio",0.3)
26material.SetThermalData("conductivity",8.333e-4*3600*12,units["btu/hrftf"])
27material.SetThermalData("expansionCoefficient",1.435e-5,units["1/f"])
28
29ThermalStress.AddPart(cyl,material)
30ThermalStress.Assemble()
31
32Step1=Solver.CreateStep("new")
33Step1.Time("SteadyState")
34
35T_in = -1
36T_out = 0
37
38Step1.AddBC("Temperature",[cyl.inner],[T_in],"F")
39Step1.AddBC("Temperature",[cyl.outer],[T_out],"F")
40Step1.AddBC("Fix",[cyl.All],[("Z",0)],"")
41
42ThermalStress.Build([Step1])
43ThermalStress.Solve()
44
45Temp1=ThermalStress.Result(Variable="Temperature", Loc=[r_i,0,0])
46Temp2=ThermalStress.Result(Variable="Temperature", Loc=[0.2788,0,0])
47Temp3=ThermalStress.Result(Variable="Temperature", Loc=[r_o,0,0])
48StressAxial1=ThermalStress.Result(Variable="Axial Stress", Loc=[r_i,0,0])
49StressHoop1=ThermalStress.Result(Variable="Hoop Stress", Loc=[r_i,0,0])
50StressAxial2=ThermalStress.Result(Variable="Axial Stress", Loc=[r_o,0,0])
51StressHoop2=ThermalStress.Result(Variable="Hoop Stress", Loc=[r_o,0,0])
52
53print("T @r = r_in:",max(Temp1))
54print("T @r = 0.2788 in:",max(Temp2))
55print("T @r = r_out:",max(Temp3))
56print("Axial Stress @r = r_in:",max(StressAxial1))
57print("Tangential Stress @r = r_in:",max(StressHoop1))
58print("Axial Stress @r = r_out:",max(StressAxial2))
59print("Tangential Stress @r = r_out:",max(StressHoop2))

Keywords: Heat Transfer, Thermal Stress, Temperature Distribution, Cylinder

Problem Reference: S. Timoshenko, Strength of Material, Part II, Elementary Theory and Problems, 3rd Edition, D. Van Nostrand Co, Inc., New York, NY, 1956, pg. 234, problem 1.

Author: Berkin Aral