Beispiel #1
0
    def execute(self):
        # aero/hydro loads
        wind = self.windLoads
        wave = self.waveLoads
        hubHt = self.z[-1]  # top of tower
        betaMain = np.interp(
            hubHt, self.z,
            wind.beta)  # wind coordinate system defined relative to hub height
        windLoads = DirectionVector(
            wind.Px, wind.Py,
            wind.Pz).inertialToWind(betaMain).windToYaw(self.yaw)
        waveLoads = DirectionVector(
            wave.Px, wave.Py,
            wave.Pz).inertialToWind(betaMain).windToYaw(self.yaw)

        self.outloads.Px = np.interp(self.z, wind.z, windLoads.x) + np.interp(
            self.z, wave.z, waveLoads.x)
        self.outloads.Py = np.interp(self.z, wind.z, windLoads.y) + np.interp(
            self.z, wave.z, waveLoads.y)
        self.outloads.Pz = np.interp(self.z, wind.z, windLoads.z) + np.interp(
            self.z, wave.z, waveLoads.z)
        self.outloads.qdyn = np.interp(self.z, wind.z, wind.qdyn) + np.interp(
            self.z, wave.z, wave.qdyn)
        self.outloads.z = self.z
        #The following are redundant, at one point we will consolidate them to something that works for both tower (not using vartrees) and jacket (still using vartrees)
        self.Px = self.outloads.Px
        self.Py = self.outloads.Py
        self.Pz = self.outloads.Pz
        self.qdyn = self.outloads.qdyn
Beispiel #2
0
    def linearize(self, params, unknowns, resids):

        dF = DirectionVector.fromArray(params['F']).hubToYaw(params['tilt'])
        dFx, dFy, dFz = dF.dx, dF.dy, dF.dz

        dtopF_dFx = np.array([dFx['dx'], dFy['dx'], dFz['dx']])
        dtopF_dFy = np.array([dFx['dy'], dFy['dy'], dFz['dy']])
        dtopF_dFz = np.array([dFx['dz'], dFy['dz'], dFz['dz']])
        dtopF_dF = hstack([dtopF_dFx, dtopF_dFy, dtopF_dFz])
        dtopF_w_dm = np.array([0.0, 0.0, -self.g])

        #dtopF = hstack([dtopF_dF, np.zeros((3, 6)), dtopF_w_dm, np.zeros((3, 3))])


        dM = DirectionVector.fromArray(params['M']).hubToYaw(params['tilt'])
        dMx, dMy, dMz = dM.dx, dM.dy, dM.dz
        dMxcross, dMycross, dMzcross = self.save_rhub.cross_deriv(self.saveF, 'dr', 'dF')

        dtopM_dMx = np.array([dMx['dx'], dMy['dx'], dMz['dx']])
        dtopM_dMy = np.array([dMx['dy'], dMy['dy'], dMz['dy']])
        dtopM_dMz = np.array([dMx['dz'], dMy['dz'], dMz['dz']])
        dtopM_dM = hstack([dtopM_dMx, dtopM_dMy, dtopM_dMz])
        dM_dF = np.array([dMxcross['dF'], dMycross['dF'], dMzcross['dF']])

        dtopM_dFx = np.dot(dM_dF, dtopF_dFx)
        dtopM_dFy = np.dot(dM_dF, dtopF_dFy)
        dtopM_dFz = np.dot(dM_dF, dtopF_dFz)
        dtopM_dF = hstack([dtopM_dFx, dtopM_dFy, dtopM_dFz])
        dtopM_dr = np.array([dMxcross['dr'], dMycross['dr'], dMzcross['dr']])

        dMx_w_cross, dMy_w_cross, dMz_w_cross = self.save_rcm.cross_deriv(self.saveF_w, 'dr', 'dF')

        if params['rna_weightM']:
            dtopM_drnacm = np.array([dMx_w_cross['dr'], dMy_w_cross['dr'], dMz_w_cross['dr']])
            dtopM_dF_w = np.array([dMx_w_cross['dF'], dMy_w_cross['dF'], dMz_w_cross['dF']])
        else:
            dtopM_drnacm = np.zeros((3, 3))
            dtopM_dF_w = np.zeros((3, 3))
        dtopM_dm = np.dot(dtopM_dF_w, dtopF_w_dm)

        if params['downwind']:
            dtopM_dr[:, 0] *= -1
            dtopM_drnacm[:, 0] *= -1

        #dtopM = hstack([dtopM_dF, dtopM_dM, dtopM_dr, dtopM_dm, dtopM_drnacm])

        J = {}
        J['top_F', 'F'] = dtopF_dF
        J['top_F', 'M'] = np.zeros((3, 3))
        J['top_F', 'r_hub'] = np.zeros((3, 3))
        J['top_F', 'rna_mass'] = dtopF_w_dm
        J['top_F', 'rna_cm'] = np.zeros((3, 3))

        J['top_M', 'F'] = dtopM_dF
        J['top_M', 'M'] = dtopM_dM
        J['top_M', 'r_hub'] = dtopM_dr
        J['top_M', 'rna_mass'] = dtopM_dm
        J['top_M', 'rna_cm'] = dtopM_drnacm

        return J
