def solve(self, problem:Problem): problem.reassign_dofs() M = problem.M(True) K = problem.K(True) ndofs = 3 * len(problem.nodes) free_dofs = problem.free_dofs() full_eigenvectors = np.zeros((len(free_dofs), ndofs)) # Unsymmetric reduction A = np.linalg.solve(M, K) # Symmetry preserving reduction #L = np.linalg.cholesky(M) #A = np.linalg.inv(L) @ K @ np.linalg.inv(L.T) eigenvalues, eigenvectors = np.linalg.eig(A) eigenvectors = eigenvectors.T # Row-major eigenvectors = eigenvectors[eigenvalues.argsort()] eigenvalues.sort() full_eigenvectors[:,free_dofs] = eigenvectors return results.ResultsModal(problem, eigenvalues, full_eigenvectors)