def get_rslres(self, rsldb, lid, avg=False):
        """Get RSL residual.

        rsldb: RSL database
        lid: location id.
        avg: set to True to get average"""

        # check if residuals are cached
        if lid not in self.__rslres:
            # get coordinates
            cu = rsldb.db.cursor()
            cu.execute("SELECT longitude,latitude FROM location WHERE location_id == %i", (lid))
            loc = cu.fetchone()

            # get data
            times = []
            obs = []
            cu.execute("SELECT time,rsl FROM measurement WHERE location_id == %i", (lid))
            for o in cu.fetchall():
                times.append(o[0] * self.timescale)
                obs.append(o[1])
            ti = [self.timeslice(min(times) - 2.0, "d"), self.timeslice(max(times), "u")]
            ts = spline.cspline(ti[1] - ti[0] + 1)
            ts.init(self.time(ti), self.getRSL(list(loc), ti, clip=False))
            residuals = []
            for i in range(0, len(times)):
                residuals.append(obs[i] - ts.eval(times[i]))
            self.__rslres[lid] = (times, residuals)
        if avg:
            r = 0.0
            if len(self.__rslres[lid][1]) > 0:
                r = sum(self.__rslres[lid][1]) / float(len(self.__rslres[lid][1]))
            return r
        else:
            return self.__rslres[lid]
    def get_rslres(self,rsldb,lid):
        """Get RSL residual.

        rsldb: RSL database
        lid: location id."""

        # check if residuals are cached
        if lid not in self.__rslres:
            # get coordinates
            cu = rsldb.db.cursor()
            cu.execute('SELECT longitude,latitude FROM location WHERE location_id == %i',(lid))
            loc = cu.fetchone()

            # get data
            times = []
            obs = []
            cu.execute('SELECT time,rsl FROM measurement WHERE location_id == %i',(lid))
            for o in cu.fetchall():
                times.append(o[0]*self.timescale)
                obs.append(o[1])
            ti = [self.timeslice(min(times)-2.,'d'), self.timeslice(max(times),'u')]
            ts = spline.cspline(ti[1]-ti[0]+1)
            ts.init(self.time(ti),self.getRSL(list(loc),ti))
            residuals = []
            for i in range(0,len(times)):
                residuals.append(obs[i]-ts.eval(times[i]))
            self.__rslres[lid] = (times,residuals)
        return self.__rslres[lid]
    def spline(self,pos,time,level=0):
        """Interpolate 2D field using cubic splines.

        pos: [xloc,yloc]
        time: time slice
        level: horizontal slice."""

        data = self.get2Dfield(time,level=level)
        # interpolate along columns
        r = []
        for c in range(0,data.shape[0]):
            col = spline.cspline(data.shape[1])
            col.init(self.ydim[:],data[c,:])
            r.append(col.eval(pos[1]))
        # interpolate row
        row = spline.cspline(data.shape[0])
        row.init(self.xdim[:],r)
        return row.eval(pos[0])
Beispiel #4
0
"""
from pygsl import spline, errors, init
from pygsl import _numobj as numx

print ("#m=0,S=2")
n = 10
a = numx.arange(n)
x = a + 0.5 * numx.sin(a)
y = a + numx.cos(a**2)
for i in a:
    print (x[i], y[i])

print ("#m=1,S=0")
# Generation of the spline object ...  Acceleration is handled internally
myspline = spline.cspline(n)
myspline = spline.linear(n)
#acc = myspline._object.get_accel_object()
#print "Accel object", dir(acc)
# initalise with the vector of the independent and the dependent
init.add_c_traceback_frames(1)
#init.set_debug_level(10)
myspline.init(x, y[:3])
#print("Saved error state", init.error_handler_state_get())

x1 = numx.arange(n * 20) / 20.
for xi in x1:
    #print xi, myspline.eval(xi)
    pass

# Faster: eval_vector
Beispiel #5
0
"""
from pygsl import spline, errors
from pygsl import _numobj as numx

print "#m=0,S=2"
n = 10
a = numx.arange(n)
x = a + 0.5 * numx.sin(a)
y = a + numx.cos(a**2)
for i in a:
    print x[i], y[i]

