Skip to content
Snippets Groups Projects
Commit 1de1eeaf authored by Adrien Crovato's avatar Adrien Crovato
Browse files

Add structural damping via complex proportional stiffness method.

parent 2e117e60
Branches master
Tags v1.1.0
1 merge request!1Vesion 1.1
Pipeline #23837 passed
...@@ -35,7 +35,8 @@ def init_pypk(cfg): ...@@ -35,7 +35,8 @@ def init_pypk(cfg):
else: else:
raise RuntimeError('"fluid" entry must be "unmatched" or "matched_isa"!\n') raise RuntimeError('"fluid" entry must be "unmatched" or "matched_isa"!\n')
# Eigen solver # Eigen solver
eig = EigenSolver(cfg['l_ref'], cfg['n_modes']) g = cfg['g_struct'] if 'g_struct' in cfg else 0.0
eig = EigenSolver(cfg['l_ref'], cfg['n_modes'], g)
# Aggregator # Aggregator
agg = KSAggregator(cfg['rho_ks']) agg = KSAggregator(cfg['rho_ks'])
# p-k method # p-k method
......
...@@ -20,9 +20,10 @@ import scipy.linalg as spla ...@@ -20,9 +20,10 @@ import scipy.linalg as spla
class EigenSolver: class EigenSolver:
"""Eigen solver """Eigen solver
""" """
def __init__(self, l, n): def __init__(self, l, n, g=0):
self._l = l # reference length self._l = l # reference length
self._n = n # number of modes self._n = n # number of modes
self._g = (1 + 1j * g) # structural damping (complex proportional stiffness)
def compute(self, rho, u, m, k, q): def compute(self, rho, u, m, k, q):
"""Compute eigenvalues and eigenvectors """Compute eigenvalues and eigenvectors
...@@ -32,7 +33,7 @@ class EigenSolver: ...@@ -32,7 +33,7 @@ class EigenSolver:
k : stiffness matrix k : stiffness matrix
q : aerodynamic matrix q : aerodynamic matrix
""" """
p, v = spla.eig(k - 0.5 * rho * u**2 * q, -u**2 / self._l**2 * m) # det((p*u/l)^2*M + K - q_inf*Q) = 0 p, v = spla.eig(self._g * k - 0.5 * rho * u**2 * q, -u**2 / self._l**2 * m) # det((p*u/l)^2*M + K - q_inf*Q) = 0
p = np.sqrt(p) p = np.sqrt(p)
# Sort # Sort
p = np.where(np.imag(p) < 0, -p, p) # change sign of p if imag(p) < 0 p = np.where(np.imag(p) < 0, -p, p) # change sign of p if imag(p) < 0
...@@ -58,10 +59,10 @@ class EigenSolver: ...@@ -58,10 +59,10 @@ class EigenSolver:
a = np.zeros((self._n + 1, self._n + 1), dtype=complex) a = np.zeros((self._n + 1, self._n + 1), dtype=complex)
b = np.zeros((self._n + 1, 1), dtype=complex) b = np.zeros((self._n + 1, 1), dtype=complex)
a[:-1,0] = -2 * p * u**2 / self._l**2 * m @ v a[:-1,0] = -2 * p * u**2 / self._l**2 * m @ v
a[:-1,1:] = p**2 * u**2 / self._l**2 * m + k - 0.5 * rho * u**2 * q a[:-1,1:] = p**2 * u**2 / self._l**2 * m + self._g * k - 0.5 * rho * u**2 * q
a[-1,0] = 0 a[-1,0] = 0
a[-1,1:] = v.T a[-1,1:] = v.T
b[:-1,0] = (p**2 * u**2 / self._l**2 * dm + dk - 0.5 * rho * u**2 * dq) @ v b[:-1,0] = (p**2 * u**2 / self._l**2 * dm + self._g * dk - 0.5 * rho * u**2 * dq) @ v
b[-1,0] = 0 b[-1,0] = 0
x = spla.lu_solve((spla.lu_factor(a)), b) x = spla.lu_solve((spla.lu_factor(a)), b)
return x[0,0] return x[0,0]
...@@ -32,6 +32,7 @@ def get_cfg(): ...@@ -32,6 +32,7 @@ def get_cfg():
'mu': 143.920, # mass ratio 'mu': 143.920, # mass ratio
'f_ref': 40.3511, # frequency of first torsional mode 'f_ref': 40.3511, # frequency of first torsional mode
'n_modes': 4, # number of modes 'n_modes': 4, # number of modes
'g_struct': 0.02, # structural damping
'rho_ks': 1e6, # KS aggregation parameter for KS 'rho_ks': 1e6, # KS aggregation parameter for KS
'method': 'nipk', # method type 'method': 'nipk', # method type
'fluid': 'unmatched', # fluid type 'fluid': 'unmatched', # fluid type
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment