Hello,
I’d like to have two points clarified about the code in rotor_structure.py (WISDEM version 3.2.0): the first point concerns the computation of blade strains, and the second the computation of blade fatigue damage.
- below are excerpts of the ExplicitComponent ComputeStrains relevant to my question:
def setup(self):
self.add_input("EA", val=np.zeros(n_span), units="N", desc="axial stiffness")
self.add_input(
"EI11",
val=np.zeros(n_span),
units="N*m**2",
desc="stiffness w.r.t principal axis 1",
)
...
self.add_input(
"M1",
val=np.zeros(n_span),
units="N*m/m",
desc="distribution along blade span of bending moment w.r.t principal axis 1",
)
...
self.add_input(
"F3",
val=np.zeros(n_span),
units="N/m",
desc="edgewise bending moment along blade span",
)
self.add_input(
"xu_strain_spar",
val=np.zeros(n_span),
desc="x-position of midpoint of spar cap on upper surface for strain calculation",
)
self.add_input(
"xl_strain_spar",
val=np.zeros(n_span),
desc="x-position of midpoint of spar cap on lower surface for strain calculation",
)
self.add_input(
"yu_strain_spar",
val=np.zeros(n_span),
desc="y-position of midpoint of spar cap on upper surface for strain calculation",
)
self.add_input(
"yl_strain_spar",
val=np.zeros(n_span),
desc="y-position of midpoint of spar cap on lower surface for strain calculation",
)
...
def strain(xu, yu, xl, yl):
# use profile c.s. to use Hansen's notation
xuu, yuu = yu, xu
xll, yll = yl, xl
...
# compute strain
x, y = rotate(xuu, yuu)
strainU = M1 / EI11 * y - M2 / EI22 * x - F3 / EA
x, y = rotate(xll, yll)
strainL = M1 / EI11 * y - M2 / EI22 * x - F3 / EA
return strainU, strainL
# ----- strains along the mid-line of the spar caps and at the center of the two trailing edge reinforcement thickness (not the trailing edge) -----
strainU_spar, strainL_spar = strain(xu_strain_spar, yu_strain_spar, xl_strain_spar, yl_strain_spar)
strainU_te, strainL_te = strain(xu_strain_te, yu_strain_te, xl_strain_te, yl_strain_te)
outputs["strainU_spar"] = strainU_spar
outputs["strainL_spar"] = strainL_spar
outputs["strainU_te"] = strainU_te
outputs["strainL_te"] = strainL_te
The three terms in the RHS of the equations for strainL and strainU are not dimensionless, but seem to have dimensions of m^-1 (assuming that x and y have dimension of length), so strainU and strainL are strains per unit lenght. Then, have I to multiply strainU_spar, strainL_spar, strainU_te, strainL_te by the blade span to get the final strain values?
- I have read a paper presented in 2020 whose authors mention WISDEM evaluation of blade fatigue failure, and use it as a constraint parameter for their optimizations. In rotor_structure.py of WISDEM 3.2.0 there is indeed an ExplicitComponent class named BladeFatigue, but is entirely commented out, so unavailable. Is there a different way to do blade fatigue analysis in WISDEM 3.2.0, or this feature has been removed?
Thank you for your time and help.