def _create_solution_scheme(self): scheme_type = self.settings["scheme_type"].GetString() # Setting the Rayleigh damping parameters process_info = self.main_model_part.ProcessInfo process_info[ StructuralMechanicsApplication. RAYLEIGH_ALPHA] = self.settings["rayleigh_alpha"].GetDouble() process_info[ StructuralMechanicsApplication. RAYLEIGH_BETA] = self.settings["rayleigh_beta"].GetDouble() # Setting the time integration schemes if (scheme_type == "central_differences"): mechanical_scheme = StructuralMechanicsApplication.ExplicitCentralDifferencesScheme( self.settings["max_delta_time"].GetDouble(), self.settings["fraction_delta_time"].GetDouble(), self.settings["time_step_prediction_level"].GetDouble()) elif (scheme_type == "multi_stage"): mechanical_scheme = StructuralMechanicsApplication.ExplicitMultiStageKimScheme( self.settings["fraction_delta_time"].GetDouble()) else: err_msg = "The requested scheme type \"" + scheme_type + "\" is not available!\n" err_msg += "Available options are: \"central_differences\", \"multi_stage\"" raise Exception(err_msg) return mechanical_scheme
def create_solver(mp, scheme_name): # Define a minimal newton raphson dynamic solver linear_solver = KratosMultiphysics.SkylineLUFactorizationSolver() builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( linear_solver) if scheme_name == "newmark": scheme = KratosMultiphysics.ResidualBasedNewmarkDisplacementScheme() elif scheme_name == "pseudo_static": scheme = KratosMultiphysics.ResidualBasedPseudoStaticDisplacementScheme( StructuralMechanicsApplication.RAYLEIGH_BETA) elif scheme_name == "backward_euler": scheme = KratosMultiphysics.ResidualBasedBDFDisplacementScheme(1) elif scheme_name == "bdf2": scheme = KratosMultiphysics.ResidualBasedBDFDisplacementScheme(2) elif scheme_name == "explicit": dynamic_settings = KratosMultiphysics.Parameters(""" { "time_step_prediction_level" : 0, "max_delta_time" : 1.0e-5, "fraction_delta_time" : 0.9 } """) scheme = StructuralMechanicsApplication.ExplicitCentralDifferencesScheme( dynamic_settings) elif scheme_name == "explicit_multi_stage": dynamic_settings = KratosMultiphysics.Parameters(""" { "fraction_delta_time" : 0.333333333333333333333333333333333333 } """) scheme = StructuralMechanicsApplication.ExplicitMultiStageKimScheme( dynamic_settings) else: damp_factor_m = 0.0 scheme = KratosMultiphysics.ResidualBasedBossakDisplacementScheme( damp_factor_m) # Creating solver compute_reactions = False reform_step_dofs = True move_mesh_flag = True # Explicit solver if "explicit" in scheme_name: strategy = StructuralMechanicsApplication.MechanicalExplicitStrategy( mp, scheme, compute_reactions, reform_step_dofs, move_mesh_flag) else: # Implicit solver otherwise max_iters = 10 # Convergence_criterion = KratosMultiphysics.ResidualCriteria(1e-14,1e-20) convergence_criterion = KratosMultiphysics.ResidualCriteria(1e-4, 1e-9) convergence_criterion.SetEchoLevel(0) 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() return strategy
def _create_dynamic_explicit_strategy(mp,scheme_name): if (scheme_name=='central_differences'): scheme = StructuralMechanicsApplication.ExplicitCentralDifferencesScheme(0.00,0.00,0.00) elif scheme_name=='multi_stage': scheme = StructuralMechanicsApplication.ExplicitMultiStageKimScheme(0.33333333333333333) strategy = StructuralMechanicsApplication.MechanicalExplicitStrategy(mp,scheme,0,0,1) strategy.SetEchoLevel(0) return strategy