def test_bilayer_realtime():
     global g, Delta_0, omega_D, lambda_0, d_A, d_B

     g.w_delta[...] = Delta_0

     Delta_1 = bilayer_delta(lambda_0, omega_D, d_A, d_B)

     print Delta_1

     # Note: need the whole energy range, because the Thouless energy is much
     #       larger than the enery gap and omega_D!
     E = u.linspace_weighed(1e-4, omega_D, 1493, [(0, 10, 0.15),
                                                  (0, 10, 5)])

     currents = u.CurrentSolver(g, E=E, chunksize=1500)
     currents.set_solvers(sp_solver=u.SP_SOLVER_TWPBVP)

     it = u.self_consistent_realtime_iteration(currents)

     for k, d, violation in it:
          print "Iter %d: relative residual %.2g" % (
               k, d.relative_residual_norm())

          if (d.relative_residual_norm() < 1e-4 and violation < 1e-5):
               break
     else:
          raise RuntimeError("Did not converge")

     assert allclose(g.w_delta[0,:], Delta_1, rtol=1e-2), \
            (g.w_delta[0,0], Delta_1)
    def func(T):
        print "    @ T =", T, ":"
        geometry.t_t = T
        geometry.w_delta = last_gtr_delta[0]

        if matsubara:
            it = u.self_consistent_matsubara_iteration(geometry,
                                                       output_func=None,
                                                       **kw)
        else:
            solver = u.CurrentSolver(geometry)
            it = u.self_consistent_realtime_iteration(solver, output_func=None,
                                                      **kw)

        zero_count = 0
        for k, d, v in it:
            rel_err = d.residual_norm() / abs(d.get()).max()
            sys.stdout.write("%g(%.2g)  " % (rel_err, abs(d.get()).max()))
            sys.stdout.flush()
            if abs(d.get()).max() < 1e-3:
                zero_count += 1
            else:
                zero_count = 0
            if zero_count > 4:
                geometry.w_delta = 0.0
                geometry.w_phase = 0.0
                break
            if rel_err < 1e-4 and v < 1e-4:
                break

        dmax = abs(geometry.w_delta).max()
        if dmax == 0:
            sys.stdout.write("=> N\n")
            return -1
        last_gtr_delta[0] = geometry.w_delta.copy()
        sys.stdout.write("=> S (%g)\n" % dmax)
        return dmax