コード例 #1
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", ""))
        import contact_convergence_criteria_factory
        convergence_criterion = contact_convergence_criteria_factory.convergence_criterion(conv_settings)

        # If we just use the adaptative convergence criteria
        if missing_meshing_dependencies:
            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 = CSMA.ContactErrorMeshCriteria(self.adaptative_remesh_parameters["compute_error_settings"])
                convergence_criterion.mechanical_convergence_criterion = KM.AndCriteria(convergence_criterion.GetMortarCriteria(False), adaptative_error_criteria)
            elif "with_adaptative_remesh" in error_criteria: # If we combine the regular convergence criteria with adaptative
                adaptative_error_criteria = CSMA.ContactErrorMeshCriteria(self.adaptative_remesh_parameters["compute_error_settings"])
                convergence_criterion.mechanical_convergence_criterion = KM.AndCriteria(convergence_criterion.mechanical_convergence_criterion, adaptative_error_criteria)

        return convergence_criterion.mechanical_convergence_criterion

        # If we combine the regular convergence criteria with adaptative
        if not missing_meshing_dependencies:
            if "with_adaptative_remesh" in error_criteria:
                adaptative_error_criteria = CSMA.ContactErrorMeshCriteria(self.adaptative_remesh_parameters["compute_error_settings"])
                convergence_criterion.mechanical_convergence_criterion = KM.AndCriteria(convergence_criterion.mechanical_convergence_criterion, adaptative_error_criteria)
        return convergence_criterion.mechanical_convergence_criterion
コード例 #2
0
 def _create_convergence_criterion(self):
     convergence_criterion = convergence_criteria_factory.convergence_criterion(
         self._get_convergence_criterion_settings())
     conv_criteria = convergence_criterion.mechanical_convergence_criterion
     contact_criteria = ContactStructuralMechanicsApplication.MPCContactCriteria(
     )
     return KratosMultiphysics.AndCriteria(conv_criteria, contact_criteria)
コード例 #3
0
    def _ConstructConvergenceCriterion(self, convergence_criterion):

        D_RT = self.settings["displacement_relative_tolerance"].GetDouble()
        D_AT = self.settings["displacement_absolute_tolerance"].GetDouble()
        R_RT = self.settings["residual_relative_tolerance"].GetDouble()
        R_AT = self.settings["residual_absolute_tolerance"].GetDouble()
        echo_level = self.settings["echo_level"].GetInt()

        if (convergence_criterion == "Displacement_criterion"):
            convergence_criterion = KratosMultiphysics.DisplacementCriteria(
                D_RT, D_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion == "Residual_criterion"):
            convergence_criterion = KratosMultiphysics.ResidualCriteria(
                R_RT, R_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion == "And_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.AndCriteria(
                Residual, Displacement)
        elif (convergence_criterion == "Or_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.OrCriteria(
                Residual, Displacement)

        return convergence_criterion
    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
        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
コード例 #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
コード例 #6
0
    def _create_nonlinear_static_strategy(self,mp):
        linear_solver = KratosMultiphysics.SkylineLUFactorizationSolver()
        builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(linear_solver)
        scheme = KratosMultiphysics.ResidualBasedIncrementalUpdateStaticScheme()
        convergence_criterion_1 = KratosMultiphysics.ResidualCriteria(1e-8,1e-8)
        convergence_criterion_2 = KratosMultiphysics.DisplacementCriteria(1e-8,1e-8)
        convergence_criterion   = KratosMultiphysics.AndCriteria(convergence_criterion_1,convergence_criterion_2)
        convergence_criterion.SetEchoLevel(0)

        max_iters = 1000
        compute_reactions = True
        reform_step_dofs = True
        move_mesh_flag = True
        strategy = KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy(mp,
                                                                scheme,
                                                                linear_solver,
                                                                convergence_criterion,
                                                                builder_and_solver,
                                                                max_iters,
                                                                compute_reactions,
                                                                reform_step_dofs,
                                                                move_mesh_flag)
        strategy.SetEchoLevel(0)
        strategy.Initialize()
        strategy.Check()
        return strategy
