Example #1
0
    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
Example #2
0
    def __init__(self, length, radius, mass, spin):
        self.length = length
        self.radius = radius
        self.mass = mass
        self.spin = spin

        x = np.linspace(0, length)
        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', [1, 0, 0])
        self.body = ModalElement('body', modes)

        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.istrain,
                              0.0)  # constant rotational speed
Example #3
0
    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, 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)

        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.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.blade1 = ModalElement('blade1', self.modes)
        self.blade2 = ModalElement('blade2', self.modes)
        self.blade3 = ModalElement('blade3', self.modes)

        self.bearing.add_leaf(root1)
        self.bearing.add_leaf(root2)
        self.bearing.add_leaf(root3)
        root1.add_leaf(self.blade1)
        root2.add_leaf(self.blade2)
        root3.add_leaf(self.blade3)
        self.system = System(self.bearing)

        # Prescribed DOF accelerations - constant rotor speed
        self.system.prescribe(self.bearing.istrain, vel=0.0, acc=0.0)

        # setup integrator
        self.integ = Integrator(self.system, ('pos', 'vel'))
        self.integ.add_output(dynamics.LoadOutput(self.bearing.iprox))
        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.CustomOutput(lambda s: b.station_positions()[-1],
                                      label="{} tip defl".format(b)))
        for b in (self.blade1, self.blade2, self.blade3):
            self.integ.add_output(
                dynamics.CustomOutput(lambda s: dot(b.Rp,
                                                    b.station_positions()[-1]),
                                      label="{} tip pos".format(b)))
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)
Example #6
0
    def __init__(self, mode_source_file, root_length=0, wind_table=None):
        # Modal element using data from Bladed model
        print "Loading modes from '%s'..." % mode_source_file
        self.blade = Blade(mode_source_file)
        self.modes = self.blade.modal_rep()
        
        if wind_table is not None:
            loading = BladeLoading(self.blade, wind_table, None)
        else:
            loading = None

        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.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.blade1 = ModalElement('blade1', self.modes, loading)
        self.blade2 = ModalElement('blade2', self.modes)
        self.blade3 = ModalElement('blade3', self.modes)
        
        self.bearing.add_leaf(root1)
        self.bearing.add_leaf(root2)
        self.bearing.add_leaf(root3)
        root1.add_leaf(self.blade1)
        root2.add_leaf(self.blade2)
        root3.add_leaf(self.blade3)
        self.system = System(self.bearing)

        # Prescribed DOF accelerations - constant rotor speed
        self.system.prescribe(self.bearing, vel=0.0, acc=0.0)
        
        # 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.blade1.iprox, local=True))
        self.integ.add_output(self.blade1.output_deflections())
        self.integ.add_output(self.blade1.output_positions())
    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
Example #8
0
bladedpath = '/bladed/gyro_effects/simpleblade_10rpm_10degs'

# Modal element using data from Bladed model
print "Loading modes from '%s'..." % bladedpath
modes = ModalRepresentation.from_Bladed(bladedpath + '.$pj')

rotorspeed = 10 * np.pi / 30  # 10 rpm
overhang = 1  # 1m

# Modal element
yaw = Hinge('yaw', [0, 0, 1])
overhang = RigidConnection('overhang', [-overhang, 0, 0])
bearing = Hinge('bearing', [1, 0, 0],
                np.dot(rotmat_y(-np.pi / 2), rotmat_x(-np.pi / 2)))
el = ModalElement('el', modes)
yaw.add_leaf(overhang)
overhang.add_leaf(bearing)
bearing.add_leaf(el)
system = System(yaw)

# Prescribe rotation speed
system.prescribe(bearing.istrain, 0.0)
system.qd[bearing.istrain] = rotorspeed

