Ejemplo n.º 1
0
def twod_to_oned(data):

    sdata = OneD()

    # spherical radius
    sdata.N = data.x1.size
    sdata.r = data.x1

    # cylindrical radius
    RR = np.outer(np.sin(data.x2), data.x1)

    # volume & mass weights
    dV = data.dV1[None,:] * data.dV2[:,None] * data.dV3
    dm = data.d * dV

    # define equatorial and polar slices
    polar, = np.where(data.x2 < np.pi / 8.0)
    equatorial, = np.where(data.x2 > 3.0 * np.pi / 8.0)
    full, = np.where(data.x2 != -1)

    # enclosed mass (spherical)
    dmr = np.sum(dm, axis = 0)
    if max(data.x2) < 2:
        msun = 2.0e33 * 0.5 #(fudge)
    else:
        msun = 2.0e33

    sdata.menc = np.cumsum(dmr) / msun

    dj = dm * data.v3 * RR

    # internal energy & density
    sdata.e = weightedavg_2d(data.e, dV, full)
    sdata.d = weightedavg_2d(data.d, dV, full)

    # calculate abar & zbar
    if data.X is not None: 

        sdata.X = Xweightedavg_2d(data.X, dm)

        # calculate mass fractions

        abar = 1.0 / np.sum(sdata.X / data.A[:,None], axis = 0)
        zbar = abar *  np.sum(data.Z[:,None] / data.A[:,None] * 
                              sdata.X , axis = 0)
        sdata.abar = abar
        sdata.zbar = zbar

    else:

        if data.A is not None:

            abar = data.A
            zbar = data.Z
            
        else:
            # assume CO
            abar = 96.0/7.0
            zbar = 48.0/7.0

        sdata.abar = abar * np.ones_like(data.x1)
        sdata.zbar = zbar * np.ones_like(data.x1)

    # guess for temp
    tguess = weightedavg_2d(data.T, dm,full)

    # call eos to derive temperature, entropy, etc
    H = helmholtz.helmeos_DE(sdata.d, sdata.e, abar, zbar, tguess = tguess) 

    # put eos results
    sdata.T = H.temp
    sdata.s = H.stot
    sdata.P = H.ptot

    # rotation data, taken from the equator

    sdata.v3 = weightedavg_2d(data.v3, dm, equatorial)
    sdata.omega = sdata.v3 / sdata.r
    sdata.j  = weightedavg_2d(RR * data.v3, dm, full)

    # mass loss rate through outer boundary
    sdata.mdot = np.sum(data.d * data.v1, axis = 0) * data.x1**2

    # aspect ratio is useful for determining the final state
    pole = 0
    equator = -1

    logr = np.log10(np.flipud(data.x1))
    logdpole = np.flipud(np.log10(data.d[pole,   :].flatten()))
    logdequator = np.log10(data.d[equator,   :])
    
    flogrpole = interp1d(logdpole,logr, bounds_error = False)
    sdata.aspect = np.nan_to_num(np.exp(np.log10(data.x1) - flogrpole(logdequator)))
    return sdata
Ejemplo n.º 2
0
def threed_to_oned(data):

    sdata = OneD()

    # spherical radius
    sdata.N = data.x1.size
    sdata.r = data.x1

    # cylindrical radius
    RR = np.outer(np.sin(data.x2), data.x1)

    # volume & mass weights
    dV = data.dV1[None,None,:] * data.dV2[None,:,None] * data.dV3[:,None,None]
    dm = data.d * dV

    # enclosed mass (spherical)
    dmr = np.sum(np.sum(dm, axis = 0), axis = 0)
    msun = 2.0e33

    sdata.menc = np.cumsum(dmr) / msun

#    dj = dm * data.v3 * RR

    # internal energy & density
    sdata.e = weightedavg_3d(data.e, dV)
    sdata.d = weightedavg_3d(data.d, dV)

    # calculate abar & zbar
    if data.X is not None: 

        sdata.X = Xweightedavg_3d(data.X, dm)

        # calculate mass fractions

        abar = 1.0 / np.sum(sdata.X / data.A[:,None], axis = 0)
        zbar = abar *  np.sum(data.Z[:,None] / data.A[:,None] * 
                              sdata.X , axis = 0)
        sdata.abar = abar
        sdata.zbar = zbar

    else:

        if data.A is not None:

            abar = data.A
            zbar = data.Z
            
        else:
            # assume CO
            abar = 96.0/7.0
            zbar = 48.0/7.0

        sdata.abar = abar * np.ones_like(data.x1)
        sdata.zbar = zbar * np.ones_like(data.x1)

    # guess for temp
    tguess = weightedavg_3d(data.T, dm)

    # call eos to derive temperature, entropy, etc
    H = helmholtz.helmeos_DE(sdata.d, sdata.e, abar, zbar, tguess = tguess) 

    # put eos results
    sdata.T = H.temp
    sdata.s = H.stot

    # rotation data, taken from the equator

    sdata.v3 = weightedavg_3d(data.v3, dm)
    sdata.omega = sdata.v3 / sdata.r
    sdata.j  = weightedavg_3d(RR * data.v3, dm)

    # mass loss rate through outer boundary
    sdata.mdot = np.sum(np.sum(data.d * data.v1, axis = 0),axis=0) * data.x1**2

    # aspect ratio is useful for determining the final state
    pole = 0
    equator = -1

    return sdata