def limit(q, limiter):
    if limiter == "weno":
        ql, qr = weno(5, q)
    elif limiter == "vanleer":
        ql, qr = vanleer(q)
    elif limiter == "donor":
        ql = q.copy()
        qr = q.copy()
    return ql, qr
def setguess(q, dt, dx, flux, guesstype, r):
    c1 = 1.0 - 2.0 / r
    c2 = 1.0 - 1.0 / r
    if guesstype == "FE":
        # This initial guess is only good for r=8; need to generalize
        # But it doesn't seem to help anyway.
        y1guess = q.copy()
        y1guess[1:] = y1guess[1:] - c1 * dt / dx * (flux(y1guess[1:]) - flux(y1guess[:-1]))
        y2guess = q.copy()
        y2guess[1:] = y2guess[1:] - c2 * dt / dx * (flux(y2guess[1:]) - flux(y2guess[:-1]))
        guess = np.hstack([y1guess, y2guess])
    elif guesstype == "BE":
        myweno = lambda (y): be(q, c1 * dt, dx, y, flux)
        y1guess = fsolve(myweno, q)
        myweno = lambda (y): be(y1guess, dt / r, dx, y, flux)
        y2guess = fsolve(myweno, y1guess)
        guess = np.hstack([y1guess, y2guess])
    elif guesstype == "BE_fine":
        yy = q.copy()
        for i in range(int(2 * r) - 2):
            myweno = lambda (y): be(yy, dt / r / 2.0, dx, y, flux)
            yy = fsolve(myweno, yy)
        y1guess = yy
        myweno = lambda (y): be(y1guess, dt / r, dx, y, flux)
        y2guess = fsolve(myweno, y1guess)
        guess = np.hstack([y1guess, y2guess])
    elif guesstype == "itrap":
        myweno = lambda (y): itrap_solve(q, c1 * dt, dx, y, flux)
        y1 = fsolve(myweno, q)
        y1hat = np.empty([1, len(y1)])
        y1hat[0, :] = y1
        ql, qr = weno(5, y1hat)
        y1guess = q.copy()
        y1guess[1:] = y1guess[1:] - dt / dx * (flux(qr[0, 1:]) - flux(qr[0, :-1]))
        y1guess[0] = y1guess[0] - dt / dx * (flux(qr[0, 0]) - flux(qr[0, -1]))
        myweno = lambda (y): be(y1guess, dt / r, dx, y, flux)
        y2guess = fsolve(myweno, y1guess)
        guess = np.hstack([y1guess, y2guess])
    else:
        guess = np.hstack([q, q])

    return guess