コード例 #7
0
    def __init__(self, convergence_criterion_parameters):
        # Note that all the convergence settings are introduced via a Kratos parameters object.

        D_RT = convergence_criterion_parameters[
            "solution_relative_tolerance"].GetDouble()
        D_AT = convergence_criterion_parameters[
            "solution_absolute_tolerance"].GetDouble()
        R_RT = convergence_criterion_parameters[
            "residual_relative_tolerance"].GetDouble()
        R_AT = convergence_criterion_parameters[
            "residual_absolute_tolerance"].GetDouble()

        echo_level = convergence_criterion_parameters["echo_level"].GetInt()
        convergence_crit = convergence_criterion_parameters[
            "convergence_criterion"].GetString()

        if (echo_level >= 1):
            KratosMultiphysics.Logger.PrintInfo(
                "::[ConvergenceCriterionFactory]:: ",
                "CONVERGENCE CRITERION : " +
                convergence_criterion_parameters["convergence_criterion"].
                GetString())

        if (convergence_crit == "solution_criterion"):
            self.convergence_criterion = KratosMultiphysics.DisplacementCriteria(
                D_RT, D_AT)
            self.convergence_criterion.SetEchoLevel(echo_level)

        elif (convergence_crit == "residual_criterion"):
            self.convergence_criterion = KratosMultiphysics.ResidualCriteria(
                R_RT, R_AT)
            self.convergence_criterion.SetEchoLevel(echo_level)

        elif (convergence_crit == "and_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            self.convergence_criterion = KratosMultiphysics.AndCriteria(
                Residual, Displacement)

        elif (convergence_crit == "or_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            self.convergence_criterion = KratosMultiphysics.OrCriteria(
                Residual, Displacement)
        else:
            err_msg = "The requested convergence criterion \"" + convergence_crit + "\" is not available!\n"
            err_msg += "Available options are: \"solution_criterion\", \"residual_criterion\", \"and_criterion\", \"or_criterion\""
            raise Exception(err_msg)
コード例 #8
0
    def _ConstructConvergenceCriterion(self, convergence_criterion):

        D_RT = self.settings["displacement_relative_tolerance"].GetDouble()
        D_AT = self.settings["displacement_absolute_tolerance"].GetDouble()
        R_RT = self.settings["residual_relative_tolerance"].GetDouble()
        R_AT = self.settings["residual_absolute_tolerance"].GetDouble()
        echo_level = self.settings["echo_level"].GetInt()

        if (convergence_criterion.lower() == "displacement_criterion"):
            convergence_criterion = KratosMultiphysics.DisplacementCriteria(
                D_RT, D_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion.lower() == "residual_criterion"):
            convergence_criterion = KratosMultiphysics.ResidualCriteria(
                R_RT, R_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion.lower() == "and_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.AndCriteria(
                Residual, Displacement)
        elif (convergence_criterion.lower() == "or_criterion"):
            Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.OrCriteria(
                Residual, Displacement)
        elif (convergence_criterion.lower() == "water_pressure_criterion"):
            convergence_criterion = KratosMultiphysics.MixedGenericCriteria([
                (KratosMultiphysics.WATER_PRESSURE, D_RT, D_AT)
            ])
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion.lower() ==
              "displacement_and_water_pressure_criterion"):
            convergence_criterion = KratosMultiphysics.MixedGenericCriteria([
                (KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)),
                (KratosMultiphysics.WATER_PRESSURE, D_RT, D_AT)
            ])
            convergence_criterion.SetEchoLevel(echo_level)
        else:
            err_msg = "The requested convergence criterion \"" + convergence_criterion + "\" is not available!\n"
            err_msg += "Available options are: \"displacement_criterion\", \"residual_criterion\", \"and_criterion\", \"or_criterion\", \"water_pressure_criterion\", \"displacement_and_water_pressure_criterion\""
            raise Exception(err_msg)

        return convergence_criterion
