def Initialize(self): 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 solution strategy self.conv_criteria = KratosCFD.VelPrCriteria( self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble(), self.settings["relative_pressure_tolerance"].GetDouble(), self.settings["absolute_pressure_tolerance"].GetDouble()) (self.conv_criteria).SetEchoLevel(self.settings["echo_level"].GetInt()) if (self.settings["turbulence_model"].GetString() == "None"): if self.settings["consider_periodic_conditions"].GetBool() == True: self.time_scheme = KratosCFD.ResidualBasedPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], KratosCFD.PATCH_INDEX) else: self.time_scheme = KratosCFD.ResidualBasedPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE]) else: raise Exception("Turbulence models are not added yet.") if self.settings["consider_periodic_conditions"].GetBool() == True: builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic( self.linear_solver, KratosCFD.PATCH_INDEX) else: builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( self.linear_solver) self.solver = KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy( self.main_model_part, self.time_scheme, self.linear_solver, self.conv_criteria, 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.solver).Check() self.main_model_part.ProcessInfo.SetValue( KratosMultiphysics.DYNAMIC_TAU, self.settings["dynamic_tau"].GetDouble()) self.main_model_part.ProcessInfo.SetValue( KratosMultiphysics.OSS_SWITCH, self.settings["oss_switch"].GetInt()) print("Monolithic solver initialization finished.")
def _CreateBuilderAndSolver(self): linear_solver = self._GetLinearSolver() if self.settings["consider_periodic_conditions"].GetBool(): builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic( linear_solver, KratosCFD.PATCH_INDEX) else: builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( linear_solver) return builder_and_solver
def _ConstructBuilderAndSolver(self, block_builder): # Creating the builder and solver if(self.settings["periodic_interface_conditions"].GetBool() == True): builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic(self.linear_solver,KratosMultiphysics.PERIODIC_PAIR_INDEX) else: if(block_builder): builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(self.linear_solver) else: builder_and_solver = KratosMultiphysics.ResidualBasedEliminationBuilderAndSolver(self.linear_solver) return builder_and_solver
def Initialize(self): self.computing_model_part = self.GetComputingModelPart() self.response_function = self.GetResponseFunction() self.sensitivity_builder = KratosMultiphysics.SensitivityBuilder( self.settings["sensitivity_settings"], self.main_model_part, self.response_function) if self.settings["scheme_settings"]["scheme_type"].GetString( ) == "bossak": self.time_scheme = KratosMultiphysics.ResidualBasedAdjointBossakScheme( self.settings["scheme_settings"], self.response_function) elif self.settings["scheme_settings"]["scheme_type"].GetString( ) == "steady": self.time_scheme = KratosMultiphysics.ResidualBasedAdjointSteadyScheme( self.response_function) else: raise Exception( "invalid scheme_type: " + self.settings["scheme_settings"]["scheme_type"].GetString()) if self.settings["consider_periodic_conditions"].GetBool() == True: builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic( self.linear_solver, KratosCFD.PATCH_INDEX) else: builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( self.linear_solver) self.solver = KratosMultiphysics.ResidualBasedLinearStrategy( self.main_model_part, self.time_scheme, self.linear_solver, builder_and_solver, False, False, False, False) (self.solver).SetEchoLevel(self.settings["echo_level"].GetInt()) self.main_model_part.ProcessInfo.SetValue( KratosMultiphysics.DYNAMIC_TAU, self.settings["dynamic_tau"].GetDouble()) self.main_model_part.ProcessInfo.SetValue( KratosMultiphysics.OSS_SWITCH, self.settings["oss_switch"].GetInt()) if hasattr(self, "_adjoint_turbulence_model_solver"): self._adjoint_turbulence_model_solver.Initialize() (self.solver).Initialize() (self.response_function).Initialize() (self.sensitivity_builder).Initialize() KratosMultiphysics.Logger.PrintInfo(self.__class__.__name__, "Solver initialization finished.")
def Initialize(self): 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 solution strategy self.conv_criteria = KratosCFD.VelPrCriteria(self.settings["relative_velocity_tolerance"].GetDouble(), self.settings["absolute_velocity_tolerance"].GetDouble(), self.settings["relative_pressure_tolerance"].GetDouble(), self.settings["absolute_pressure_tolerance"].GetDouble()) (self.conv_criteria).SetEchoLevel(self.settings["echo_level"].GetInt()) # Creating the time integration 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 = KratosMultiphysics.ResidualBasedIncrementalUpdateStaticSchemeSlip( 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, the BDF process is required to update the BDF coefficients if (self.settings["time_scheme"].GetString() == "bdf2"): time_order = 2 self.bdf_process = KratosMultiphysics.ComputeBDFCoefficientsProcess(self.computing_model_part, 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 (self.settings["turbulence_model"].GetString() == "None"): # Bossak time integration scheme if self.settings["time_scheme"].GetString() == "bossak": if self.settings["consider_periodic_conditions"].GetBool() == True: self.time_scheme = KratosCFD.ResidualBasedPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.computing_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE], KratosCFD.PATCH_INDEX) else: self.time_scheme = KratosCFD.ResidualBasedPredictorCorrectorVelocityBossakSchemeTurbulent( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE]) # BDF2 time integration scheme elif self.settings["time_scheme"].GetString() == "bdf2": self.time_scheme = KratosCFD.GearScheme() # Time scheme for steady state fluid solver elif self.settings["time_scheme"].GetString() == "steady": self.time_scheme = KratosCFD.ResidualBasedSimpleSteadyScheme( self.settings["velocity_relaxation"].GetDouble(), self.settings["pressure_relaxation"].GetDouble(), self.computing_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE]) else: err_msg = "Requested time scheme " + self.settings["time_scheme"].GetString() + " is not available.\n" err_msg += "Available options are: \"bossak\", \"bdf2\" and \"steady\"" raise Exception(err_msg) else: raise Exception("Turbulence models are not added yet.") if self.settings["consider_periodic_conditions"].GetBool() == True: builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic(self.linear_solver, KratosCFD.PATCH_INDEX) else: builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(self.linear_solver) self.solver = KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy(self.computing_model_part, self.time_scheme, self.linear_solver, self.conv_criteria, 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.PrintInfo("NavierStokesSolverMonolithic", "Solver initialization finished.")
def Initialize(self): 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 solution strategy self.convergence_criterion = KratosMultiphysics.MixedGenericCriteria([ (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()) ]) (self.conv_criteria).SetEchoLevel(self.settings["echo_level"].GetInt()) if (self.settings["turbulence_model"].GetString() == "None"): if self.settings["time_scheme"].GetString() == "bossak": if self.settings["consider_periodic_conditions"].GetBool( ) == True: self.time_scheme = KratosPFEM2.ResidualBasedPredictorCorrectorVelocityBossakAleScheme( self.settings["alpha"].GetDouble(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE], KratosCFD.PATCH_INDEX) else: self.time_scheme = KratosPFEM2.ResidualBasedPredictorCorrectorVelocityBossakAleScheme( self.settings["alpha"].GetDouble(), self.settings["move_mesh_strategy"].GetInt(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE]) elif self.settings["time_scheme"].GetString() == "bdf2": self.time_scheme = KratosCFD.BDF2TurbulentScheme() elif self.settings["time_scheme"].GetString() == "steady": self.time_scheme = KratosCFD.ResidualBasedSimpleSteadyScheme( self.settings["velocity_relaxation"].GetDouble(), self.settings["pressure_relaxation"].GetDouble(), self.computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE]) else: raise Exception("Turbulence models are not added yet.") if self.settings["consider_periodic_conditions"].GetBool() == True: builder_and_solver = KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic( self.linear_solver, KratosCFD.PATCH_INDEX) else: builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver( self.linear_solver) self.solver = KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy( self.computing_model_part, self.time_scheme, self.linear_solver, self.conv_criteria, 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.PrintInfo( "PFEM2NavierStokesMonolithicSolver", "Solver initialization finished.")
def PeriodicBlockBuilderAndSolver(linear_solver, _): return KratosCFD.ResidualBasedBlockBuilderAndSolverPeriodic( linear_solver, KratosCFD.PATCH_INDEX)