-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[feat] add Pade Sigma analytic continuation and refine tests
- Loading branch information
1 parent
f512cdc
commit 89998a9
Showing
5 changed files
with
164 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
# pyright: reportUnusedExpression=false | ||
|
||
import numpy as np | ||
|
||
from triqs.utility import mpi | ||
from h5 import HDFArchive | ||
from triqs.gf import Gf, MeshReFreq, BlockGf | ||
|
||
from solid_dmft.postprocessing.maxent_sigma import _read_h5 | ||
|
||
def _write_sigma_omega_to_h5(sigma_w, external_path, iteration): | ||
""" Writes real-frequency self energy to h5 archive. """ | ||
h5_internal_path = 'DMFT_results/' + ('last_iter' if iteration is None | ||
else f'it_{iteration}') | ||
|
||
with HDFArchive(external_path, 'a') as archive: | ||
for i, sigma_imp in enumerate(sigma_w): | ||
archive[h5_internal_path][f'Sigma_Refreq_{i}'] = sigma_imp | ||
|
||
def _run_pade(sigma_iw_list, n_w, w_min, w_max, n_iw, eta): | ||
""" | ||
Run pade in parallel. Call via main function. | ||
""" | ||
mpi.report('Continuing impurities with blocks:') | ||
|
||
imps_blocks = [] | ||
sigma_iw_flat_list = [] | ||
|
||
# create flattened list of self-energies | ||
for i, sigma_iw in enumerate(sigma_iw_list): | ||
blocks = list(sigma_iw.indices) | ||
mpi.report('- Imp {}: {}'.format(i, blocks)) | ||
for block in blocks: | ||
imps_blocks.append((i, block)) | ||
sigma_iw_flat_list.append(sigma_iw[block]) | ||
|
||
sigma_w_flat_list = [] | ||
wmesh = MeshReFreq(w_min=w_min,w_max=w_max,n_w=n_w) | ||
imps_blocks_indices = np.arange(len(imps_blocks)) | ||
for i in imps_blocks_indices: | ||
sigma_w_flat_list.append(Gf(mesh=wmesh, target_shape=sigma_iw_flat_list[i].target_shape)) | ||
|
||
# Runs Pade while parallelizing over impurities and blocks | ||
for i in mpi.slice_array(imps_blocks_indices): | ||
print(f'Rank {mpi.rank} continuing Σ {i}/{len(imps_blocks)}') | ||
sigma_w_flat_list[i].set_from_pade(sigma_iw_flat_list[i],n_points=n_iw, freq_offset=eta) | ||
|
||
# sync Pade data | ||
for i in imps_blocks_indices: | ||
sigma_w_flat_list[i] = mpi.all_reduce(sigma_w_flat_list[i]) | ||
|
||
# Create list of BlockGf | ||
sigma_w_list = [] | ||
for i, sigma_iw in enumerate(sigma_iw_list): | ||
block_list = [] | ||
for block in sigma_iw.indices: | ||
block_list.append(sigma_w_flat_list.pop(0)) | ||
sigma_w_list.append(BlockGf(name_list=list(sigma_iw.indices), block_list=block_list, make_copies=True)) | ||
|
||
return sigma_w_list | ||
|
||
def main(external_path, n_w, w_min, w_max, n_iw, iteration=None, eta=0.0): | ||
""" | ||
Main function that reads the Matsubara self-energy from h5, analytically continues it, | ||
writes the results back to the h5 archive and also returns the results. | ||
Function parallelizes using MPI over impurities and blocks. | ||
Parameters | ||
---------- | ||
external_path : string | ||
Path to the h5 archive to read from and write to | ||
n_w : int | ||
number of real frequencies of the final self-energies returned | ||
w_min : float | ||
Lower end of range where Sigma is being continued. | ||
w_max : float | ||
Upper end of range where Sigma is being continued. | ||
n_iw : int | ||
number of Matsubara frequencies to consider for the Pade approximant | ||
iteration : int/string | ||
Iteration to read from and write to. Default to last_iter | ||
eta : float | ||
frequency offset within Pade | ||
Returns | ||
------- | ||
sigma_w : list of triqs.gf.BlockGf | ||
Sigma(omega) per inequivalent shell | ||
""" | ||
|
||
sigma_iw = None | ||
if mpi.is_master_node(): | ||
sigma_iw, _, _, _ = _read_h5(external_path, iteration) | ||
sigma_iw = mpi.bcast(sigma_iw) | ||
|
||
# run pade in parallel | ||
sigma_w = _run_pade(sigma_iw, n_w, w_min, w_max, n_iw, eta) | ||
|
||
mpi.report('Writing results to h5 archive now.') | ||
if mpi.is_master_node(): | ||
_write_sigma_omega_to_h5(sigma_w, external_path, iteration) | ||
mpi.report('Finished writing Σ(ω) to archive.') | ||
|
||
return sigma_w | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters