Ejemplo n.º 1
0
    def setUp(self):
        cout.cout_wrap.initialise(False, False)
        A = scio.loadmat(TestKrylov.test_dir + '/src/' + 'A.mat')
        B = scio.loadmat(TestKrylov.test_dir + '/src/' + 'B.mat')
        C = scio.loadmat(TestKrylov.test_dir + '/src/' + 'C.mat')
        A = libsp.csc_matrix(A['A'])
        B = B['B']
        C = C['C']
        D = np.zeros((B.shape[1], C.shape[0]))

        A = A.todense()

        self.ss = libss.ss(A, B, C, D)

        self.rom = krylov.Krylov()

        if not os.path.exists(self.test_dir + '/figs/'):
            os.makedirs(self.test_dir + '/figs/')
Ejemplo n.º 2
0
# # Assemble UVLM
uvlm.assemble_ss()

# # Scale UVLM
# t_uvlm_scale0 = time.time()
# print('Scaling UVLM...')
# uvlm.nondimss()
# length_ref = uvlm.ScalingFacts['length']
# speed_ref = uvlm.ScalingFacts['speed']
# force_ref = uvlm.ScalingFacts['force']
# time_ref = uvlm.ScalingFacts['time']
# t_uvlm_scale = time.time() - t_uvlm_scale0
# print('...UVLM Scaling complete in %.2f s' % t_uvlm_scale)

# UVLM remove gust input - gusts not required in analysis
uvlm.SS.B = libsp.csc_matrix(
    aeroelastic_system.linuvlm.SS.B[:, :6 * aeroelastic_system.linuvlm.Kzeta])
uvlm.SS.D = libsp.csc_matrix(
    aeroelastic_system.linuvlm.SS.D[:, :6 * aeroelastic_system.linuvlm.Kzeta])
#
# UVLM projection onto modes
print('Projecting UVLM onto modes')
gain_input = libsp.dot(
    gain_struct_2_aero,
    sclalg.block_diag(beam.U[:, :beam.Nmodes], beam.U[:, :beam.Nmodes]))
gain_output = libsp.dot(beam.U[:, :beam.Nmodes].T, gain_aero_2_struct)
uvlm.SS.addGain(gain_input, where='in')
uvlm.SS.addGain(gain_output, where='out')
print('...complete')

# # Krylov MOR
# rom = krylovrom.KrylovReducedOrderModel()
Ejemplo n.º 3
0
dt = ws.dt
tsaero.rho = ws.rho
scaling_factors = {
    'length': 1,  #0.5*ws.c_ref,
    'speed': 1,  #u_inf,
    'density': 1
}  #ws.rho}

# Linearise UVLM
aeroelastic_system = linaeroela.LinAeroEla(data)
uvlm = aeroelastic_system.linuvlm
uvlm.assemble_ss()
aeroelastic_system.get_gebm2uvlm_gains()

# Remove lattice coordinates and velocities from the inputs to the system
uvlm.SS.B = libsp.csc_matrix(uvlm.SS.B[:, -uvlm.Kzeta:])
uvlm.SS.D = libsp.csc_matrix(uvlm.SS.D[:, -uvlm.Kzeta:])

# Create system to transmit a vertical gust across the chord in time
A_gust = np.zeros((M + 1, M + 1))
A_gust[1:, :-1] = np.eye(M)
B_gust = np.zeros((M + 1, 1))
B_gust[0] = 1
C_gust = np.eye(M + 1)
D_gust = np.zeros((C_gust.shape[0], 1))
print(D_gust.shape)
if use_sparse:
    A_gust = libsp.csc_matrix(A_gust)
    B_gust = libsp.csc_matrix(B_gust)
    C_gust = libsp.csc_matrix(C_gust)
    D_gust = libsp.csc_matrix(D_gust)
Ejemplo n.º 4
0
Sol.linuvlm.assemble_ss()

# scale
print('Scaling of UVLM eq.s started...')
Sol.linuvlm.nondimss()
Lref0=Sol.linuvlm.ScalingFacts['length']
Uref0=Sol.linuvlm.ScalingFacts['speed']
Fref0=Sol.linuvlm.ScalingFacts['force']
tref0=Sol.linuvlm.ScalingFacts['time']
print('\t\tdone in %.2f sec' %Sol.linuvlm.cpu_summary['nondim'])


# remove gust input
print('removing gust input started...')
t0=time.time()
Sol.linuvlm.SS.B=libsp.csc_matrix(Sol.linuvlm.SS.B[:,:6*Sol.linuvlm.Kzeta])
Sol.linuvlm.SS.D=Sol.linuvlm.SS.D[:,:6*Sol.linuvlm.Kzeta]
print('\t\tdone in %.2f sec' %(time.time()-t0))

# project
print('projection of UVLM eq.s started...')
t0=time.time()
Kin =libsp.dot(Kas, sc.linalg.block_diag(gebm.U[:,:gebm.Nmodes],
					 									gebm.U[:,:gebm.Nmodes]))
Kout=libsp.dot(gebm.U[:,:gebm.Nmodes].T,Ksa)
Sol.linuvlm.SS.addGain(Kin, where='in')
Sol.linuvlm.SS.addGain(Kout, where='out')
print('\t\tdone in %.2f sec' %(time.time()-t0))

Kin,Kout=None,None
Kas,Ksa=None,None
Ejemplo n.º 5
0
import scipy.signal as sig

# Load matrices
A = scio.loadmat('A.mat')
B = scio.loadmat('B.mat')
C = scio.loadmat('C.mat')
A = A['A']
B = B['B']
C = C['C']
D = np.zeros((B.shape[1], C.shape[0]))

# Convert A to dense
As = sc.sparse.csc_matrix(A)
Ad = As.todense()

A = libsp.csc_matrix(As)

# Assemble continuous time system
fom_ss = libss.ss(A, B, C, D)
fom_sc = sig.lti(Ad, B, C, D)

# Compare frequency response
wv = np.logspace(-1, 3, 1000)
wvsc, mag_fom_sc, ph_fom_sc = fom_sc.bode(wv)
Y_fom_ss = fom_ss.freqresp(wv)[0, 0, :]
mag_fom_ss = 20 * np.log10(np.abs(Y_fom_ss))
ph_fom_ss = np.angle(Y_fom_ss) * 180 / np.pi

print(np.max(np.abs(mag_fom_sc - mag_fom_ss)))

# Build rom