def _create_linear_solver(self): """Create the eigensolver. This overrides the base class method and replaces the usual linear solver with an eigenvalue problem solver. """ if self.eigensolver_settings["solver_type"].GetString() == "FEAST": feast_system_solver_settings = self.eigensolver_settings[ "linear_solver_settings"] if feast_system_solver_settings["solver_type"].GetString( ) == "complex_skyline_lu_solver": # default built-in feast system solver linear_solver = ExternalSolversApplication.FEASTSolver( self.eigensolver_settings) elif feast_system_solver_settings["solver_type"].GetString( ) == "pastix": feast_system_solver = ExternalSolversApplication.PastixComplexSolver( feast_system_solver_settings) linear_solver = ExternalSolversApplication.FEASTSolver( self.eigensolver_settings, feast_system_solver) else: raise Exception( "Unsupported FEAST system solver_type: " + feast_system_solver_settings["solver_type"].GetString()) else: raise Exception( "Unsupported eigensolver solver_type: " + self.eigensolver_settings["solver_type"].GetString()) return linear_solver
def Initialize(self): self.compute_model_part = self.GetComputeModelPart() self.eigensolver_settings = self.settings["eigensolver_settings"] if self.eigensolver_settings["solver_type"].GetString() == "FEAST": linear_solver_settings = self.eigensolver_settings["linear_solver_settings"] if linear_solver_settings["solver_type"].GetString() == "skyline_lu": # default built-in feast system solver self.eigen_solver = ExternalSolversApplication.FEASTSolver(self.eigensolver_settings) else: # external feast system solver feast_system_solver = self._GetFEASTSystemSolver(linear_solver_settings) self.eigen_solver = ExternalSolversApplication.FEASTSolver(self.eigensolver_settings, feast_system_solver) else: raise Exception("solver_type is not yet implemented: " + self.eigensolver_settings["solver_type"].GetString()) if self.settings["solution_type"].GetString() == "Dynamic": self.scheme = StructuralMechanicsApplication.EigensolverDynamicScheme() else: raise Exception("solution_type is not yet implemented.") self.builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(self.eigen_solver) self.solver = StructuralMechanicsApplication.EigensolverStrategy( self.compute_model_part, self.scheme, self.builder_and_solver)
def _solve_eigen(self, mp, echo=0): feast_system_solver_settings = KratosMultiphysics.Parameters("""{ }""") eigensolver_settings = KratosMultiphysics.Parameters(""" { "perform_stochastic_estimate": false, "lambda_min": 1.0e-2, "lambda_max": 25.0, "search_dimension": 7 } """) if not (hasattr(KratosMultiphysics.ExternalSolversApplication, "PastixComplexSolver")): self.skipTest('"PastixComplexSolver" not available') feast_system_solver = ExternalSolversApplication.PastixComplexSolver( feast_system_solver_settings) eigen_solver = ExternalSolversApplication.FEASTSolver( eigensolver_settings, feast_system_solver) builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( eigen_solver) eigen_scheme = StructuralMechanicsApplication.EigensolverDynamicScheme( ) eig_strategy = StructuralMechanicsApplication.EigensolverStrategy( mp, eigen_scheme, builder_and_solver) eig_strategy.SetEchoLevel(echo) eig_strategy.Solve()
def test_undamped_mdof_system_eigen(self): import KratosMultiphysics.ExternalSolversApplication as ExternalSolversApplication # FEAST is available otherwise this test is not being called if not hasattr(KratosMultiphysics.ExternalSolversApplication, "PastixSolver"): self.skipTest("Pastix Solver is not available") current_model = KratosMultiphysics.Model() mp = self._set_up_mdof_system(current_model) #set parameters mp.Elements[1].SetValue(KratosMultiphysics.NODAL_MASS, 20.0) mp.Elements[2].SetValue( StructuralMechanicsApplication.NODAL_DISPLACEMENT_STIFFNESS, [200.0, 200.0, 200.0]) mp.Elements[3].SetValue(KratosMultiphysics.NODAL_MASS, 40.0) mp.Elements[4].SetValue( StructuralMechanicsApplication.NODAL_DISPLACEMENT_STIFFNESS, [400.0, 400.0, 400.0]) #create solver eigen_solver_parameters = KratosMultiphysics.Parameters(""" { "solver_type": "FEAST", "print_feast_output": false, "perform_stochastic_estimate": false, "solve_eigenvalue_problem": true, "lambda_min": 0.0, "lambda_max": 4.0e5, "number_of_eigenvalues": 2, "search_dimension": 18, "linear_solver_settings": { "solver_type" : "pastix", "echo_level" : 0 } }""") feast_system_solver = ExternalSolversApplication.PastixComplexSolver( eigen_solver_parameters["linear_solver_settings"]) eigen_solver = ExternalSolversApplication.FEASTSolver( eigen_solver_parameters, feast_system_solver) scheme = StructuralMechanicsApplication.EigensolverDynamicScheme() builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( eigen_solver) solver = StructuralMechanicsApplication.EigensolverStrategy( mp, scheme, builder_and_solver) solver.Solve() current_eigenvalues = [ ev for ev in mp.ProcessInfo[ StructuralMechanicsApplication.EIGENVALUE_VECTOR] ] analytical_eigenvalues = [5, 20] for ev in range(len(analytical_eigenvalues)): self.assertAlmostEqual(current_eigenvalues[ev], analytical_eigenvalues[ev])
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") 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) elif solver_type == "FEAST" or solver_type == "feast": if kratos_utils.CheckIfApplicationsAvailable( "ExternalSolversApplication"): import KratosMultiphysics.ExternalSolversApplication as ExSA eigen_solver = ExSA.FEASTSolver(settings, linear_solver) else: raise Exception("ExternalSolversApplication not available") else: raise Exception("Solver type not found. Asking for :" + solver_type) return eigen_solver
def Initialize(self): self.eigensolver_settings = self.settings["eigensolver_settings"] solver_type = self.eigensolver_settings["solver_type"].GetString() solution_type = self.settings["solution_type"].GetString() if solver_type == "FEAST": self.linear_solver = KratosExternal.FEASTSolver(self.eigensolver_settings) else: raise Exception("solver_type is not yet implemented.") if solution_type == "Dynamic": self.scheme = KratosStructural.EigensolverDynamicScheme() else: raise Exception("solution_type is not yet implemented.") self.builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(self.linear_solver) self.solver = KratosStructural.EigensolverStrategy( self.main_model_part, self.scheme, self.builder_and_solver)