def test_matrix3(self): """fftn(ifftn(x)) is x""" for ar in [self.md, self.mz, self.mf, self.mc]: d = ar.copy() r_tol, a_tol = _get_rtol_atol(d) t = mkl_fft.fftn(mkl_fft.ifftn(d)) assert_allclose(d, t, rtol=r_tol, atol=a_tol, err_msg = "failed test for dtype {}, max abs diff: {}".format(d.dtype, np.max(np.abs(d-t))))
def propagate(self): self.work.fill(0) self.work_view1[:] = self.field1.field for W in self.W1: self.work_view1 *= W self.work_F = mkl_fft.fftn(self.work, overwrite_x=True) for WF in self.W12F_pad: self.work_F *= WF self.work[:] = mkl_fft.ifftn(self.work, overwrite_x=True) for W in self.W2: self.work_view2 *= W self.field2.field = self.work_view2 * self.Sf
def propagate_backward(self): self.work.fill(0) self.work_view2[:] = self.field2.field for W in self.W2: self.work_view2 *= W.conj() self.work_F = mkl_fft.fftn(self.work, axes=range(-self.ndim, 0), overwrite_x=True) for WF in self.W12F_pad: self.work_F *= WF.conj() self.work[:] = mkl_fft.ifftn(self.work, axes=range(-self.ndim, 0), overwrite_x=True) for W in self.W1: self.work_view1 *= W.conj() self.field1.field = self.work_view1 * self.Sb
def _operation(self, field, adjoint): '''The internal filtering operation. Parameters ---------- field : Field The input field. adjoint : boolean Whether to perform a forward or adjoint filter. Returns ------- Field The filtered field. ''' self._compute_functions(field) if self.cutout is None: f = field.shaped else: f = self.internal_array f[:] = 0 c = tuple([slice(None)] * field.tensor_order) + self.cutout f[c] = field.shaped # Don't overwrite f if it's the input array. if _use_mkl: kwargs = { 'overwrite_x': self.cutout is not None and field.grid.ndim > 1 } else: kwargs = {} f = _fft_module.fftn(f, axes=tuple(range(-self.input_grid.ndim, 0)), **kwargs) if (self._transfer_function.ndim - self.internal_grid.ndim) == 2: # The transfer function is a matrix field. s1 = f.shape[:-self.internal_grid.ndim] + ( self.internal_grid.size, ) f = Field(f.reshape(s1), self.internal_grid) s2 = self._transfer_function.shape[:-self.internal_grid.ndim] + ( self.internal_grid.size, ) tf = Field(self._transfer_function.reshape(s2), self.internal_grid) if adjoint: tf = field_conjugate_transpose(tf) f = field_dot(tf, f).shaped else: # The transfer function is a scalar field. if adjoint: tf = self._transfer_function.conj() else: tf = self._transfer_function f *= tf if _use_mkl: kwargs = {'overwrite_x': True} else: kwargs = {} f = _fft_module.ifftn(f, axes=tuple(range(-self.input_grid.ndim, 0)), **kwargs) s = f.shape[:-self.internal_grid.ndim] + (-1, ) if self.cutout is None: res = f.reshape(s) else: res = f[c].reshape(s) return Field(res, self.input_grid)