Beispiel #3
0
    def provideJ(self):

        dF = DirectionVector.fromArray(self.F).hubToYaw(self.tilt)
        dFx, dFy, dFz = dF.dx, dF.dy, dF.dz

        dtopF_dFx = np.array([dFx['dx'], dFy['dx'], dFz['dx']])
        dtopF_dFy = np.array([dFx['dy'], dFy['dy'], dFz['dy']])
        dtopF_dFz = np.array([dFx['dz'], dFy['dz'], dFz['dz']])
        dtopF_dF = hstack([dtopF_dFx, dtopF_dFy, dtopF_dFz])
        dtopF_w_dm = np.array([0.0, 0.0, -self.g])

        dtopF = hstack(
            [dtopF_dF,
             np.zeros((3, 6)), dtopF_w_dm,
             np.zeros((3, 3))])

        dM = DirectionVector.fromArray(self.M).hubToYaw(self.tilt)
        dMx, dMy, dMz = dM.dx, dM.dy, dM.dz
        dMxcross, dMycross, dMzcross = self.save_rhub.cross_deriv(
            self.saveF, 'dr', 'dF')

        dtopM_dMx = np.array([dMx['dx'], dMy['dx'], dMz['dx']])
        dtopM_dMy = np.array([dMx['dy'], dMy['dy'], dMz['dy']])
        dtopM_dMz = np.array([dMx['dz'], dMy['dz'], dMz['dz']])
        dtopM_dM = hstack([dtopM_dMx, dtopM_dMy, dtopM_dMz])
        dM_dF = np.array([dMxcross['dF'], dMycross['dF'], dMzcross['dF']])

        dtopM_dFx = np.dot(dM_dF, dtopF_dFx)
        dtopM_dFy = np.dot(dM_dF, dtopF_dFy)
        dtopM_dFz = np.dot(dM_dF, dtopF_dFz)
        dtopM_dF = hstack([dtopM_dFx, dtopM_dFy, dtopM_dFz])
        dtopM_dr = np.array([dMxcross['dr'], dMycross['dr'], dMzcross['dr']])

        dMx_w_cross, dMy_w_cross, dMz_w_cross = self.save_rcm.cross_deriv(
            self.saveF_w, 'dr', 'dF')

        if self.rna_weightM:
            dtopM_drnacm = np.array(
                [dMx_w_cross['dr'], dMy_w_cross['dr'], dMz_w_cross['dr']])
            dtopM_dF_w = np.array(
                [dMx_w_cross['dF'], dMy_w_cross['dF'], dMz_w_cross['dF']])
        else:
            dtopM_drnacm = np.zeros((3, 3))
            dtopM_dF_w = np.zeros((3, 3))
        dtopM_dm = np.dot(dtopM_dF_w, dtopF_w_dm)

        if self.downwind:
            dtopM_dr[:, 0] *= -1
            dtopM_drnacm[:, 0] *= -1

        dtopM = hstack([dtopM_dF, dtopM_dM, dtopM_dr, dtopM_dm, dtopM_drnacm])

        J = vstack([dtopF, dtopM])

        return J
