def _create_convergence_criterion(self): # Creation of an auxiliar Kratos parameters object to store the convergence settings conv_params = KratosMultiphysics.Parameters("{}") conv_params.AddValue( "convergence_criterion", self.solving_strategy_settings["convergence_criterion"]) # conv_params.AddEmptyValue("rotation_dofs").SetBool(self._check_input_dof("ROTATION")) conv_params.AddEmptyValue("echo_level").SetInt(self.echo_level) is_component_wise = False if (self.solving_strategy_settings["builder_type"].GetString() == "component_wise"): is_component_wise = True conv_params.AddEmptyValue("component_wise").SetBool(is_component_wise) conv_params.AddValue( "displacement_relative_tolerance", self.solving_strategy_settings["variable_relative_tolerance"]) conv_params.AddValue( "displacement_absolute_tolerance", self.solving_strategy_settings["variable_absolute_tolerance"]) conv_params.AddValue( "residual_relative_tolerance", self.solving_strategy_settings["residual_relative_tolerance"]) conv_params.AddValue( "residual_absolute_tolerance", self.solving_strategy_settings["residual_absolute_tolerance"]) # Construction of the class convergence_criterion import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion( conv_params) return convergence_criterion.mechanical_convergence_criterion
def _GetConvergenceCriterion(self): # Creation of an auxiliar Kratos parameters object to store the convergence settings conv_params = KratosMultiphysics.Parameters("{}") conv_params.AddValue("convergence_criterion", self.settings["convergence_criterion"]) conv_params.AddValue("rotation_dofs", self.settings["rotation_dofs"]) conv_params.AddValue("echo_level", self.settings["echo_level"]) conv_params.AddValue("component_wise", self.settings["component_wise"]) conv_params.AddValue("displacement_relative_tolerance", self.settings["displacement_relative_tolerance"]) conv_params.AddValue("displacement_absolute_tolerance", self.settings["displacement_absolute_tolerance"]) conv_params.AddValue("residual_relative_tolerance", self.settings["residual_relative_tolerance"]) conv_params.AddValue("residual_absolute_tolerance", self.settings["residual_absolute_tolerance"]) # Construction of the class convergence_criterion import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion( conv_params) if self.settings["compute_mortar_contact"].GetInt() > 0: Mortar = KratosMultiphysics.ContactStructuralMechanicsApplication.MortarConvergenceCriteria( ) Mortar.SetEchoLevel(self.echo_level) convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria( Mortar, convergence_criterion.mechanical_convergence_criterion) return convergence_criterion.mechanical_convergence_criterion
def _create_convergence_criterion(self): # Create an auxiliary Kratos parameters object to store the convergence settings. conv_params = KratosMultiphysics.Parameters("{}") conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"]) conv_params.AddValue("rotation_dofs",self.settings["rotation_dofs"]) conv_params.AddValue("echo_level",self.settings["echo_level"]) conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"]) conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"]) conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"]) conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"]) import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params) return convergence_criterion.mechanical_convergence_criterion
def _create_convergence_criterion(self): # Creation of an auxiliar Kratos parameters object to store the convergence settings conv_params = KratosMultiphysics.Parameters("{}") conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"]) conv_params.AddEmptyValue("rotation_dofs").SetBool(self._check_input_dof("ROTATION")) conv_params.AddValue("echo_level",self.settings["echo_level"]) conv_params.AddValue("component_wise",self.settings["component_wise"]) conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"]) conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"]) conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"]) conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"]) # Construction of the class convergence_criterion import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params) return convergence_criterion.mechanical_convergence_criterion
def _GetConvergenceCriterion(self): # Creation of an auxiliar Kratos parameters object to store the convergence settings conv_params = KratosMultiphysics.Parameters("{}") conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"]) conv_params.AddValue("rotation_dofs",self.settings["rotation_dofs"]) conv_params.AddValue("echo_level",self.settings["echo_level"]) conv_params.AddValue("component_wise",self.settings["component_wise"]) conv_params.AddValue("displacement_relative_tolerance",self.settings["displacement_relative_tolerance"]) conv_params.AddValue("displacement_absolute_tolerance",self.settings["displacement_absolute_tolerance"]) conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"]) conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"]) # Construction of the class convergence_criterion import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion(conv_params) if self.settings["compute_mortar_contact"].GetInt() > 0: Mortar = KratosMultiphysics.ContactStructuralMechanicsApplication.MortarConvergenceCriteria() Mortar.SetEchoLevel(self.echo_level) convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria(Mortar, convergence_criterion.mechanical_convergence_criterion) return convergence_criterion.mechanical_convergence_criterion
def GetConvergenceCriteria(self, error_criteria, conv_settings): if ("_with_adaptative_remesh" in error_criteria): conv_settings["convergence_criterion"].SetString( error_criteria.replace("_with_adaptative_remesh", "")) # If we just use the adaptative convergence criteria if (missing_meshing_dependencies is True): if ("adaptative_remesh" in error_criteria): raise NameError( 'The AdaptativeErrorCriteria can not be used without compiling the MeshingApplication' ) else: if (error_criteria == "adaptative_remesh_criteria"): adaptative_error_criteria = StructuralMechanicsApplication.ErrorMeshCriteria( self.adaptative_remesh_parameters["compute_error_settings"] ) adaptative_error_criteria.SetEchoLevel( conv_settings["echo_level"].GetInt()) return adaptative_error_criteria # Regular convergence criteria import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion( conv_settings) # If we combine the regular convergence criteria with adaptative if (missing_meshing_dependencies is False): if ("_with_adaptative_remesh" in error_criteria): adaptative_error_criteria = StructuralMechanicsApplication.ErrorMeshCriteria( self.adaptative_remesh_parameters["compute_error_settings"] ) adaptative_error_criteria.SetEchoLevel( conv_settings["echo_level"].GetInt()) convergence_criterion.mechanical_convergence_criterion = KratosMultiphysics.AndCriteria( convergence_criterion.mechanical_convergence_criterion, adaptative_error_criteria) return convergence_criterion.mechanical_convergence_criterion
def _create_convergence_criterion(self): import convergence_criteria_factory convergence_criterion = convergence_criteria_factory.convergence_criterion(self._get_convergence_criterion_settings()) return convergence_criterion.mechanical_convergence_criterion
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
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)
def __init__(self, convergence_criterion_parameters): # Note that all the convergence settings are introduced via a Kratos parameters object. self.echo_level = convergence_criterion_parameters[ "echo_level"].GetInt() self.convergence_criterion_name = convergence_criterion_parameters[ "convergence_criterion"].GetString() self.mortar_type = convergence_criterion_parameters[ "mortar_type"].GetString() self.frictional_decomposed = convergence_criterion_parameters[ "frictional_decomposed"].GetBool() self.print_convergence_criterion = convergence_criterion_parameters[ "print_convergence_criterion"].GetBool() self.compute_dynamic_factor = convergence_criterion_parameters[ "compute_dynamic_factor"].GetBool() self.gidio_debug = convergence_criterion_parameters[ "gidio_debug"].GetBool() if "contact" in self.convergence_criterion_name: D_RT = convergence_criterion_parameters[ "displacement_relative_tolerance"].GetDouble() D_AT = convergence_criterion_parameters[ "displacement_absolute_tolerance"].GetDouble() R_RT = convergence_criterion_parameters[ "residual_relative_tolerance"].GetDouble() R_AT = convergence_criterion_parameters[ "residual_absolute_tolerance"].GetDouble() CD_RT = convergence_criterion_parameters[ "contact_displacement_relative_tolerance"].GetDouble() CD_AT = convergence_criterion_parameters[ "contact_displacement_absolute_tolerance"].GetDouble() CR_RT = convergence_criterion_parameters[ "contact_residual_relative_tolerance"].GetDouble() CR_AT = convergence_criterion_parameters[ "contact_residual_absolute_tolerance"].GetDouble() FCD_RT = convergence_criterion_parameters[ "frictional_contact_displacement_relative_tolerance"].GetDouble( ) FCD_AT = convergence_criterion_parameters[ "frictional_contact_displacement_absolute_tolerance"].GetDouble( ) FCR_RT = convergence_criterion_parameters[ "frictional_contact_residual_relative_tolerance"].GetDouble() FCR_AT = convergence_criterion_parameters[ "frictional_contact_residual_absolute_tolerance"].GetDouble() condn_convergence_criterion = convergence_criterion_parameters[ "condn_convergence_criterion"].GetBool() ensure_contact = convergence_criterion_parameters[ "ensure_contact"].GetBool() if self.echo_level >= 1: KM.Logger.PrintInfo( "::[Mechanical Solver]:: ", "CONVERGENCE CRITERION : " + self.convergence_criterion_name) if self.convergence_criterion_name == "contact_displacement_criterion": if (self.mortar_type == "ALMContactFrictional" and self.frictional_decomposed): self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierFrictionalContactCriteria( D_RT, D_AT, CD_RT, CD_AT, FCD_RT, FCD_AT, ensure_contact, self.print_convergence_criterion) elif "Penalty" in self.mortar_type: self.mechanical_convergence_criterion = CSMA.DisplacementContactCriteria( D_RT, D_AT, self.print_convergence_criterion) else: self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierContactCriteria( D_RT, D_AT, CD_RT, CD_AT, ensure_contact, self.print_convergence_criterion) self.mechanical_convergence_criterion.SetEchoLevel( self.echo_level) elif self.convergence_criterion_name == "contact_residual_criterion": if (self.mortar_type == "ALMContactFrictional" and self.frictional_decomposed): self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualFrictionalContactCriteria( R_RT, R_AT, CR_RT, CR_AT, FCR_RT, FCR_AT, ensure_contact, self.print_convergence_criterion) elif "Penalty" in self.mortar_type: self.mechanical_convergence_criterion = CSMA.DisplacementResidualContactCriteria( R_RT, R_AT, self.print_convergence_criterion) else: self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria( R_RT, R_AT, CR_RT, CR_AT, ensure_contact, self.print_convergence_criterion) self.mechanical_convergence_criterion.SetEchoLevel( self.echo_level) elif self.convergence_criterion_name == "contact_mixed_criterion": if (self.mortar_type == "ALMContactFrictional" and self.frictional_decomposed): self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedFrictionalontactCriteria( R_RT, R_AT, CR_RT, CR_AT, FCR_RT, FCR_AT, ensure_contact, self.print_convergence_criterion) elif "Penalty" in self.mortar_type: self.mechanical_convergence_criterion = CSMA.DisplacementResidualContactCriteria( R_RT, R_AT, self.print_convergence_criterion) else: self.mechanical_convergence_criterion = CSMA.DisplacementLagrangeMultiplierMixedContactCriteria( R_RT, R_AT, CR_RT, CR_AT, ensure_contact, self.print_convergence_criterion) self.mechanical_convergence_criterion.SetEchoLevel( self.echo_level) elif self.convergence_criterion_name == "contact_and_criterion": if "Penalty" in self.mortar_type: Displacement = CSMA.DisplacementContactCriteria( D_RT, D_AT, self.print_convergence_criterion) Residual = CSMA.DisplacementResidualContactCriteria( R_RT, R_AT, self.print_convergence_criterion) else: Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria( D_RT, D_AT, CD_RT, CD_AT, ensure_contact, self.print_convergence_criterion) Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria( R_RT, R_AT, CR_RT, CR_AT, ensure_contact, self.print_convergence_criterion) Displacement.SetEchoLevel(self.echo_level) Residual.SetEchoLevel(self.echo_level) self.mechanical_convergence_criterion = KM.AndCriteria( Residual, Displacement) elif self.convergence_criterion_name == "contact_or_criterion": if "Penalty" in self.mortar_type: Displacement = CSMA.DisplacementContactCriteria( D_RT, D_AT, self.print_convergence_criterion) Residual = CSMA.DisplacementResidualContactCriteria( R_RT, R_AT, self.print_convergence_criterion) else: Displacement = CSMA.DisplacementLagrangeMultiplierContactCriteria( D_RT, D_AT, CD_RT, CD_AT, ensure_contact, self.print_convergence_criterion) Residual = CSMA.DisplacementLagrangeMultiplierResidualContactCriteria( R_RT, R_AT, CR_RT, CR_AT, ensure_contact, self.print_convergence_criterion) Displacement.SetEchoLevel(self.echo_level) Residual.SetEchoLevel(self.echo_level) self.mechanical_convergence_criterion = KM.OrCriteria( Residual, Displacement) # Adding the mortar criteria Mortar = self.GetMortarCriteria() if (condn_convergence_criterion is True): # Construct the solver import eigen_solver_factory settings_max = KM.Parameters(""" { "solver_type" : "power_iteration_highest_eigenvalue_solver", "max_iteration" : 10000, "tolerance" : 1e-9, "required_eigen_number" : 1, "verbosity" : 0, "linear_solver_settings" : { "solver_type" : "SuperLUSolver", "max_iteration" : 500, "tolerance" : 1e-9, "scaling" : false, "verbosity" : 0 } } """) eigen_solver_max = eigen_solver_factory.ConstructSolver( settings_max) settings_min = KM.Parameters(""" { "solver_type" : "power_iteration_eigenvalue_solver", "max_iteration" : 10000, "tolerance" : 1e-9, "required_eigen_number" : 1, "verbosity" : 0, "linear_solver_settings" : { "solver_type" : "SuperLUSolver", "max_iteration" : 500, "tolerance" : 1e-9, "scaling" : false, "verbosity" : 0 } } """) eigen_solver_min = eigen_solver_factory.ConstructSolver( settings_min) condition_number_utility = KM.ConditionNumberUtility( eigen_solver_max, eigen_solver_min) else: condition_number_utility = None self.mechanical_convergence_criterion = CSMA.MortarAndConvergenceCriteria( self.mechanical_convergence_criterion, Mortar, self.print_convergence_criterion, condition_number_utility) self.mechanical_convergence_criterion.SetEchoLevel(self.echo_level) self.mechanical_convergence_criterion.SetActualizeRHSFlag(True) elif self.convergence_criterion_name == "adaptative_remesh_criteria": self.mechanical_convergence_criterion = None else: # Standard criteria (same as structural mechanics application) # Construction of the class convergence_criterion import convergence_criteria_factory base_mechanical_convergence_criterion = convergence_criteria_factory.convergence_criterion( convergence_criterion_parameters) # Adding the mortar criteria if "ALMContact" in self.mortar_type or "MeshTying" in self.mortar_type: Mortar = self.GetMortarCriteria(False) self.mechanical_convergence_criterion = KM.AndCriteria( base_mechanical_convergence_criterion. mechanical_convergence_criterion, Mortar) self.mechanical_convergence_criterion.SetActualizeRHSFlag(True) else: self.mechanical_convergence_criterion = base_mechanical_convergence_criterion.mechanical_convergence_criterion