コード例 #9
0
    def __init__(self, model_part, convergence_criterion_parameters):
        # The main model part
        self.model_part = model_part

        # 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()
            FSTCD_RT = convergence_criterion_parameters[
                "frictional_stick_contact_displacement_relative_tolerance"].GetDouble(
                )
            FSTCD_AT = convergence_criterion_parameters[
                "frictional_stick_contact_displacement_absolute_tolerance"].GetDouble(
                )
            FSTCR_RT = convergence_criterion_parameters[
                "frictional_stick_contact_residual_relative_tolerance"].GetDouble(
                )
            FSTCR_AT = convergence_criterion_parameters[
                "frictional_stick_contact_residual_absolute_tolerance"].GetDouble(
                )
            FSLCD_RT = convergence_criterion_parameters[
                "frictional_slip_contact_displacement_relative_tolerance"].GetDouble(
                )
            FSLCD_AT = convergence_criterion_parameters[
                "frictional_slip_contact_displacement_absolute_tolerance"].GetDouble(
                )
            FSLCR_RT = convergence_criterion_parameters[
                "frictional_slip_contact_residual_relative_tolerance"].GetDouble(
                )
            FSLCR_AT = convergence_criterion_parameters[
                "frictional_slip_contact_residual_absolute_tolerance"].GetDouble(
                )
            RNTT = convergence_criterion_parameters[
                "ratio_normal_tangent_threshold"].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 "ALMContactFrictional" in self.mortar_type and self.frictional_decomposed:
                    if "PureSlip" in self.mortar_type:
                        pure_slip = True
                    else:
                        pure_slip = auxiliar_methods_solvers.AuxiliarPureSlipCheck(
                            self.model_part)
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierFrictionalContactCriteria(
                        D_RT, D_AT, CD_RT, CD_AT, FSTCD_RT, FSTCD_AT, FSLCD_RT,
                        FSLCD_AT, RNTT, ensure_contact, pure_slip,
                        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 "ALMContactFrictional" in self.mortar_type and self.frictional_decomposed:
                    if "PureSlip" in self.mortar_type:
                        pure_slip = True
                    else:
                        pure_slip = auxiliar_methods_solvers.AuxiliarPureSlipCheck(
                            self.model_part)
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualFrictionalContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, FSTCD_RT, FSTCR_AT, FSLCD_RT,
                        FSLCR_AT, RNTT, ensure_contact, pure_slip,
                        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 "ALMContactFrictional" in self.mortar_type and self.frictional_decomposed:
                    if "PureSlip" in self.mortar_type:
                        pure_slip = True
                    else:
                        pure_slip = auxiliar_methods_solvers.AuxiliarPureSlipCheck(
                            self.model_part)
                    self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedFrictionalContactCriteria(
                        R_RT, R_AT, CR_RT, CR_AT, FSTCD_RT, FSTCR_AT, FSLCD_RT,
                        FSLCR_AT, RNTT, ensure_contact, pure_slip,
                        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:
                # Construct the solver
                settings_max = KM.Parameters("""
                {
                    "solver_type"             : "power_iteration_highest_eigenvalue_solver",
                    "max_iteration"           : 10000,
                    "tolerance"               : 1e-9,
                    "required_eigen_number"   : 1,
                    "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
                }
                """)
                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)
            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
コード例 #10
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
コード例 #11
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)
コード例 #12
0
    def __init__(self, convergence_criterion_parameters):
        # Note that all the convergence settings are introduced via a Kratos parameters object.

        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()

        echo_level = convergence_criterion_parameters["echo_level"].GetInt()
        convergence_crit = convergence_criterion_parameters["convergence_criterion"].GetString()

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

        rotation_dofs = False
        if(convergence_criterion_parameters.Has("rotation_dofs")):
            if(convergence_criterion_parameters["rotation_dofs"].GetBool()):
                rotation_dofs = True

        volumetric_strain_dofs = False
        if convergence_criterion_parameters.Has("volumetric_strain_dofs"):
            if convergence_criterion_parameters["volumetric_strain_dofs"].GetBool():
                volumetric_strain_dofs = True

        # Convergence criteria if there are rotation DOFs in the problem
        if(rotation_dofs):
            if(convergence_crit == "displacement_criterion"):
                self.mechanical_convergence_criterion = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "residual_criterion"):
                self.mechanical_convergence_criterion = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "and_criterion"):
                Displacement = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Residual, Displacement)

            elif(convergence_crit == "or_criterion"):
                Displacement = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(Residual, Displacement)
            else:
                err_msg =  "The requested convergence criterion \"" + convergence_crit + "\" is not available!\n"
                err_msg += "Available options are: \"displacement_criterion\", \"residual_criterion\", \"and_criterion\", \"or_criterion\""
                raise Exception(err_msg)

        # Convergence criteria if there are volumetric strain DOFs in the problem
        elif(volumetric_strain_dofs):
            other_dof_name = "VOLUMETRIC_STRAIN"
            if(convergence_crit == "displacement_criterion"):
                self.mechanical_convergence_criterion = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT, other_dof_name)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "residual_criterion"):
                self.mechanical_convergence_criterion = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT, other_dof_name)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "and_criterion"):
                Displacement = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT, other_dof_name)
                Displacement.SetEchoLevel(echo_level)
                Residual = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT, other_dof_name)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Residual, Displacement)

            elif(convergence_crit == "or_criterion"):
                Displacement = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria(D_RT, D_AT, other_dof_name)
                Displacement.SetEchoLevel(echo_level)
                Residual = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria(R_RT, R_AT, other_dof_name)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(Residual, Displacement)
            else:
                err_msg =  "The requested convergence criterion \"" + convergence_crit + "\" is not available!\n"
                err_msg += "Available options are: \"displacement_criterion\", \"residual_criterion\", \"and_criterion\", \"or_criterion\""
                raise Exception(err_msg)

        # Convergence criteria without rotation DOFs
        else:
            if(convergence_crit == "displacement_criterion"):
                self.mechanical_convergence_criterion = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "residual_criterion"):
                self.mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif(convergence_crit == "and_criterion"):
                Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Residual, Displacement)

            elif(convergence_crit == "or_criterion"):
                Displacement = KratosMultiphysics.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(Residual, Displacement)
            else:
                err_msg =  "The requested convergence criterion \"" + convergence_crit + "\" is not available!\n"
                err_msg += "Available options are: \"displacement_criterion\", \"residual_criterion\", \"and_criterion\", \"or_criterion\""
                raise Exception(err_msg)
