def next_loop(self): """returns the DMFT loop nr. of the next loop""" archive = HDFArchive(self.archive, 'r') if archive.is_group('results'): nl = archive['results']['n_dmft_loops'] else: nl = 0 del archive return nl
def run_dmft_loops(self, n_dmft_loops = 1): """runs the DMFT calculation""" clp = p = CleanLoopParameters(self.get_parameters()) report = Reporter(**clp) report('Parameters:', clp) scheme = Scheme(**clp) dmft = DMFTObjects(**clp) raw_dmft = DMFTObjects(**clp) g_0_c_iw, g_c_iw, sigma_c_iw, dmu = dmft.get_dmft_objs() # ref, ref, ref, value report('Initializing...') if clp['nambu']: transf = NambuTransformation(**clp) scheme.set_pretransf(transf.pretransformation(), transf.pretransformation_inverse()) raw_transf = NambuTransformation(**clp) else: transf = ClustersiteTransformation(g_loc = scheme.g_local(sigma_c_iw, dmu), **clp) clp.update({'g_transf_struct': transf.get_g_struct()}) raw_transf = ClustersiteTransformation(**clp) transf.set_hamiltonian(**clp) report('Transformation ready') report('New basis:', transf.get_g_struct()) impurity = Solver(beta = clp['beta'], gf_struct = dict(transf.get_g_struct()), n_tau = clp['n_tau'], n_iw = clp['n_iw'], n_l = clp['n_legendre']) impurity.Delta_tau.name = '$\\tilde{\\Delta}_c$' rnames = random_generator_names_list() report('H = ', transf.hamiltonian) report('Impurity solver ready') report('') for loop_nr in range(self.next_loop(), self.next_loop() + n_dmft_loops): report('DMFT-loop nr. %s'%loop_nr) if mpi.is_master_node(): duration = time() report('Calculating dmu...') dmft.find_dmu(scheme, **clp) g_0_c_iw, g_c_iw, sigma_c_iw, dmu = dmft.get_dmft_objs() report('dmu = %s'%dmu) report('Calculating local Greenfunction...') g_c_iw << scheme.g_local(sigma_c_iw, dmu) g_c_iw << addExtField(g_c_iw, p['ext_field']) if mpi.is_master_node() and p['verbosity'] > 1: checksym_plot(g_c_iw, p['archive'][0:-3] + 'Gchecksym' + str(loop_nr) + '.pdf') report('Calculating Weiss-field...') g_0_c_iw << inverse(inverse(g_c_iw) + sigma_c_iw) dmft.make_g_0_iw_with_delta_tau_real() report('Changing basis...') transf.set_dmft_objs(*dmft.get_dmft_objs()) if mpi.is_master_node() and p['verbosity'] > 1: checktransf_plot(transf.get_g_iw(), p['archive'][0:-3] + 'Gchecktransf' + str(loop_nr) + '.pdf') checktransf_plot(g_0_c_iw, p['archive'][0:-3] + 'Gweisscheck' + str(loop_nr) + '.pdf') checksym_plot(inverse(transf.g_0_iw), p['archive'][0:-3] + 'invGweisscheckconst' + str(loop_nr) + '.pdf') #checksym_plot(inverse(transf.get_g_iw()), p['archive'][0:-3] + 'invGsymcheckconst' + str(loop_nr) + '.pdf') if not clp['random_name']: clp.update({'random_name': rnames[int((loop_nr + mpi.rank) % len(rnames))]}) # TODO move if not clp['random_seed']: clp.update({'random_seed': 862379 * mpi.rank + 12563 * self.next_loop()}) impurity.G0_iw << transf.get_g_0_iw() report('Solving impurity problem...') mpi.barrier() impurity.solve(h_int = transf.get_hamiltonian(), **clp.get_cthyb_parameters()) if mpi.is_master_node() and p['verbosity'] > 1: checksym_plot(inverse(impurity.G0_iw), p['archive'][0:-3] + 'invGweisscheckconstsolver' + str(loop_nr) + '.pdf') report('Postprocessing measurements...') if clp['measure_g_l']: for ind, g in transf.get_g_iw(): g << LegendreToMatsubara(impurity.G_l[ind]) else: for ind, g in transf.get_g_iw(): g.set_from_fourier(impurity.G_tau[ind]) raw_transf.set_dmft_objs(transf.get_g_0_iw(), transf.get_g_iw(), inverse(transf.get_g_0_iw()) - inverse(transf.get_g_iw())) if clp['measure_g_tau'] and clp['fit_tail']: for ind, g in transf.get_g_iw(): for tind in transf.get_g_struct(): if tind[0] == ind: block_inds = tind[1] fixed_moments = TailGf(len(block_inds), len(block_inds), 1, 1) fixed_moments[1] = identity(len(block_inds)) g.fit_tail(fixed_moments, 3, clp['tail_start'], clp['n_iw'] - 1) if mpi.is_master_node() and p['verbosity'] > 1: checksym_plot(inverse(transf.get_g_iw()), p['archive'][0:-3] + 'invGsymcheckconstsolver' + str(loop_nr) + '.pdf') report('Backtransforming...') transf.set_sigma_iw(inverse(transf.get_g_0_iw()) - inverse(transf.get_g_iw())) dmft.set_dmft_objs(*transf.get_backtransformed_dmft_objs()) dmft.set_dmu(dmu) raw_dmft.set_dmft_objs(*raw_transf.get_backtransformed_dmft_objs()) raw_dmft.set_dmu(dmu) if clp['mix']: dmft.mix() if clp['impose_paramagnetism']: dmft.paramagnetic() if clp['impose_afm']: dmft.afm() if clp['site_symmetries']: dmft.site_symmetric(clp['site_symmetries']) density = scheme.apply_pretransf_inv(dmft.get_g_iw(), True).total_density() report('Saving results...') if mpi.is_master_node(): a = HDFArchive(p['archive'], 'a') if not a.is_group('results'): a.create_group('results') a_r = a['results'] a_r.create_group(str(loop_nr)) a_l = a_r[str(loop_nr)] a_l['g_c_iw'] = dmft.get_g_iw() a_l['g_c_iw_raw'] = raw_dmft.get_g_iw() a_l['g_transf_iw'] = transf.get_g_iw() a_l['g_transf_iw_raw'] = raw_transf.get_g_iw() a_l['sigma_c_iw'] = dmft.get_sigma_iw() a_l['sigma_c_iw_raw'] = raw_dmft.get_sigma_iw() a_l['sigma_transf_iw'] = transf.get_sigma_iw() a_l['sigma_transf_iw_raw'] = raw_transf.get_sigma_iw() a_l['g_0_c_iw'] = dmft.get_g_0_iw() a_l['g_0_c_iw_raw'] = raw_dmft.get_g_0_iw() a_l['g_0_transf_iw'] = transf.get_g_0_iw() a_l['g_0_transf_iw_raw'] = raw_transf.get_g_0_iw() a_l['dmu'] = dmft.get_dmu() a_l['density'] = density a_l['loop_time'] = {'seconds': time() - duration, 'hours': (time() - duration)/3600., 'days': (time() - duration)/3600./24.} a_l['n_cpu'] = mpi.size a_l['cdmft_code_version'] = CDmft._version clp_dict = dict() clp_dict.update(clp) a_l['parameters'] = clp_dict a_l['triqs_code_version'] = version a_l['delta_transf_tau'] = impurity.Delta_tau if clp['measure_g_l']: a_l['g_transf_l'] = impurity.G_l if clp['measure_g_tau']: a_l['g_transf_tau'] = impurity.G_tau a_l['sign'] = impurity.average_sign if clp['measure_density_matrix']: a_l['density_matrix'] = impurity.density_matrix a_l['g_atomic_tau'] = impurity.atomic_gf a_l['h_loc_diagonalization'] = impurity.h_loc_diagonalization if a_r.is_data('n_dmft_loops'): a_r['n_dmft_loops'] += 1 else: a_r['n_dmft_loops'] = 1 del a_l, a_r, a report('Loop done') report('') mpi.barrier()
import sys, numpy as np, os from mpltotex import PRLPlotConf from pytriqs.gf.local import GfReFreq, GfImTime, GfLegendre, GfImFreq from pytriqs.archive import HDFArchive from pytriqs.statistics.histograms import Histogram mplcfg = PRLPlotConf(add_ax=False) fig = mplcfg.fig plt = mplcfg.plt for archive_name in sys.argv[1:]: archive = HDFArchive(archive_name, 'r') if not archive.is_group('g_w'): print 'g_w of ' + archive_name + ' not found' continue try: histos = archive['histograms'] except: print 'couldn\'t load histos of ' + archive_name continue ax0 = fig.add_axes([.17, .15 + .5, .82, .82 - .5]) hist = histos[0] dx = (hist.limits[1] - hist.limits[0]) / len(hist) x = np.linspace(hist.limits[0], hist.limits[1], len(hist.data)) y = hist.data i_max = 0 for i, yi in enumerate(y): if not np.allclose(yi, 0): i_max = i ax0.bar(x, y, dx, color='gray', linewidth=0.1) #ax0.hist(hist.data, 20) ax0.set_xlabel("$D$")