コード例 #1
0
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
コード例 #2
0
    
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()

コード例 #3
0
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]