def __thrustTorqueDeriv(self, Np, Tp, dNp_dX, dTp_dX, dNp_dprecurve, dTp_dprecurve, r, precurve, presweep, precone, Rhub, Rtip, precurveTip, presweepTip): """derivatives of thrust and torque""" Tb = np.array([1, 0]) Qb = np.array([0, 1]) Npb, Tpb, rb, precurveb, presweepb, preconeb, Rhubb, Rtipb, precurvetipb, presweeptipb = \ _bem.thrusttorque_bv(Np, Tp, r, precurve, presweep, precone, Rhub, Rtip, precurveTip, presweepTip, Tb, Qb) # X = [r, chord, theta, Rhub, Rtip, presweep, precone, tilt, hubHt] dT_dNp = Npb[0, :] dQ_dNp = Npb[1, :] dT_dTp = Tpb[0, :] dQ_dTp = Tpb[1, :] # chain rule dT_dX = dT_dNp*dNp_dX + dT_dTp*dTp_dX dQ_dX = dQ_dNp*dNp_dX + dQ_dTp*dTp_dX dT_dr = dT_dX[0, :] + rb[0, :] dQ_dr = dQ_dX[0, :] + rb[1, :] dT_dchord = dT_dX[1, :] dQ_dchord = dQ_dX[1, :] dT_dtheta = dT_dX[2, :] dQ_dtheta = dQ_dX[2, :] dT_dRhub = np.sum(dT_dX[3, :]) + Rhubb[0] dQ_dRhub = np.sum(dQ_dX[3, :]) + Rhubb[1] dT_dRtip = np.sum(dT_dX[4, :]) + Rtipb[0] dQ_dRtip = np.sum(dQ_dX[4, :]) + Rtipb[1] dT_dpresweep = dT_dX[5, :] + presweepb[0, :] dQ_dpresweep = dQ_dX[5, :] + presweepb[1, :] dT_dprecone = np.sum(dT_dX[6, :]) + preconeb[0]*pi/180.0 dQ_dprecone = np.sum(dQ_dX[6, :]) + preconeb[1]*pi/180.0 dT_dtilt = np.sum(dT_dX[7, :]) dQ_dtilt = np.sum(dQ_dX[7, :]) dT_dhubht = np.sum(dT_dX[8, :]) dQ_dhubht = np.sum(dQ_dX[8, :]) dT_dprecurvetip = precurvetipb[0] dQ_dprecurvetip = precurvetipb[1] dT_dpresweeptip = presweeptipb[0] dQ_dpresweeptip = presweeptipb[1] dT_dprecurve = np.sum(dT_dNp*dNp_dprecurve + dT_dTp*dTp_dprecurve, axis=1) + precurveb[0, :] dQ_dprecurve = np.sum(dQ_dNp*dNp_dprecurve + dQ_dTp*dTp_dprecurve, axis=1) + precurveb[1, :] # scalars = [precone, tilt, hubHt, Rhub, Rtip, precurvetip, presweeptip] dT_ds = np.array([dT_dprecone, dT_dtilt, dT_dhubht, dT_dRhub, dT_dRtip, dT_dprecurvetip, dT_dpresweeptip]) dQ_ds = np.array([dQ_dprecone, dQ_dtilt, dQ_dhubht, dQ_dRhub, dQ_dRtip, dQ_dprecurvetip, dQ_dpresweeptip]) # vectors = [r, chord, theta, precurve, presweep] dT_dv = np.vstack((dT_dr, dT_dchord, dT_dtheta, dT_dprecurve, dT_dpresweep)) dQ_dv = np.vstack((dQ_dr, dQ_dchord, dQ_dtheta, dQ_dprecurve, dQ_dpresweep)) return dT_ds, dQ_ds, dT_dv, dQ_dv
def __thrustTorqueDeriv(self, Np, Tp, dNp_dX, dTp_dX, dNp_dprecurve, dTp_dprecurve, r, precurve, presweep, precone, Rhub, Rtip, precurveTip, presweepTip): """derivatives of thrust and torque""" Tb = np.array([1, 0]) Qb = np.array([0, 1]) Npb, Tpb, rb, precurveb, presweepb, preconeb, Rhubb, Rtipb, precurvetipb, presweeptipb = \ _bem.thrusttorque_bv(Np, Tp, r, precurve, presweep, precone, Rhub, Rtip, precurveTip, presweepTip, Tb, Qb) # X = [r, chord, theta, Rhub, Rtip, presweep, precone, tilt, hubHt, yaw, azimuth, Uinf, Omega, pitch] dT_dNp = Npb[0, :] dQ_dNp = Npb[1, :] dT_dTp = Tpb[0, :] dQ_dTp = Tpb[1, :] # chain rule dT_dX = dT_dNp * dNp_dX + dT_dTp * dTp_dX dQ_dX = dQ_dNp * dNp_dX + dQ_dTp * dTp_dX dT_dr = dT_dX[0, :] + rb[0, :] dQ_dr = dQ_dX[0, :] + rb[1, :] dT_dchord = dT_dX[1, :] dQ_dchord = dQ_dX[1, :] dT_dtheta = dT_dX[2, :] dQ_dtheta = dQ_dX[2, :] dT_dRhub = np.sum(dT_dX[3, :]) + Rhubb[0] dQ_dRhub = np.sum(dQ_dX[3, :]) + Rhubb[1] dT_dRtip = np.sum(dT_dX[4, :]) + Rtipb[0] dQ_dRtip = np.sum(dQ_dX[4, :]) + Rtipb[1] dT_dpresweep = dT_dX[5, :] + presweepb[0, :] dQ_dpresweep = dQ_dX[5, :] + presweepb[1, :] dT_dprecone = np.sum(dT_dX[6, :]) + preconeb[0] * pi / 180.0 dQ_dprecone = np.sum(dQ_dX[6, :]) + preconeb[1] * pi / 180.0 dT_dtilt = np.sum(dT_dX[7, :]) dQ_dtilt = np.sum(dQ_dX[7, :]) dT_dhubht = np.sum(dT_dX[8, :]) dQ_dhubht = np.sum(dQ_dX[8, :]) dT_dprecurvetip = precurvetipb[0] dQ_dprecurvetip = precurvetipb[1] dT_dpresweeptip = presweeptipb[0] dQ_dpresweeptip = presweeptipb[1] dT_dprecurve = np.sum(dT_dNp * dNp_dprecurve + dT_dTp * dTp_dprecurve, axis=1) + precurveb[0, :] dQ_dprecurve = np.sum(dQ_dNp * dNp_dprecurve + dQ_dTp * dTp_dprecurve, axis=1) + precurveb[1, :] dT_dyaw = np.sum(dT_dX[9, :]) dQ_dyaw = np.sum(dQ_dX[9, :]) dT_dUinf = np.sum(dT_dX[11, :]) dQ_dUinf = np.sum(dQ_dX[11, :]) dT_dOmega = np.sum(dT_dX[12, :]) dQ_dOmega = np.sum(dQ_dX[12, :]) dT_dpitch = np.sum(dT_dX[13, :]) dQ_dpitch = np.sum(dQ_dX[13, :]) # scalars = [precone, tilt, hubHt, Rhub, Rtip, precurvetip, presweeptip, yaw, Uinf, Omega, pitch] dT_ds = np.array([ dT_dprecone, dT_dtilt, dT_dhubht, dT_dRhub, dT_dRtip, dT_dprecurvetip, dT_dpresweeptip, dT_dyaw, dT_dUinf, dT_dOmega, dT_dpitch ]) dQ_ds = np.array([ dQ_dprecone, dQ_dtilt, dQ_dhubht, dQ_dRhub, dQ_dRtip, dQ_dprecurvetip, dQ_dpresweeptip, dQ_dyaw, dQ_dUinf, dQ_dOmega, dQ_dpitch ]) # vectors = [r, chord, theta, precurve, presweep] dT_dv = np.vstack( (dT_dr, dT_dchord, dT_dtheta, dT_dprecurve, dT_dpresweep)) dQ_dv = np.vstack( (dQ_dr, dQ_dchord, dQ_dtheta, dQ_dprecurve, dQ_dpresweep)) return dT_ds, dQ_ds, dT_dv, dQ_dv