def test_condition_number(self):
        try:
            import KratosMultiphysics.ExternalSolversApplication
        except:
            self.skipTest(
                "KratosMultiphysics.ExternalSolversApplication is not available"
            )

        space = KratosMultiphysics.UblasSparseSpace()

        # Read the matrices
        K = KratosMultiphysics.CompressedMatrix()
        KratosMultiphysics.ReadMatrixMarketMatrix(GetFilePath("A.mm"), K)

        # Construct the solver
        import eigen_solver_factory
        settings_max = KratosMultiphysics.Parameters("""
        {
            "solver_type"             : "power_iteration_highest_eigenvalue_solver",
            "max_iteration"           : 10000,
            "tolerance"               : 1e-9,
            "required_eigen_number"   : 1,
            "verbosity"               : 0,
            "linear_solver_settings"  : {
                "solver_type"             : "SuperLUSolver",
                "max_iteration"           : 500,
                "tolerance"               : 1e-9,
                "scaling"                 : false,
                "verbosity"               : 0
            }
        }
        """)
        eigen_solver_max = eigen_solver_factory.ConstructSolver(settings_max)
        settings_min = KratosMultiphysics.Parameters("""
        {
            "solver_type"             : "power_iteration_eigenvalue_solver",
            "max_iteration"           : 10000,
            "tolerance"               : 1e-9,
            "required_eigen_number"   : 1,
            "verbosity"               : 0,
            "linear_solver_settings"  : {
                "solver_type"             : "SuperLUSolver",
                "max_iteration"           : 500,
                "tolerance"               : 1e-9,
                "scaling"                 : false,
                "verbosity"               : 0
            }
        }
        """)
        eigen_solver_min = eigen_solver_factory.ConstructSolver(settings_min)

        # Solve
        condition_number_utility = KratosMultiphysics.ConditionNumberUtility()
        condition_number = condition_number_utility.GetConditionNumber(
            K, eigen_solver_max, eigen_solver_min)

        self.assertLessEqual(abs(condition_number - 194.5739) / 194.5739, 1e-3)
    def test_condition_number(self):
        space = KratosMultiphysics.UblasSparseSpace()

        # Read the matrices
        K = KratosMultiphysics.CompressedMatrix()
        KratosMultiphysics.ReadMatrixMarketMatrix(GetFilePath("A.mm"), K)

        # Construct the solver
        import eigen_solver_factory
        settings_max = KratosMultiphysics.Parameters("""
        {
            "eigen_solver_settings"      : {
            "solver_type"                 : "PowerIterationHighestEigenvalueSolver",
                "max_iteration"           : 10000,
                "tolerance"               : 1e-9,
                "required_eigen_number"   : 1,
                "verbosity"               : 0
            },
            "linear_solver_settings"      : {
            "solver_type"             : "SuperLUSolver",
                "max_iteration"           : 500,
                "tolerance"               : 1e-9,
                "scaling"                 : false,
                "verbosity"               : 0
            }
        }
        """)
        eigen_solver_max = eigen_solver_factory.ConstructSolver(settings_max)
        settings_min = KratosMultiphysics.Parameters("""
        {
            "eigen_solver_settings"      : {
                "solver_type"             : "PowerIterationEigenvalueSolver",
                "max_iteration"           : 10000,
                "tolerance"               : 1e-9,
                "required_eigen_number"   : 1,
                "verbosity"               : 0
            },
            "linear_solver_settings"      : {
            "solver_type"             : "SuperLUSolver",
                "max_iteration"           : 500,
                "tolerance"               : 1e-9,
                "scaling"                 : false,
                "verbosity"               : 0
            }
        }
        """)
        eigen_solver_min = eigen_solver_factory.ConstructSolver(settings_min)

        # Solve
        condition_number_utility = KratosMultiphysics.ConditionNumberUtility()
        condition_number = condition_number_utility.GetConditionNumber(
            K, eigen_solver_max, eigen_solver_min)

        self.assertAlmostEqual(condition_number, 194.5739, 3)
    def _auxiliary_test_function(
            self,
            settings,
            matrix_name="auxiliar_files_for_python_unnitest/sparse_matrix_files/A.mm",
            eigen_value_estimated="lowest"):
        space = KratosMultiphysics.UblasSparseSpace()

        # Read the matrices
        K = KratosMultiphysics.CompressedMatrix()
        KratosMultiphysics.ReadMatrixMarketMatrix(GetFilePath(matrix_name), K)

        n = K.Size1()
        M = KratosMultiphysics.CompressedMatrix(n, n)

        for i in range(n):
            for j in range(n):
                if (i == j):
                    M[i, j] = 1.0

        # create result containers (they will be resized inside the solver)
        eigenvalues = KratosMultiphysics.Vector(n)
        eigenvectors = KratosMultiphysics.Matrix(n, 1)

        # Construct the solver
        import eigen_solver_factory
        eigen_solver = eigen_solver_factory.ConstructSolver(settings)

        # Solve
        eigen_solver.Solve(K, M, eigenvalues, eigenvectors)
        eigenvalue = eigenvalues[0]

        if (eigen_value_estimated == "lowest"):
            self.assertLessEqual(abs(eigenvalue - 0.061463) / 0.061463, 5.0e-3)
        else:
            self.assertLessEqual(abs(eigenvalue - 11.959) / 11.959, 5.0e-3)