# Prescribed yaw angle
acc_period = 0.1
yaw_time1 = 3.0
yaw_time2 = 6.0
dvyaw = 10 * np.pi / 180
system.prescribe(yaw.istrain,
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.blade = Blade(mode_source_file)
        self.modes = self.blade.modal_rep()

        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.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.blade1 = ModalElement('blade1', self.modes)
        self.blade2 = ModalElement('blade2', self.modes)
        self.blade3 = ModalElement('blade3', self.modes)

        self.bearing.add_leaf(root1)
        self.bearing.add_leaf(root2)
        self.bearing.add_leaf(root3)
        root1.add_leaf(self.blade1)
        root2.add_leaf(self.blade2)
        root3.add_leaf(self.blade3)
        self.system = System(self.bearing)

        # Prescribed DOF accelerations - constant rotor speed
        self.system.prescribe(self.bearing, acc=0.0)

        # 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.blade1.iprox, local=True))
        self.integ.add_output(self.blade1.output_deflections())
        self.integ.add_output(self.blade1.output_positions())

    def simulate(self, qm0=None, spin=10.0, t1=1.5, dt=0.01):
        # reset
        self.system.q[:] = 0.0
        self.system.qd[:] = 0.0

        # initial conditions
        if qm0 is not None:  # initial modal amplitudes
            self.system.q[self.blade1.istrain] = qm0
            self.system.q[self.blade2.istrain] = qm0
            self.system.q[self.blade3.istrain] = qm0
        self.system.qd[self.bearing.istrain][0] = spin

        # simulate
        self.t, self.y = self.integ.integrate(t1, dt)
        for i, lab in enumerate(self.integ.labels()):
            print "%2d  %s" % (i, lab)
        return self.t, self.y

    def lin(self, qm0=None, spin=10.0):
        # reset
        self.system.q[:] = 0.0
        self.system.qd[:] = 0.0

        # initial conditions
        if qm0 is not None:  # initial modal amplitudes
            self.system.q[self.blade1.istrain] = qm0
            self.system.q[self.blade2.istrain] = qm0
            self.system.q[self.blade3.istrain] = qm0
        else:
            qm0 = np.zeros(self.blade1._nstrain * 3)
        self.system.prescribe(self.bearing, vel=spin, acc=0.0)
        self.system.qd[self.bearing.istrain][0] = spin

        linsys = linearisation.LinearisedSystem(self.system, qm0)
        return linsys

    def ani(self, t=None, y=None, planview=True):
        if t is None: t = self.t
        if y is None: y = self.y
        l = 40
        if planview:
            return dynvis.anim(self.system, t, y, (1, 2), (-l, l), (-l, l))
        else:
            return dynvis.anim(self.system, t, y, (0, 1), (-l, l), (-5, 5))
print "Loading modes from '%s'..." % path_damped
modes = ModalRepresentation.from_Bladed(path_damped+'.$pj')
print "Loading modes from '%s'..." % path_undamped
modes0 = ModalRepresentation.from_Bladed(path_undamped+'.$pj')

# Blade loading
wind_table = np.array([
    [0, 1, 2,  10], # time
    [0, 0, 0,  0 ], # x
    [0, 0, 20, 20], # y
    [0, 0, 0,  0 ], # z
])
loading = BladeLoading(modes.x, wind_table, None)

# Modal element
el = ModalElement('el', modes, loading)
system = System(el)
el0 = ModalElement('el0', modes0, loading)
system0 = System(el0)

integ = Integrator(system)
integ0 = Integrator(system0)
integ.add_output(el.output_positions(stations=[16,32]))
integ0.add_output(el0.output_positions(stations=[16,32]))

#def simulate(system, t1=2.0, dt=0.005):

# Load Bladed data for comparison
import pybladed.data
brun = pybladed.data.BladedRun(path_damped)
bladed_defl = np.c_[
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.blade = Blade(mode_source_file)
        self.modes = self.blade.modal_rep()

        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.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.blade1 = ModalElement('blade1', self.modes)
        self.blade2 = ModalElement('blade2', self.modes)
        self.blade3 = ModalElement('blade3', self.modes)
        
        self.bearing.add_leaf(root1)
        self.bearing.add_leaf(root2)
        self.bearing.add_leaf(root3)
        root1.add_leaf(self.blade1)
        root2.add_leaf(self.blade2)
        root3.add_leaf(self.blade3)
        self.system = System(self.bearing)

        # Prescribed DOF accelerations - constant rotor speed
        self.system.prescribe(self.bearing, acc=0.0)
        
        # 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.blade1.iprox, local=True))
        self.integ.add_output(self.blade1.output_deflections())
        self.integ.add_output(self.blade1.output_positions())
        
    def simulate(self, qm0=None, spin=10.0, t1=1.5, dt=0.01):
        # reset
        self.system.q [:] = 0.0
        self.system.qd[:] = 0.0

        # initial conditions
        if qm0 is not None:  # initial modal amplitudes
            self.system.q[self.blade1.istrain] = qm0
            self.system.q[self.blade2.istrain] = qm0
            self.system.q[self.blade3.istrain] = qm0
        self.system.qd[self.bearing.istrain][0] = spin
        
        # simulate
        self.t,self.y = self.integ.integrate(t1, dt)
        for i,lab in enumerate(self.integ.labels()):
            print "%2d  %s" % (i,lab)
        return self.t, self.y
    
    def lin(self, qm0=None, spin=10.0):
        # reset
        self.system.q [:] = 0.0
        self.system.qd[:] = 0.0

        # initial conditions
        if qm0 is not None:  # initial modal amplitudes
            self.system.q[self.blade1.istrain] = qm0
            self.system.q[self.blade2.istrain] = qm0
            self.system.q[self.blade3.istrain] = qm0
        else:
            qm0 = np.zeros(self.blade1._nstrain * 3)
        self.system.prescribe(self.bearing, vel=spin, acc=0.0)
        self.system.qd[self.bearing.istrain][0] = spin
        
        linsys = linearisation.LinearisedSystem(self.system, qm0)
        return linsys

    def ani(self, t=None, y=None, planview=True):
        if t is None: t = self.t
        if y is None: y = self.y
        l = 40
        if planview:
            return dynvis.anim(self.system, t, y, (1,2), (-l,l), (-l,l))
        else:
            return dynvis.anim(self.system, t, y, (0,1), (-l,l), (-5,5))
Example #12
0
import numpy as np
from scipy.linalg import eig
import matplotlib.pyplot as plt

import dynamics
from dynamics import System, ModalElement, solve_system
from linearisation import LinearisedSystem, ModalRepresentation
import dynvis

dynamics.gravity = 0

# Modal element using data from Bladed model
print "Loading modes from 'demo_a.prj'..."
modes = ModalRepresentation.from_Bladed('demo_a_simplified.prj')
el = ModalElement('el', modes)
system = System(el)

# Linearise system and find modes - should match with original
print "Linearising..."
linsys = LinearisedSystem(system)
w, v = eig(linsys.K, linsys.M)
order = np.argsort(w)
w = np.sqrt(np.real(w[order]))
f = w / 2 / np.pi
v = v[:, order]

# Check that modes come out matching what went in
assert np.allclose(modes.freqs, w), "Linearised freqs should match"
ventries = np.nonzero(abs(v) > 1e-2)[0]
assert len(ventries) == len(w) and (ventries == np.arange(4)).all(), \
dynamics.gravity = 0

bladedpath = '/bladed/gyro_effects/simpleblade_10rpm_10degs'

# Modal element using data from Bladed model
print "Loading modes from '%s'..." % bladedpath
modes = ModalRepresentation.from_Bladed(bladedpath+'.$pj')

rotorspeed = 10 * np.pi/30 # 10 rpm
overhang = 1 # 1m

# Modal element
yaw = Hinge('yaw', [0,0,1])
overhang = RigidConnection('overhang', [-overhang,0,0])
bearing = Hinge('bearing', [1,0,0],np.dot(rotmat_y(-np.pi/2), rotmat_x(-np.pi/2)))
el = ModalElement('el', modes)
yaw.add_leaf(overhang)
overhang.add_leaf(bearing)
bearing.add_leaf(el)
system = System(yaw)

# Prescribe rotation speed
system.prescribe(bearing.istrain, 0.0)
system.qd[bearing.istrain] = rotorspeed

# Prescribed yaw angle
acc_period = 0.1
yaw_time1 = 3.0
yaw_time2 = 6.0
dvyaw = 10 * np.pi/180
system.prescribe(yaw.istrain,
Example #14
0
    def __init__(self, bladed_file, root_length=0, rigid=False):
        # Modal element using data from Bladed model
        print "Loading modes from '%s'..." % bladed_file
        self.blade = Blade(bladed_file)
        self.tower = Tower(bladed_file)
        self.modes = self.blade.modal_rep()

        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.blade1 = ModalElement('blade1', self.modes)
        self.blade2 = ModalElement('blade2', self.modes)
        self.blade3 = ModalElement('blade3', self.modes)

        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.blade1)
        root2.add_leaf(self.blade2)
        root3.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)
        if rigid:
            for b in (self.blade1, self.blade2, self.blade3):
                self.system.prescribe(b, 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(b.output_deflections())
        for b in (self.blade1, self.blade2, self.blade3):
            self.integ.add_output(b.output_positions())
        for b in (self.blade1, self.blade2, self.blade3):
            self.integ.add_output(
                dynamics.NodeOutput(b.iprox, local=True, deriv=2))
Example #15
0
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)
# Load Bladed data for comparison
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)
from blade import Tower

