def _create_convergence_criterion(self):
        # Creation of an auxiliar Kratos parameters object to store the convergence settings
        conv_params = KratosMultiphysics.Parameters("{}")
        conv_params.AddValue(
            "convergence_criterion",
            self.solving_strategy_settings["convergence_criterion"])
        # conv_params.AddEmptyValue("rotation_dofs").SetBool(self._check_input_dof("ROTATION"))
        conv_params.AddEmptyValue("echo_level").SetInt(self.echo_level)
        is_component_wise = False
        if (self.solving_strategy_settings["builder_type"].GetString() ==
                "component_wise"):
            is_component_wise = True
        conv_params.AddEmptyValue("component_wise").SetBool(is_component_wise)
        conv_params.AddValue(
            "displacement_relative_tolerance",
            self.solving_strategy_settings["variable_relative_tolerance"])
        conv_params.AddValue(
            "displacement_absolute_tolerance",
            self.solving_strategy_settings["variable_absolute_tolerance"])
        conv_params.AddValue(
            "residual_relative_tolerance",
            self.solving_strategy_settings["residual_relative_tolerance"])
        conv_params.AddValue(
            "residual_absolute_tolerance",
            self.solving_strategy_settings["residual_absolute_tolerance"])

        # Construction of the class convergence_criterion
        import convergence_criteria_factory
        convergence_criterion = convergence_criteria_factory.convergence_criterion(
            conv_params)

        return convergence_criterion.mechanical_convergence_criterion
Esempio n. 2
0
    def _GetConvergenceCriterion(self):
        # Creation of an auxiliar Kratos parameters object to store the convergence settings
        conv_params = KratosMultiphysics.Parameters("{}")
        conv_params.AddValue("convergence_criterion",
                             self.settings["convergence_criterion"])
        conv_params.AddValue("rotation_dofs", self.settings["rotation_dofs"])
        conv_params.AddValue("echo_level", self.settings["echo_level"])
        conv_params.AddValue("component_wise", self.settings["component_wise"])
        conv_params.AddValue("displacement_relative_tolerance",
                             self.settings["displacement_relative_tolerance"])
        conv_params.AddValue("displacement_absolute_tolerance",
                             self.settings["displacement_absolute_tolerance"])
        conv_params.AddValue("residual_relative_tolerance",
                             self.settings["residual_relative_tolerance"])
        conv_params.AddValue("residual_absolute_tolerance",
                             self.settings["residual_absolute_tolerance"])

        # Construction of the class convergence_criterion
        import convergence_criteria_factory
        convergence_criterion = convergence_criteria_factory.convergence_criterion(
            conv_params)

        if self.settings["compute_mortar_contact"].GetInt() > 0:
            Mortar = KratosMultiphysics.ContactStructuralMechanicsApplication.MortarConvergenceCriteria(
            )
            Mortar.SetEchoLevel(self.echo_level)

            convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                Mortar, convergence_criterion.mechanical_convergence_criterion)

        return convergence_criterion.mechanical_convergence_criterion
 def _create_convergence_criterion(self):
     # Create an auxiliary Kratos parameters object to store the convergence settings.
     conv_params = KratosMultiphysics.Parameters("{}")
     conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"])
     conv_params.AddValue("rotation_dofs",self.settings["rotation_dofs"])
     conv_params.AddValue("echo_level",self.settings["echo_level"])
     conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"])
     conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"])
     conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"])
     conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"])
     import convergence_criteria_factory
     convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params)
     return convergence_criterion.mechanical_convergence_criterion
Esempio n. 4
0
 def _create_convergence_criterion(self):
     # Creation of an auxiliar Kratos parameters object to store the convergence settings
     conv_params = KratosMultiphysics.Parameters("{}")
     conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"])
     conv_params.AddEmptyValue("rotation_dofs").SetBool(self._check_input_dof("ROTATION"))
     conv_params.AddValue("echo_level",self.settings["echo_level"])
     conv_params.AddValue("component_wise",self.settings["component_wise"])
     conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"])
     conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"])
     conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"])
     conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"])
     
     # Construction of the class convergence_criterion
     import convergence_criteria_factory
     convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params)
     
     return convergence_criterion.mechanical_convergence_criterion
Esempio n. 5
0
    def _GetConvergenceCriterion(self):
        # Creation of an auxiliar Kratos parameters object to store the convergence settings
        conv_params = KratosMultiphysics.Parameters("{}")
        conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"])
        conv_params.AddValue("rotation_dofs",self.settings["rotation_dofs"])
        conv_params.AddValue("echo_level",self.settings["echo_level"])
        conv_params.AddValue("component_wise",self.settings["component_wise"])
        conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"])
        conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"])
        conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"])
        conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"])
        
        # Construction of the class convergence_criterion
        import convergence_criteria_factory
        convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params)
        
        if  self.settings["compute_mortar_contact"].GetInt() > 0:
            Mortar = KratosMultiphysics.ContactStructuralMechanicsApplication.MortarConvergenceCriteria()
            Mortar.SetEchoLevel(self.echo_level)

            convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Mortar, convergence_criterion.mechanical_convergence_criterion)
        
        return convergence_criterion.mechanical_convergence_criterion
