def _solve_static(self, mp): linear_solver = KratosMultiphysics.SkylineLUFactorizationSolver() builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( linear_solver) scheme = KratosMultiphysics.ResidualBasedIncrementalUpdateStaticScheme( ) convergence_criterion = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria( 1e-15, 1e-15) convergence_criterion.SetEchoLevel(0) max_iters = 1000 compute_reactions = False reform_step_dofs = False 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.Check() strategy.Solve()
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): # 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 # 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 = StructuralMechanicsApplication.DisplacementAndOtherDoFCriteria( D_RT, D_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion_parameters["convergence_criterion"]. GetString() == "Residual_criterion"): self.mechanical_convergence_criterion = StructuralMechanicsApplication.ResidualDisplacementAndOtherDoFCriteria( R_RT, R_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion_parameters["convergence_criterion"]. GetString() == "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_criterion_parameters["convergence_criterion"]. GetString() == "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) # Convergence criteria without rotation DOFs else: if (convergence_criterion_parameters["convergence_criterion"]. GetString() == "Displacement_criterion"): self.mechanical_convergence_criterion = KratosMultiphysics.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 = 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_criterion_parameters["convergence_criterion"]. GetString() == "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)