def _ConstructConvergenceCriterion(self, convergence_criterion): D_RT = self.settings["mechanical_solver_settings"]["displacement_relative_tolerance"].GetDouble() D_AT = self.settings["mechanical_solver_settings"]["displacement_absolute_tolerance"].GetDouble() R_RT = self.settings["mechanical_solver_settings"]["residual_relative_tolerance"].GetDouble() R_AT = self.settings["mechanical_solver_settings"]["residual_absolute_tolerance"].GetDouble() echo_level = self.settings["mechanical_solver_settings"]["echo_level"].GetInt() if(convergence_criterion == "Displacement_criterion"): convergence_criterion = KratosSolid.DisplacementConvergenceCriterion(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 = KratosSolid.DisplacementConvergenceCriterion(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 = KratosSolid.DisplacementConvergenceCriterion(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 __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 __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)
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