mirror of
https://github.com/triqs/dft_tools
synced 2024-10-14 03:51:37 +02:00
0d25aefc73
* typos and subbed check in spin polarized calculations for quantum espresso with a warning when computing the deltaN * fixed typos in comments * removed legacy mode maintaining only compatibility layer and switched to old (<3.10) python syntax * added target density output in mu finder for brent and newton, refactored tunit test for DC, changed some comments
169 lines
5.7 KiB
Python
Executable File
169 lines
5.7 KiB
Python
Executable File
##########################################################################
|
|
#
|
|
# TRIQS: a Toolbox for Research in Interacting Quantum Systems
|
|
#
|
|
# Copyright (C) 2023 by A. Carta
|
|
#
|
|
# TRIQS 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.
|
|
#
|
|
# TRIQS 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
|
|
# TRIQS. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##########################################################################
|
|
|
|
|
|
|
|
import numpy as np
|
|
from triqs_dft_tools.sumk_dft import *
|
|
from triqs.gf import *
|
|
from h5 import HDFArchive
|
|
from triqs.operators.util import *
|
|
import triqs.utility.mpi as mpi
|
|
|
|
|
|
Uval = 5
|
|
Jval = 0.3
|
|
|
|
method_dict = {
|
|
"FLL":{
|
|
"numbering_convention":0,
|
|
"new_convention":"cFLL"
|
|
},
|
|
"AMF":{
|
|
"numbering_convention":2,
|
|
"new_convention":"cAMF"
|
|
},
|
|
"Held":{
|
|
"numbering_convention":1,
|
|
"new_convention":"cHeld"
|
|
},
|
|
}
|
|
|
|
|
|
|
|
|
|
def test_dc(method, method_dict, dens, Uval, Jval, filename):
|
|
|
|
dc_no = method_dict[method]["numbering_convention"]
|
|
dc_string = method_dict[method]["new_convention"]
|
|
|
|
mpi.report("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
|
|
mpi.report(f"\n Testing interface {method} \n")
|
|
mpi.report("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
|
|
|
|
mpi.report("\nTesting legacy compatibility layer:\n")
|
|
SK_compat.calc_dc(dens_mat=dens[0], U_interact=Uval, J_hund=Jval, use_dc_formula=dc_no )
|
|
mpi.report("Up DC matrix:")
|
|
mpi.report(SK_compat.dc_imp[0]['up'])
|
|
mpi.report(f"Double counting energy = {SK_compat.dc_energ} ")
|
|
|
|
mpi.report("\nTesting new dc interface:\n")
|
|
SK_new.calc_dc(dens_mat=dens[0], U_interact=Uval, J_hund=Jval, use_dc_formula=dc_string)
|
|
mpi.report("Up DC matrix:")
|
|
mpi.report(SK_new.dc_imp[0]['up'])
|
|
mpi.report(f"Double counting energy = {SK_new.dc_energ} ")
|
|
|
|
# Load previously computed DC values from h5 archive
|
|
R = HDFArchive(f'./{filename}', 'r')
|
|
dc_comp = R[f'DC_{method}_benchmark']['dc_imp']
|
|
en_comp = R[f'DC_{method}_benchmark']['dc_energ']
|
|
del R
|
|
|
|
mpi.report(f"\nAsserting comparison for method: {method}")
|
|
assert np.allclose(SK_compat.dc_imp[0]['up'], dc_comp, atol=1e-12), f"Assertion failed comparing legacy Vdc to reference, method: {method} "
|
|
assert np.allclose(SK_compat.dc_energ, en_comp, atol=1e-12), f"Assertion failed comparing legacy energy to reference, method {method} "
|
|
assert np.allclose(SK_new.dc_imp[0]['up'], dc_comp, atol=1e-12), f"Assertion failed comparing Vdc to reference, method: {method} "
|
|
assert np.allclose(SK_new.dc_energ, en_comp, atol=1e-12), f"Assertion failed comparing energy to reference, method: {method} "
|
|
mpi.report("Comparison with stored DC values successfull!\n")
|
|
|
|
|
|
|
|
|
|
# %% 5 orbitals testing
|
|
|
|
mpi.report("\n############################################")
|
|
mpi.report("############################################")
|
|
mpi.report(f"\n \n Starting tests for 5 orbitals \n \n")
|
|
mpi.report("############################################")
|
|
mpi.report("############################################")
|
|
dft_filename = "./NiO.ref"
|
|
use_blocks = False
|
|
SK_compat = SumkDFT(hdf_file=dft_filename+'.h5',use_dft_blocks=use_blocks)
|
|
SK_compat.set_mu(13.9)
|
|
SK_new = SumkDFT(hdf_file=dft_filename+'.h5',use_dft_blocks=use_blocks)
|
|
SK_new.set_mu(13.9)
|
|
|
|
|
|
icrsh = 0
|
|
dens = SK_compat.density_matrix()
|
|
|
|
with np.printoptions(precision=5):
|
|
for key in dens[0].keys():
|
|
mpi.report(f"{key} channel")
|
|
mpi.report(dens[0][key].real)
|
|
|
|
N_up = np.trace(dens[0]['up'].real)
|
|
N_down = np.trace(dens[0]['down'].real)
|
|
N_tot = N_up + N_down
|
|
|
|
mpi.report(f"{N_up=} ,{N_down=}, {N_tot=}\n")
|
|
|
|
for method in ["FLL", "AMF", "Held"]:
|
|
test_dc(method, method_dict, dens, Uval, Jval, filename = f"{dft_filename}.h5")
|
|
|
|
#in case implementation changes, to write new testing data into archive
|
|
#R = HDFArchive('./NiO.ref.h5', 'a')
|
|
#R.create_group(f'DC_{method}_benchmark')
|
|
#R[f'DC_{method}_benchmark']['dc_imp']= SK_new.dc_imp[0]['up']
|
|
#R[f'DC_{method}_benchmark']['dc_energ']= SK_new.dc_energ
|
|
#del R
|
|
|
|
|
|
# 3 orbital testing
|
|
|
|
mpi.report("############################################")
|
|
mpi.report("############################################")
|
|
mpi.report(f"\n \n Starting tests for 3 orbitals \n \n")
|
|
mpi.report("############################################")
|
|
mpi.report("############################################")
|
|
dft_filename = "./SrVO3.ref"
|
|
use_blocks = False
|
|
SK_compat = SumkDFT(hdf_file=dft_filename+'.h5',use_dft_blocks=use_blocks)
|
|
SK_new = SumkDFT(hdf_file=dft_filename+'.h5',use_dft_blocks=use_blocks)
|
|
|
|
icrsh = 0
|
|
dens = SK_compat.density_matrix()
|
|
|
|
|
|
with np.printoptions(precision=5):
|
|
for key in dens[0].keys():
|
|
mpi.report(f"{key} channel")
|
|
mpi.report(dens[0][key].real)
|
|
|
|
N_up = np.trace(dens[0]['up'].real)
|
|
N_down = np.trace(dens[0]['down'].real)
|
|
N_tot = N_up + N_down
|
|
|
|
mpi.report(f"{N_up=} ,{N_down=}, {N_tot=}\n")
|
|
|
|
Uval = 5
|
|
Jval = 0.3
|
|
|
|
for method in ["FLL", "AMF", "Held"]:
|
|
test_dc(method, method_dict, dens, Uval, Jval, filename = f"{dft_filename}.h5" )
|
|
|
|
#in case implementation changes, to write new testing data into archive
|
|
#R = HDFArchive(f'./{dft_filename}.h5', 'a')
|
|
#R.create_group(f'DC_{method}_benchmark')
|
|
#R[f'DC_{method}_benchmark']['dc_imp']= SK_new.dc_imp[0]['up']
|
|
#R[f'DC_{method}_benchmark']['dc_energ']= SK_new.dc_energ
|
|
#del R
|