def _create_linear_solver(self):
     linear_solver_configuration = self.settings["linear_solver_settings"]
     if linear_solver_configuration.Has("solver_type"): # user specified a linear solver
         return linear_solver_factory.ConstructSolver(linear_solver_configuration)
     else:
         KratosMultiphysics.Logger.PrintInfo('::[MechanicalSolver]:: No linear solver was specified, using fastest available solver')
         return linear_solver_factory.CreateFastestAvailableDirectLinearSolver()
Ejemplo n.º 2
0
def ConstructSolver(settings):
    if not isinstance(settings, KM.Parameters):
        raise Exception("Input is expected to be provided as a Kratos Parameters object")

    solver_type = settings["solver_type"].GetString()

    if solver_type == "eigen_eigensystem":
        if kratos_utils.CheckIfApplicationsAvailable("EigenSolversApplication"):
            import KratosMultiphysics.EigenSolversApplication as EiSA
            eigen_solver = EiSA.EigensystemSolver(settings)
            return eigen_solver
        else:
            raise Exception("EigenSolversApplication not available")
    elif solver_type == "feast":
        if kratos_utils.CheckIfApplicationsAvailable("EigenSolversApplication"):
            import KratosMultiphysics.EigenSolversApplication as EiSA
            if EiSA.HasFEAST():
                is_symmetric = settings["symmetric"].GetBool() if settings.Has("symmetric") else True
                eigen_solver = EiSA.FEASTSymmetricEigensystemSolver(settings) if is_symmetric else EiSA.FEASTGeneralEigensystemSolver(settings)
                return eigen_solver
            else:
                raise Exception("FEAST not available in EigenSolversApplication")
        else:
            raise Exception("EigenSolversApplication not available")
    elif solver_type == "feast_complex":
        if kratos_utils.CheckIfApplicationsAvailable("EigenSolversApplication"):
            import KratosMultiphysics.EigenSolversApplication as EiSA
            if EiSA.HasFEAST():
                is_symmetric = settings["symmetric"].GetBool() if settings.Has("symmetric") else True
                eigen_solver = EiSA.ComplexFEASTSymmetricEigensystemSolver(settings) if is_symmetric else EiSA.ComplexFEASTGeneralEigensystemSolver(settings)
                return eigen_solver
            else:
                raise Exception("FEAST not available in EigenSolversApplication")
        else:
            raise Exception("EigenSolversApplication not available")

    linear_solver_configuration = settings["linear_solver_settings"]
    if linear_solver_configuration.Has("solver_type"): # user specified a linear solver
        linear_solver = linear_solver_factory.ConstructSolver(linear_solver_configuration)
    else:
        linear_solver = linear_solver_factory.CreateFastestAvailableDirectLinearSolver()

    if solver_type == "power_iteration_eigenvalue_solver":
        eigen_solver = KM.PowerIterationEigenvalueSolver( settings, linear_solver)
    elif solver_type == "power_iteration_highest_eigenvalue_solver":
        eigen_solver = KM.PowerIterationHighestEigenvalueSolver( settings, linear_solver)
    elif solver_type == "rayleigh_quotient_iteration_eigenvalue_solver":
        eigen_solver = KM.RayleighQuotientIterationEigenvalueSolver( settings, linear_solver)
    else:
        raise Exception("Solver type not found. Asking for :" + solver_type)

    return eigen_solver