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