Beispiel #4
0
    def provideJ(self):

        dF = DirectionVector.fromArray(self.F).hubToYaw(self.tilt)
        dFx, dFy, dFz = dF.dx, dF.dy, dF.dz

        dtopF_dFx = np.array([dFx['dx'], dFy['dx'], dFz['dx']])
        dtopF_dFy = np.array([dFx['dy'], dFy['dy'], dFz['dy']])
        dtopF_dFz = np.array([dFx['dz'], dFy['dz'], dFz['dz']])
        dtopF_dF = hstack([dtopF_dFx, dtopF_dFy, dtopF_dFz])
        dtopF_w_dm = np.array([0.0, 0.0, -self.g])

        dtopF = hstack([dtopF_dF, np.zeros((3, 6)), dtopF_w_dm, np.zeros((3, 3))])


        dM = DirectionVector.fromArray(self.M).hubToYaw(self.tilt)
        dMx, dMy, dMz = dM.dx, dM.dy, dM.dz
        dMxcross, dMycross, dMzcross = self.save_rhub.cross_deriv(self.saveF, 'dr', 'dF')

        dtopM_dMx = np.array([dMx['dx'], dMy['dx'], dMz['dx']])
        dtopM_dMy = np.array([dMx['dy'], dMy['dy'], dMz['dy']])
        dtopM_dMz = np.array([dMx['dz'], dMy['dz'], dMz['dz']])
        dtopM_dM = hstack([dtopM_dMx, dtopM_dMy, dtopM_dMz])
        dM_dF = np.array([dMxcross['dF'], dMycross['dF'], dMzcross['dF']])

        dtopM_dFx = np.dot(dM_dF, dtopF_dFx)
        dtopM_dFy = np.dot(dM_dF, dtopF_dFy)
        dtopM_dFz = np.dot(dM_dF, dtopF_dFz)
        dtopM_dF = hstack([dtopM_dFx, dtopM_dFy, dtopM_dFz])
        dtopM_dr = np.array([dMxcross['dr'], dMycross['dr'], dMzcross['dr']])

        dMx_w_cross, dMy_w_cross, dMz_w_cross = self.save_rcm.cross_deriv(self.saveF_w, 'dr', 'dF')

        if self.rna_weightM:
            dtopM_drnacm = np.array([dMx_w_cross['dr'], dMy_w_cross['dr'], dMz_w_cross['dr']])
            dtopM_dF_w = np.array([dMx_w_cross['dF'], dMy_w_cross['dF'], dMz_w_cross['dF']])
        else:
            dtopM_drnacm = np.zeros((3, 3))
            dtopM_dF_w = np.zeros((3, 3))
        dtopM_dm = np.dot(dtopM_dF_w, dtopF_w_dm)

        if self.downwind:
            dtopM_dr[:, 0] *= -1
            dtopM_drnacm[:, 0] *= -1

        dtopM = hstack([dtopM_dF, dtopM_dM, dtopM_dr, dtopM_dm, dtopM_drnacm])

        J = vstack([dtopF, dtopM])

        return J
