correlated_fields.py 3.06 KB
Newer Older
Martin Reinecke's avatar
Martin Reinecke committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 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
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Copyright(C) 2013-2018 Max-Planck-Society
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik
# and financially supported by the Studienstiftung des deutschen Volkes.

19
from __future__ import absolute_import, division, print_function
Philipp Arras's avatar
Philipp Arras committed
20

21
from ..compat import *
Philipp Arras's avatar
Philipp Arras committed
22
from ..domain_tuple import DomainTuple
Martin Reinecke's avatar
Martin Reinecke committed
23
from ..multi_domain import MultiDomain
24
from ..operators.contraction_operator import ContractionOperator
Philipp Arras's avatar
Philipp Arras committed
25
from ..operators.distributors import PowerDistributor
Martin Reinecke's avatar
Martin Reinecke committed
26
from ..operators.harmonic_operators import HarmonicTransformOperator
Martin Reinecke's avatar
Martin Reinecke committed
27
from ..operators.simple_linear_operators import FieldAdapter
28
from ..operators.scaling_operator import ScalingOperator
Martin Reinecke's avatar
Martin Reinecke committed
29

Martin Reinecke's avatar
Martin Reinecke committed
30

31
def CorrelatedField(s_space, amplitude_model, name='xi'):
32
    '''
Martin Reinecke's avatar
Martin Reinecke committed
33
    Function for construction of correlated fields
34 35 36

    Parameters
    ----------
37 38 39 40 41 42
    s_space : Domain
        Field domain
    amplitude_model: Operator
        model for correlation structure
    name : string
        MultiField component name
43
    '''
Martin Reinecke's avatar
Martin Reinecke committed
44 45 46 47 48
    h_space = s_space.get_default_codomain()
    ht = HarmonicTransformOperator(h_space, s_space)
    p_space = amplitude_model.target[0]
    power_distributor = PowerDistributor(h_space, p_space)
    A = power_distributor(amplitude_model)
49
    vol = h_space.scalar_dvol
Philipp Arras's avatar
Cleanup  
Philipp Arras committed
50
    vol = ScalingOperator(vol**(-0.5), h_space)
51
    return ht(vol(A)*FieldAdapter(h_space, name))
52 53


Philipp Arras's avatar
Cleanup  
Philipp Arras committed
54 55
def MfCorrelatedField(s_space_spatial, s_space_energy, amplitude_model_spatial,
                      amplitude_model_energy, name="xi"):
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    '''
    Method for construction of correlated multi-frequency fields
    '''
    h_space_spatial = s_space_spatial.get_default_codomain()
    h_space_energy = s_space_energy.get_default_codomain()
    h_space = DomainTuple.make((h_space_spatial, h_space_energy))
    ht1 = HarmonicTransformOperator(h_space, space=0)
    ht2 = HarmonicTransformOperator(ht1.target, space=1)
    ht = ht2(ht1)

    p_space_spatial = amplitude_model_spatial.target[0]
    p_space_energy = amplitude_model_energy.target[0]

    pd_spatial = PowerDistributor(h_space, p_space_spatial, 0)
    pd_energy = PowerDistributor(pd_spatial.domain, p_space_energy, 1)
    pd = pd_spatial(pd_energy)

73 74
    dom_distr_spatial = ContractionOperator(pd.domain, 1).adjoint
    dom_distr_energy = ContractionOperator(pd.domain, 0).adjoint
75 76 77 78 79

    a_spatial = dom_distr_spatial(amplitude_model_spatial)
    a_energy = dom_distr_energy(amplitude_model_energy)
    a = a_spatial*a_energy
    A = pd(a)
Philipp Arras's avatar
Philipp Arras committed
80
    return ht(A*FieldAdapter(h_space, name))