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 = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT, self.EpetraCommunicator) convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion == "Residual_criterion"): convergence_criterion = TrilinosApplication.TrilinosResidualCriteria( R_RT, R_AT) convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion == "And_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT, self.EpetraCommunicator) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) convergence_criterion = TrilinosApplication.TrilinosAndCriteria( Residual, Displacement) elif (convergence_criterion == "Or_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT, self.EpetraCommunicator) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) convergence_criterion = TrilinosApplication.TrilinosOrCriteria( Residual, Displacement) return convergence_criterion
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() convergence_crit = convergence_criterion_parameters[ "convergence_criterion"].GetString() echo_level = convergence_criterion_parameters["echo_level"].GetInt() if (echo_level >= 1 and KratosMPI.mpi.rank == 0): KratosMultiphysics.Logger.PrintInfo( "::[Mechanical Solver]::", "MPI CONVERGENCE CRITERION : " + convergence_criterion_parameters["convergence_criterion"]. GetString()) if (convergence_crit == "displacement_criterion"): self.mechanical_convergence_criterion = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_crit == "residual_criterion"): self.mechanical_convergence_criterion = TrilinosApplication.TrilinosResidualCriteria( R_RT, R_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_crit == "and_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosAndCriteria( Residual, Displacement) elif (convergence_crit == "or_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosOrCriteria( 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]:: MPI CONVERGENCE CRITERION : ", convergence_criterion_parameters["convergence_criterion"]. GetString()) if (convergence_criterion_parameters["convergence_criterion"]. GetString() == "Displacement_criterion"): self.mechanical_convergence_criterion = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion_parameters["convergence_criterion"]. GetString() == "Residual_criterion"): self.mechanical_convergence_criterion = TrilinosApplication.TrilinosResidualCriteria( R_RT, R_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_criterion_parameters["convergence_criterion"]. GetString() == "And_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosAndCriteria( Residual, Displacement) elif (convergence_criterion_parameters["convergence_criterion"]. GetString() == "Or_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosOrCriteria( Residual, Displacement)
def _CreateConvergenceCriterion(self): if self.settings["time_scheme"].GetString() == "steady": convergence_criterion = KratosTrilinos.TrilinosResidualCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble()) else: convergence_criterion = KratosTrilinos.TrilinosMixedGenericCriteria( [(KratosMultiphysics.VELOCITY, self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble()), (KratosMultiphysics.PRESSURE, self.settings["relative_pressure_tolerance"].GetDouble(), self.settings["absolute_pressure_tolerance"].GetDouble())]) convergence_criterion.SetEchoLevel(self.settings["echo_level"].GetInt()) return convergence_criterion
def _CreateConvergenceCriterion(self): if self.settings["time_scheme"].GetString() == "steady": convergence_criterion = KratosTrilinos.TrilinosResidualCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble()) else: convergence_criterion = KratosTrilinos.TrilinosUPCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble(), self.settings["relative_pressure_tolerance"].GetDouble(), self.settings["absolute_pressure_tolerance"].GetDouble()) convergence_criterion.SetEchoLevel( self.settings["echo_level"].GetInt()) return convergence_criterion
def Initialize(self): ## Construct the communicator self.EpetraCommunicator = KratosTrilinos.CreateCommunicator() if hasattr(self, "_turbulence_model_solver"): self._turbulence_model_solver.SetCommunicator( self.EpetraCommunicator) ## Get the computing model part self.computing_model_part = self.GetComputingModelPart() ## If needed, create the estimate time step utility if (self.settings["time_stepping"]["automatic_time_step"].GetBool()): self.EstimateDeltaTimeUtility = self._GetAutomaticTimeSteppingUtility( ) ## Creating the Trilinos convergence criteria if (self.settings["time_scheme"].GetString() == "bossak"): self.conv_criteria = KratosTrilinos.TrilinosUPCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble(), self.settings["relative_pressure_tolerance"].GetDouble(), self.settings["absolute_pressure_tolerance"].GetDouble()) elif (self.settings["time_scheme"].GetString() == "steady"): self.conv_criteria = KratosTrilinos.TrilinosResidualCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble()) (self.conv_criteria).SetEchoLevel(self.settings["echo_level"].GetInt()) ## Creating the Trilinos time scheme if (self.element_integrates_in_time): # "Fake" scheme for those cases in where the element manages the time integration # It is required to perform the nodal update once the current time step is solved self.time_scheme = KratosTrilinos.TrilinosResidualBasedIncrementalUpdateStaticSchemeSlip( self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE] + 1) # In case the BDF2 scheme is used inside the element, set the time discretization utility to compute the BDF coefficients if (self.settings["time_scheme"].GetString() == "bdf2"): time_order = self.settings["time_order"].GetInt() if time_order == 2: self.time_discretization = KratosMultiphysics.TimeDiscretization.BDF( time_order) else: raise Exception( "Only \"time_order\" equal to 2 is supported. Provided \"time_order\": " + str(time_order)) else: err_msg = "Requested elemental time scheme " + self.settings[ "time_scheme"].GetString() + " is not available.\n" err_msg += "Available options are: \"bdf2\"" raise Exception(err_msg) else: if not hasattr(self, "_turbulence_model_solver"): if self.settings["time_scheme"].GetString() == "bossak": # TODO: Can we remove this periodic check, Is the PATCH_INDEX used in this scheme? if self.settings["consider_periodic_conditions"].GetBool( ) == True: self.time_scheme = TrilinosFluid.TrilinosPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], KratosCFD.PATCH_INDEX) else: self.time_scheme = TrilinosFluid.TrilinosPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE]) elif self.settings["time_scheme"].GetString() == "steady": self.time_scheme = TrilinosFluid.TrilinosResidualBasedSimpleSteadyScheme( self.settings["velocity_relaxation"].GetDouble(), self.settings["pressure_relaxation"].GetDouble(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE]) else: self._turbulence_model_solver.Initialize() if self.settings["time_scheme"].GetString() == "bossak": self.time_scheme = TrilinosFluid.TrilinosPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], self.settings["turbulence_model_solver_settings"] ["velocity_pressure_relaxation_factor"].GetDouble(), self._turbulence_model_solver. GetTurbulenceSolvingProcess()) # Time scheme for steady state fluid solver elif self.settings["time_scheme"].GetString() == "steady": self.time_scheme = TrilinosFluid.TrilinosResidualBasedSimpleSteadyScheme( self.settings["velocity_relaxation"].GetDouble(), self.settings["pressure_relaxation"].GetDouble(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], self._turbulence_model_solver. GetTurbulenceSolvingProcess()) ## Set the guess_row_size (guess about the number of zero entries) for the Trilinos builder and solver if self.main_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE] == 3: guess_row_size = 20 * 4 elif self.main_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE] == 2: guess_row_size = 10 * 3 ## Construct the Trilinos builder and solver if self.settings["consider_periodic_conditions"].GetBool() == True: self.builder_and_solver = KratosTrilinos.TrilinosBlockBuilderAndSolverPeriodic( self.EpetraCommunicator, guess_row_size, self.trilinos_linear_solver, KratosCFD.PATCH_INDEX) else: self.builder_and_solver = KratosTrilinos.TrilinosBlockBuilderAndSolver( self.EpetraCommunicator, guess_row_size, self.trilinos_linear_solver) ## Construct the Trilinos Newton-Raphson strategy self.solver = KratosTrilinos.TrilinosNewtonRaphsonStrategy( self.main_model_part, self.time_scheme, self.trilinos_linear_solver, self.conv_criteria, self.builder_and_solver, self.settings["maximum_iterations"].GetInt(), self.settings["compute_reactions"].GetBool(), self.settings["reform_dofs_at_each_step"].GetBool(), self.settings["move_mesh_flag"].GetBool()) (self.solver).SetEchoLevel(self.settings["echo_level"].GetInt()) self.formulation.SetProcessInfo(self.computing_model_part) (self.solver).Initialize() KratosMultiphysics.Logger.Print( "Monolithic MPI solver initialization finished.")
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() convergence_crit = convergence_criterion_parameters[ "convergence_criterion"].GetString() echo_level = convergence_criterion_parameters["echo_level"].GetInt() rotation_dofs = False if convergence_criterion_parameters.Has("rotation_dofs"): rotation_dofs = convergence_criterion_parameters[ "rotation_dofs"].GetBool() volumetric_strain_dofs = False if convergence_criterion_parameters.Has("volumetric_strain_dofs"): volumetric_strain_dofs = convergence_criterion_parameters[ "volumetric_strain_dofs"].GetBool() if (echo_level >= 1): KratosMultiphysics.Logger.PrintInfo( "::[Mechanical Solver]::", "MPI CONVERGENCE CRITERION : " + convergence_criterion_parameters["convergence_criterion"]. GetString()) if (convergence_crit == "displacement_criterion"): if rotation_dofs: self.mechanical_convergence_criterion = TrilinosApplication.TrilinosMixedGenericCriteria( [(KratosMultiphysics.DISPLACEMENT, D_RT, D_AT), (KratosMultiphysics.ROTATION, D_RT, D_AT)]) elif volumetric_strain_dofs: self.mechanical_convergence_criterion = TrilinosApplication.TrilinosMixedGenericCriteria( [(KratosMultiphysics.DISPLACEMENT, D_RT, D_AT), (KratosMultiphysics.VOLUMETRIC_STRAIN, D_RT, D_AT)]) else: self.mechanical_convergence_criterion = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_crit == "residual_criterion"): self.mechanical_convergence_criterion = TrilinosApplication.TrilinosResidualCriteria( R_RT, R_AT) self.mechanical_convergence_criterion.SetEchoLevel(echo_level) elif (convergence_crit == "and_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosAndCriteria( Residual, Displacement) elif (convergence_crit == "or_criterion"): Displacement = TrilinosApplication.TrilinosDisplacementCriteria( D_RT, D_AT) Displacement.SetEchoLevel(echo_level) Residual = TrilinosApplication.TrilinosResidualCriteria(R_RT, R_AT) Residual.SetEchoLevel(echo_level) self.mechanical_convergence_criterion = TrilinosApplication.TrilinosOrCriteria( 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)