# Options
dynamics.OPT_GRAVITY = True
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))
from blade import Tower

# Options
dynamics.OPT_GRAVITY = True
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))
Example #19
0
print "Loading blade from '%s'..." % bladed_path
blade = Blade(bladed_path+'.$pj')
modes = blade.modal_rep()

# Blade loading
wind_table = np.array([
    [0, 1, 2,  10], # time
    [0, 0, 20, 20], # x
    [0, 0, 0,  0 ], # y
    [0, 0, 0,  0 ], # z
])
loading = BladeLoading(blade, wind_table, None)

# Modal element
base = RigidConnection('base', rotation=rotmat_y(-np.pi/2))
el = ModalElement('el', modes, loading)
base.add_leaf(el)
system = System(base)

integ = Integrator(system)
integ.add_output(el.output_deflections(stations=[8,16]))
integ.add_output(dynamics.CustomOutput(
    lambda s: el._get_loading()[8,:], 'loading'))
integ.add_output(dynamics.CustomOutput(
    lambda s: el.loading.relspeed, 'relspeed'))

# Load Bladed data for comparison
import pybladed.data
brun = pybladed.data.BladedRun(bladed_path)
bladed_defl = np.c_[
    brun.get('blade 1 x-deflection;1'),
modes = ModalRepresentation.from_Bladed(bladedpath+'.$pj')

# Blade loading
wind_table = np.array([
    [0, 1, 2,  10], # time
    [0, 0, 0,  0 ], # x
    [0, 0, 20, 20], # y
    [0, 0, 0,  0 ], # z
])
loading = BladeLoading(modes.x, wind_table, None)

rotorspeed = 10 * np.pi/30 # 10 rpm

# Modal element
bearing = Hinge('bearing', [0,1,0])
el = ModalElement('el', modes, loading)
bearing.add_leaf(el)
system = System(bearing)

# Prescribe rotation speed
system.prescribe(bearing.istrain, 0.0)
system.qd[bearing.istrain] = rotorspeed

system.find_equilibrium()

integ = Integrator(system, ())
integ.add_position_output(bearing.istrain)
integ.add_custom_output(lambda s: el.modes.X(el.xstrain)[(16,32),1:3].flatten(), 'defl')
integ.add_custom_output(lambda s: el._get_loading()[16,:], 'loading')
integ.add_custom_output(lambda s: el.quad_forces, 'quad_forces')
integ.add_custom_output(lambda s: el.quad_stress, 'quad_stress')
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)
Example #22
0
# Load Bladed data for comparison
import pybladed.data
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)