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
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
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