diff --git a/setup.py b/setup.py index 7551bf35..1ac31f5d 100644 --- a/setup.py +++ b/setup.py @@ -63,16 +63,12 @@ "console_scripts": [ "dcore_pre = dcore.dcore_pre:run", "dcore = dcore.dcore:run", - "dcore_post = dcore.dcore_post:run", "dcore_check = dcore.dcore_check:run", "dcore_bse = dcore.dcore_bse:run", "dcore_gk = dcore.dcore_gk:run", "dcore_mpicheck = dcore.dcore_mpicheck:run", "dcore_anacont = dcore.dcore_anacont:run", "dcore_spectrum = dcore.dcore_spectrum:run", - "dcore_anacont_pade = dcore.dcore_anacont_pade:run", - "dcore_anacont_spm = dcore.dcore_anacont_spm:run", - "dcore_anacont_spm_interactive = dcore.dcore_anacont_spm_interactive:run", ] }, diff --git a/src/dcore/dcore_anacont_pade.py b/src/dcore/dcore_anacont_pade.py deleted file mode 100644 index 16c2bfe9..00000000 --- a/src/dcore/dcore_anacont_pade.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# DCore -- Integrated DMFT software for correlated electrons -# Copyright (C) 2017 The University of Tokyo -# -# This program 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. -# -# This program 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 this program. If not, see . -# - -import argparse -import numpy -import toml - -from dcore._dispatcher import MeshReFreq -from dcore.version import version, print_header -from dcore.anacont.pade import anacont - - -def dcore_anacont_pade_from_seedname(seedname): - print("Reading ", seedname + "_anacont.toml...") - with open(seedname + "_anacont.toml", "r") as f: - params = toml.load(f) - - print("Reading ", seedname + "_sigma_iw.npz...") - sigma_iw_npz = numpy.load(seedname + "_sigma_iw.npz") - - assert params["omega_min"] < params["omega_max"] - mesh_w = MeshReFreq(params["omega_min"], params["omega_max"], params["Nomega"]) - - beta = params["beta"] - params_pade = params.get("pade", {}) - params_pade["iomega_max"] = params_pade.get("omega_max", -1.0) - params_pade["eta"] = params_pade.get("eta", 0.01) - params_pade["n_min"] = params_pade.get("n_min", 0) - params_pade["n_max"] = params_pade.get("n_max", 100000000) - - data_w = anacont( - sigma_iw_npz, beta=beta, mesh_w=mesh_w, params_pade=params_pade - ) - - print("Writing to", seedname + "_sigma_w.npz...") - numpy.savez(seedname + "_sigma_w.npz", **data_w) - - -def run(): - - print_header() - - parser = argparse.ArgumentParser( - prog="dcore_anacont_pade.py", - description="pre script for dcore.", - usage="$ dcore_anacont_pade input", - add_help=True, - formatter_class=argparse.RawTextHelpFormatter, - # epilog=generate_all_description() - ) - parser.add_argument( - "seedname", action="store", default=None, type=str, help="seedname" - ) - parser.add_argument( - "--version", action="version", version="DCore {}".format(version) - ) - - args = parser.parse_args() - - dcore_anacont_pade_from_seedname(args.seedname) diff --git a/src/dcore/dcore_anacont_spm.py b/src/dcore/dcore_anacont_spm.py deleted file mode 100644 index f45752d0..00000000 --- a/src/dcore/dcore_anacont_spm.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# DCore -- Integrated DMFT software for correlated electrons -# Copyright (C) 2017 The University of Tokyo -# -# This program 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. -# -# This program 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 this program. If not, see . -# - -import argparse -import toml -import numpy as np -from dcore._dispatcher import MeshReFreq -from dcore.version import version, print_header -from dcore.anacont.spm import set_default_values, anacont - - -def set_default_config(params): - default_values = { - "show_fit": False, - "show_result": False, - "show_fit": False, - "verbose_opt": False, - "max_iters_opt": 100, - "solver_opt": "ECOS", - } - params["spm"] = set_default_values(params["spm"], default_values) - return params - - -def dcore_anacont_spm_from_seedname(seedname): - print("Reading ", seedname + "_anacont.toml...") - with open(seedname + "_anacont.toml", "r") as f: - params = toml.load(f) - params = set_default_config(params) - print("Using configuration: ", params) - - print("Reading ", seedname + "_sigma_iw.npz...") - npz = np.load(seedname + "_sigma_iw.npz") - - assert params["omega_min"] < params["omega_max"] - mesh_w = MeshReFreq(params["omega_min"], params["omega_max"], params["Nomega"]) - - assert params["spm"]["n_matsubara"] > 0 - - beta = params["beta"] - params_spm = params["spm"] - data_w = anacont(npz, beta, mesh_w, params_spm) - - print("Writing to", seedname + "_sigma_w.npz...") - np.savez(seedname + "_sigma_w.npz", **data_w) - - -# example file for 'seedname_anacont.toml' -# beta = 40.0 -# Nomega = 4000 -# omega_min = -6.0 -# omega_max = 6.2 - -# [spm] -# n_matsubara = 300 #number of retained Matsubara frequencies -# n_tail = 100 -# n_tau = 10000 -# n_sv = 30 # number of retained singular values -# show_fit = false -# show_result = false -# lambda = 1e-6 -# verbose_opt = true -# max_iters_opt = 100 -# solver_opt = 'ECOS' - - -def run(): - print_header() - - parser = argparse.ArgumentParser( - prog="dcore_anacont_spm.py", - description="pre script for dcore.", - usage="$ dcore_anacont_spm input", - add_help=True, - formatter_class=argparse.RawTextHelpFormatter, - # epilog=generate_all_description() - ) - parser.add_argument( - "seedname", action="store", default=None, type=str, help="seedname" - ) - parser.add_argument( - "--version", action="version", version="DCore {}".format(version) - ) - - args = parser.parse_args() - - dcore_anacont_spm_from_seedname(args.seedname) diff --git a/src/dcore/dcore_anacont_spm_interactive.py b/src/dcore/dcore_anacont_spm_interactive.py deleted file mode 100644 index 133fc3e5..00000000 --- a/src/dcore/dcore_anacont_spm_interactive.py +++ /dev/null @@ -1,182 +0,0 @@ -# -# DCore -- Integrated DMFT software for correlated electrons -# Copyright (C) 2017 The University of Tokyo -# -# This program 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. -# -# This program 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 this program. If not, see . -# - -import argparse -import toml -import numpy as np -import matplotlib.pyplot as plt -from matplotlib.ticker import MultipleLocator -from dcore._dispatcher import MeshReFreq, MeshImFreq, GfReFreq, GfImFreq -from dcore.version import version, print_header -from dcore.anacont.spm import set_default_values, calc_gf_tau_from_gf_matsubara, get_single_continuation, get_multiple_continuations, get_kramers_kronig_realpart, dos_to_gf_imag - -def _plot_overview(lambdas, chi2_values, energies, densities, nrows=3, ncols=5): - fig, axes = plt.subplots(nrows=nrows, ncols=ncols, sharex=False, figsize=(15, 10)) - - axes[0, 0].plot(np.log10(lambdas), chi2_values, '-o', color='k') - axes[0, 0].set_yscale('log') - axes[0, 0].set_xlabel(r'$\log_{10} \lambda$') - axes[0, 0].set_ylabel(r'$\log_{10} \chi^2 $') - axes[0, 0].xaxis.set_minor_locator(MultipleLocator(1)) - - for i, (d, lambd) in enumerate(zip(densities, np.log10(lambdas)), start=1): - j = i // ncols - k = i % ncols - ax = axes[j, k] - ax.plot(energies, d) - ax.set_xlim(energies[0], energies[-1]) - ax.set_ylim(0, None) - ax.set_xlabel(r'$\omega$') - ax.set_ylabel(r'$\rho(\omega)$') - ax.text(0.98, 0.87, r'$\log_{{10}} \lambda = {0:1.1f}$'.format(lambd), horizontalalignment='right', transform = ax.transAxes) - - plt.tight_layout() - plt.show() - plt.close() - -def _anacont_spm_per_gf(params, matsubara_frequencies, gf_matsubara): - tau_grid, gf_tau, const_real_tail, const_imag_tail = calc_gf_tau_from_gf_matsubara(matsubara_frequencies, gf_matsubara, params['spm_interactive']['n_tau'], params['spm_interactive']['n_tail'], params['beta'], show_fit=params['spm_interactive']['show_fit']) - num_lambdas = params['spm_interactive']['n_rows_overview'] * params['spm_interactive']['n_cols_overview'] - 1 - lambda_values = np.logspace(start=params['spm_interactive']['lambda_min_log10'], stop=params['spm_interactive']['lambda_max_log10'], num=num_lambdas, base=10, endpoint=True) - energies, densities, chi2_values, rho_integrated_values = get_multiple_continuations(tau_grid, gf_tau, params['spm_interactive']['n_sv'], params['beta'], params['omega_min'], params['omega_max'], params['Nomega'], const_imag_tail, lambda_values, verbose=params['spm_interactive']['verbose_opt'], max_iters=params['spm_interactive']['max_iters_opt'], solver=params['spm_interactive']['solver_opt']) - - _plot_overview(lambda_values, chi2_values, energies, densities, nrows=params['spm_interactive']['n_rows_overview'], ncols=params['spm_interactive']['n_cols_overview']) - lambd = input('\nPlease enter desired value for log10(lambda): ') - lambd = float(lambd) - print(f'Calculating result with log10(lambda)={lambd}...') - lambd = 10 ** lambd - - density, _, energies, _, _ = get_single_continuation(tau_grid, gf_tau, params['spm_interactive']['n_sv'], params['beta'], params['omega_min'], params['omega_max'], params['Nomega'], const_imag_tail, lambd, verbose=params['spm_interactive']['verbose_opt'], max_iters=params['spm_interactive']['max_iters_opt'], solver=params['spm_interactive']['solver_opt']) - - energies, gf_real, gf_imag = get_kramers_kronig_realpart(energies, dos_to_gf_imag(density)) - gf_real += const_real_tail - return energies, gf_real, gf_imag - -def set_default_config(params): - default_values = {'show_fit' : False, - 'show_result' : False, - 'show_fit': False, - 'verbose_opt' : False, - 'max_iters_opt' : 100, - 'solver_opt' : 'ECOS', - 'n_rows_overview' : 3, - 'n_cols_overview' : 5} - params['spm_interactive'] = set_default_values(params['spm_interactive'], default_values) - return params - -def dcore_anacont_spm_interactive(seedname): - print('Reading ', seedname + '_anacont.toml...') - with open(seedname + '_anacont.toml', 'r') as f: - params = toml.load(f) - params = set_default_config(params) - print('Using configuration: ', params) - - print('Reading ', seedname + '_sigma_iw.npz...') - npz = np.load(seedname + '_sigma_iw.npz') - - assert params['omega_min'] < params['omega_max'] - mesh_w = MeshReFreq(params['omega_min'], params['omega_max'], params['Nomega']) - - data_w = {} - num_data = np.sum([key.startswith('data') for key in npz.keys()]) - for idata in range(num_data): - key = f'data{idata}' - data = npz[key] - n_matsubara = data.shape[0]//2 - mesh_iw = MeshImFreq(params['beta'], 'Fermion', n_matsubara) - gf_iw = GfImFreq(data=data, beta=params['beta'], mesh=mesh_iw) - n_orbitals = gf_iw.data.shape[1] - matsubara_frequencies = np.imag(gf_iw.mesh.values()[n_matsubara:]) - sigma_w_data = np.zeros((params['Nomega'], n_orbitals, n_orbitals), dtype=np.complex128) - for i_orb in range(n_orbitals): - print(f'Performing analytic continuation for data index {idata} and orbital index {i_orb}...') - gf_matsubara = gf_iw.data[n_matsubara:, i_orb, i_orb] - plt.plot(matsubara_frequencies, -np.imag(gf_matsubara)) - plt.title('Please determine energy up to which high-energy tail behaves linearly.') - plt.xscale('log') - plt.yscale('log') - plt.xlabel(r'$ \omega_n $') - plt.ylabel(r'-Im $G( \omega_n )$') - plt.show() - plt.close() - tail_cutoff_energy = input('\nPlease enter energy up to which high-energy tail behaves linearly: ') - tail_cutoff_energy = float(tail_cutoff_energy) - i_cutoff_energy = np.searchsorted(matsubara_frequencies, tail_cutoff_energy) - print('Retaining {} Matsubara frequencies.'.format(i_cutoff_energy)) - retained_matsubara_frequencies = matsubara_frequencies[:i_cutoff_energy] - gf_matsubara = gf_matsubara[:i_cutoff_energy] - energies, gf_real, gf_imag = _anacont_spm_per_gf(params, retained_matsubara_frequencies, gf_matsubara) - sigma_w_data[:, i_orb, i_orb] = gf_real + 1j * gf_imag - if params['spm_interactive']['show_result']: - plt.axhline(y=0, xmin=energies[0], xmax=energies[-1], color='lightgrey') - plt.plot(energies, gf_real, label=r'Re $G( \omega )$') - plt.plot(energies, gf_imag, label=r'Im $G( \omega )$') - plt.xlim(energies[0], energies[-1]) - plt.xlabel(r'$\omega$') - plt.legend() - plt.tight_layout() - plt.show() - plt.close() - sigma_w = GfReFreq(mesh=mesh_w, data=sigma_w_data) - data_w[key] = sigma_w.data - - print('Writing to', seedname + '_sigma_w.npz...') - np.savez(seedname + '_sigma_w.npz', **data_w) - -#example file for 'seedname_anacont.toml' -# beta = 40.0 -# Nomega = 4000 -# omega_min = -6.0 -# omega_max = 6.2 - -# [spm_interactive] -# n_tail = 100 -# n_tau = 10000 -# n_sv = 30 -# show_fit = false -# show_result = true -# lambda_min_log10 = -10 -# lambda_max_log10 = 2 -# verbose_opt = false -# max_iters_opt = 100 -# solver_opt = 'ECOS' -# n_rows_overview = 3 -# n_cols_overview = 5 - -def run(): - print_header() - - parser = argparse.ArgumentParser( - prog='dcore_anacont_spm_interactive.py', - description='pre script for dcore.', - usage='$ dcore_anacont_spm_interactive input', - add_help=True, - formatter_class=argparse.RawTextHelpFormatter, - #epilog=generate_all_description() - ) - parser.add_argument('seedname', - action='store', - default=None, - type=str, - help='seedname' - ) - parser.add_argument('--version', action='version', version='DCore {}'.format(version)) - - args = parser.parse_args() - - dcore_anacont_spm_interactive(args.seedname) diff --git a/src/dcore/dcore_post.py b/src/dcore/dcore_post.py deleted file mode 100644 index ae899e73..00000000 --- a/src/dcore/dcore_post.py +++ /dev/null @@ -1,31 +0,0 @@ -# -# DCore -- Integrated DMFT software for correlated electrons -# Copyright (C) 2017 The University of Tokyo -# -# This program 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. -# -# This program 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 this program. If not, see . -# - -import sys - - -def dcore_post(filename, np=1, prefix=None): - """ - Removed function. Use dcore_anacont and dcore_spectrum instead. - """ - - sys.exit("dcore_post is removed. Use dcore_anacont and dcore_spectrum instead.") - - -def run(): - sys.exit("dcore_post is removed from DCore v4. Use dcore_anacont and dcore_spectrum instead.")