hp_space.py 2.84 KB
Newer Older
csongor's avatar
csongor committed
1
2
3
4
5
6
7
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
8
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
csongor's avatar
csongor committed
10
11
#
# You should have received a copy of the GNU General Public License
12
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Theo Steininger's avatar
Theo Steininger committed
13
#
Martin Reinecke's avatar
Martin Reinecke committed
14
# Copyright(C) 2013-2018 Max-Planck-Society
Theo Steininger's avatar
Theo Steininger committed
15
16
17
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik
# and financially supported by the Studienstiftung des deutschen Volkes.
csongor's avatar
csongor committed
18

Martin Reinecke's avatar
Martin Reinecke committed
19
from __future__ import division
csongor's avatar
csongor committed
20
import numpy as np
Martin Reinecke's avatar
Martin Reinecke committed
21
from .structured_domain import StructuredDomain
22

Theo Steininger's avatar
Theo Steininger committed
23

Martin Reinecke's avatar
Martin Reinecke committed
24
class HPSpace(StructuredDomain):
Martin Reinecke's avatar
Martin Reinecke committed
25
26
27
28
    """NIFTy subclass for HEALPix discretizations of the two-sphere.

    Its harmonic partner domain is the
    :class:`~nifty4.domains.lm_space.LMSpace`.
Martin Reinecke's avatar
Martin Reinecke committed
29
30
31
32
33
34

    Parameters
    ----------
    nside : int
        The corresponding HEALPix Nside parameter. Must be a positive integer
        and typically is a power of 2.
csongor's avatar
csongor committed
35
    """
36

Martin Reinecke's avatar
Martin Reinecke committed
37
38
    def __init__(self, nside):
        super(HPSpace, self).__init__()
39
        self._needed_for_hash += ["_nside"]
Martin Reinecke's avatar
Martin Reinecke committed
40
41
42
        self._nside = int(nside)
        if self._nside < 1:
            raise ValueError("nside must be >=1.")
43

44
45
46
    def __repr__(self):
        return ("HPSpace(nside=%r)" % self.nside)

47
48
49
    @property
    def harmonic(self):
        return False
csongor's avatar
csongor committed
50
51
52

    @property
    def shape(self):
Martin Reinecke's avatar
Martin Reinecke committed
53
        return (self.size,)
csongor's avatar
csongor committed
54
55

    @property
Martin Reinecke's avatar
Martin Reinecke committed
56
    def size(self):
57
        return np.int(12 * self.nside * self.nside)
csongor's avatar
csongor committed
58

59
    def scalar_dvol(self):
60
        return np.pi / (3*self._nside*self._nside)
61
62
63

    @property
    def nside(self):
Martin Reinecke's avatar
Martin Reinecke committed
64
        """Returns the nside of the corresponding HEALPix pixelization."""
65
66
        return self._nside

Martin Reinecke's avatar
Martin Reinecke committed
67
    def get_default_codomain(self):
Martin Reinecke's avatar
Martin Reinecke committed
68
69
70
71
72
73
74
75
76
77
78
79
80
        """Returns a :class:`LMSpace` object, which is capable of storing a
        fairly accurate representation of data residing on `self`

        Returns
        -------
        LMSpace
            The parter domain

        Notes
        -----
        The `lmax` and `mmax` parameters of the returned :class:`LMSpace` are
        set to `2*self.nside`.
        """
Martin Reinecke's avatar
Martin Reinecke committed
81
        from .. import LMSpace
Martin Reinecke's avatar
bug fix    
Martin Reinecke committed
82
        return LMSpace(lmax=2*self.nside)
Martin Reinecke's avatar
Martin Reinecke committed
83
84

    def check_codomain(self, codomain):
Martin Reinecke's avatar
Martin Reinecke committed
85
86
87
88
89
90
91
92
        """Raises `TypeError` if `codomain` is not a matching partner domain
        for `self`.

        Notes
        -----
        This function only checks whether `codomain` is of type
        :class:`LMSpace`.
        """
Martin Reinecke's avatar
Martin Reinecke committed
93
94
95
        from .. import LMSpace
        if not isinstance(codomain, LMSpace):
            raise TypeError("codomain must be a LMSpace.")