hp_space.py 2.83 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
    """NIFTy subclass for HEALPix discretizations of the two-sphere.

    Its harmonic partner domain is the
Philipp Arras's avatar
Philipp Arras committed
28
    :class:`~nifty5.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
    _needed_for_hash = ["_nside"]

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

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

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

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

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

Martin Reinecke's avatar
Martin Reinecke committed
60
    @property
61
    def scalar_dvol(self):
62
        return np.pi / (3*self._nside*self._nside)
63
64
65

    @property
    def nside(self):
Martin Reinecke's avatar
Martin Reinecke committed
66
        """int : HEALPix Nside parameter of this domain"""
67
68
        return self._nside

Martin Reinecke's avatar
Martin Reinecke committed
69
    def get_default_codomain(self):
Martin Reinecke's avatar
Martin Reinecke committed
70
71
72
73
74
75
        """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
76
            The partner domain
Martin Reinecke's avatar
Martin Reinecke committed
77
78
79
80
81
82

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

    def check_codomain(self, codomain):
Martin Reinecke's avatar
Martin Reinecke committed
87
88
89
90
91
92
93
94
        """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
95
96
97
        from .. import LMSpace
        if not isinstance(codomain, LMSpace):
            raise TypeError("codomain must be a LMSpace.")