def calculate(model, domain_size, buffer_size=0, diis=True): hf = dchf.DCHF(model) assign_chain_domains(hf, domain_size, buffer_size) # Since the convergence criterion is never met an exception will be raised try: hf.kernel(tolerance=0, maxiter=maxiter, fock_hook="diis" if diis else None) except RuntimeError: pass return hf.convergence_history
times = [] titles = [] errors = [] pyplot.figure(figsize=(12, 4.8)) pyplot.subplot(121) for domain_size in [2, 4, 6, 8, 12, 24]: print "Size={:d}".format(domain_size) x = list(sorted(set([0, 2, (domain_size // 4) * 2, domain_size]))) y = [] for buffer_size in x: print " buff={:d}".format(buffer_size) t = time.time() hf = dchf.DCHF(model) assign_chain_domains(hf, domain_size, buffer_size) hf.kernel(tolerance=1e-9, maxiter=30) t = time.time() - t times.append(t) error = abs(ref_e - hf.e_tot) titles.append("{:d}({:d})".format(domain_size, buffer_size)) errors.append(error) y.append(error) if buffer_size + domain_size >= N: break pyplot.semilogy(x[:len(y)], y,
ref_hf_energy = [] errors_dm = [] errors_dm_intrinsic = [] for alt in spacing: print "Alt =", alt model = atomic_chain(N, alt_spacing=alt) ref_hf = scf.RHF(model) ref_hf.conv_tol = tolerance ref_hf.kernel() dm_ref = ref_hf.make_rdm1() hf = dchf.DCHF(model) assign_chain_domains(hf, 4, 2) hf.kernel(tolerance=tolerance) mask = numpy.logical_not(hf.domains_pattern(2)) hf_energy.append(hf.e_tot) ref_hf_energy.append(ref_hf.e_tot) errors_dm.append(abs(dm_ref - hf.dm).max()) errors_dm_intrinsic.append(abs(dm_ref * mask).max()) pyplot.figure(figsize=(12, 4.8)) pyplot.subplot(121) pyplot.scatter(spacing - 1.4, hf_energy, label="DCHF") pyplot.scatter(spacing - 1.4, ref_hf_energy, label="HF") pyplot.xlabel("Dimerization parameter (A)")
from test_common import atomic_chain from test_dchf import assign_chain_domains import fake pyplot = fake.pyplot() N = 24 tolerance = 1e-5 model = atomic_chain(N, alt_spacing=2.3) hf_dimer = scf.RHF(model) hf_dimer.conv_tol = tolerance hf_dimer.kernel() dchf_dimer = DCHF(model) assign_chain_domains(dchf_dimer, 2, 2) dchf_dimer.kernel(tolerance=tolerance) model = atomic_chain(N, alt_spacing=1.53) hf_uniform = scf.RHF(model) hf_uniform.conv_tol = tolerance hf_uniform.kernel() dchf_uniform = DCHF(model) assign_chain_domains(dchf_uniform, 2, 2) dchf_uniform.kernel(tolerance=tolerance) pyplot.figure(figsize=(12, 10)) for hf, subplot, title in ( (hf_dimer, 221, "HF dimerized chain"), (hf_uniform, 222, "HF uniform chain"),
def setup_full(model): hf = dchf.DCHF(model) assign_chain_domains(hf, model.natm, 0) return hf
def setup(model): hf = dchf.DCHF(model) assign_chain_domains(hf, 1, 0) return hf
(dchf.DCCCSD, 122, "DC-CCSD", ref_ccsd_e2), ): print "==", title, "==" pyplot.subplot(subplot) for wocc in (1, 0.5, 0): print "wocc={:.1f}".format(wocc) y = [] for c in configurations: print " config={}".format(repr(c)) if c in mf_cache: hf = mf_cache[c] else: hf = dchf.DCHF(model) assign_chain_domains(hf, *c) hf.kernel(tolerance=tolerance) mf_cache[c] = hf mp = driver(hf, w_occ=wocc) mp.kernel() y.append(abs(reference - mp.e2)) print " {:.3e}".format(y[-1]) pyplot.semilogy(x, y, marker="x", label="w_occ={:.1f}".format(wocc)) pyplot.xticks(x, list("{:d}({:d})".format(*i) for i in configurations)) pyplot.ylabel("Absolute error (Ry)") pyplot.xlabel("Domain size (buffer size)") pyplot.legend()