mirror of
https://github.com/TREX-CoE/Sherman-Morrison.git
synced 2024-11-03 20:54:08 +01:00
87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
|
#!/usr/bin/env python
|
||
|
import h5py
|
||
|
import sys
|
||
|
import numpy as np
|
||
|
import math
|
||
|
|
||
|
fname = sys.argv[1]
|
||
|
dataset =h5py.File(fname, "r")
|
||
|
cycle_num = sys.argv[2]
|
||
|
cycle = "cycle_" + cycle_num
|
||
|
cgroup = dataset[cycle]
|
||
|
|
||
|
slater_matrix = cgroup["slater_matrix"][()]
|
||
|
slater_inverse = cgroup["slater_inverse"][()]
|
||
|
nupdates = cgroup["nupdates"][()]
|
||
|
update_idxs = cgroup["col_update_index"][()]
|
||
|
updates = cgroup["updates"][()]
|
||
|
dim = cgroup["slater_matrix_dim"][()]
|
||
|
Id = np.identity(dim)
|
||
|
|
||
|
print(f'========================\n== UPDATE CYCLE: {cycle_num} ==\n========================')
|
||
|
print()
|
||
|
print(f'Number of updates: {nupdates}')
|
||
|
print(f'Columns that need to be updated (replaced): {update_idxs}\n')
|
||
|
|
||
|
# det_sm = np.linalg.det(slater_matrix)
|
||
|
# det_si = np.linalg.det(slater_inverse)
|
||
|
# eigen_values_sm, eigen_vectors_sm = np.linalg.eig(slater_matrix)
|
||
|
# eigen_values_si, eigen_vectors_si = np.linalg.eig(slater_inverse)
|
||
|
|
||
|
# SSi = np.matmul(slater_matrix, slater_inverse)
|
||
|
# detSSi = np.linalg.det(SSi)
|
||
|
# delta = Id - SSi
|
||
|
# res_max = np.amax(abs(delta))
|
||
|
# res_max2 = res_max*res_max
|
||
|
# res_fro = np.linalg.norm(delta, 'fro')
|
||
|
# res_fro2 = res_fro*res_fro
|
||
|
|
||
|
# print(f'Determinant of Slater-matrix: {det_sm}')
|
||
|
# print(f'Determinant of inverse Slater-matrix: {det_si}\n')
|
||
|
|
||
|
# print(f'Smalles eigenvalue (modulus) of Slater-matrix: {np.amin(abs(eigen_values_sm))}')
|
||
|
# print(f'Smalles eigenvalue (modulus) of inverse Slater-matrix: {np.amin(abs(eigen_values_si))}\n')
|
||
|
|
||
|
# print(f'Det(S*Sinv): {detSSi}')
|
||
|
# print(f'Residual (Id - S*Sinv) (Max norm): {res_max}')
|
||
|
# print(f'Residual (Max norm sq.): {res_max2}')
|
||
|
# print(f'Residual (Frob. norm): {res_fro}')
|
||
|
# print(f'Residual (Frob. norm sq.): {res_fro2}\n')
|
||
|
|
||
|
print(f'+-----------------------------------------------+\n| Updating Slater-matrix... |')
|
||
|
slater_matrix_new = slater_matrix
|
||
|
index = 0
|
||
|
for update in updates:
|
||
|
column = update_idxs[index] - 1
|
||
|
slater_matrix_new[column] = update
|
||
|
index = index + 1
|
||
|
|
||
|
print(f'| Computing inverse of updated Slater-matrix... |\n+-----------------------------------------------+\n')
|
||
|
slater_inverse_new = np.linalg.inv(slater_matrix_new)
|
||
|
|
||
|
det_sm = np.linalg.det(slater_matrix_new)
|
||
|
det_si = np.linalg.det(slater_inverse_new)
|
||
|
eigen_values_sm, eigen_vectors_sm = np.linalg.eig(slater_matrix_new)
|
||
|
eigen_values_si, eigen_vectors_si = np.linalg.eig(slater_inverse_new)
|
||
|
|
||
|
SSi = np.matmul(slater_matrix_new, slater_inverse_new)
|
||
|
detSSi = np.linalg.det(SSi)
|
||
|
delta = Id - SSi
|
||
|
res_max = np.amax(abs(delta))
|
||
|
res_max2 = res_max*res_max
|
||
|
res_fro = np.linalg.norm(delta, 'fro')
|
||
|
res_fro2 = res_fro*res_fro
|
||
|
|
||
|
print(f'(DUSM) Determinant of UPDATED Slater-matrix: {cycle_num}, {det_sm}')
|
||
|
print(f'(DUSI) Determinant of UPDATED inverse Slater-matrix: {det_si}\n')
|
||
|
|
||
|
print(f'(SEVUSM) Smalles eigenvalue (modulus) of UPDATED Slater-matrix: {np.amin(abs(eigen_values_sm))}')
|
||
|
print(f'(SEVUSI) Smalles eigenvalue (modulus) of UPDATED inverse Slater-matrix: {np.amin(abs(eigen_values_si))}\n')
|
||
|
|
||
|
print(f'(DSSI) det(S*Sinv): {detSSi}')
|
||
|
print(f'(RMN) Residual (Id - S*Sinv) (Max norm): {res_max}')
|
||
|
print(f'(RMN2) Residual (Max norm sq.): {res_max2}')
|
||
|
print(f'(RFN) Residual (Frob. norm): {res_fro}')
|
||
|
print(f'(RFN2) Residual (Frob. norm sq.): {res_fro2}\n')
|
||
|
|
||
|
dataset.close()
|