From a1306279bd6184e509a670c71fcb1a3f2275a593 Mon Sep 17 00:00:00 2001 From: Martin Reinecke <martin@mpa-garching.mpg.de> Date: Sat, 22 Apr 2017 10:35:55 +0200 Subject: [PATCH] use iterative map analysis for Healpix --- .../transformations/hplmtransformation.py | 7 ++----- .../transformations/lmhptransformation.py | 9 +++------ test/test_misc.py | 13 +++++++++++++ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/nifty/operators/fft_operator/transformations/hplmtransformation.py b/nifty/operators/fft_operator/transformations/hplmtransformation.py index 8fe7031be..f32e0db86 100644 --- a/nifty/operators/fft_operator/transformations/hplmtransformation.py +++ b/nifty/operators/fft_operator/transformations/hplmtransformation.py @@ -88,11 +88,8 @@ class HPLMTransformation(SlicingTransformation): mmax = lmax nside= self.domain.nside - sjob = pyHealpix.sharpjob_d() - sjob.set_Healpix_geometry(nside) - sjob.set_triangular_alm_info(lmax, mmax) if issubclass(inp.dtype.type, np.complexfloating): - [resultReal, resultImag] = [sjob.map2alm(x) + [resultReal, resultImag] = [pyHealpix.map2alm_iter(x,lmax,mmax,3) for x in (inp.real, inp.imag)] [resultReal, @@ -102,7 +99,7 @@ class HPLMTransformation(SlicingTransformation): result = self._combine_complex_result(resultReal, resultImag) else: - result = sjob.map2alm(inp) + result = pyHealpix.map2alm_iter(inp,lmax,mmax,3) result = lm_transformation_factory.buildIdx(result, lmax=lmax) return result diff --git a/nifty/operators/fft_operator/transformations/lmhptransformation.py b/nifty/operators/fft_operator/transformations/lmhptransformation.py index d17d52293..0fc9e425b 100644 --- a/nifty/operators/fft_operator/transformations/lmhptransformation.py +++ b/nifty/operators/fft_operator/transformations/lmhptransformation.py @@ -64,7 +64,7 @@ class LMHPTransformation(SlicingTransformation): if not isinstance(domain, LMSpace): raise TypeError("domain needs to be a LMSpace.") - nside = np.max(domain.lmax//2, 1) + nside = max((domain.lmax+1) // 2, 1) result = HPSpace(nside=nside, dtype=domain.dtype) return result @@ -89,21 +89,18 @@ class LMHPTransformation(SlicingTransformation): lmax = self.domain.lmax mmax = lmax - sjob = pyHealpix.sharpjob_d() - sjob.set_Healpix_geometry(nside) - sjob.set_triangular_alm_info(lmax, mmax) if issubclass(inp.dtype.type, np.complexfloating): [resultReal, resultImag] = [lm_transformation_factory.buildLm(x, lmax=lmax) for x in (inp.real, inp.imag)] - [resultReal, resultImag] = [sjob.alm2map(x) + [resultReal, resultImag] = [pyHealpix.alm2map(x,lmax,mmax,nside) for x in [resultReal, resultImag]] result = self._combine_complex_result(resultReal, resultImag) else: result = lm_transformation_factory.buildLm(inp, lmax=lmax) - result = sjob.alm2map(result) + result = pyHealpix.alm2map(result,lmax,mmax,nside) return result diff --git a/test/test_misc.py b/test/test_misc.py index 930be0aba..b8a8f8592 100644 --- a/test/test_misc.py +++ b/test/test_misc.py @@ -31,6 +31,7 @@ from nifty import Field,\ FieldArray, \ RGRGTransformation, \ LMGLTransformation, \ + LMHPTransformation, \ FFTOperator from nose.plugins.skip import SkipTest @@ -103,3 +104,15 @@ class Misc_Tests(unittest.TestCase): inp = Field.from_random(domain=a,random_type='normal',std=7,mean=3,dtype=tp) out = fft.inverse_times(fft.times(inp)) assert_allclose(inp.val, out.val) + + def test_sht2(self): + if 'pyHealpix' not in di: + raise SkipTest + for lm in [128,256]: + for tp in [np.float64,np.complex128,np.float32,np.complex64]: + a = LMSpace(lmax=lm) + b = LMHPTransformation.get_codomain(a) + fft = FFTOperator(domain=a, target=b, domain_dtype=tp, target_dtype=tp) + inp = Field.from_random(domain=a,random_type='normal',std=1,mean=0,dtype=tp) + out = fft.inverse_times(fft.times(inp)) + assert_allclose(inp.val, out.val,rtol=1e-3,atol=1e-3) -- GitLab