Beispiel #5
0
    def execute(self):

        # coordinates of blade tip in yaw c.s.
        blade_yaw = DirectionVector(self.precurveTip, self.presweepTip, self.Rtip)\
            .bladeToAzimuth(self.precone).azimuthToHub(180.0).hubToYaw(self.tilt)

        # find corresponding radius of tower
        ztower = (self.towerHt + self.hub_tt[2] +
                  blade_yaw.z) / self.towerHt  # nondimensional location
        # rtower = np.interp(ztower, self.tower_z, self.tower_d) / 2.0
        dtower, ddtower_dztower, ddtower_dtowerz, ddtower_dtowerd = interp_with_deriv(
            ztower, self.tower_z, self.Twrouts.TwrObj.D)
        rtower = dtower / 2.0
        self.drtower_dztower = ddtower_dztower / 2.0
        self.drtower_dtowerz = ddtower_dtowerz / 2.0
        self.drtower_dtowerd = ddtower_dtowerd / 2.0

        # max deflection before strike
        if self.precone >= 0:  # upwind
            self.max_tip_deflection = -self.hub_tt[0] - blade_yaw.x - rtower
        else:
            self.max_tip_deflection = -self.hub_tt[0] + blade_yaw.x - rtower
            # TODO: need to redo gradients for this case.

        # ground clearance
        self.ground_clearance = self.towerHt + self.hub_tt[2] + blade_yaw.z

        # save for derivs
        self.blade_yaw = blade_yaw
Beispiel #6
0
    def execute(self):

        F = self.F
        M = self.M

        F = DirectionVector.fromArray(F).hubToYaw(self.tilt)
        M = DirectionVector.fromArray(M).hubToYaw(self.tilt)

        # change x-direction if downwind
        r_hub = np.copy(self.r_hub)
        rna_cm = np.copy(self.rna_cm)
        if self.downwind:
            r_hub[0] *= -1
            rna_cm[0] *= -1
        r_hub = DirectionVector.fromArray(r_hub)
        rna_cm = DirectionVector.fromArray(rna_cm)
        self.save_rhub = r_hub
        self.save_rcm = rna_cm

        # aerodynamic moments
        M = M + r_hub.cross(F)
        self.saveF = F


        # add weight loads
        F_w = DirectionVector(0.0, 0.0, -self.m_RNA*self.g)
        M_w = rna_cm.cross(F_w)
        self.saveF_w = F_w

        Fout = F + F_w

        if self.rna_weightM:
            Mout = M + M_w
        else:
            Mout = M
            #REMOVE WEIGHT EFFECT TO ACCOUNT FOR P-Delta Effect
            print "!!!! No weight effect on rotor moments -TowerSE  !!!!"

        # put back in array
        self.top_F = np.array([Fout.x, Fout.y, Fout.z])
        self.top_M = np.array([Mout.x, Mout.y, Mout.z])
Beispiel #7
0
    def solve_nonlinear(self, params, unknowns, resids):

        F = params['F']
        M = params['M']

        F = DirectionVector.fromArray(F).hubToYaw(params['tilt'])
        M = DirectionVector.fromArray(M).hubToYaw(params['tilt'])

        # change x-direction if downwind
        r_hub = np.copy(params['r_hub'])
        rna_cm = np.copy(params['rna_cm'])
        if params['downwind']:
            r_hub[0] *= -1
            rna_cm[0] *= -1
        r_hub = DirectionVector.fromArray(r_hub)
        rna_cm = DirectionVector.fromArray(rna_cm)
        self.save_rhub = r_hub
        self.save_rcm = rna_cm

        # aerodynamic moments
        M = M + r_hub.cross(F)
        self.saveF = F


        # add weight loads
        F_w = DirectionVector(0.0, 0.0, -params['rna_mass']*gravity)
        M_w = rna_cm.cross(F_w)
        self.saveF_w = F_w

        Fout = F + F_w

        if params['rna_weightM']:
            Mout = M + M_w
        else:
            Mout = M
            #REMOVE WEIGHT EFFECT TO ACCOUNT FOR P-Delta Effect
            print("!!!! No weight effect on rotor moments -TowerSE  !!!!")

        # put back in array
        unknowns['top_F'] = np.array([Fout.x, Fout.y, Fout.z])
        unknowns['top_M'] = np.array([Mout.x, Mout.y, Mout.z])
