def _get_criterion(self): # Note that all the convergence settings are introduced via a Kratos parameters object. V_RT = self.settings["variable_relative_tolerance"].GetDouble() V_AT = self.settings["variable_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 (echo_level >= 1): print( "::[-----Criterion-----]::", self.settings["convergence_criterion"].GetString(), ) convergence_criterion = None if (self.settings["convergence_criterion"].GetString() == "Variable_criterion"): convergence_criterion = KratosSolid.DofsCriterion(V_RT, V_AT) convergence_criterion.SetEchoLevel(echo_level) convergence_criterion.Set( KratosSolid.CriterionLocalFlags.INCREMENTAL) elif (self.settings["convergence_criterion"].GetString() == "Residual_criterion"): convergence_criterion = KratosSolid.ResidualCriterion(R_RT, R_AT) convergence_criterion.SetEchoLevel(echo_level) elif (self.settings["convergence_criterion"].GetString() == "And_criterion"): Variable = KratosSolid.DofsCriterion(V_RT, V_AT) Variable.SetEchoLevel(echo_level) Variable.Set(KratosSolid.CriterionLocalFlags.INCREMENTAL) Residual = KratosSolid.ResidualCriterion(R_RT, R_AT) Residual.SetEchoLevel(echo_level) convergence_criterion = KratosSolid.CompositeCriterion( Residual, Variable) convergence_criterion.Set(KratosSolid.CriterionLocalFlags.AND) elif (self.settings["convergence_criterion"].GetString() == "Or_criterion"): Variable = KratosSolid.DofsCriterion(V_RT, V_AT) Variable.SetEchoLevel(echo_level) Variable.Set(KratosSolid.CriterionLocalFlags.INCREMENTAL) Residual = KratosSolid.ResidualCriterion(R_RT, R_AT) Residual.SetEchoLevel(echo_level) convergence_criterion = KratosSolid.CompositeCriterion( Residual, Variable) convergence_criterion.Set(KratosSolid.CriterionLocalFlags.OR) else: raise Exception("Unsupported \"convergence_criterion\" : " + self.settings["convergence_criterion"].GetString()) return convergence_criterion
def GetConvergenceCriterion(self): if (len(self.dofs) > 0 and self.settings["separate_dofs"].GetBool()): convergence_criteria = [] for dof in self.dofs: kratos_variable = KratosMultiphysics.KratosGlobals.GetVariable( dof) convergence_criteria.append( self._get_dof_criterion(kratos_variable)) convergence_criterion = KratosSolid.CompositeCriterion( convergence_criteria) convergence_criterion.Set(KratosSolid.CriterionLocalFlags.AND) else: convergence_criterion = self._get_criterion() return convergence_criterion