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)
예제 #2
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())
    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