def __init__(self, model, settings): KratosMultiphysics.Process.__init__(self) ## Settings string in json format default_parameters = KratosMultiphysics.Parameters(""" { "model_part_name" : "model_part", "formulation" : "reduced_variables", "variables" : "free_surface", "interval" : [0.0, 1e30], "wave_length" : 10.0, "wave_period" : 10.0, "wave_height" : 1.0 } """) # Overwrite the default settings with user-provided parameters settings.ValidateAndAssignDefaults(default_parameters) self.model_part = model[settings["model_part_name"].GetString()] self.interval = KratosMultiphysics.IntervalUtility(settings) self.formulation = self.__formulation[ settings["formulation"].GetString()] self.variables = self.__variables[settings["variables"].GetString()] # Definition of pi number import math # Wave parameters wave_height = settings["wave_height"].GetDouble() wave_period = settings["wave_period"].GetDouble() wave_length = settings["wave_length"].GetDouble() # Creation of the parameters for the c++ process free_surface_parameters = KratosMultiphysics.Parameters("""{}""") free_surface_parameters.AddEmptyValue("amplitude").SetDouble( 0.5 * wave_height) free_surface_parameters.AddEmptyValue("period").SetDouble(wave_period) free_surface_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) free_surface_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) velocity_parameters = KratosMultiphysics.Parameters("""{}""") velocity_parameters.AddEmptyValue("amplitude").SetDouble( math.pi * wave_height / wave_period) velocity_parameters.AddEmptyValue("period").SetDouble(wave_period) velocity_parameters.AddEmptyValue("phase_shift").SetDouble( wave_period / 4) velocity_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) if self.variables == Shallow.Variables.VELOCITY_VARIABLE: velocity_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) self.free_surface_process = Shallow.ApplySinusoidalFunctionToScalar( self.model_part, Shallow.FREE_SURFACE_ELEVATION, free_surface_parameters) self.velocity_process = Shallow.ApplySinusoidalFunctionToScalar( self.model_part, Shallow.FREE_SURFACE_ELEVATION, velocity_parameters) self.variables_utility = Shallow.ShallowWaterVariablesUtility( self.model_part)
def ExecuteInitialize(self): wave_amplitude = 0.5 * self.wave_height depth = -self.model_part.Nodes.__iter__().__next__( ).GetSolutionStepValue(SW.TOPOGRAPHY) gravity = self.model_part.ProcessInfo[KM.GRAVITY_Z] wave_velocity = sqrt(depth * gravity) velocity_amplitude = wave_amplitude * wave_velocity / depth # Creation of the parameters for the c++ process free_surface_parameters = KM.Parameters("""{}""") free_surface_parameters.AddEmptyValue("amplitude").SetDouble( wave_amplitude) free_surface_parameters.AddEmptyValue("period").SetDouble( self.wave_period) free_surface_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) free_surface_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) free_surface_parameters.AddEmptyValue("smooth_time").SetDouble( self.smooth_time) velocity_parameters = KM.Parameters("""{}""") velocity_parameters.AddEmptyValue("amplitude").SetDouble( velocity_amplitude) velocity_parameters.AddEmptyValue("period").SetDouble(self.wave_period) velocity_parameters.AddEmptyValue("phase_shift").SetDouble( self.wave_period / 4) velocity_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) free_surface_parameters.AddEmptyValue("smooth_time").SetDouble( self.smooth_time) if self.variables == SW.Variables.VelocityVariable: velocity_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) self.free_surface_process = SW.ApplySinusoidalFunctionToScalar( self.model_part, SW.FREE_SURFACE_ELEVATION, free_surface_parameters) self.velocity_process = SW.ApplySinusoidalFunctionToVector( self.model_part, KM.VELOCITY, velocity_parameters) KM.NormalCalculationUtils().CalculateOnSimplex( self.model_part, self.model_part.ProcessInfo[KM.DOMAIN_SIZE]) SW.ShallowWaterUtilities().NormalizeVector(self.model_part, KM.NORMAL)
def __init__(self, model, settings): KM.Process.__init__(self) ## Settings string in json format default_parameters = KM.Parameters(""" { "model_part_name" : "model_part", "formulation" : "reduced_variables", "variables" : "free_surface", "interval" : [0.0, 1e30], "wave_length" : 10.0, "wave_period" : 10.0, "wave_height" : 1.0 } """) # Overwrite the default settings with user-provided parameters settings.ValidateAndAssignDefaults(default_parameters) self.model_part = model[settings["model_part_name"].GetString()] self.interval = KM.IntervalUtility(settings) self.formulation = self.__formulation[ settings["formulation"].GetString()] self.variables = self.__variables[settings["variables"].GetString()] self.fix_dofs = True # Definition of pi number import math # Wave parameters wave_height = settings["wave_height"].GetDouble() wave_period = settings["wave_period"].GetDouble() wave_length = settings["wave_length"].GetDouble() # Creation of the parameters for the c++ process free_surface_parameters = KM.Parameters("""{}""") free_surface_parameters.AddEmptyValue("amplitude").SetDouble( 0.5 * wave_height) free_surface_parameters.AddEmptyValue("period").SetDouble(wave_period) free_surface_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) free_surface_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) velocity_parameters = KM.Parameters("""{}""") velocity_parameters.AddEmptyValue("amplitude").SetDouble( math.pi * wave_height / wave_period) velocity_parameters.AddEmptyValue("period").SetDouble(wave_period) velocity_parameters.AddEmptyValue("phase_shift").SetDouble( wave_period / 4) velocity_parameters.AddEmptyValue("vertical_shift").SetDouble(0.0) if self.variables == SW.Variables.VelocityVariable: velocity_parameters.AddEmptyValue("phase_shift").SetDouble(0.0) self.free_surface_process = SW.ApplySinusoidalFunctionToScalar( self.model_part, SW.FREE_SURFACE_ELEVATION, free_surface_parameters) self.velocity_process = SW.ApplySinusoidalFunctionToVector( self.model_part, KM.VELOCITY, velocity_parameters) KM.NormalCalculationUtils().CalculateOnSimplex( self.model_part, self.model_part.ProcessInfo[KM.DOMAIN_SIZE]) SW.ShallowWaterUtilities().NormalizeVector(self.model_part, KM.NORMAL)