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
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 _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
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_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
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)
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
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 __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. 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)
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
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