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() #TODO: next part would be much cleaner if we passed directly the parameters to the c++ if self.settings["consider_periodic_conditions"] == True: self.solver_settings = KratosCFD.FractionalStepSettingsPeriodic(self.computing_model_part, self.computing_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE], self.settings.GetInt(), self.settings["use_slip_conditions"].GetBool(), self.settings["move_mesh_flag"].GetBool(), self.settings["reform_dofs_at_each_step"].GetBool(), KratosCFD.PATCH_INDEX) else: self.solver_settings = KratosCFD.FractionalStepSettings(self.computing_model_part, self.computing_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE], self.settings["time_order"].GetInt(), self.settings["use_slip_conditions"].GetBool(), self.settings["move_mesh_flag"].GetBool(), self.settings["reform_dofs_at_each_step"].GetBool()) self.solver_settings.SetEchoLevel(self.settings["echo_level"].GetInt()) self.solver_settings.SetStrategy(KratosCFD.StrategyLabel.Velocity, self.velocity_linear_solver, self.settings["velocity_tolerance"].GetDouble(), self.settings["maximum_velocity_iterations"].GetInt()) self.solver_settings.SetStrategy(KratosCFD.StrategyLabel.Pressure, self.pressure_linear_solver, self.settings["pressure_tolerance"].GetDouble(), self.settings["maximum_pressure_iterations"].GetInt()) if self.settings["consider_periodic_conditions"].GetBool() == True: self.solver = KratosCFD.FSStrategy(self.computing_model_part, self.solver_settings, self.settings["predictor_corrector"].GetBool(), KratosCFD.PATCH_INDEX) else: self.solver = KratosCFD.FSStrategy(self.computing_model_part, self.solver_settings, self.settings["predictor_corrector"].GetBool()) 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()) (self.solver).Initialize() self.solver.Check() KratosMultiphysics.Logger.PrintInfo("NavierStokesSolverFractionalStep", "Solver initialization finished.")
def _CreateSolutionStrategy(self): computing_model_part = self.GetComputingModelPart() domain_size = computing_model_part.ProcessInfo[ KratosMultiphysics.DOMAIN_SIZE] # Create the pressure and velocity linear solvers # Note that linear_solvers is a tuple. The first item is the pressure # linear solver. The second item is the velocity linear solver. linear_solvers = self._GetLinearSolver() # Create the fractional step settings instance # TODO: next part would be much cleaner if we passed directly the parameters to the c++ if self.settings["consider_periodic_conditions"].GetBool(): fractional_step_settings = KratosCFD.FractionalStepSettingsPeriodic( computing_model_part, domain_size, self.settings["time_order"].GetInt(), self.settings["use_slip_conditions"].GetBool(), self.settings["move_mesh_flag"].GetBool(), self.settings["reform_dofs_at_each_step"].GetBool(), KratosCFD.PATCH_INDEX) else: fractional_step_settings = KratosCFD.FractionalStepSettings( computing_model_part, domain_size, self.settings["time_order"].GetInt(), self.settings["use_slip_conditions"].GetBool(), self.settings["move_mesh_flag"].GetBool(), self.settings["reform_dofs_at_each_step"].GetBool()) # Set the strategy echo level fractional_step_settings.SetEchoLevel( self.settings["echo_level"].GetInt()) # Set the velocity and pressure fractional step strategy settings fractional_step_settings.SetStrategy( KratosCFD.StrategyLabel.Pressure, linear_solvers[0], self.settings["pressure_tolerance"].GetDouble(), self.settings["maximum_pressure_iterations"].GetInt()) fractional_step_settings.SetStrategy( KratosCFD.StrategyLabel.Velocity, linear_solvers[1], self.settings["velocity_tolerance"].GetDouble(), self.settings["maximum_velocity_iterations"].GetInt()) # Create the fractional step strategy if self.settings["consider_periodic_conditions"].GetBool() == True: solution_strategy = KratosCFD.FSStrategy( computing_model_part, fractional_step_settings, self.settings["predictor_corrector"].GetBool(), KratosCFD.PATCH_INDEX) else: solution_strategy = KratosCFD.FSStrategy( computing_model_part, fractional_step_settings, self.settings["predictor_corrector"].GetBool()) return solution_strategy