Source code for green_mbtools.pesto.ac_utils
import numpy as np
import os
[docs]
def dump_input_caratheodory_data(wsample, X_iw, ifile):
"""Function to dump input data to files for caratheodory analytic continuation.
Parameters
----------
wsample : numpy.ndarray
1D array of Matsubara frequencies
X_iw : numpy.ndarray
5D array of shape (nw, ns, nk, nao, nao)
ifile : string
filename for storing the Matsubara data. The data is stored in the format::
iw_1 iw_2 iw_3 ... iw_n
Real X(iw_1) Matrix
Imag X(iw_1) Matrix
Real X(iw_2) Matrix
Imag X(iw_2) Matrix
... and so on.
"""
nw, ns, nk, nao = X_iw.shape[:4]
# Save dim1 for better understanding of output
np.savetxt("dimensions.txt", np.asarray(X_iw.shape[1:3], dtype=int))
# Dump input data to file
dim = 0
for js in range(ns):
for jk in range(nk):
# make the directory for given (js, jk) point
if not os.path.exists(str(dim)):
os.mkdir(str(dim))
# Write the input data to file
output_fname = str(dim) + '/' + ifile
with open(output_fname, 'w') as fs:
# write frequencies in the first line
for w_j in wsample:
fs.write(str(w_j) + '\t')
fs.write('\n\n')
for jw in range(nw):
# Real part for jw-th frequency
for p in range(nao):
for q in range(nao):
fs.write(str(X_iw[jw, js, jk, p, q].real) + '\t')
fs.write('\n')
fs.write('\n')
# Imag part for jw-th frequency
for p in range(nao):
for q in range(nao):
fs.write(str(X_iw[jw, js, jk, p, q].imag) + '\t')
fs.write('\n')
fs.write('\n')
dim += 1
[docs]
def load_caratheodory_data(matrix_file, spectral_file, X_dims):
"""Loads output data from Caratheodory analytic continuation.
Parameters
----------
matrix_file : string
Path to output matrix file. The output file has the following format::
w1 Re.Xc[11](w1 + i eta) Im.Xc[11](w1 + i eta) Re.Xc[12](w1 + i eta)
w2 Re.Xc[11](w2 + i eta) Im.Xc[11](w2 + i eta) Re.Xc[12](w2 + i eta)
... and so on
spectral_file : string
Path to output spectral file, which has the following format::
w1 XA(w1 + i eta)
w2 XA(w2 + i eta)
... and so on
X_dims : tuple
shape of tensor for reading and storing the output data into
Returns
-------
numpy.ndarray
real frequencies on which analytically continued data is returned
numpy.ndarray
Complex valued output tensor with full matrix form of continued data
numpy.ndarray
Real valued spectral function corresponding to the complex continued data
"""
# Dimensions
_, ns, nk, nao = X_dims[:4]
dim1 = ns * nk
# Load the spectral function data
dump_A = False
try:
XA_w = np.loadtxt("0/{}".format(spectral_file))
freqs = XA_w[:, 0]
except IOError:
pass
else:
dump_A = True
if dump_A:
XA_w = np.zeros((freqs.shape[0], dim1))
for d1 in range(dim1):
# Read X_w data
try:
X_wsk = np.loadtxt("{}/{}".format(d1, spectral_file))
XA_w[:, d1] = X_wsk[:, 1]
except IOError:
print(
"{} is missing in {} folder. Analytical continuation \
may have failed at that point.".format(spectral_file, d1)
)
# reshape the spectral data
XA_w = XA_w.reshape((freqs.shape[0],) + (ns, nk))
else:
print("All AC fails. Will not dump to DOS.h5")
# Load the complex matrix data
dump_c = False
try:
Xc_w = np.loadtxt("0/{}".format(matrix_file))
except IOError:
pass
else:
dump_c = True
if dump_c:
Xc_w = np.zeros((freqs.shape[0], dim1, nao, nao), dtype=complex)
for d1 in range(dim1):
# Read X_c data
try:
X_wsk = np.loadtxt("{}/{}".format(d1, matrix_file))
for jw in range(len(freqs)):
# need to convert the real + imag data into complex type
Xc_imtd = X_wsk[jw, 1:].view(complex)
Xc_w[jw, d1, :, :] = Xc_imtd.reshape((nao, nao))
except IOError:
print(
"{} is missing in {} folder. Analytical continuation \
may have failed at that point.".format(spectral_file, d1)
)
# reshape the complex matrix data
Xc_w = Xc_w.reshape((freqs.shape[0],) + (ns, nk, nao, nao))
return freqs, Xc_w, XA_w