Beispiel #8
0
    def solve_nonlinear(self, params, unknowns, resids):
        # aero/hydro loads
        # wind = params['windLoads']
        # wave = params['waveLoads']
        # outloads = params['outloads']
        z = params['z']
        hubHt = z[-1]  # top of cylinder
        windLoads = DirectionVector(params['windLoads_Px'], params['windLoads_Py'], params['windLoads_Pz']).inertialToWind(params['windLoads_beta']).windToYaw(params['yaw'])
        waveLoads = DirectionVector(params['waveLoads_Px'], params['waveLoads_Py'], params['waveLoads_Pz']).inertialToWind(params['waveLoads_beta']).windToYaw(params['yaw'])

        Px = np.interp(z, params['windLoads_z'], windLoads.x) + np.interp(z, params['waveLoads_z'], waveLoads.x)
        Py = np.interp(z, params['windLoads_z'], windLoads.y) + np.interp(z, params['waveLoads_z'], waveLoads.y)
        Pz = np.interp(z, params['windLoads_z'], windLoads.z) + np.interp(z, params['waveLoads_z'], waveLoads.z)
        qdyn = np.interp(z, params['windLoads_z'], params['windLoads_qdyn']) + np.interp(z, params['waveLoads_z'], params['waveLoads_qdyn'])
        # outloads.z = z

        #The following are redundant, at one point we will consolidate them to something that works for both cylinder (not using vartrees) and jacket (still using vartrees)
        unknowns['Px'] = Px
        unknowns['Py'] = Py
        unknowns['Pz'] = Pz
        unknowns['qdyn'] = qdyn
Beispiel #9
0
    def solve_nonlinear(self, params, unknowns, resids):

        F = params['F']
        M = params['M']

        F = DirectionVector.fromArray(F).hubToYaw(params['tilt'])
        M = DirectionVector.fromArray(M).hubToYaw(params['tilt'])

        # change x-direction if downwind
        r_hub = np.copy(params['r_hub'])
        rna_cm = np.copy(params['rna_cm'])
        if params['downwind']:
            r_hub[0] *= -1
            rna_cm[0] *= -1
        r_hub = DirectionVector.fromArray(r_hub)
        rna_cm = DirectionVector.fromArray(rna_cm)
        self.save_rhub = r_hub
        self.save_rcm = rna_cm

        # aerodynamic moments
        M = M + r_hub.cross(F)
        self.saveF = F

        # add weight loads
        F_w = DirectionVector(0.0, 0.0, -params['rna_mass'] * gravity)
        M_w = rna_cm.cross(F_w)
        self.saveF_w = F_w

        Fout = F + F_w

        if params['rna_weightM']:
            Mout = M + M_w
        else:
            Mout = M
            #REMOVE WEIGHT EFFECT TO ACCOUNT FOR P-Delta Effect
            print("!!!! No weight effect on rotor moments -TowerSE  !!!!")

        # put back in array
        unknowns['top_F'] = np.array([Fout.x, Fout.y, Fout.z])
        unknowns['top_M'] = np.array([Mout.x, Mout.y, Mout.z])
Beispiel #10
0
    def execute(self):

        F = self.F
        M = self.M

        F = DirectionVector.fromArray(F).hubToYaw(self.tilt)
        M = DirectionVector.fromArray(M).hubToYaw(self.tilt)

        # change x-direction if downwind
        r_hub = np.copy(self.r_hub)
        rna_cm = np.copy(self.rna_cm)
        if self.downwind:
            r_hub[0] *= -1
            rna_cm[0] *= -1
        r_hub = DirectionVector.fromArray(r_hub)
        rna_cm = DirectionVector.fromArray(rna_cm)
        self.save_rhub = r_hub
        self.save_rcm = rna_cm

        # aerodynamic moments
        M = M + r_hub.cross(F)
        self.saveF = F

        # add weight loads
        F_w = DirectionVector(0.0, 0.0, -self.m_RNA * self.g)
        M_w = rna_cm.cross(F_w)
        self.saveF_w = F_w

        Fout = F + F_w

        if self.rna_weightM:
            Mout = M + M_w
        else:
            Mout = M
            #REMOVE WEIGHT EFFECT TO ACCOUNT FOR P-Delta Effect
            print "!!!! No weight effect on rotor moments -TowerSE  !!!!"

        # put back in array
        self.top_F = np.array([Fout.x, Fout.y, Fout.z])
        self.top_M = np.array([Mout.x, Mout.y, Mout.z])
