示例#1
0
 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))))
示例#2
0
    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
示例#3
0
    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
示例#4
0
    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)