class Rotor(object): def __init__(self, mode_source_file, root_length=0): # Modal element using data from Bladed model print "Loading modes from '%s'..." % mode_source_file self.modes = ModalRepresentation.from_Bladed(mode_source_file) self.bearing = Hinge('bearing', [0,0,1]) self.offset = RigidConnection('offset', [root_length, 0, 0]) self.blade = ModalElement('blade', self.modes) self.bearing.add_leaf(self.offset) self.offset.add_leaf(self.blade) self.system = System(self.bearing) # Prescribed DOF accelerations self.system.prescribe(self.bearing.istrain, vel=0.0, acc=0.0) # constant spin speed def simulate(self, qm0, spin=10.0, t1=1.5, dt=0.01): # reset self.system.q [:] = 0.0 self.system.qd[:] = 0.0 # initial conditions self.system.q[self.blade.istrain] = qm0 # initial modal amplitudes self.system.prescribe(self.bearing.istrain, vel=spin, acc=0.0) #acc=spin/t1) # setup integrator self.integ = Integrator(self.system, ('pos','vel')) self.integ.add_output(dynamics.LoadOutput(self.bearing.iprox)) self.integ.add_output(dynamics.LoadOutput(self.blade.iprox)) self.integ.add_output(dynamics.LoadOutput(self.blade.iprox, local=True)) self.integ.add_output(dynamics.CustomOutput( lambda s: self.blade.station_positions()[-1], label="Tip pos")) self.integ.add_output(dynamics.CustomOutput( lambda s: self.blade.quad_stress, label="Quad stress")) # simulate self.t,self.y = self.integ.integrate(t1, dt) return self.t, self.y def lin(self, qm0, spin=10.0): # reset self.system.q [:] = 0.0 self.system.qd[:] = 0.0 # initial conditions self.system.q[self.blade.istrain] = qm0 # initial modal amplitudes self.system.prescribe(self.bearing.istrain, vel=spin, acc=0.0) # constant speed linsys = linearisation.LinearisedSystem(self.system, qm0) return linsys def ani(self, vs=1): l = 40 return dynvis.anim(self.system, self.t, self.y, (0,vs), (-l,l), (-l,l), velocities=False, only_free=True)
class Rotor(object): def __init__(self, mode_source_file, root_length=0): # Modal element using data from Bladed model print "Loading modes from '%s'..." % mode_source_file self.modes = ModalRepresentation.from_Bladed(mode_source_file) self.bearing = Hinge('bearing', [0, 0, 1]) self.offset = RigidConnection('offset', [root_length, 0, 0]) self.blade = ModalElement('blade', self.modes) self.bearing.add_leaf(self.offset) self.offset.add_leaf(self.blade) self.system = System(self.bearing) # Prescribed DOF accelerations self.system.prescribe(self.bearing.istrain, vel=0.0, acc=0.0) # constant spin speed def simulate(self, qm0, spin=10.0, t1=1.5, dt=0.01): # reset self.system.q[:] = 0.0 self.system.qd[:] = 0.0 # initial conditions self.system.q[self.blade.istrain] = qm0 # initial modal amplitudes self.system.prescribe(self.bearing.istrain, vel=spin, acc=0.0) #acc=spin/t1) # setup integrator self.integ = Integrator(self.system, ('pos', 'vel')) self.integ.add_output(dynamics.LoadOutput(self.bearing.iprox)) self.integ.add_output(dynamics.LoadOutput(self.blade.iprox)) self.integ.add_output(dynamics.LoadOutput(self.blade.iprox, local=True)) self.integ.add_output( dynamics.CustomOutput(lambda s: self.blade.station_positions()[-1], label="Tip pos")) self.integ.add_output( dynamics.CustomOutput(lambda s: self.blade.quad_stress, label="Quad stress")) # simulate self.t, self.y = self.integ.integrate(t1, dt) return self.t, self.y def lin(self, qm0, spin=10.0): # reset self.system.q[:] = 0.0 self.system.qd[:] = 0.0 # initial conditions self.system.q[self.blade.istrain] = qm0 # initial modal amplitudes self.system.prescribe(self.bearing.istrain, vel=spin, acc=0.0) # constant speed linsys = linearisation.LinearisedSystem(self.system, qm0) return linsys def ani(self, vs=1): l = 40 return dynvis.anim(self.system, self.t, self.y, (0, vs), (-l, l), (-l, l), velocities=False, only_free=True)
acc_period = 0.1 yaw_time1 = 3.0 yaw_time2 = 6.0 dvyaw = 10 * np.pi/180 system.prescribe(yaw.istrain, acc=lambda t: (t>=yaw_time1 and t<(yaw_time1+acc_period)) and dvyaw/acc_period or 0 +\ (t>yaw_time2 and t<=(yaw_time2+acc_period)) and -dvyaw/acc_period or 0) system.find_equilibrium() integ = Integrator(system, ()) integ.add_position_output(yaw.istrain, 'yaw position') integ.add_velocity_output(yaw.istrain, 'yaw velocity') integ.add_acceleration_output(yaw.istrain, 'yaw acceleration') integ.add_acceleration_output(el.imult) integ.add_force_output(bearing.idist, "root load") integ.add_custom_output(lambda s: el.station_positions()[-1], 'tip pos') integ.add_custom_output(lambda s: el.modes.X(el.xstrain)[-1,1:3], 'tip defl') integ.add_custom_output(lambda s: el.quad_forces, 'quad_forces') integ.add_custom_output(lambda s: el.quad_stress, 'quad_stress') # Load Bladed data for comparison import pybladed.data brun = pybladed.data.BladedRun(bladedpath) bladed_defl = np.c_[ brun.get('blade 1 x-deflection;4'), brun.get('blade 1 y-deflection;4'), brun.get('blade 1 x-position;4'), brun.get('blade 1 y-position;4'), brun.get('blade 1 z-position;4'), brun.get('rotor azimuth'), brun.get('nacelle yaw displacement'),
acc_period = 0.1 yaw_time1 = 3.0 yaw_time2 = 6.0 dvyaw = 10 * np.pi / 180 system.prescribe(yaw.istrain, acc=lambda t: (t>=yaw_time1 and t<(yaw_time1+acc_period)) and dvyaw/acc_period or 0 +\ (t>yaw_time2 and t<=(yaw_time2+acc_period)) and -dvyaw/acc_period or 0) system.find_equilibrium() integ = Integrator(system, ()) integ.add_position_output(yaw.istrain, 'yaw position') integ.add_velocity_output(yaw.istrain, 'yaw velocity') integ.add_acceleration_output(yaw.istrain, 'yaw acceleration') integ.add_acceleration_output(el.imult) integ.add_force_output(bearing.idist, "root load") integ.add_custom_output(lambda s: el.station_positions()[-1], 'tip pos') integ.add_custom_output(lambda s: el.modes.X(el.xstrain)[-1, 1:3], 'tip defl') integ.add_custom_output(lambda s: el.quad_forces, 'quad_forces') integ.add_custom_output(lambda s: el.quad_stress, 'quad_stress') # Load Bladed data for comparison import pybladed.data brun = pybladed.data.BladedRun(bladedpath) bladed_defl = np.c_[brun.get('blade 1 x-deflection;4'), brun.get('blade 1 y-deflection;4'), brun.get('blade 1 x-position;4'), brun.get('blade 1 y-position;4'), brun.get('blade 1 z-position;4'), brun.get('rotor azimuth'), brun.get('nacelle yaw displacement'), brun.get('blade 1 root Fz'),