mirror of
https://github.com/triqs/dft_tools
synced 2024-11-07 06:33:48 +01:00
c1ac9c85c8
You *may* need to run "pytriqs update_archive.py filename.h5 v1.2" to update the archive if you have dft_parproj_input is present.
134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
from pytriqs.archive import HDFArchive
|
|
import h5py
|
|
import sys
|
|
import numpy
|
|
import subprocess
|
|
|
|
if len(sys.argv) < 2:
|
|
print "Usage: python update_archive.py old_archive [v1.0|v1.2]"
|
|
sys.exit()
|
|
|
|
print """
|
|
This script is an attempt to update your archive to TRIQS 1.2.
|
|
Please keep a copy of your old archive as this script is
|
|
** not guaranteed ** to work for your archive.
|
|
If you encounter any problem please report it on github!
|
|
"""
|
|
|
|
def convert_shells(shells):
|
|
shell_entries = ['atom', 'sort', 'l', 'dim']
|
|
return [ {name: int(val) for name, val in zip(shell_entries, shells[ish])} for ish in range(len(shells)) ]
|
|
|
|
def convert_corr_shells(corr_shells):
|
|
corr_shell_entries = ['atom', 'sort', 'l', 'dim', 'SO', 'irep']
|
|
return [ {name: int(val) for name, val in zip(corr_shell_entries, corr_shells[icrsh])} for icrsh in range(len(corr_shells)) ]
|
|
|
|
def det_shell_equivalence(corr_shells):
|
|
corr_to_inequiv = [0 for i in range(len(corr_shells))]
|
|
inequiv_to_corr = [0]
|
|
n_inequiv_shells = 1
|
|
|
|
if len(corr_shells) > 1:
|
|
inequiv_sort = [ corr_shells[0]['sort'] ]
|
|
inequiv_l = [ corr_shells[0]['l'] ]
|
|
for i in range(len(corr_shells)-1):
|
|
is_equiv = False
|
|
for j in range(n_inequiv_shells):
|
|
if (inequiv_sort[j]==corr_shells[i+1]['sort']) and (inequiv_l[j]==corr_shells[i+1]['l']):
|
|
is_equiv = True
|
|
corr_to_inequiv[i+1] = j
|
|
if is_equiv==False:
|
|
corr_to_inequiv[i+1] = n_inequiv_shells
|
|
n_inequiv_shells += 1
|
|
inequiv_sort.append( corr_shells[i+1]['sort'] )
|
|
inequiv_l.append( corr_shells[i+1]['l'] )
|
|
inequiv_to_corr.append( i+1 )
|
|
|
|
return n_inequiv_shells, corr_to_inequiv, inequiv_to_corr
|
|
|
|
|
|
### Main ###
|
|
|
|
filename = sys.argv[1]
|
|
if len(sys.argv) > 2:
|
|
from_v = sys.argv[2]
|
|
else: # Assume updating an old v1.0 script
|
|
from_v = 'v1.0'
|
|
A = h5py.File(filename)
|
|
|
|
# Rename groups
|
|
old_to_new = {'SumK_LDA':'dft_input', 'SumK_LDA_ParProj':'dft_parproj_input',
|
|
'SymmCorr':'dft_symmcorr_input', 'SymmPar':'dft_symmpar_input', 'SumK_LDA_Bands':'dft_bands_input'}
|
|
|
|
for old, new in old_to_new.iteritems():
|
|
if old not in A.keys(): continue
|
|
print "Changing %s to %s ..."%(old, new)
|
|
A.copy(old,new)
|
|
del(A[old])
|
|
|
|
# Move output items from dft_input to user_data
|
|
move_to_output = ['chemical_potential','dc_imp','dc_energ']
|
|
for obj in move_to_output:
|
|
if obj in A['dft_input'].keys():
|
|
if 'user_data' not in A: A.create_group('user_data')
|
|
print "Moving %s to user_data ..."%obj
|
|
A.copy('dft_input/'+obj,'user_data/'+obj)
|
|
del(A['dft_input'][obj])
|
|
# Delete obsolete quantities
|
|
to_delete = ['gf_struct_solver','map_inv','map','deg_shells','h_field']
|
|
for obj in to_delete:
|
|
if obj in A['dft_input'].keys():
|
|
del(A['dft_input'][obj])
|
|
|
|
if from_v == 'v1.0':
|
|
# Update shells and corr_shells to list of dicts
|
|
shells_old = HDFArchive(filename,'r')['dft_input']['shells']
|
|
corr_shells_old = HDFArchive(filename,'r')['dft_input']['corr_shells']
|
|
shells = convert_shells(shells_old)
|
|
corr_shells = convert_corr_shells(corr_shells_old)
|
|
del(A['dft_input']['shells'])
|
|
del(A['dft_input']['corr_shells'])
|
|
A.close()
|
|
# Need to use HDFArchive for the following
|
|
HDFArchive(filename,'a')['dft_input']['shells'] = shells
|
|
HDFArchive(filename,'a')['dft_input']['corr_shells'] = corr_shells
|
|
A = h5py.File(filename)
|
|
|
|
# Add shell equivalency quantities
|
|
if 'n_inequiv_shells' not in A['dft_input']:
|
|
equiv_shell_info = det_shell_equivalence(corr_shells)
|
|
A['dft_input']['n_inequiv_shells'] = equiv_shell_info[0]
|
|
A['dft_input']['corr_to_inequiv'] = equiv_shell_info[1]
|
|
A['dft_input']['inequiv_to_corr'] = equiv_shell_info[2]
|
|
|
|
# Rename variables
|
|
groups = ['dft_symmcorr_input','dft_symmpar_input']
|
|
for group in groups:
|
|
if group not in A.keys(): continue
|
|
if 'n_s' not in A[group]: continue
|
|
print "Changing n_s to n_symm ..."
|
|
A[group].move('n_s','n_symm')
|
|
# Convert orbits to list of dicts
|
|
orbits_old = HDFArchive(filename,'r')[group]['orbits']
|
|
orbits = convert_corr_shells(orbits_old)
|
|
del(A[group]['orbits'])
|
|
A.close()
|
|
HDFArchive(filename,'a')[group]['orbits'] = orbits
|
|
A = h5py.File(filename)
|
|
|
|
groups = ['dft_parproj_input']
|
|
for group in groups:
|
|
if group not in A.keys(): continue
|
|
if 'proj_mat_pc' not in A[group]: continue
|
|
print "Changing proj_mat_pc to proj_mat_all ..."
|
|
A[group].move('proj_mat_pc','proj_mat_all')
|
|
|
|
A.close()
|
|
|
|
# Repack to reclaim disk space
|
|
retcode = subprocess.call(["h5repack","-i%s"%filename, "-otemphgfrt.h5"])
|
|
if retcode != 0:
|
|
print "h5repack failed!"
|
|
else:
|
|
subprocess.call(["mv","-f","temphgfrt.h5","%s"%filename])
|