def __init__(self, length, radius, mass, endmass): self.length = length self.radius = radius self.mass = mass self.endmass = endmass Jz = radius**2 / 2 Jxy = (3 * radius**2 + length**2) / 12 inertia = mass * np.diag([Jxy, Jxy, Jz]) self.A = mass * Jxy + endmass * (length / 2)**2 self.C = mass * Jz self.pivot = Hinge('pivot', [0, 1, 0]) self.axis = Hinge('axis', [0, 0, 1]) self.body = RigidBody('body', mass, inertia) self.offset = RigidConnection('offset', [0, 0, length / 2]) self.endbody = RigidBody('end', endmass) self.pivot.add_leaf(self.axis) self.axis.add_leaf(self.body) self.pivot.add_leaf(self.offset) self.offset.add_leaf(self.endbody) self.system = System(self.pivot) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed
def __init__(self, length, radius, mass, spin, endmass): self.length = length self.radius = radius self.mass = mass self.spin = spin self.endmass = endmass x = np.linspace(-length / 2, length / 2) modes = linearisation.ModalRepresentation( x=x, shapes=np.zeros((len(x), 3, 0)), rotations=np.zeros((len(x), 3, 0)), density=np.ones_like(x) * mass / length, mass_axis=np.zeros((len(x), 2)), section_inertia=np.ones_like(x) * radius**2 / 4, freqs=np.zeros((0, )), ) self.bearing = Hinge('bearing', [0, 0, 1]) self.pivot = Hinge('pivot', [0, 1, 0]) self.axis = Hinge('axis', [0, 0, 1], rotmat_y(-np.pi / 2)) self.body = ModalElement('body', modes) self.offset = RigidConnection('offset', [0, 0, length / 2]) self.endbody = RigidBody('end', endmass) self.bearing.add_leaf(self.pivot) self.pivot.add_leaf(self.axis) self.axis.add_leaf(self.body) self.pivot.add_leaf(self.offset) self.offset.add_leaf(self.endbody) self.system = System(self.bearing) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed
def __init__(self, length, radius, mass, endmass): self.length = length self.radius = radius self.mass = mass self.endmass = endmass Jx = mass * radius**2 / 2 Jyz = mass * (3 * radius**2 + length**2) / 12 self.A = Jyz + endmass * (length / 2)**2 self.C = Jx self.pivot = Hinge('pivot', [0, 1, 0]) self.offset = RigidConnection('offset', [0, 0, -length / 2]) self.axis = Hinge('axis', [0, 0, 1], rotmat_y(-np.pi / 2)) self.body = UniformBeam('body', length, mass / length, 1, 1, 1, Jx=Jx / 2) # /2 because added to both ends self.endoffset = RigidConnection('endoffset', [0, 0, length / 2]) self.endbody = RigidBody('end', endmass) self.pivot.add_leaf(self.offset) self.offset.add_leaf(self.axis) self.axis.add_leaf(self.body) self.pivot.add_leaf(self.endoffset) self.endoffset.add_leaf(self.endbody) self.system = System(self.pivot) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed self.system.prescribe(self.body, acc=0.0) # rigid beam
def __init__(self, length, radius, mass, spin, endmass): self.length = length self.radius = radius self.mass = mass self.spin = spin self.endmass = endmass Jx = mass * radius**2 / 2 self.bearing = Hinge('bearing', [0, 0, 1]) self.pivot = Hinge('pivot', [0, 1, 0]) self.offset = RigidConnection('offset', [-length / 2, 0, 0]) self.axis = Hinge('axis', [1, 0, 0]) self.body = UniformBeam('body', length, mass / length, 1, 1, 1, Jx=Jx / 2) # /2 because added to both ends self.endbody = RigidBody('end', endmass) self.bearing.add_leaf(self.pivot) self.pivot.add_leaf(self.offset) self.offset.add_leaf(self.axis) self.axis.add_leaf(self.body) self.offset.add_leaf(self.endbody) self.system = System(self.bearing) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed self.system.prescribe(self.body, acc=0.0) # rigid beam
def __init__(self, length, radius, mass, endmass): self.length = length self.radius = radius self.mass = mass self.endmass = endmass # corrected radius for lumped masses mr = radius / np.sqrt(2) root3 = np.sqrt(3) self.A = 3 * (mass / 3) * mr**2 / 2 + endmass * (length / 2)**2 self.C = 3 * (mass / 3) * mr**2 self.pivot = Hinge('pivot', [0, 1, 0]) self.axis = Hinge('axis', [0, 0, 1]) self.arm1 = RigidConnection('arm1', [mr, 0, 0]) self.arm2 = RigidConnection('arm2', [-mr / 2, mr * root3 / 2, 0]) self.arm3 = RigidConnection('arm3', [-mr / 2, -mr * root3 / 2, 0]) self.body = RigidBody('body', mass / 3) self.body2 = RigidBody('body2', mass / 3) self.body3 = RigidBody('body3', mass / 3) self.offset = RigidConnection('offset', [0, 0, length / 2]) self.endbody = RigidBody('end', endmass) self.pivot.add_leaf(self.axis) self.axis.add_leaf(self.arm1) self.axis.add_leaf(self.arm2) self.axis.add_leaf(self.arm3) self.arm1.add_leaf(self.body) self.arm2.add_leaf(self.body2) self.arm3.add_leaf(self.body3) self.pivot.add_leaf(self.offset) self.offset.add_leaf(self.endbody) self.system = System(self.pivot) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed
def __init__(self, length, radius, mass, spin): self.length = length self.radius = radius self.mass = mass self.spin = spin Jx = radius**2 / 2 Jyz = (3 * radius**2 + length**2) / 12 Jyz_0 = Jyz + (length / 2)**2 # parallel axis theorem inertia = mass * np.diag([Jx, Jyz_0, Jyz_0]) self.bearing = Hinge('bearing', [0, 0, 1]) self.pivot = Hinge('pivot', [0, 1, 0]) self.axis = Hinge('axis', [1, 0, 0]) self.body = RigidBody('body', mass, inertia, [length / 2, 0, 0]) self.bearing.add_leaf(self.pivot) self.pivot.add_leaf(self.axis) self.axis.add_leaf(self.body) self.system = System(self.bearing) # Prescribed DOF accelerations self.system.prescribe(self.axis, acc=0.0) # constant rotational speed
brun = pybladed.data.BladedRun(bladed_path) thrust = brun.get('rotating hub Fx') bladed_defl = np.c_[brun.get('Nacelle fore-aft displacement'), brun.get('Nacelle nod angle'), ] #loading = PointLoading(blade, wind_table, None) thrust_time = [0, 1, 2, 10] thrust_force = [0, 0, 10e3, 10e3] thrust = np.c_[thrust_force, np.zeros((4, 2))].T loadfunc = scipy.interpolate.interp1d(thrust_time, thrust) # Modal element base = RigidConnection('base', rotation=rotmat_y(-np.pi / 2)) el = ModalElement('el', modes, distal=True, damping_freqs=[8.269, 10.248]) rna = RigidBody('rna', 24000, np.diag([6400003, 6400003, 4266667]), nodal_load=loadfunc) base.add_leaf(el) el.add_leaf(rna) system = System(base) integ = Integrator(system) integ.add_output(el.output_deflections()) integ.add_output(el.output_rotations()) integ.add_output(dynamics.LoadOutput(rna.iprox)) linsys = LinearisedSystem(system) def ani_xy(s, t, y): return dynvis.anim(s, t, y, (0, 1), (-5, 45), (-5, 5), velocities=False)
import pybladed.data brun = pybladed.data.BladedRun(bladed_path) bladed_defl = np.c_[brun.get('Nacelle fore-aft displacement'), brun.get('Nacelle nod angle'), ] #loading = PointLoading(blade, wind_table, None) thrust_time = [0, 1, 2, 10] thrust_force = [0, 0, 10e3, 10e3] thrust = np.c_[thrust_force, np.zeros((4, 2))].T loadfunc = scipy.interpolate.interp1d(thrust_time, thrust) # Modal element base = RigidConnection('base', rotation=rotmat_y(-np.pi / 2)) el = ModalElement('el', modes, distal=True, damping_freqs=combined_freqs) rna = RigidBody('rna', 109993, np.diag([19406630, 19406630, 38813240]), nodal_load=loadfunc) base.add_leaf(el) el.add_leaf(rna) system = System(base) integ = Integrator(system) integ.add_output(el.output_deflections()) integ.add_output(el.output_rotations()) integ.add_output(dynamics.LoadOutput(rna.iprox)) linsys = LinearisedSystem(system) def ani_xy(s, t, y): return dynvis.anim(s, t, y, (0, 1), (-5, 45), (-5, 5), velocities=False)
dynamics.OPT_GEOMETRIC_STIFFNESS = False # Create model bladed_file = r'C:\Users\Rick Lupton\Dropbox\phd\Bladed\Models\OC3-Hywind_SparBuoy_NREL5MW.prj' print "Loading modes from '%s'..." % bladed_file towerdef = Tower(bladed_file) modes = towerdef.modal_rep() endmass = 100000 endinertia = 100 el1 = ModalElement('el', modes, distal=False) system1 = System(el1) el2 = ModalElement('el', modes, distal=True) body = RigidBody('body', endmass, inertia=endinertia * np.eye(3)) el2.add_leaf(body) system2 = System(el2) integ1 = Integrator(system1) integ1.add_output(el1.output_positions()) integ2 = Integrator(system2, outputs=('pos', 'vel', 'acc')) integ2.add_output(el2.output_positions()) integ2.add_output(dynamics.NodeOutput(body.iprox)) integ2.add_output(dynamics.NodeOutput(body.iprox, deriv=2)) integ2.add_output(dynamics.LoadOutput(body.iprox)) integ2.add_output(dynamics.StrainOutput(el2.imult)) if False: t, y1 = integ1.integrate(20, 0.05) t, y2 = integ2.integrate(20, 0.05)
def __init__(self, bladed_file, root_length=0): # Load modes but use a simple flapped blade print "Loading modes from '%s'..." % bladed_file self.blade = Blade(bladed_file) self.tower = Tower(bladed_file) self.modes = self.blade.modal_rep() # Calculate equivalent blade properties I1 = self.modes.I0[0] I2 = self.modes.J0[0, 0] print I1, I2 wflap = self.modes.freqs[0] bmass = self.modes.mass inertia = self.modes.inertia_tensor(np.zeros(len(self.modes.freqs))) Xc = [I1 / bmass, 0, 0] kflap = I2 * wflap**2 Ry = rotmat_y(-pi / 2) Rhb1 = rotmat_x(0 * 2 * pi / 3) Rhb2 = rotmat_x(1 * 2 * pi / 3) Rhb3 = rotmat_x(2 * 2 * pi / 3) self.base = FreeJoint('base') self.towerlink = RigidConnection('tower', [0, 0, self.tower.hubheight]) self.bearing = Hinge('bearing', [1, 0, 0]) root1 = RigidConnection('root1', root_length * np.dot(Rhb1, [0, 0, 1]), dot(Rhb1, Ry)) root2 = RigidConnection('root2', root_length * np.dot(Rhb2, [0, 0, 1]), dot(Rhb2, Ry)) root3 = RigidConnection('root3', root_length * np.dot(Rhb3, [0, 0, 1]), dot(Rhb3, Ry)) self.flap1 = Hinge('flap1', [0, 1, 0]) self.flap2 = Hinge('flap2', [0, 1, 0]) self.flap3 = Hinge('flap3', [0, 1, 0]) self.blade1 = RigidBody('blade1', bmass, inertia, Xc) self.blade2 = RigidBody('blade2', bmass, inertia, Xc) self.blade3 = RigidBody('blade3', bmass, inertia, Xc) self.flap1.stiffness = self.flap2.stiffness = self.flap3.stiffness = kflap self.base.add_leaf(self.towerlink) self.towerlink.add_leaf(self.bearing) self.bearing.add_leaf(root1) self.bearing.add_leaf(root2) self.bearing.add_leaf(root3) root1.add_leaf(self.flap1) root2.add_leaf(self.flap2) root3.add_leaf(self.flap3) self.flap1.add_leaf(self.blade1) self.flap2.add_leaf(self.blade2) self.flap3.add_leaf(self.blade3) self.system = System(self.base) # Prescribed DOF accelerations - constant rotor speed self.base_motion = None self.base_motion_amp = 0 self.system.prescribe(self.bearing, vel=0) self.system.prescribe(self.base, vel=0) # setup integrator self.integ = Integrator(self.system, ('pos', 'vel', 'acc')) self.integ.add_output(dynamics.LoadOutput(self.base.iprox)) self.integ.add_output(dynamics.LoadOutput(self.towerlink.iprox)) self.integ.add_output( dynamics.LoadOutput(self.bearing.iprox, local=True)) self.integ.add_output( dynamics.LoadOutput(self.bearing.idist[0], local=True)) for b in (self.blade1, self.blade2, self.blade3): self.integ.add_output(dynamics.LoadOutput(b.iprox, local=True)) for b in (self.blade1, self.blade2, self.blade3): self.integ.add_output( dynamics.NodeOutput(b.iprox, local=True, deriv=2))