Beispiel #4
0
    def _auxiliary_test_function(self, settings, matrix_name="A.mm", eigen_value_estimated = "lowest"):
        space = KratosMultiphysics.UblasSparseSpace()
        
        # Read the matrices
        K = KratosMultiphysics.CompressedMatrix()
        KratosMultiphysics.ReadMatrixMarketMatrix(GetFilePath(matrix_name),K)

        n = K.Size1()
        M = KratosMultiphysics.CompressedMatrix(n, n)
        
        for i in range(n):
            for j in range(n):
                if (i == j):
                    M[i, j] = 1.0
                else:
                    M[i, j] = 0.0

        # Construct the solver
        import eigen_solver_factory
        eigen_solver = eigen_solver_factory.ConstructSolver(settings)
        
        # Solve
        eigenvalue = eigen_solver.GetEigenValue(K, M)

        if (eigen_value_estimated == "lowest"):
            self.assertLessEqual(abs(eigenvalue - 0.061463)/0.061463, 5.0e-3)
        else:
            self.assertLessEqual(abs(eigenvalue - 11.959)/11.959, 5.0e-3)
    def test_mass_normalization(self):

        space = KratosMultiphysics.UblasSparseSpace()

        settings = KratosMultiphysics.Parameters('''{
            "solver_type": "eigen_eigensystem",
            "number_of_eigenvalues": 3,
            "max_iteration": 1000,
            "tolerance": 1e-8,
            "normalize_eigenvectors": true,
            "echo_level": 0
         }''')

        K = KratosMultiphysics.CompressedMatrix()

        this_file_dir = os.path.dirname(os.path.realpath(__file__))
        base_dir = os.path.dirname(os.path.dirname(os.path.dirname(this_file_dir)))
        matrix_file_path = os.path.join(base_dir, "kratos", "tests", "A.mm")

        KratosMultiphysics.ReadMatrixMarketMatrix(matrix_file_path, K) # symmetric test matrix

        n = K.Size1()
        self.assertEqual(n, 900)

        M = KratosMultiphysics.CompressedMatrix(n, n)

        for i in range(n):
            for j in range(n):
                if (i == j):
                    M[i, j] = 1.0

        # create result containers (they will be resized inside the solver)
        eigenvalues = KratosMultiphysics.Vector(n)
        eigenvectors = KratosMultiphysics.Matrix(n, 1)

        # Construct the solver
        eigen_solver = eigen_solver_factory.ConstructSolver(settings)

        # Solve
        eigen_solver.Solve(K, M, eigenvalues, eigenvectors)

        self.assertAlmostEqual(eigenvalues[0], 0.061463, 4)
        self.assertAlmostEqual(eigenvalues[1], 0.15318431112733275, 7)
        self.assertAlmostEqual(eigenvalues[2], 0.153184311127333, 7)


        # test mass normalization of eigenvectors
        for i in range(eigenvectors.Size1()):
            eigenvector = KratosMultiphysics.Vector(n)
            for j in range(n):
                eigenvector[j] = eigenvectors[i,j]

            _aux = KratosMultiphysics.Vector(n)
            space.Mult(M, eigenvector, _aux)

            value = 0.0
            for j in range(n):
                value += eigenvector[j] * _aux[j]

            self.assertAlmostEqual(value, 1.0, 7)
 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.
     """
     import eigen_solver_factory
     return eigen_solver_factory.ConstructSolver(self.eigensolver_settings)
Beispiel #7
0
    def __init__(self, convergence_criterion_parameters):
        # Note that all the convergence settings are introduced via a Kratos parameters object.
        echo_level = convergence_criterion_parameters["echo_level"].GetInt()
        convergence_criterion_name = convergence_criterion_parameters[
            "convergence_criterion"].GetString()
        if "contact" in convergence_criterion_name:
            D_RT = convergence_criterion_parameters[
                "displacement_relative_tolerance"].GetDouble()
            D_AT = convergence_criterion_parameters[
                "displacement_absolute_tolerance"].GetDouble()
            R_RT = convergence_criterion_parameters[
                "residual_relative_tolerance"].GetDouble()
            R_AT = convergence_criterion_parameters[
                "residual_absolute_tolerance"].GetDouble()
            CD_RT = convergence_criterion_parameters[
                "contact_displacement_relative_tolerance"].GetDouble()
            CD_AT = convergence_criterion_parameters[
                "contact_displacement_absolute_tolerance"].GetDouble()
            CR_RT = convergence_criterion_parameters[
                "contact_residual_relative_tolerance"].GetDouble()
            CR_AT = convergence_criterion_parameters[
                "contact_residual_absolute_tolerance"].GetDouble()
            condn_convergence_criterion = convergence_criterion_parameters[
                "condn_convergence_criterion"].GetBool()
            fancy_convergence_criterion = convergence_criterion_parameters[
                "fancy_convergence_criterion"].GetBool()
            print_convergence_criterion = convergence_criterion_parameters[
                "print_convergence_criterion"].GetBool()
            ensure_contact = convergence_criterion_parameters[
                "ensure_contact"].GetBool()
            gidio_debug = convergence_criterion_parameters[
                "gidio_debug"].GetBool()

            if (echo_level >= 1):
                KM.Logger.PrintInfo(
                    "::[Mechanical Solver]:: ",
                    "CONVERGENCE CRITERION : " + convergence_criterion_name)

            if (fancy_convergence_criterion == True):
                table = KM.TableStreamUtility()

            if (convergence_criterion_name == "contact_displacement_criterion"
                ):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, D_RT, D_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, D_RT, D_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_name == "contact_residual_criterion"):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_name == "contact_mixed_criterion"):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_name == "contact_and_criterion"):
                if (fancy_convergence_criterion == True):
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact, table,
                        print_convergence_criterion)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)

                Displacement.SetEchoLevel(echo_level)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    Residual, Displacement)

            elif (convergence_criterion_name == "contact_or_criterion"):
                if (fancy_convergence_criterion == True):
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact, table,
                        print_convergence_criterion)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)

                Displacement.SetEchoLevel(echo_level)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.OrCriteria(
                    Residual, Displacement)

            # Adding the mortar criteria
            mortar_type = convergence_criterion_parameters[
                "mortar_type"].GetString()
            if (mortar_type == "ALMContactFrictionless"):
                if (fancy_convergence_criterion == True):
                    Mortar = CSMA.ALMFrictionlessMortarConvergenceCriteria(
                        table, print_convergence_criterion, gidio_debug)
                else:
                    Mortar = CSMA.ALMFrictionlessMortarConvergenceCriteria()
            elif (mortar_type == "ALMContactFrictionlessComponents"):
                if (fancy_convergence_criterion == True):
                    Mortar = CSMA.ALMFrictionlessComponentsMortarConvergenceCriteria(
                        table, print_convergence_criterion, gidio_debug)
                else:
                    Mortar = CSMA.ALMFrictionlessComponentsMortarConvergenceCriteria(
                    )
            elif (mortar_type == "ALMContactFrictional"):
                if (fancy_convergence_criterion == True):
                    Mortar = CSMA.ALMFrictionalMortarConvergenceCriteria(
                        table, print_convergence_criterion, gidio_debug)
                else:
                    Mortar = CSMA.ALMFrictionalMortarConvergenceCriteria()
            elif ("MeshTying" in mortar_type):
                if (fancy_convergence_criterion == True):
                    Mortar = CSMA.MeshTyingMortarConvergenceCriteria(table)
                else:
                    Mortar = CSMA.MeshTyingMortarConvergenceCriteria()

            Mortar.SetEchoLevel(echo_level)

            if (fancy_convergence_criterion == True):

                if (condn_convergence_criterion == True):
                    # Construct the solver
                    import eigen_solver_factory
                    settings_max = KM.Parameters("""
                    {
                        "solver_type"             : "power_iteration_highest_eigenvalue_solver",
                        "max_iteration"           : 10000,
                        "tolerance"               : 1e-9,
                        "required_eigen_number"   : 1,
                        "verbosity"               : 0,
                        "linear_solver_settings"  : {
                            "solver_type"             : "SuperLUSolver",
                            "max_iteration"           : 500,
                            "tolerance"               : 1e-9,
                            "scaling"                 : false,
                            "verbosity"               : 0
                        }
                    }
                    """)
                    eigen_solver_max = eigen_solver_factory.ConstructSolver(
                        settings_max)
                    settings_min = KM.Parameters("""
                    {
                        "solver_type"             : "power_iteration_eigenvalue_solver",
                        "max_iteration"           : 10000,
                        "tolerance"               : 1e-9,
                        "required_eigen_number"   : 1,
                        "verbosity"               : 0,
                        "linear_solver_settings"  : {
                            "solver_type"             : "SuperLUSolver",
                            "max_iteration"           : 500,
                            "tolerance"               : 1e-9,
                            "scaling"                 : false,
                            "verbosity"               : 0
                        }
                    }
                    """)
                    eigen_solver_min = eigen_solver_factory.ConstructSolver(
                        settings_min)

                    condition_number_utility = KM.ConditionNumberUtility(
                        eigen_solver_max, eigen_solver_min)
                else:
                    condition_number_utility = None

                self.mechanical_convergence_criterion = CSMA.MortarAndConvergenceCriteria(
                    self.mechanical_convergence_criterion, Mortar, table,
                    print_convergence_criterion, condition_number_utility)
            else:
                self.mechanical_convergence_criterion = CSMA.MortarAndConvergenceCriteria(
                    self.mechanical_convergence_criterion, Mortar)
            self.mechanical_convergence_criterion.SetEchoLevel(echo_level)
            self.mechanical_convergence_criterion.SetActualizeRHSFlag(True)

        else:  # Standard criteria (same as structural mechanics application)
            # Construction of the class convergence_criterion
            import convergence_criteria_factory
            base_mechanical_convergence_criterion = convergence_criteria_factory.convergence_criterion(
                convergence_criterion_parameters)

            # Adding the mortar criteria
            mortar_type = convergence_criterion_parameters[
                "mortar_type"].GetString()
            if (mortar_type == "ALMContactFrictionless"):
                Mortar = CSMA.ALMFrictionlessMortarConvergenceCriteria()
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            elif (mortar_type == "ALMContactFrictionless"):
                Mortar = CSMA.ALMFrictionlessComponentsMortarConvergenceCriteria(
                )
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            elif (mortar_type == "ALMContactFrictional"):
                Mortar = CSMA.ALMFrictionalMortarConvergenceCriteria()
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            elif ("MeshTying" in mortar_type):
                Mortar = CSMA.MeshTyingMortarConvergenceCriteria()
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            else:
                self.mechanical_convergence_criterion = base_mechanical_convergence_criterion.mechanical_convergence_criterion
Beispiel #8
0
    def __init__(self, convergence_criterion_parameters):
        # Note that all the convergence settings are introduced via a Kratos parameters object.
        self.echo_level = convergence_criterion_parameters[
            "echo_level"].GetInt()
        self.convergence_criterion_name = convergence_criterion_parameters[
            "convergence_criterion"].GetString()
        self.mortar_type = convergence_criterion_parameters[
            "mortar_type"].GetString()
        self.frictional_decomposed = convergence_criterion_parameters[
            "frictional_decomposed"].GetBool()
        self.print_convergence_criterion = convergence_criterion_parameters[
            "print_convergence_criterion"].GetBool()
        self.compute_dynamic_factor = convergence_criterion_parameters[
            "compute_dynamic_factor"].GetBool()
        self.gidio_debug = convergence_criterion_parameters[
            "gidio_debug"].GetBool()
        if "contact" in self.convergence_criterion_name:
            D_RT = convergence_criterion_parameters[
                "displacement_relative_tolerance"].GetDouble()
            D_AT = convergence_criterion_parameters[
                "displacement_absolute_tolerance"].GetDouble()
            R_RT = convergence_criterion_parameters[
                "residual_relative_tolerance"].GetDouble()
            R_AT = convergence_criterion_parameters[
                "residual_absolute_tolerance"].GetDouble()
            CD_RT = convergence_criterion_parameters[
                "contact_displacement_relative_tolerance"].GetDouble()
            CD_AT = convergence_criterion_parameters[
                "contact_displacement_absolute_tolerance"].GetDouble()
            CR_RT = convergence_criterion_parameters[
                "contact_residual_relative_tolerance"].GetDouble()
            CR_AT = convergence_criterion_parameters[
                "contact_residual_absolute_tolerance"].GetDouble()
            FCD_RT = convergence_criterion_parameters[
                "frictional_contact_displacement_relative_tolerance"].GetDouble(
                )
            FCD_AT = convergence_criterion_parameters[
                "frictional_contact_displacement_absolute_tolerance"].GetDouble(
                )
            FCR_RT = convergence_criterion_parameters[
                "frictional_contact_residual_relative_tolerance"].GetDouble()
            FCR_AT = convergence_criterion_parameters[
                "frictional_contact_residual_absolute_tolerance"].GetDouble()
            condn_convergence_criterion = convergence_criterion_parameters[
                "condn_convergence_criterion"].GetBool()
            ensure_contact = convergence_criterion_parameters[
                "ensure_contact"].GetBool()

            if self.echo_level >= 1:
                KM.Logger.PrintInfo(
                    "::[Mechanical Solver]:: ", "CONVERGENCE CRITERION : " +
                    self.convergence_criterion_name)

            if self.convergence_criterion_name == "contact_displacement_criterion":
                if (self.mortar_type == "ALMContactFrictional"
                        and self.frictional_decomposed):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierFrictionalContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, FCD_RT, FCD_AT,
                        ensure_contact, self.print_convergence_criterion)
                elif "Penalty" in self.mortar_type:
                    self.mechanical_convergence_criterion = CSMA.DisplacementContactCriteria(
                        D_RT, D_AT, self.print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact,
                        self.print_convergence_criterion)

                self.mechanical_convergence_criterion.SetEchoLevel(
                    self.echo_level)

            elif self.convergence_criterion_name == "contact_residual_criterion":
                if (self.mortar_type == "ALMContactFrictional"
                        and self.frictional_decomposed):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualFrictionalContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, FCR_RT, FCR_AT,
                        ensure_contact, self.print_convergence_criterion)
                elif "Penalty" in self.mortar_type:
                    self.mechanical_convergence_criterion = CSMA.DisplacementResidualContactCriteria(
                        R_RT, R_AT, self.print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact,
                        self.print_convergence_criterion)
                self.mechanical_convergence_criterion.SetEchoLevel(
                    self.echo_level)

            elif self.convergence_criterion_name == "contact_mixed_criterion":
                if (self.mortar_type == "ALMContactFrictional"
                        and self.frictional_decomposed):
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedFrictionalontactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, FCR_RT, FCR_AT,
                        ensure_contact, self.print_convergence_criterion)
                elif "Penalty" in self.mortar_type:
                    self.mechanical_convergence_criterion = CSMA.DisplacementResidualContactCriteria(
                        R_RT, R_AT, self.print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact,
                        self.print_convergence_criterion)
                self.mechanical_convergence_criterion.SetEchoLevel(
                    self.echo_level)

            elif self.convergence_criterion_name == "contact_and_criterion":
                if "Penalty" in self.mortar_type:
                    Displacement = CSMA.DisplacementContactCriteria(
                        D_RT, D_AT, self.print_convergence_criterion)
                    Residual = CSMA.DisplacementResidualContactCriteria(
                        R_RT, R_AT, self.print_convergence_criterion)
                else:
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact,
                        self.print_convergence_criterion)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact,
                        self.print_convergence_criterion)

                Displacement.SetEchoLevel(self.echo_level)
                Residual.SetEchoLevel(self.echo_level)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    Residual, Displacement)

            elif self.convergence_criterion_name == "contact_or_criterion":
                if "Penalty" in self.mortar_type:
                    Displacement = CSMA.DisplacementContactCriteria(
                        D_RT, D_AT, self.print_convergence_criterion)
                    Residual = CSMA.DisplacementResidualContactCriteria(
                        R_RT, R_AT, self.print_convergence_criterion)
                else:
                    Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact,
                        self.print_convergence_criterion)
                    Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact,
                        self.print_convergence_criterion)

                Displacement.SetEchoLevel(self.echo_level)
                Residual.SetEchoLevel(self.echo_level)
                self.mechanical_convergence_criterion = KM.OrCriteria(
                    Residual, Displacement)

            # Adding the mortar criteria
            Mortar = self.GetMortarCriteria()

            if (condn_convergence_criterion is True):
                # Construct the solver
                import eigen_solver_factory
                settings_max = KM.Parameters("""
                {
                    "solver_type"             : "power_iteration_highest_eigenvalue_solver",
                    "max_iteration"           : 10000,
                    "tolerance"               : 1e-9,
                    "required_eigen_number"   : 1,
                    "verbosity"               : 0,
                    "linear_solver_settings"  : {
                        "solver_type"             : "SuperLUSolver",
                        "max_iteration"           : 500,
                        "tolerance"               : 1e-9,
                        "scaling"                 : false,
                        "verbosity"               : 0
                    }
                }
                """)
                eigen_solver_max = eigen_solver_factory.ConstructSolver(
                    settings_max)
                settings_min = KM.Parameters("""
                {
                    "solver_type"             : "power_iteration_eigenvalue_solver",
                    "max_iteration"           : 10000,
                    "tolerance"               : 1e-9,
                    "required_eigen_number"   : 1,
                    "verbosity"               : 0,
                    "linear_solver_settings"  : {
                        "solver_type"             : "SuperLUSolver",
                        "max_iteration"           : 500,
                        "tolerance"               : 1e-9,
                        "scaling"                 : false,
                        "verbosity"               : 0
                    }
                }
                """)
                eigen_solver_min = eigen_solver_factory.ConstructSolver(
                    settings_min)

                condition_number_utility = KM.ConditionNumberUtility(
                    eigen_solver_max, eigen_solver_min)
            else:
                condition_number_utility = None

            self.mechanical_convergence_criterion = CSMA.MortarAndConvergenceCriteria(
                self.mechanical_convergence_criterion, Mortar,
                self.print_convergence_criterion, condition_number_utility)

            self.mechanical_convergence_criterion.SetEchoLevel(self.echo_level)
            self.mechanical_convergence_criterion.SetActualizeRHSFlag(True)

        elif self.convergence_criterion_name == "adaptative_remesh_criteria":
            self.mechanical_convergence_criterion = None
        else:  # Standard criteria (same as structural mechanics application)
            # Construction of the class convergence_criterion
            import convergence_criteria_factory
            base_mechanical_convergence_criterion = convergence_criteria_factory.convergence_criterion(
                convergence_criterion_parameters)

            # Adding the mortar criteria
            if "ALMContact" in self.mortar_type or "MeshTying" in self.mortar_type:
                Mortar = self.GetMortarCriteria(False)
                self.mechanical_convergence_criterion = KM.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                self.mechanical_convergence_criterion.SetActualizeRHSFlag(True)
            else:
                self.mechanical_convergence_criterion = base_mechanical_convergence_criterion.mechanical_convergence_criterion
Beispiel #9
0
    def ComputeConditionNumber(self):
        NumberOfNodes = self.main_model_part.NumberOfNodes()
        self.work_dir = '/home/inigo/simulations/naca0012/07_salome/05_MeshRefinement/'
        #self.work_dir = '/home/inigo/simulations/naca0012/07_salome/06_Rectangle/'

        Size1 = self.solver.GetSystemMatrix()
        print('Size1 =', Size1.Size1())

        if (NumberOfNodes < 5.0e1):

            print('\nComputing condition number . . .\n')

            import eigen_solver_factory
            settings_max = KratosMultiphysics.Parameters("""
            {
                "solver_type"             : "power_iteration_highest_eigenvalue_solver",
                "max_iteration"           : 10000,
                "tolerance"               : 1e-9,
                "required_eigen_number"   : 1,
                "verbosity"               : 0,
                "linear_solver_settings"  : {
                    "solver_type"             : "SuperLUSolver",
                    "max_iteration"           : 500,
                    "tolerance"               : 1e-9,
                    "scaling"                 : false,
                    "verbosity"               : 0
                }
            }
            """)
            eigen_solver_max = eigen_solver_factory.ConstructSolver(
                settings_max)
            settings_min = KratosMultiphysics.Parameters("""
            {
                "solver_type"             : "power_iteration_eigenvalue_solver",
                "max_iteration"           : 10000,
                "tolerance"               : 1e-9,
                "required_eigen_number"   : 1,
                "verbosity"               : 0,
                "linear_solver_settings"  : {
                    "solver_type"             : "SuperLUSolver",
                    "max_iteration"           : 500,
                    "tolerance"               : 1e-9,
                    "scaling"                 : false,
                    "verbosity"               : 0
                }
            }
            """)

            eigen_solver_min = eigen_solver_factory.ConstructSolver(
                settings_min)
            condition_number = KratosMultiphysics.ConditionNumberUtility(
            ).GetConditionNumber(self.solver.GetSystemMatrix(),
                                 eigen_solver_max, eigen_solver_min)

            if (abs(condition_number - 1.0) < 1e-4):
                print(
                    'Singular System. Not able to compute Condition Number. Zero EigenValue'
                )
                with open(self.work_dir + "mesh_refinement_loads.dat",
                          'a') as loads_file:
                    loads_file.write('%16s' % ("Zero Eigen"))
                    loads_file.flush()

                with open(self.work_dir + "plots/results/all_cases.dat",
                          'a') as all_cases_file:
                    all_cases_file.write('%16s' % ("Zero Eigen"))
                    all_cases_file.flush()

            else:
                print('condition_number = {:.2e}'.format(condition_number))

                with open(self.work_dir + "mesh_refinement_loads.dat",
                          'a') as loads_file:
                    loads_file.write('{0:16.2e}'.format(condition_number))
                    loads_file.flush()

                with open(self.work_dir + "plots/results/all_cases.dat",
                          'a') as all_cases_file:
                    all_cases_file.write('{0:16.2e}'.format(condition_number))
                    all_cases_file.flush()

                condition_results_file_name = self.work_dir + "plots/condition_number/data/condition/condition_results.dat"
                with open(condition_results_file_name, 'a') as condition_file:
                    condition_file.write('{0:16.2e} {1:16.2e}\n'.format(
                        NumberOfNodes, condition_number))
                    condition_file.flush()

            print('\nComputing condition number finished . . .\n')
        else:
            with open(self.work_dir + "mesh_refinement_loads.dat",
                      'a') as loads_file:
                loads_file.write('%16s' % ("Not Comp."))
                loads_file.flush()

            with open(self.work_dir + "plots/results/all_cases.dat",
                      'a') as all_cases_file:
                all_cases_file.write('%16s' % ("Not Comp."))
                all_cases_file.flush()