WISDEM: rotor blade strains and fatigue calculations

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.

  1. 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?

  1. 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.

Hi Henny,

Can you explain a little more about your calculations and concern over the units? To me, I see standard beam bending stress-strain formulas (M*y/(E * I) and F / (E *A)).

Regarding fatigue, at one point WISDEM included a capability to provide DELs computed externally (from OpenFAST or another aero-elastic tool) and WISDEM would compute a damage constraint. This was difficult to get right and very easy to get wrong, so we have mostly removed it. Instead, that coupling can now happen in the WEIS tool (https://github.com/WISDEM/WEIS/tree/develop) that connects WISDEM & OpenFAST properly.

Best,
Garrett

Hi Garret,

According to the units reported in the inputs lines in the setup part of the class, M is a moment per unit lenght and has dimension of [N], F is a force per unit lenght and has dimension of [N/m], EA has dimension of [N], and EI has dimension of [Nm^2]. This makes the dimension of the terms F / (E *A) and [i]My/(E * I)[/i] equal to [1/m] (for the Moment term I am assuming the dimension of y to be [m], since it is a distance).
Now, the definition of strain is dl/l, that is, a length change divided by a lenght, so it’s dimensionless not [1/m]. Then I wondered whether the strains computed by ComputeStrains formulas are actually strains per unit lenght and must be multiplied by a length to have the actual dl/l value.
Since the quantities defined per unit lenght that I found so far are usually defined along the blade span, I thought that this lenght may be the blade span.

Thank you for the explanation about the fatigue analysis and the suggestion of WEIS.

Best,
Henny

Any update on this topic?
And best wishes of a happy 2022 to all!