Esempio n. 6
0
    def GetConvergenceCriteria(self, error_criteria, conv_settings):
        if ("_with_adaptative_remesh" in error_criteria):
            conv_settings["convergence_criterion"].SetString(
                error_criteria.replace("_with_adaptative_remesh", ""))
        # If we just use the adaptative convergence criteria
        if (missing_meshing_dependencies is True):
            if ("adaptative_remesh" in error_criteria):
                raise NameError(
                    'The AdaptativeErrorCriteria can not be used without compiling the MeshingApplication'
                )
        else:
            if (error_criteria == "adaptative_remesh_criteria"):
                adaptative_error_criteria = StructuralMechanicsApplication.ErrorMeshCriteria(
                    self.adaptative_remesh_parameters["compute_error_settings"]
                )
                adaptative_error_criteria.SetEchoLevel(
                    conv_settings["echo_level"].GetInt())
                return adaptative_error_criteria

        # Regular convergence criteria
        import convergence_criteria_factory
        convergence_criterion = convergence_criteria_factory.convergence_criterion(
            conv_settings)

        # If we combine the regular convergence criteria with adaptative
        if (missing_meshing_dependencies is False):
            if ("_with_adaptative_remesh" in error_criteria):
                adaptative_error_criteria = StructuralMechanicsApplication.ErrorMeshCriteria(
                    self.adaptative_remesh_parameters["compute_error_settings"]
                )
                adaptative_error_criteria.SetEchoLevel(
                    conv_settings["echo_level"].GetInt())
                convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    convergence_criterion.mechanical_convergence_criterion,
                    adaptative_error_criteria)
        return convergence_criterion.mechanical_convergence_criterion
Esempio n. 7
0
 def _create_convergence_criterion(self):
     import convergence_criteria_factory
     convergence_criterion = convergence_criteria_factory.convergence_criterion(self._get_convergence_criterion_settings())
     return convergence_criterion.mechanical_convergence_criterion
Esempio n. 8
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
Esempio n. 9
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()
        if "contact" in convergence_criterion_parameters[
                "convergence_criterion"].GetString():
            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()
            contact_tolerance = convergence_criterion_parameters[
                "contact_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()

            if (echo_level >= 1):
                print(
                    "::[Mechanical Solver]:: CONVERGENCE CRITERION : ",
                    convergence_criterion_parameters["convergence_criterion"].
                    GetString())

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

            if (convergence_criterion_parameters["convergence_criterion"].
                    GetString() == "contact_displacement_criterion"):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, D_RT, D_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, D_RT, D_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "contact_residual_criterion"):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "contact_mixed_criterion"):
                if (fancy_convergence_criterion == True):
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierMixedContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierMixedContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "contact_and_criterion"):
                if (fancy_convergence_criterion == True):
                    Displacement = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact, table,
                        print_convergence_criterion)
                    Residual = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    Displacement = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact)
                    Residual = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)

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

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "contact_or_criterion"):
                if (fancy_convergence_criterion == True):
                    Displacement = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact, table,
                        print_convergence_criterion)
                    Residual = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact, table,
                        print_convergence_criterion)
                else:
                    Displacement = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, ensure_contact)
                    Residual = ContactStructuralMechanicsApplication.DisplacementLagrangeMultiplierResidualContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, ensure_contact)

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

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

            Mortar.SetEchoLevel(echo_level)

            if (fancy_convergence_criterion == True):
                self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.MortarAndConvergenceCriteria(
                    self.mechanical_convergence_criterion, Mortar, table,
                    print_convergence_criterion, condn_convergence_criterion)
            else:
                self.mechanical_convergence_criterion = ContactStructuralMechanicsApplication.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
            if (convergence_criterion_parameters["mortar_type"].GetString() ==
                    "ALMContactFrictionless"):
                Mortar = ContactStructuralMechanicsApplication.ALMFrictionlessMortarConvergenceCriteria(
                )
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            elif (convergence_criterion_parameters["mortar_type"].GetString()
                  == "ALMContactFrictional"):
                Mortar = ContactStructuralMechanicsApplication.ALMFrictionalMortarConvergenceCriteria(
                )
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
            elif ("MeshTying" in
                  convergence_criterion_parameters["mortar_type"].GetString()):
                Mortar = ContactStructuralMechanicsApplication.MeshTyingMortarConvergenceCriteria(
                )
                Mortar.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    base_mechanical_convergence_criterion.
                    mechanical_convergence_criterion, Mortar)
                (self.mechanical_convergence_criterion
                 ).SetActualizeRHSFlag(True)
Esempio n. 10
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