def SolveStatic( mbs, simulationSettings=exudyn.SimulationSettings(), updateInitialValues=False, storeSolver=True, showHints=False, showCausingItems=True, ): staticSolver = exudyn.MainSolverStatic() if storeSolver: mbs.sys[ 'staticSolver'] = staticSolver #copy solver structure to sys variable mbs.sys[ 'simulationSettings'] = simulationSettings #link to last simulation settings success = False try: success = staticSolver.SolveSystem(mbs, simulationSettings) except: pass #print error message after except, to catch all errors if not success: # exudyn.Print not shown in Spyder at this time (because of exception?) # exudyn.Print(SolverErrorMessage(staticSolver, mbs, isStatic=True, showCausingObjects=showCausingItems, # showCausingNodes=showCausingItems, showHints=showHints)) print( SolverErrorMessage(staticSolver, mbs, isStatic=True, showCausingObjects=showCausingItems, showCausingNodes=showCausingItems, showHints=showHints)) raise ValueError("SolveStatic terminated due to errors") elif updateInitialValues: currentState = mbs.systemData.GetSystemState() #get current values mbs.systemData.SetSystemState( systemStateList=currentState, configuration=exudyn.ConfigurationType.Initial) return success
if exudynTestGlobals.useGraphics: #only start graphics once, but after background is set exu.StartRenderer() simulationSettings.staticSolver.numberOfLoadSteps = 10 simulationSettings.staticSolver.adaptiveStep = True import numpy as np testRefVal = 0 #compute eigenvalues manually: calcEig = True if calcEig: from scipy.linalg import solve, eigh, eig #eigh for symmetric matrices, positive definite staticSolver = exu.MainSolverStatic() #staticSolver.SolveSystem(mbs, simulationSettings) staticSolver.InitializeSolver(mbs, simulationSettings) staticSolver.ComputeMassMatrix(mbs) m = staticSolver.GetSystemMassMatrix() #exu.Print("m =",m) staticSolver.ComputeJacobianODE2RHS(mbs) staticSolver.ComputeJacobianAE(mbs) K = staticSolver.GetSystemJacobian() #exu.Print("K =",K) nODE2 = staticSolver.GetODE2size()
def ComputeODE2Eigenvalues(mbs, simulationSettings=exudyn.SimulationSettings(), useSparseSolver=False, numberOfEigenvalues=0, setInitialValues=True, convert2Frequencies=False): import numpy as np #use static solver, as it does not include factors from time integration (and no velocity derivatives) in the jacobian staticSolver = exudyn.MainSolverStatic() #initialize solver with initial values staticSolver.InitializeSolver(mbs, simulationSettings) staticSolver.ComputeMassMatrix(mbs) M = staticSolver.GetSystemMassMatrix() staticSolver.ComputeJacobianODE2RHS( mbs) #compute ODE2 part of jacobian ==> stored internally in solver staticSolver.ComputeJacobianAE( mbs) #compute algebraic part of jacobian (not needed here...) jacobian = staticSolver.GetSystemJacobian() #read out stored jacobian nODE2 = staticSolver.GetODE2size() #obtain ODE2 part from jacobian == stiffness matrix K = jacobian[0:nODE2, 0:nODE2] if not useSparseSolver: from scipy.linalg import eigh #eigh for symmetric matrices, positive definite; eig for standard eigen value problems [eigenValuesUnsorted, eigenVectors ] = eigh(K, M) #this gives omega^2 ... squared eigen frequencies (rad/s) eigenValues = np.sort( a=abs(eigenValuesUnsorted)) #eigh returns unsorted eigenvalues... if numberOfEigenvalues > 0: eigenValues = eigenValues[0:numberOfEigenvalues] eigenVectors = eigenVectors[0:numberOfEigenvalues] else: if numberOfEigenvalues == 0: #compute all eigenvalues numberOfEigenvalues = nODE2 from scipy.sparse.linalg import eigsh, csr_matrix #eigh for symmetric matrices, positive definite Kcsr = csr_matrix(K) Mcsr = csr_matrix(M) #use "LM" (largest magnitude), but shift-inverted mode with sigma=0, to find the zero-eigenvalues: #see https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html [eigenValues, eigenVectors] = eigsh(A=Kcsr, k=numberOfEigenvalues, M=Mcsr, which='LM', sigma=0, mode='normal') #sort eigenvalues eigenValues = np.sort(a=abs(eigenValues)) if convert2Frequencies: eigenFrequencies = np.sqrt(eigenValues) / (2 * np.pi) return [eigenFrequencies, eigenVectors] else: return [eigenValues, eigenVectors]