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)
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
def _create_convergence_criterion(self): """This method is overridden to make sure it always uses "displacement_criterion" """ convergence_criterion_setting = self._get_convergence_criterion_settings( ) if convergence_criterion_setting["convergence_criterion"].GetString( ) != "displacement_criterion": warn_msg = 'Convergence criterion "displacement_criterion" is required. \n' warn_msg += '"' + convergence_criterion_setting[ "convergence_criterion"].GetString( ) + '" specification will be ignored' KratosMultiphysics.Logger.PrintWarning( "StructuralMechanicsPrebucklingAnalysis; Warning", warn_msg) convergence_criterion_setting["convergence_criterion"].SetString( "displacement_criterion") convergence_criterion = convergence_criteria_factory.convergence_criterion( convergence_criterion_setting) return convergence_criterion.mechanical_convergence_criterion
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
def _create_convergence_criterion(self): convergence_criterion = convergence_criteria_factory.convergence_criterion( self._get_convergence_criterion_settings()) return convergence_criterion.mechanical_convergence_criterion
def _create_convergence_criterion(self): import KratosMultiphysics.StructuralMechanicsApplication.convergence_criteria_factory as 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. 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