Please run the code cell below to correctly initialize the notebook#
If a bug is found an issue can be created on the Github page
!pip install tuduam
!git clone https://github.com/saullocastro/tuduam.git
# If the following error occurs "fatal: destination path 'tuduam' already exists and is not an empty directory." please continue as your environment is already set up correctly
Requirement already satisfied: tuduam in c:\users\damie\anaconda3\envs\tuduam_notebook\lib\site-packages (2024.15)
Requirement already satisfied: numpy in c:\users\damie\anaconda3\envs\tuduam_notebook\lib\site-packages (from tuduam) (1.26.4)
Requirement already satisfied: scipy in c:\users\damie\anaconda3\envs\tuduam_notebook\lib\site-packages (from tuduam) (1.12.0)
fatal: destination path 'tuduam' already exists and is not an empty directory.
Structural analysis of a wing section#
Performing a stress analysis of the complex geometry of the multicell wingbox shown in figure 1 can be complicated and tedious. Additionally, for a preliminary investigation often speed and simplicity are of greater importance, on the other hand a final solution must be as exact as circumstances allow. In order to meet these standard we idealize the wingbox into a simpler mechanical model which under given loading conditions behaves in nearly the same manner as the original structure.
Figure 2: Idealization of a wingbox
To get to this mechical model we replace the stringers and spar flanges with concentrations of areas called booms over which the direct stress is constant and which are located along the midline of the skin. Furthermore we assume that all shear stresses are carried by the skin and all direct stresses by these booms. An important consideration here is that the direct stress carrying capacity of the skin may be allowed for by increasing each boom area by an area equivalent to the direct stress carrying capacity of the adjacent skin panels. Using this assumption the shearflow through the skin section between the booms will be constant and will only change when encountering a boom. If you want more details on this idealization please refer to source 1.
The skin addition to the boom areas#
As previously mentioned in order to make the assumption that the skin thickness is zero we first have to incorportate the direct stress carrying capacity of the skin into the booms. To find this addition we can perform a moment equivalence for the two panels shown figure 2. This wil result in the equation 1.
Where \(\sigma_1\), \(\sigma_2\) are the direct stresses at boom 1 and 2, respectively. As seen from equation 1, the idealization is dependent on the loading case as the direct stresses would change for different loadings. However, you might correctly see the chicken and egg problem here. Therefore, we have to rewrite equation 1, we can do this by assuming that the direct stress is mostly related to the lift and therefore using \(\sigma = \frac{M \cdot y}{Ixx}\) we can rewrite equation 1 to equation 2.
Figure 3: Idealization of a panel
Sources#
Megson T. H. G. 1972. Aircraft Structures for Engineering Students. London: Edward Arnold.
Discretizing an airfoil#
In the code cell below we discretize an airfoil using the methods explained above. Here we make use of the repository tuduam
which you have seen before for the preliminary sizing of the propeller. In this notebook however we will be working with the structures
module of the repository. More specifically in the following code cell we’ll utilize discretize_airfoil
. We’ll also plot the result using plotly
. You can see information on each boom by hovering over it with your mouse.
import tuduam as tud
from tuduam.structures.wingbox import discretize_airfoil
import os
import numpy as np
data_path = os.path.join(".",'tuduam/tests/naca45112.txt')
chord = 2 # meters
attr_dict = {
"n_cell":4,
"spar_loc_nondim":[0.3, 0.5, 0.7],
"t_sk_cell":[0.002,0.004,0.004, 0.004],
"area_str":20e-6,
"t_sp":0.008,
"str_cell":[8,8,7,8],
}
#
wingbox_struct = tud.Wingbox(**attr_dict)
wingbox = discretize_airfoil(data_path, chord, wingbox_struct)
wingbox.plot_geometry()
c:\Users\damie\anaconda3\envs\tuduam_notebook\Lib\site-packages\tuduam\structures\wingbox.py:1389: UserWarning:
7 was not an even number and will be floored for conservative reasons
c:\Users\damie\anaconda3\envs\tuduam_notebook\Lib\site-packages\tuduam\structures\wingbox.py:635: UserWarning:
Negative boom areas encountered this is currently a bug, temporary fix takes the absolute value
Direct Stress Analysis#
Direct stress in the cross section of a wingbox are caused by the bending moments caused by the lift and drag. However because the lift forces are significantly larger than the drag forces involved we have chosen to for now ignore the stresses caused by the drag in our model. Additionally, we can generally say the contribution \(I_{xy}\) of neglible hence it also left out. In future works this could also be taken into account however. Using these assume leaves us with equation 3.
Getting the values of \(I_{xx}\) is very much so simplified due to the definition of our booms. It can simply be found by using equation 4.
It is then straightforward to get the stress at each boom. See the code cell below. More information on each boom can be seen by hovering over the boom. In this case color
is a reference to the stress level at that boom.
import rich
wingbox.stress_analysis(4e3, 2e3, 8e3, 38e3, 0.3, 24e9)
wingbox.plot_direct_stresses()
print("\n \n")
rich.print(f"Maximum stress is {max([i.sigma for i in wingbox.boom_dict.values()])/1e6} MPa")
rich.print(f"$Ixx = {wingbox.Ixx*1e12} mm^4")
Maximum stress is 76.52231802066308 MPa
$Ixx = 157000455.47923973 mm^4
<Figure size 1000x100 with 0 Axes>
Shear Stress analysis#
The direct stresses were straight forward however computing the shear stresses is quite more involved. As mentioned earlier, the shear flow over a panel is constant and only jumps at the one of the booms. When we have an open sections this gives us an easy point to start from as we know that at the outer edge of the structure the shear flow has to be zero. However, a wingbox is a closed structure so we have to cut the structure in each cell to give us a starting point. This is as shown in figure 3 indicated by the two small parrallel lines.
Figure 4: Starting point of the wingbox analysis
However, these cut’s have to be “mended”, we do this by applying a complementary shear flow in each cell. We can solve for these complementary shear flows by assuming no warping will occur and hence the amount of twist per unit length should be the same in each cell. This would give us n + 1 unknowns however with n equations. Thus, the final equation can be found from moment equivalence of all the shear flows and the internal shear itself. A complete description of this process is described in source 1 which has been previously shown. Now let us apply it. See the code cell below.
import rich
import plotly.graph_objs as go
wingbox.stress_analysis(4e3, 2e3, 8e3, 38e3, 0.3, 24e9)
wingbox.plot_shear_stress()
print("\n \n")
rich.print(f"Maximum shear stress is {max([i.tau for i in wingbox.panel_dict.values()])/1e6} MPa")
Maximum shear stress is 1.6695574128918829 MPa
Visualizing the direction of the shear stresses#
In the next code cell we’ll also visualize the direction of all the shear stresses in the wingbox.
wingbox.plot_quiver_shear_stress(scale= 0.035, arrow_scale= 0.4)