コード例 #13
0
    def __init__(self, convergence_criterion_parameters):
        """Create a convergence criterion from json parameters.

        Keyword arguments:
        convergence_criterion_parameters

        If no error is raised, a valid convergence criterion is accessible
        through the member variable mechanical_convergence_criterion after
        return.
        """
        # Note that all the convergence settings are introduced via a Kratos parameters object.
        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()

        echo_level = convergence_criterion_parameters["echo_level"].GetInt()

        if (echo_level >= 1):
            print(
                "::[Mechanical_Solver]:: Convergence criterion [",
                convergence_criterion_parameters["convergence_criterion"].
                GetString(), "]")

        rotation_dofs = False
        if (convergence_criterion_parameters.Has("rotation_dofs")):
            if (convergence_criterion_parameters["rotation_dofs"].GetBool()):
                rotation_dofs = True

        component_wise = False
        if (convergence_criterion_parameters.Has("component_wise")):
            if (convergence_criterion_parameters["component_wise"].GetBool()):
                component_wise = True

        # Convergence criteria if there are rotation DOFs in the problem
        if (rotation_dofs == True):
            if (convergence_criterion_parameters["convergence_criterion"].
                    GetString() == "Displacement_criterion"):
                self.mechanical_convergence_criterion = KratosSolid.DisplacementCriteria(
                    D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Residual_criterion"):
                self.mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                    R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "And_criterion"):
                Displacement = KratosSolid.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Or_criterion"):
                Displacement = KratosSolid.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)
            else:
                raise Exception(
                    "Unsupported \"convergence_criterion\" : " +
                    convergence_criterion_parameters["convergence_criterion"].
                    GetString())

        # Convergence criteria without rotation DOFs
        else:
            if (convergence_criterion_parameters["convergence_criterion"].
                    GetString() == "Displacement_criterion"):
                self.mechanical_convergence_criterion = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Residual_criterion"):
                if (component_wise == True):
                    self.mechanical_convergence_criterion = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    self.mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                        R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "And_criterion"):
                Displacement = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                if (component_wise == True):
                    Residual = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)
            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Or_criterion"):
                Displacement = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                if (component_wise == True):
                    Residual = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)
            else:
                raise Exception(
                    "Unsupported \"convergence_criterion\" : " +
                    convergence_criterion_parameters["convergence_criterion"].
                    GetString())