print "#m=1,S=0"
# Generation of the spline object ...  Acceleration is handled internally
myspline = spline.cspline(n)
myspline = spline.linear(n)
acc = myspline._object.get_accel_object()
#print "Accel object", dir(acc)
# initalise with the vector of the independent and the dependent
myspline.init(x,y)
x1 = numx.arange(n * 20) / 20.
for xi in x1:
    #print xi, myspline.eval(xi)
    pass

# Faster: eval_vector
myspline.eval_vector(x1)
# Faster: eval_vector but use gsl_spline_eval_e to get errors back
# This should fail with gsl_DomainError
xtest = 10.5
def spectrum(y_final, y, u_s, u_t, N, derivs1, scalarsys, tensorsys):
    i = None

    h = 0.01
    h2 = 1.e-6  # init step size for mode integration

    abserr1 = 1.e-8  # absolute error tolerance - DO NOT ADJUST THESE VALUES!
    relerr1 = 1.e-8  # relative error tolerance

    abserr2 = 1e-10  # absolute error tolerance
    relerr2 = 1e-10  # relative error tolerance

    spec_params = params()

    # Read in k files
    k = None
    ks = np.empty(knos)
    kis = np.empty(kinos)

    try:
        ks = np.loadtxt(k_file)
    except IOError as e:
        print(f"Could not open file {k_file}, errno = {e}.")
        sys.exit()

    try:
        kis = np.loadtxt(ki_file)
    except IOError as e:
        print(f"Could not open file {ki_file}, errno = {e}.")
        sys.exit()

    realu_init = np.empty(2)
    imu_init = np.empty(2)

    realu_s = np.empty(kmax)
    realu_t = np.empty(kmax)

    imu_s = np.empty(kmax)
    imu_t = np.empty(kmax)

    P_s = np.empty(kinos)
    P_t = np.empty(kinos)

    j = None
    l = None
    m = None
    o = None
    status = None

    countback = 0
    count = 0

    ydoub = np.empty(NEQS)

    Ninit = None  # N_obs from flow integration
    Nfinal = None  # Smallest N value from flow integration

    spec_norm = None

    ru_init = None
    dru_init = None

    iu_init = None
    diu_init = None

    nu = None
    Yeff = None
    Phi = None

    # Buffers for interpolations
    Nefoldsback = np.empty(kmax)

    flowback = np.empty((5, kmax))

    Nordered = np.empty(kmax)
    uordered_s = np.empty(kmax)
    uordered_t = np.empty(kmax)
    """
    Initialize/allocate gsl stepper routines and variable
    step-size routines.  Define ode system.
    """
    s = odeiv.step_rk4(NEQS, derivs1)
    c = odeiv.control_y_new(s, abserr1, relerr1)
    e = odeiv.evolve(s, c, NEQS)
    """
    Set the initial value of the scale factor.  This is chosen
    so that k = aH (with k corresponding to the quadrupole) at the
    value N_obs from the path file.  The scale factor as a 
    function of N is a(N) = a_init*exp(-# of efolds).
    Units are hM_PL
    """
    Ninit = N
    spec_params.a_init = (1.73e-61 / y[1]) * np.exp(Ninit)
    spec_params.k = k
    """
    To improve stability/efficiency, we first generate
    an interpolating function for H, epsilon, sigma and xi^2.  We then pass these values
    as parameters to the mode equation, rather than solving the mode equation along with
    the full set of flow equations each time.
    """
    """
    Integrate backwards from end of inflation to the earliest time needed in order to initialize the
    largest scale fluctuations in the BD limlt.
    """
    ydoub[:] = y_final[:NEQS].copy()
    N = y_final[NEQS]
    Nfinal = N

    while (kis[0] * 5.41e-58) / (spec_params.a_init * np.exp(-N) *
                                 ydoub[1]) < Y:
        flowback[:, countback] = ydoub[:5].copy()

        Nefoldsback[countback] = N

        try:
            N, h2, ydoub = e.apply(N, 1000, h2, ydoub)
        except:
            status = 0
            return status
        else:
            status = 0

        countback += 1

    Nefoldsback[countback] = N

    flowback[:, countback] = ydoub[:5].copy()

    H = np.empty(countback + 1)
    eps = np.empty(countback + 1)
    sig = np.empty(countback + 1)
    xi = np.empty(countback + 1)
    Nefolds = np.empty(kmax)
    # Nefolds = np.empty(countback+1)
    phi = np.empty(countback + 1)

    H[:] = flowback[1, :countback + 1].copy()
    eps[:] = flowback[2, :countback + 1].copy()
    sig[:] = flowback[3, :countback + 1].copy()
    xi[:] = flowback[4, :countback + 1].copy()
    phi[:] = flowback[0, :countback + 1].copy()
    Nefolds[:countback + 1] = Nefoldsback[:countback + 1].copy()

    # Generate interpolating functions for H, eps, sig, xi and phi (for path gen. only)
    spline1 = spline.cspline(countback + 1)
    spline1.init(Nefolds[:countback + 1], H)

    spline2 = spline.cspline(countback + 1)
    spline2.init(Nefolds[:countback + 1], eps)

    spline3 = spline.cspline(countback + 1)
    spline3.init(Nefolds[:countback + 1], sig)

    spline4 = spline.cspline(countback + 1)
    spline4.init(Nefolds[:countback + 1], xi)

    spline0 = spline.cspline(countback + 1)
    spline0.init(Nefolds[:countback + 1], phi)

    h2 = -h2
    """
    Find scalar spectra first.
    """
    for m in range(kinos):
        print(m)

        k = kis[m] * 5.41e-58  # converts to Planck from hMpc^-1
        kis[m] = k
        N = Ninit
        ydoub[1] = spline1.eval(N)
        ydoub[2] = spline2.eval(N)
        count = 0
        """
        First, check to see if the given k value is in the
        Bunch-Davies limit at the start of inflation.  This limit is
        set by the #define Y=k/aH.  If the given k value yields a
        larger Y than the BD limit, then we must integrate forward
        (to smaller N) until we reach the proper value for Y.  If it is
        smaller, we must integrate backwards (to larger N).  These
        integrators are given a fixed stepsize to ensure that we don't
        inadvertently step too far beyond Y.
        """
        if k / 1.73e-61 > Y:  # 1.73e-61 is the present Hubble radius (~3.2e-4 hMpc^-1) in Planck units
            while k / (spec_params.a_init * np.exp(-N) * ydoub[1] *
                       (1 - ydoub[2])) > Y:
                N += -0.01
                ydoub[1] = spline1.eval(N)
                ydoub[2] = spline2.eval(N)
        else:
            while k / (spec_params.a_init * np.exp(-N) * ydoub[1] *
                       (1 - ydoub[2])) < Y:
                N += 0.01
                ydoub[1] = spline1.eval(N)
                ydoub[2] = spline2.eval(N)

        spec_params.k = k
        nu = (3 - spline2.eval(N)) / (2 * (1 - spline2.eval(N)))
        # print(nu)
        Yeff = k / (spec_params.a_init *
                    (np.exp(-N) * (spline1.eval(N) * (1. - spline2.eval(N)))))
        # print(Yeff)

        if spline2.eval(N) < 1.:
            ru_init = realu_init[0] = 0.5 * np.sqrt(
                np.pi / k) * np.sqrt(Yeff) * _ufuncs.sf_bessel_Jnu(nu, Yeff)
            dru_init = realu_init[1] = 0.5 * np.sqrt(np.pi / k) * (
                k / (spec_params.a_init * np.exp(-N) * spline1.eval(N))
            ) * (_ufuncs.sf_bessel_Jnu(nu, Yeff) / (2. * np.sqrt(Yeff)) +
                 (np.sqrt(Yeff) *
                  (-_ufuncs.sf_bessel_Jnu(nu + 1., Yeff) +
                   (nu *
                    (1. - spline2.eval(N)) * _ufuncs.sf_bessel_Jnu(nu, Yeff)) /
                   (Yeff * (1. - spline2.eval(N))))))
            iu_init = imu_init[0] = 0.5 * np.sqrt(
                np.pi / k) * np.sqrt(Yeff) * _ufuncs.sf_bessel_Ynu(nu, Yeff)
            diu_init = imu_init[1] = 0.5 * np.sqrt(np.pi / k) * (
                k / (spec_params.a_init * np.exp(-N) * spline1.eval(N))
            ) * (_ufuncs.sf_bessel_Ynu(nu, Yeff) / (2. * np.sqrt(Yeff)) +
                 (np.sqrt(Yeff) *
                  (-_ufuncs.sf_bessel_Ynu(nu + 1., Yeff) +
                   (nu *
                    (1. - spline2.eval(N)) * _ufuncs.sf_bessel_Ynu(nu, Yeff)) /
                   (Yeff * (1. - spline2.eval(N))))))
        else:
            ru_init = realu_init[0] = -0.5 * np.sqrt(
                np.pi / k) * np.sqrt(Yeff) * _ufuncs.sf_bessel_Ynu(nu, Yeff)
            dru_init = realu_init[1] = -0.5 * np.sqrt(np.pi / k) * (
                k / (spec_params.a_init * np.exp(-N) * spline1.eval(N))
            ) * (_ufuncs.sf_bessel_Ynu(nu, Yeff) / (2. * np.sqrt(Yeff)) +
                 (np.sqrt(Yeff) *
                  (-_ufuncs.sf_bessel_Ynu(nu + 1., Yeff) +
                   (nu *
                    (1. - spline2.eval(N)) * _ufuncs.sf_bessel_Ynu(nu, Yeff)) /
                   (Yeff * (1. - spline2.eval(N))))))
            iu_init = imu_init[0] = 0.5 * np.sqrt(
                np.pi / k) * np.sqrt(Yeff) * _ufuncs.sf_bessel_Jnu(nu, Yeff)
            diu_init = imu_init[1] = 0.5 * np.sqrt(np.pi / k) * (
                k / (spec_params.a_init * np.exp(-N) * spline1.eval(N))
            ) * (_ufuncs.sf_bessel_Jnu(nu, Yeff) / (2. * np.sqrt(Yeff)) +
                 (np.sqrt(Yeff) *
                  (-_ufuncs.sf_bessel_Jnu(nu + 1., Yeff) +
                   (nu *
                    (1. - spline2.eval(N)) * _ufuncs.sf_bessel_Jnu(nu, Yeff)) /
                   (Yeff * (1. - spline2.eval(N))))))
        """
        Solve for real part of u first.
        """
        s2 = odeiv.step_rkf45(2, scalarsys, args=spec_params)
        c2 = odeiv.control_y_new(s2, abserr2, relerr2)

        while N > Nfinal:
            realu_s[count] = realu_init[0] * realu_init[0]
            Nefolds[count] = N

            spec_params.H = spline1.eval(N)
            spec_params.eps = spline2.eval(N)
            spec_params.sig = spline3.eval(N)
            spec_params.xi = spline4.eval(N)
            Phi = spline0.eval(N)

            e2 = odeiv.evolve(s2, c2, 2)  # mode eqs

            try:
                N, h2, realu_init = e2.apply(N, 0, h2, realu_init)
            except:
                status = 0
                return status
            else:
                status = 0

            count += 1

            if count == kmax:
                status = 0
                return status

        realu_s[count] = realu_init[0] * realu_init[0]
        Nefolds[count] = N

        for j in range(count + 1):
            Nordered[j] = Nefolds[count - j]
            uordered_s[j] = realu_s[count - j]
        """
        Generate interpolating function for realu(N)
        """
        spline5 = spline.cspline(count + 1)
        spline5.init(Nordered[:count + 1], uordered_s[:count + 1])
        """
        Imaginary part
        """
        count = 0
        N = Nefolds[0]

        s2 = odeiv.step_rkf45(2, scalarsys, args=spec_params)
        c2 = odeiv.control_y_new(s2, abserr2, relerr2)
        e2 = odeiv.evolve(s2, c2, 2)  # mode eqs

        while N > Nfinal:
            imu_s[count] = imu_init[0] * imu_init[0]
            Nefolds[count] = N

            spec_params.H = spline1.eval(N)
            spec_params.eps = spline2.eval(N)
            spec_params.sig = spline3.eval(N)
            spec_params.xi = spline4.eval(N)

            try:
                N, h2, imu_init = e2.apply(N, 0, h2, imu_init)
            except:
                status = 0
                return status
            else:
                status = 0

            count += 1

            if count == kmax:
                status = 0
                return status

        imu_s[count] = imu_init[0] * imu_init[0]
        Nefolds[count] = N
        count -= 1

        P_s[m] = (k**3. / (2. * (np.pi**2.))) * (
            spline5.eval(Nefolds[count]) + imu_s[count]) / (
                (spec_params.a_init * np.exp(-Nefolds[count]) *
                 spec_params.a_init * np.exp(-Nefolds[count]) *
                 spline2.eval(Nefolds[count])) / (4 * np.pi))
        """
        Tensor spectra
        """
        count = 0

        N = Nefolds[0]
        realu_init[0] = ru_init
        realu_init[1] = dru_init

        s2 = odeiv.step_rkf45(2, tensorsys, args=spec_params)
        c2 = odeiv.control_y_new(s2, abserr2, relerr2)

        while N > Nfinal:
            realu_t[count] = realu_init[0] * realu_init[0]
            Nefolds[count] = N

            spec_params.H = spline1.eval(N)
            spec_params.eps = spline2.eval(N)

            e2 = odeiv.evolve(s2, c2, 2)  # mode eqs

            try:
                N, h2, realu_init = e2.apply(N, 0, h2, realu_init)
            except:
                status = 0
                return status
            else:
                status = 0

            count += 1

            if count == kmax:
                status = 0
                return status

        realu_t[count] = realu_init[0] * realu_init[0]
        Nefolds[count] = N

        for j in range(count + 1):
            Nordered[j] = Nefolds[count - j]
            uordered_t[j] = realu_t[count - j]

        spline7 = spline.cspline(count + 1)
        spline7.init(Nordered[:count + 1], uordered_t[:count + 1])
        """
        Imaginary part
        """
        count = 0

        N = Nefolds[0]
        imu_init[0] = iu_init
        imu_init[1] = diu_init

        s2 = odeiv.step_rkf45(2, tensorsys, args=spec_params)
        c2 = odeiv.control_y_new(s2, abserr2, relerr2)

        while N > Nfinal:
            imu_t[count] = imu_init[0] * imu_init[0]
            Nefolds[count] = N

            spec_params.H = spline1.eval(N)
            spec_params.eps = spline2.eval(N)

            e2 = odeiv.evolve(s2, c2, 2)  # mode eqs

            try:
                N, h2, imu_init = e2.apply(N, 0, h2, imu_init)
            except:
                status = 0
                return status
            else:
                status = 0

            count += 1

            if count == kmax:
                status = 0
                return status

        imu_t[count] = imu_init[0] * imu_init[0]
        Nefolds[count] = N
        count -= 1

        P_t[m] = 64. * np.pi * (k**3. / (2. * np.pi**2.)) * (
            spline7.eval(Nefolds[count]) + imu_t[count]) / (
                (spec_params.a_init * np.exp(-Nefolds[count]) *
                 spec_params.a_init * np.exp(-Nefolds[count])))

        if kis[m] == knorm * 5.41e-58:  # normalize here
            spec_norm = Amp / (P_s[m] + P_t[m])
            """
            This is a little different from the C code,
            because the y[1] change is outside the if statement
            """
            y[1] = np.sqrt(spec_norm)  # normalize H for later recon
    """
    Now that we have finished calculating the spectra, interpolate each spectrum and evaluate at k-values of interest
    """
    spline8 = spline.cspline(kinos)
    spline8.init(kis, P_t)

    spline6 = spline.cspline(kinos)
    spline6.init(kis, P_s)

    for i in range(knos):
        u_s[0, i] = ks[i]
        u_s[1, i] = spec_norm * spline6.eval(ks[i] * 5.41e-58)

        u_t[0, i] = ks[i]
        u_t[1, i] = spec_norm * spline8.eval(ks[i] * 5.41e-58)

    return status