def get_lm_f0tau(mass, spin, l, m, nmodes):
    """Return the f0 and the tau of each overtone for a given l, m mode.

    Parameters
    ----------
    mass : float or array
        Mass of the black hole (in solar masses).
    spin : float or array
        Dimensionless spin of the final black hole.
    l : int or array
        l-index of the harmonic.
    m : int or array
        m-index of the harmonic.
    nmodes : int
        The number of overtones to generate.

    Returns
    -------
    f0 : float or array
        The frequency of the QNM(s), in Hz. If only a single mode is requested
        (and mass, spin, l, and m are not arrays), this will be a float. If
        multiple modes requested, will be an array with shape
        ``[input shape x] nmodes``, where ``input shape`` is the broadcasted
        shape of the inputs.
    tau : float or array
        The damping time of the QNM(s), in seconds. Return type is same as f0.
    """
    # convert to arrays
    mass, spin, l, m, input_is_array = ensurearray(
        mass, spin, l, m)
    # we'll ravel the arrays so we can evaluate each parameter combination
    # one at a a time
    origshape = mass.shape
    if nmodes < 1:
        raise ValueError("nmodes must be >= 1")
    if nmodes > 1:
        newshape = tuple(list(origshape)+[nmodes])
    else:
        newshape = origshape
    f0s = numpy.zeros((mass.size, nmodes))
    taus = numpy.zeros((mass.size, nmodes))
    mass = mass.ravel()
    spin = spin.ravel()
    l = l.ravel()
    m = m.ravel()
    qnmfreq = None
    modes = range(nmodes)
    for ii in range(mass.size):
        qnmfreq = _genqnmfreq(mass[ii], spin[ii], l[ii], m[ii], nmodes,
                              qnmfreq=qnmfreq)
        f0s[ii, :] = [qnmfreq.data[n].real/(2 * numpy.pi) for n in modes]
        taus[ii, :] = [1./qnmfreq.data[n].imag for n in modes]
    f0s = f0s.reshape(newshape)
    taus = taus.reshape(newshape)
    return (formatreturn(f0s, input_is_array),
            formatreturn(taus, input_is_array))
def get_lm_f0tau ( mass , spin , l , m , nmodes ) : mass , spin , l , m , input_is_array = ensurearray ( mass , spin , l , m ) origshape = mass . shape if nmodes < 1 : raise ValueError ( "nmodes must be >= 1" ) if nmodes > 1 : newshape = tuple ( list ( origshape ) + [ nmodes ] ) else : newshape = origshape f0s = numpy . zeros ( ( mass . size , nmodes ) ) taus = numpy . zeros ( ( mass . size , nmodes ) ) mass = mass . ravel ( ) spin = spin . ravel ( ) l = l . ravel ( ) m = m . ravel ( ) qnmfreq = None modes = range ( nmodes ) for ii in range ( mass . size ) : qnmfreq = _genqnmfreq ( mass [ ii ] , spin [ ii ] , l [ ii ] , m [ ii ] , nmodes , qnmfreq = qnmfreq ) f0s [ ii , : ] = [ qnmfreq . data [ n ] . real / ( 2 * numpy . pi ) for n in modes ] taus [ ii , : ] = [ 1. / qnmfreq . data [ n ] . imag for n in modes ] f0s = f0s . reshape ( newshape ) taus = taus . reshape ( newshape ) return ( formatreturn ( f0s , input_is_array ) , formatreturn ( taus , input_is_array ) )
Return the f0 and the tau of each overtone for a given l, m mode.

    Parameters
    ----------
    mass : float or array
        Mass of the black hole (in solar masses).
    spin : float or array
        Dimensionless spin of the final black hole.
    l : int or array
        l-index of the harmonic.
    m : int or array
        m-index of the harmonic.
    nmodes : int
        The number of overtones to generate.

    Returns
    -------
    f0 : float or array
        The frequency of the QNM(s), in Hz. If only a single mode is requested
        (and mass, spin, l, and m are not arrays), this will be a float. If
        multiple modes requested, will be an array with shape
        ``[input shape x] nmodes``, where ``input shape`` is the broadcasted
        shape of the inputs.
    tau : float or array
        The damping time of the QNM(s), in seconds. Return type is same as f0.