Source code for dmft_tools.results_to_archive

################################################################################
#
# solid_dmft - A versatile python wrapper to perform DFT+DMFT calculations
#              utilizing the TRIQS software library
#
# Copyright (C) 2018-2020, ETH Zurich
# Copyright (C) 2021, The Simons Foundation
#      authors: A. Hampel, M. Merkel, and S. Beck
#
# solid_dmft is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# solid_dmft is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.

# You should have received a copy of the GNU General Public License along with
# solid_dmft (in the file COPYING.txt in this directory). If not, see
# <http://www.gnu.org/licenses/>.
#
################################################################################

import os
from h5 import HDFArchive
import triqs.utility.mpi as mpi


[docs] def _compile_information(sum_k, general_params, solver_params, solvers, map_imp_solver, solver_type_per_imp, previous_mu, density_mat_pre, density_mat, deltaN, dens): """ Collects all results in a dictonary. """ write_to_h5 = {'chemical_potential_post': sum_k.chemical_potential, 'chemical_potential_pre': previous_mu, 'DC_pot': sum_k.dc_imp, 'DC_energ': sum_k.dc_energ, 'dens_mat_pre': density_mat_pre, 'dens_mat_post': density_mat, } if deltaN is not None: write_to_h5['deltaN'] = deltaN if dens is not None: write_to_h5['deltaN_trace'] = dens if any(str(entry) in ('crpa_dynamic') for entry in general_params['dc_type']): write_to_h5['DC_pot_dyn'] = sum_k.dc_imp_dyn for icrsh in range(sum_k.n_inequiv_shells): isolvsec = map_imp_solver[icrsh] if solver_type_per_imp[icrsh] in ['cthyb', 'hubbardI']: write_to_h5['Delta_time_{}'.format(icrsh)] = solvers[icrsh].Delta_time # Write the full density matrix to last_iter only - it is large if solver_params[isolvsec]['measure_density_matrix']: write_to_h5['full_dens_mat_{}'.format(icrsh)] = solvers[icrsh].density_matrix write_to_h5['h_loc_diag_{}'.format(icrsh)] = solvers[icrsh].h_loc_diagonalization if solver_type_per_imp[icrsh] in ('cthyb','hubbardI'): write_to_h5['Sigma_moments_{}'.format(icrsh)] = solvers[icrsh].Sigma_moments write_to_h5['G_moments_{}'.format(icrsh)] = solvers[icrsh].G_moments write_to_h5['Sigma_Hartree_{}'.format(icrsh)] = solvers[icrsh].Sigma_Hartree write_to_h5['orbital_occupations_{}'.format(icrsh)] = solvers[icrsh].orbital_occupations elif solver_type_per_imp[icrsh] == 'ftps': write_to_h5['Delta_freq_{}'.format(icrsh)] = solvers[icrsh].Delta_freq write_to_h5['Gimp_time_{}'.format(icrsh)] = solvers[icrsh].G_time write_to_h5['G0_freq_{}'.format(icrsh)] = solvers[icrsh].G0_freq write_to_h5['Gimp_freq_{}'.format(icrsh)] = solvers[icrsh].G_freq write_to_h5['Sigma_freq_{}'.format(icrsh)] = solvers[icrsh].Sigma_freq if solver_type_per_imp[icrsh] == 'cthyb': if solver_params[isolvsec]['measure_pert_order']: write_to_h5['pert_order_imp_{}'.format(icrsh)] = solvers[icrsh].perturbation_order write_to_h5['pert_order_total_imp_{}'.format(icrsh)] = solvers[icrsh].perturbation_order_total if solver_params[isolvsec]['measure_chi'] is not None: write_to_h5['O_{}_time_{}'.format(solver_params[isolvsec]['measure_chi'], icrsh)] = solvers[icrsh].O_time # if legendre was set, that we have both now! if (solver_params[isolvsec]['measure_G_l'] or not solver_params[isolvsec]['perform_tail_fit'] and solver_params[isolvsec]['legendre_fit']): write_to_h5['G_time_orig_{}'.format(icrsh)] = solvers[icrsh].G_time_orig write_to_h5['Gimp_l_{}'.format(icrsh)] = solvers[icrsh].G_l if solver_params[isolvsec]['crm_dyson_solver']: write_to_h5['G_time_dlr_{}'.format(icrsh)] = solvers[icrsh].G_time_dlr write_to_h5['Sigma_dlr_{}'.format(icrsh)] = solvers[icrsh].Sigma_dlr if solver_type_per_imp[icrsh] == 'ctint' and solver_params[isolvsec]['measure_pert_order']: write_to_h5['pert_order_imp_{}'.format(icrsh)] = solvers[icrsh].perturbation_order if solver_type_per_imp[icrsh] == 'hubbardI': write_to_h5['G0_Refreq_{}'.format(icrsh)] = solvers[icrsh].G0_Refreq write_to_h5['Gimp_Refreq_{}'.format(icrsh)] = solvers[icrsh].G_Refreq write_to_h5['Sigma_Refreq_{}'.format(icrsh)] = solvers[icrsh].Sigma_Refreq if solver_params[isolvsec]['measure_G_l']: write_to_h5['Gimp_l_{}'.format(icrsh)] = solvers[icrsh].G_l if solver_type_per_imp[icrsh] == 'hartree': write_to_h5['Sigma_Refreq_{}'.format(icrsh)] = solvers[icrsh].Sigma_Refreq if solver_type_per_imp[icrsh] == 'ctseg': # if legendre was set, that we have both now! write_to_h5['orbital_occupations_{}'.format(icrsh)] = solvers[icrsh].orbital_occupations write_to_h5['Sigma_Hartree_{}'.format(icrsh)] = solvers[icrsh].Sigma_Hartree write_to_h5['Sigma_moments_{}'.format(icrsh)] = solvers[icrsh].Sigma_moments if (solver_params[isolvsec]['legendre_fit']): write_to_h5['G_time_orig_{}'.format(icrsh)] = solvers[icrsh].G_time_orig write_to_h5['Gimp_l_{}'.format(icrsh)] = solvers[icrsh].G_l if solver_params[isolvsec]['improved_estimator']: write_to_h5['F_freq_{}'.format(icrsh)] = solvers[icrsh].F_freq write_to_h5['F_time_{}'.format(icrsh)] = solvers[icrsh].F_time if solver_params[isolvsec]['measure_pert_order']: write_to_h5['pert_order_histo_imp_{}'.format(icrsh)] = solvers[icrsh].perturbation_order_histo write_to_h5['avg_order_imp_{}.format(icrsh)'] = solvers[icrsh].avg_pert_order if solver_params[isolvsec]['measure_nn_tau']: write_to_h5['O_NN_{}'.format(icrsh)] = solvers[icrsh].triqs_solver.results.nn_tau if solver_params[isolvsec]['measure_state_hist']: write_to_h5['state_hist_{}'.format(icrsh)] = solvers[icrsh].state_histogram if solver_params[isolvsec]['crm_dyson_solver']: write_to_h5['G_time_dlr_{}'.format(icrsh)] = solvers[icrsh].G_time_dlr write_to_h5['Sigma_dlr_{}'.format(icrsh)] = solvers[icrsh].Sigma_dlr if general_params['h_int_type'][icrsh] == 'dyn_density_density': write_to_h5['D0_time_{}'.format(icrsh)] = solvers[icrsh].triqs_solver.D0_tau write_to_h5['Jperp_time_{}'.format(icrsh)] = solvers[icrsh].triqs_solver.Jperp_tau return write_to_h5
[docs] def write(archive, sum_k, general_params, solver_params, solvers, map_imp_solver, solver_type_per_imp, it, is_sampling, previous_mu, density_mat_pre, density_mat, deltaN=None, dens=None): """ Collects and writes results to archive. """ if not mpi.is_master_node(): return write_to_h5 = _compile_information(sum_k, general_params, solver_params, solvers, map_imp_solver, solver_type_per_imp, previous_mu, density_mat_pre, density_mat, deltaN, dens) # Saves the results to last_iter with HDFArchive(archive, 'a') as ar: ar['DMFT_results']['iteration_count'] = it for key, value in write_to_h5.items(): ar['DMFT_results/last_iter'][key] = value # Permanently saves to h5 archive every h5_save_freq iterations if ((not is_sampling and it % general_params['h5_save_freq'] == 0) or (is_sampling and it % general_params['sampling_h5_save_freq'] == 0)): ar['DMFT_results'].create_group('it_{}'.format(it)) for key, value in write_to_h5.items(): # Full density matrix only written to last_iter - it is large if 'full_dens_mat_' not in key and 'h_loc_diag_' not in key: ar['DMFT_results/it_{}'.format(it)][key] = value # Saves CSC input if general_params['csc']: for dft_var in ['dft_update', 'dft_input', 'dft_misc_input']: if dft_var in ar: ar['DMFT_results/it_{}'.format(it)].create_group(dft_var) for key, value in ar[dft_var].items(): # do only store changing elements if key not in ['symm_kpath', 'kpts_cart']: ar['DMFT_results/it_{}'.format(it)][dft_var][key] = value for band_elem in ['_bands.dat', '_bands.dat.gnu', '_bands.projwfc_up', '_band.dat']: if os.path.isfile('./{}{}'.format(general_params['seedname'], band_elem)): os.rename('./{}{}'.format(general_params['seedname'], band_elem), './{}{}_it{}'.format(general_params['seedname'], band_elem, it)) for w90_elem in ['_hr.dat', '.wout']: if os.path.isfile('./{}{}'.format(general_params['seedname'], w90_elem)): os.rename('./{}{}'.format(general_params['seedname'], w90_elem), './{}_it{}{}'.format(general_params['seedname'], it, w90_elem))