예제 #1
0
    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()]

        # 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.VELOCITY_VARIABLE:
            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)
예제 #2
0
    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)