Exemple #1
0
    def filter_func(field, *args):
        # these next steps are a kind of hack we have to turn keyword arugments into regular arguments
        # the reason for doing this is that Xarray's apply_ufunc machinery works a lot better
        # with regular arguments
        assert len(args) == len(Laplacian.required_grid_args())
        grid_vars = {
            k: v
            for k, v in zip(Laplacian.required_grid_args(), args)
        }
        laplacian = Laplacian(**grid_vars)
        np = get_array_module(field)
        field_bar = field.copy()  # Initalize the filtering process

        # prepare field for filtering (this multiplies by area for simple fixed factor
        # filters, and does nothing for all other filters)
        field_bar = laplacian.prepare(field_bar)

        T_minus_2 = field_bar.copy()
        T_minus_1 = shifted_laplacian(field_bar, filter_spec.s_max, laplacian,
                                      filter_spec.dx_min_sq)
        field_bar = filter_spec.p[0] * T_minus_2 + filter_spec.p[1] * T_minus_1
        for i in range(2, filter_spec.n_steps + 1):
            T_minus_0 = (
                2 * shifted_laplacian(T_minus_1, filter_spec.s_max, laplacian,
                                      filter_spec.dx_min_sq) - T_minus_2)
            field_bar += filter_spec.p[i] * T_minus_0
            T_minus_2 = T_minus_1.copy()
            T_minus_1 = T_minus_0.copy()

        # finalize filtering (this divides by area for simple fixed factor filters,
        # and does nothing for all other filters)
        field_bar = laplacian.finalize(field_bar)

        return field_bar
Exemple #2
0
    def filter_func(field, *args):
        # these next steps are a kind of hack we have to turn keyword arugments into regular arguments
        # the reason for doing this is that Xarray's apply_ufunc machinery works a lot better
        # with regular arguments
        assert len(args) == len(Laplacian.required_grid_args())
        grid_vars = {
            k: v
            for k, v in zip(Laplacian.required_grid_args(), args)
        }
        laplacian = Laplacian(**grid_vars)
        np = get_array_module(field)
        field_bar = field.copy()  # Initalize the filtering process

        # prepare field for filtering (this multiplies by area for simple fixed factor
        # filters, and does nothing for all other filters)
        field_bar = laplacian.prepare(field_bar)

        for i in range(filter_spec.n_steps_total):
            if filter_spec.is_laplacian[i]:
                s_l = np.real(filter_spec.s[i])
                tendency = laplacian(field_bar)  # Compute Laplacian
                field_bar += (1 / s_l) * tendency  # Update filtered field
            else:
                s_b = filter_spec.s[i]
                temp_l = laplacian(field_bar)  # Compute Laplacian
                temp_b = laplacian(
                    temp_l)  # Compute Biharmonic (apply Laplacian twice)
                field_bar += (temp_l * 2 * np.real(s_b) / np.abs(s_b)**2 +
                              temp_b * 1 / np.abs(s_b)**2)

        # finalize filtering (this divides by area for simple fixed factor filters,
        # and does nothing for all other filters)
        field_bar = laplacian.finalize(field_bar)

        return field_bar
Exemple #3
0
 def filter_func(field, *args):
     # these next steps are a kind of hack we have to turn keyword arugments into regular arguments
     # the reason for doing this is that Xarray's apply_ufunc machinery works a lot better
     # with regular arguments
     assert len(args) == len(Laplacian.required_grid_args())
     grid_vars = {
         k: v
         for k, v in zip(Laplacian.required_grid_args(), args)
     }
     laplacian = Laplacian(**grid_vars)
     np = get_array_module(field)
     field_bar = field.copy()  # Initalize the filtering process
     for i in range(filter_spec.n_lap_steps):
         s_l = filter_spec.s_l[i]
         tendency = laplacian(field_bar)  # Compute Laplacian
         field_bar += (1 / s_l) * tendency  # Update filtered field
     for i in range(filter_spec.n_bih_steps):
         s_b = filter_spec.s_b[i]
         temp_l = laplacian(field_bar)  # Compute Laplacian
         temp_b = laplacian(
             temp_l)  # Compute Biharmonic (apply Laplacian twice)
         field_bar += (temp_l * 2 * np.real(s_b) / np.abs(s_b)**2 +
                       temp_b * 1 / np.abs(s_b)**2)
     return field_bar