hp_space.py 2.82 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
        """int : HEALPix Nside parameter of this domain"""
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
        """Returns a :class:`LMSpace` object, which is capable of storing a
        fairly accurate representation of data residing on `self`

        Returns
        -------
        LMSpace
Martin Reinecke's avatar
Martin Reinecke committed
74
            The partner domain
Martin Reinecke's avatar
Martin Reinecke committed
75 76 77 78 79 80

        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.")