Beispiel #11
0
    def linearize(self, params, unknowns, resids):

        dF = DirectionVector.fromArray(params['F']).hubToYaw(params['tilt'])
        dFx, dFy, dFz = dF.dx, dF.dy, dF.dz

        dtopF_dFx = np.array([dFx['dx'], dFy['dx'], dFz['dx']])
        dtopF_dFy = np.array([dFx['dy'], dFy['dy'], dFz['dy']])
        dtopF_dFz = np.array([dFx['dz'], dFy['dz'], dFz['dz']])
        dtopF_dF = hstack([dtopF_dFx, dtopF_dFy, dtopF_dFz])
        dtopF_w_dm = np.array([0.0, 0.0, -self.g])

        #dtopF = hstack([dtopF_dF, np.zeros((3, 6)), dtopF_w_dm, np.zeros((3, 3))])

        dM = DirectionVector.fromArray(params['M']).hubToYaw(params['tilt'])
        dMx, dMy, dMz = dM.dx, dM.dy, dM.dz
        dMxcross, dMycross, dMzcross = self.save_rhub.cross_deriv(
            self.saveF, 'dr', 'dF')

        dtopM_dMx = np.array([dMx['dx'], dMy['dx'], dMz['dx']])
        dtopM_dMy = np.array([dMx['dy'], dMy['dy'], dMz['dy']])
        dtopM_dMz = np.array([dMx['dz'], dMy['dz'], dMz['dz']])
        dtopM_dM = hstack([dtopM_dMx, dtopM_dMy, dtopM_dMz])
        dM_dF = np.array([dMxcross['dF'], dMycross['dF'], dMzcross['dF']])

        dtopM_dFx = np.dot(dM_dF, dtopF_dFx)
        dtopM_dFy = np.dot(dM_dF, dtopF_dFy)
        dtopM_dFz = np.dot(dM_dF, dtopF_dFz)
        dtopM_dF = hstack([dtopM_dFx, dtopM_dFy, dtopM_dFz])
        dtopM_dr = np.array([dMxcross['dr'], dMycross['dr'], dMzcross['dr']])

        dMx_w_cross, dMy_w_cross, dMz_w_cross = self.save_rcm.cross_deriv(
            self.saveF_w, 'dr', 'dF')

        if params['rna_weightM']:
            dtopM_drnacm = np.array(
                [dMx_w_cross['dr'], dMy_w_cross['dr'], dMz_w_cross['dr']])
            dtopM_dF_w = np.array(
                [dMx_w_cross['dF'], dMy_w_cross['dF'], dMz_w_cross['dF']])
        else:
            dtopM_drnacm = np.zeros((3, 3))
            dtopM_dF_w = np.zeros((3, 3))
        dtopM_dm = np.dot(dtopM_dF_w, dtopF_w_dm)

        if params['downwind']:
            dtopM_dr[:, 0] *= -1
            dtopM_drnacm[:, 0] *= -1

        #dtopM = hstack([dtopM_dF, dtopM_dM, dtopM_dr, dtopM_dm, dtopM_drnacm])

        J = {}
        J['top_F', 'F'] = dtopF_dF
        J['top_F', 'M'] = np.zeros((3, 3))
        J['top_F', 'r_hub'] = np.zeros((3, 3))
        J['top_F', 'rna_mass'] = dtopF_w_dm
        J['top_F', 'rna_cm'] = np.zeros((3, 3))

        J['top_M', 'F'] = dtopM_dF
        J['top_M', 'M'] = dtopM_dM
        J['top_M', 'r_hub'] = dtopM_dr
        J['top_M', 'rna_mass'] = dtopM_dm
        J['top_M', 'rna_cm'] = dtopM_drnacm

        return J