コード例 #14
0
    def __init__(self, convergence_criterion_parameters):
        # Note that all the convergence settings are introduced via a Kratos parameters object.

        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()

        echo_level = convergence_criterion_parameters["echo_level"].GetInt()

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

        rotation_dofs = False
        if (convergence_criterion_parameters.Has("rotation_dofs")):
            if (convergence_criterion_parameters["rotation_dofs"].GetBool()):
                rotation_dofs = True

        component_wise = False
        if (convergence_criterion_parameters.Has("component_wise")):
            if (convergence_criterion_parameters["component_wise"].GetBool()):
                component_wise = True

        # Convergence criteria if there are rotation DOFs in the problem
        if (rotation_dofs == True):
            if (convergence_criterion_parameters["convergence_criterion"].
                    GetString() == "Displacement_criterion"):
                self.mechanical_convergence_criterion = KratosSolid.DisplacementCriteria(
                    D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Residual_criterion"):
                self.mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                    R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "And_criterion"):
                Displacement = KratosSolid.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Or_criterion"):
                Displacement = KratosSolid.DisplacementCriteria(D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)

        # Convergence criteria without rotation DOFs
        else:
            if (convergence_criterion_parameters["convergence_criterion"].
                    GetString() == "Displacement_criterion"):
                self.mechanical_convergence_criterion = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Residual_criterion"):
                if (component_wise == True):
                    self.mechanical_convergence_criterion = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    self.mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                        R_RT, R_AT)
                self.mechanical_convergence_criterion.SetEchoLevel(echo_level)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "And_criterion"):
                Displacement = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                if (component_wise == True):
                    Residual = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)

            elif (convergence_criterion_parameters["convergence_criterion"].
                  GetString() == "Or_criterion"):
                Displacement = KratosSolid.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                Displacement.SetEchoLevel(echo_level)
                if (component_wise == True):
                    Residual = KratosSolid.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                Residual.SetEchoLevel(echo_level)
                self.mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)
コード例 #15
0
    def GetConvergenceCriterion(self, convergence_criterion_type,
                                rotation_dofs, echo_level, component_wise):

        D_RT = self.settings["displacement_relative_tolerance"].GetDouble()
        D_AT = self.settings["displacement_absolute_tolerance"].GetDouble()
        R_RT = self.settings["residual_relative_tolerance"].GetDouble()
        R_AT = self.settings["residual_absolute_tolerance"].GetDouble()

        if (rotation_dofs):
            if (convergence_criterion_type == "Displacement_criteria"):
                mechanical_convergence_criterion = SolidMechanicsApplication.DisplacementCriteria(
                    D_RT, D_AT)
            elif (convergence_criterion_type == "Residual_criteria"):
                mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                    R_RT, R_AT)
            elif (convergence_criterion_type == "And_criteria"):
                Displacement = SolidMechanicsApplication.DisplacementCriteria(
                    D_RT, D_AT)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)
            elif (convergence_criterion_type == "Or_criteria"):
                Displacement = SolidMechanicsApplication.DisplacementCriteria(
                    D_RT, D_AT)
                Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)
            #~ elif(convergence_criterion_type == "Mixed_criteria"):
            #~ Displacement = KratosMultiphysics.MixedElementCriteria(D_RT, D_AT)
            #~ Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            #~ mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Residual, Displacement)
        else:
            if (echo_level > 1):
                print("::[Mechanical Solver]:: CONVERGENCE CRITERION : ",
                      convergence_criterion_type)

            if (convergence_criterion_type == "Displacement_criteria"):
                mechanical_convergence_criterion = SolidMechanicsApplication.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
            elif (convergence_criterion_type == "Residual_criteria"):
                if (component_wise):
                    mechanical_convergence_criterion = SolidMechanicsApplication.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    mechanical_convergence_criterion = KratosMultiphysics.ResidualCriteria(
                        R_RT, R_AT)
            elif (convergence_criterion_type == "And_criteria"):
                Displacement = SolidMechanicsApplication.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                if (component_wise):
                    Residual = SolidMechanicsApplication.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(
                    Residual, Displacement)
            elif (convergence_criterion_type == "Or_criteria"):
                Displacement = SolidMechanicsApplication.DisplacementConvergenceCriterion(
                    D_RT, D_AT)
                if (self.component_wise):
                    Residual = SolidMechanicsApplication.ComponentWiseResidualConvergenceCriterion(
                        R_RT, R_AT)
                else:
                    Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
                mechanical_convergence_criterion = KratosMultiphysics.OrCriteria(
                    Residual, Displacement)
            #~ elif(convergence_criterion_type == "Mixed_criteria"):
            #~ Displacement = KratosMultiphysics.MixedElementConvergeCriteria(D_RT, D_AT)
            #~ Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            #~ mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Residual, Displacement)

        return mechanical_convergence_criterion
コード例 #16
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
                from KratosMultiphysics 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
            from KratosMultiphysics.StructuralMechanicsApplication 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