diff --git a/doc/jcl_template.py b/doc/jcl_template.py index 7c4f5eb..81bea31 100755 --- a/doc/jcl_template.py +++ b/doc/jcl_template.py @@ -335,10 +335,13 @@ def __init__(self): 'support': [0, 1, 2, 3, 4, 5], # True or False, enables flutter check with k, ke or pk method 'flutter': False, - # flutter parameters for k and ke method + # Flutter parameters for k and ke method 'flutter_para': {'method': 'k', 'k_red': np.linspace(2.0, 0.001, 1000)}, - # flutter parameters for pk method - # 'flutter_para': {'method': 'pk', 'Vtas': np.linspace(100.0, 500.0, 100)}, + # Flutter parameters for pk method + # There are two implementations of the PK method: 'pk_schwochow', 'pk_rodden' + # Available mode tracking algortihms: 'MAC', 'MACXP', 'MAC*PCC' (recommended) + # 'flutter_para': {'method': 'pk', 'Vtas': np.linspace(100.0, 500.0, 100), + # 'tracking': 'MAC*PCC'}, }, ] # End diff --git a/loadskernel/equations/frequency_domain.py b/loadskernel/equations/frequency_domain.py index a742e74..695654e 100644 --- a/loadskernel/equations/frequency_domain.py +++ b/loadskernel/equations/frequency_domain.py @@ -628,11 +628,19 @@ def eval_equations(self): def calc_eigenvalues(self, A, eigenvalues_old, eigenvectors_old): eigenvalue, eigenvector = linalg.eig(A) - # To match the modes with the previous step, use a combination of modal assurance criterion and pole correlation. - # This improves the handling of complex conjugate poles. - MAC = fem_helper.calc_MAC(eigenvectors_old, eigenvector) - PCC = fem_helper.calc_PCC(eigenvalues_old, eigenvalue) - idx_pos = self.get_best_match(MAC * PCC) + # To match the modes with the previous step, use a correlation cirterion as specified in the JCL. + # The MAC matrix is used as default. + if 'tracking' not in self.simcase['flutter_para']: + MAC = fem_helper.calc_MAC(eigenvectors_old, eigenvector) + elif self.simcase['flutter_para']['tracking'] == 'MAC': + MAC = fem_helper.calc_MAC(eigenvectors_old, eigenvector) + elif self.simcase['flutter_para']['tracking'] == 'MACXP': + MAC = fem_helper.calc_MACXP(eigenvectors_old, eigenvector) + elif self.simcase['flutter_para']['tracking'] == 'MAC*PCC': + # This is a combination of modal assurance criterion and pole correlation and improves the handling of complex + # conjugate poles. + MAC = fem_helper.calc_MAC(eigenvectors_old, eigenvector) * fem_helper.calc_PCC(eigenvalues_old, eigenvalue) + idx_pos = self.get_best_match(MAC) eigenvalues = eigenvalue[idx_pos] eigenvectors = eigenvector[:, idx_pos] return eigenvalues, eigenvectors