mirror of
https://github.com/triqs/dft_tools
synced 2025-01-03 01:55:56 +01:00
Move repeated converter functions in converter_tools.py
This commit is contained in:
parent
0bb1a45afb
commit
a7f2a5096f
@ -35,6 +35,8 @@ par_proj_data -> parproj_data
|
|||||||
symm_par_data -> symmpar_data
|
symm_par_data -> symmpar_data
|
||||||
|
|
||||||
**********
|
**********
|
||||||
|
* separated read_fortran_file, __repack, inequiv_shells into new converter_tools class from which hk and wien converters are derived
|
||||||
|
|
||||||
|
|
||||||
* moved find_dc, find_mu_nonint, check_projectors, sorts_of_atoms,
|
* moved find_dc, find_mu_nonint, check_projectors, sorts_of_atoms,
|
||||||
number_of_atoms to end, not to be documented.
|
number_of_atoms to end, not to be documented.
|
||||||
|
78
python/converters/converter_tools.py
Normal file
78
python/converters/converter_tools.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# TRIQS: a Toolbox for Research in Interacting Quantum Systems
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 by M. Aichhorn
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
class ConverterTools:
|
||||||
|
|
||||||
|
def read_fortran_file(self,filename,to_replace):
|
||||||
|
""" Returns a generator that yields all numbers in the Fortran file as float, one by one"""
|
||||||
|
import os.path
|
||||||
|
import string
|
||||||
|
if not(os.path.exists(filename)) : raise IOError, "File %s does not exist."%filename
|
||||||
|
for line in open(filename,'r') :
|
||||||
|
for old,new in to_replace.iteritems(): line = line.replace(old,new)
|
||||||
|
for x in line.split(): yield string.atof(x)
|
||||||
|
|
||||||
|
|
||||||
|
def __repack(self):
|
||||||
|
"""Calls the h5repack routine, in order to reduce the file size of the hdf5 archive.
|
||||||
|
Should only be used BEFORE the first invokation of HDFArchive in the program, otherwise
|
||||||
|
the hdf5 linking is broken!!!"""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
if not (mpi.is_master_node()): return
|
||||||
|
mpi.report("Repacking the file %s"%self.hdf_file)
|
||||||
|
|
||||||
|
retcode = subprocess.call(["h5repack","-i%s"%self.hdf_file, "-otemphgfrt.h5"])
|
||||||
|
if (retcode!=0):
|
||||||
|
mpi.report("h5repack failed!")
|
||||||
|
else:
|
||||||
|
subprocess.call(["mv","-f","temphgfrt.h5","%s"%self.hdf_file])
|
||||||
|
|
||||||
|
|
||||||
|
def inequiv_shells(self,lst):
|
||||||
|
"""
|
||||||
|
The number of inequivalent shells is calculated from lst, and a mapping is given as
|
||||||
|
map(i_corr_shells) = i_inequiv_corr_shells
|
||||||
|
invmap(i_inequiv_corr_shells) = i_corr_shells
|
||||||
|
in order to put the self energies to all equivalent shells, and for extracting Gloc
|
||||||
|
"""
|
||||||
|
|
||||||
|
tmp = []
|
||||||
|
self.shellmap = [0 for i in range(len(lst))]
|
||||||
|
self.invshellmap = [0]
|
||||||
|
self.n_inequiv_corr_shells = 1
|
||||||
|
tmp.append( lst[0][1:3] )
|
||||||
|
|
||||||
|
if (len(lst)>1):
|
||||||
|
for i in range(len(lst)-1):
|
||||||
|
|
||||||
|
fnd = False
|
||||||
|
for j in range(self.n_inequiv_corr_shells):
|
||||||
|
if (tmp[j]==lst[i+1][1:3]):
|
||||||
|
fnd = True
|
||||||
|
self.shellmap[i+1] = j
|
||||||
|
if (fnd==False):
|
||||||
|
self.shellmap[i+1] = self.n_inequiv_corr_shells
|
||||||
|
self.n_inequiv_corr_shells += 1
|
||||||
|
tmp.append( lst[i+1][1:3] )
|
||||||
|
self.invshellmap.append(i+1)
|
@ -24,21 +24,10 @@ from types import *
|
|||||||
import numpy
|
import numpy
|
||||||
from pytriqs.archive import *
|
from pytriqs.archive import *
|
||||||
import pytriqs.utility.mpi as mpi
|
import pytriqs.utility.mpi as mpi
|
||||||
import string
|
|
||||||
from math import sqrt
|
from math import sqrt
|
||||||
|
from converter_tools import *
|
||||||
|
|
||||||
|
class HkConverter(ConverterTools):
|
||||||
def read_fortran_file (filename):
|
|
||||||
""" Returns a generator that yields all numbers in the Fortran file as float, one by one"""
|
|
||||||
import os.path
|
|
||||||
if not(os.path.exists(filename)) : raise IOError, "File %s does not exist."%filename
|
|
||||||
for line in open(filename,'r') :
|
|
||||||
for x in line.replace('D','E').replace('(',' ').replace(')',' ').replace(',',' ').split() :
|
|
||||||
yield string.atof(x)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class HkConverter:
|
|
||||||
"""
|
"""
|
||||||
Conversion from general H(k) file to an hdf5 file that can be used as input for the SumK_LDA class.
|
Conversion from general H(k) file to an hdf5 file that can be used as input for the SumK_LDA class.
|
||||||
"""
|
"""
|
||||||
@ -46,7 +35,6 @@ class HkConverter:
|
|||||||
def __init__(self, hk_file, hdf_file, lda_subgrp = 'lda_input', symmcorr_subgrp = 'lda_symmcorr_input', repacking = False):
|
def __init__(self, hk_file, hdf_file, lda_subgrp = 'lda_input', symmcorr_subgrp = 'lda_symmcorr_input', repacking = False):
|
||||||
"""
|
"""
|
||||||
Init of the class.
|
Init of the class.
|
||||||
on.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
assert type(hk_file)==StringType,"hk_file must be a filename"
|
assert type(hk_file)==StringType,"hk_file must be a filename"
|
||||||
@ -54,11 +42,12 @@ class HkConverter:
|
|||||||
self.lda_file = hk_file
|
self.lda_file = hk_file
|
||||||
self.lda_subgrp = lda_subgrp
|
self.lda_subgrp = lda_subgrp
|
||||||
self.symmcorr_subgrp = symmcorr_subgrp
|
self.symmcorr_subgrp = symmcorr_subgrp
|
||||||
|
self.fortran_to_replace = {'D':'E', '(':' ', ')':' ', ',':' '}
|
||||||
|
|
||||||
# Checks if h5 file is there and repacks it if wanted:
|
# Checks if h5 file is there and repacks it if wanted:
|
||||||
import os.path
|
import os.path
|
||||||
if (os.path.exists(self.hdf_file) and repacking):
|
if (os.path.exists(self.hdf_file) and repacking):
|
||||||
self.__repack()
|
ConverterTools.__repack(self)
|
||||||
|
|
||||||
|
|
||||||
def convert_dmft_input(self, first_real_part_matrix = True, only_upper_triangle = False, weights_in_file = False):
|
def convert_dmft_input(self, first_real_part_matrix = True, only_upper_triangle = False, weights_in_file = False):
|
||||||
@ -71,7 +60,7 @@ class HkConverter:
|
|||||||
mpi.report("Reading input from %s..."%self.lda_file)
|
mpi.report("Reading input from %s..."%self.lda_file)
|
||||||
|
|
||||||
# R is a generator : each R.Next() will return the next number in the file
|
# R is a generator : each R.Next() will return the next number in the file
|
||||||
R = read_fortran_file(self.lda_file)
|
R = ConverterTools.read_fortran_file(self,self.lda_file,self.fortran_to_replace)
|
||||||
try:
|
try:
|
||||||
energy_unit = 1.0 # the energy conversion factor is 1.0, we assume eV in files
|
energy_unit = 1.0 # the energy conversion factor is 1.0, we assume eV in files
|
||||||
n_k = int(R.next()) # read the number of k points
|
n_k = int(R.next()) # read the number of k points
|
||||||
@ -93,7 +82,7 @@ class HkConverter:
|
|||||||
# now read the information about the shells:
|
# now read the information about the shells:
|
||||||
corr_shells = [ [ int(R.next()) for i in range(6) ] for icrsh in range(n_corr_shells) ] # reads iatom, sort, l, dim, SO flag, irep
|
corr_shells = [ [ int(R.next()) for i in range(6) ] for icrsh in range(n_corr_shells) ] # reads iatom, sort, l, dim, SO flag, irep
|
||||||
|
|
||||||
self.inequiv_shells(corr_shells) # determine the number of inequivalent correlated shells, has to be known for further reading...
|
ConverterTools.inequiv_shells(self,corr_shells) # determine the number of inequivalent correlated shells, needed for further reading
|
||||||
|
|
||||||
use_rotations = 0
|
use_rotations = 0
|
||||||
rot_mat = [numpy.identity(corr_shells[icrsh][3],numpy.complex_) for icrsh in xrange(n_corr_shells)]
|
rot_mat = [numpy.identity(corr_shells[icrsh][3],numpy.complex_) for icrsh in xrange(n_corr_shells)]
|
||||||
@ -210,53 +199,3 @@ class HkConverter:
|
|||||||
'rot_mat_time_inv','n_reps','dim_reps','T','n_orbitals','proj_mat','bz_weights','hopping']
|
'rot_mat_time_inv','n_reps','dim_reps','T','n_orbitals','proj_mat','bz_weights','hopping']
|
||||||
for it in things_to_save: ar[self.lda_subgrp][it] = locals()[it]
|
for it in things_to_save: ar[self.lda_subgrp][it] = locals()[it]
|
||||||
del ar
|
del ar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __repack(self):
|
|
||||||
"""Calls the h5repack routine, in order to reduce the file size of the hdf5 archive.
|
|
||||||
Should only be used BEFORE the first invokation of HDFArchive in the program, otherwise
|
|
||||||
the hdf5 linking is broken!!!"""
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
if not (mpi.is_master_node()): return
|
|
||||||
|
|
||||||
mpi.report("Repacking the file %s"%self.hdf_file)
|
|
||||||
|
|
||||||
retcode = subprocess.call(["h5repack","-i%s"%self.hdf_file, "-otemphgfrt.h5"])
|
|
||||||
if (retcode!=0):
|
|
||||||
mpi.report("h5repack failed!")
|
|
||||||
else:
|
|
||||||
subprocess.call(["mv","-f","temphgfrt.h5","%s"%self.hdf_file])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def inequiv_shells(self,lst):
|
|
||||||
"""
|
|
||||||
The number of inequivalent shells is calculated from lst, and a mapping is given as
|
|
||||||
map(i_corr_shells) = i_inequiv_corr_shells
|
|
||||||
invmap(i_inequiv_corr_shells) = i_corr_shells
|
|
||||||
in order to put the Self energies to all equivalent shells, and for extracting Gloc
|
|
||||||
"""
|
|
||||||
|
|
||||||
tmp = []
|
|
||||||
self.shellmap = [0 for i in range(len(lst))]
|
|
||||||
self.invshellmap = [0]
|
|
||||||
self.n_inequiv_corr_shells = 1
|
|
||||||
tmp.append( lst[0][1:3] )
|
|
||||||
|
|
||||||
if (len(lst)>1):
|
|
||||||
for i in range(len(lst)-1):
|
|
||||||
|
|
||||||
fnd = False
|
|
||||||
for j in range(self.n_inequiv_corr_shells):
|
|
||||||
if (tmp[j]==lst[i+1][1:3]):
|
|
||||||
fnd = True
|
|
||||||
self.shellmap[i+1] = j
|
|
||||||
if (fnd==False):
|
|
||||||
self.shellmap[i+1] = self.n_inequiv_corr_shells
|
|
||||||
self.n_inequiv_corr_shells += 1
|
|
||||||
tmp.append( lst[i+1][1:3] )
|
|
||||||
self.invshellmap.append(i+1)
|
|
||||||
|
@ -24,20 +24,9 @@ from types import *
|
|||||||
import numpy
|
import numpy
|
||||||
from pytriqs.archive import *
|
from pytriqs.archive import *
|
||||||
import pytriqs.utility.mpi as mpi
|
import pytriqs.utility.mpi as mpi
|
||||||
import string
|
from converter_tools import *
|
||||||
|
|
||||||
|
class Wien2kConverter(ConverterTools):
|
||||||
def read_fortran_file (filename):
|
|
||||||
""" Returns a generator that yields all numbers in the Fortran file as float, one by one"""
|
|
||||||
import os.path
|
|
||||||
if not(os.path.exists(filename)) : raise IOError, "File %s does not exist."%filename
|
|
||||||
for line in open(filename,'r') :
|
|
||||||
for x in line.replace('D','E').split() :
|
|
||||||
yield string.atof(x)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Wien2kConverter:
|
|
||||||
"""
|
"""
|
||||||
Conversion from Wien2k output to an hdf5 file that can be used as input for the SumkLDA class.
|
Conversion from Wien2k output to an hdf5 file that can be used as input for the SumkLDA class.
|
||||||
"""
|
"""
|
||||||
@ -61,11 +50,12 @@ class Wien2kConverter:
|
|||||||
self.parproj_subgrp = parproj_subgrp
|
self.parproj_subgrp = parproj_subgrp
|
||||||
self.symmpar_subgrp = symmpar_subgrp
|
self.symmpar_subgrp = symmpar_subgrp
|
||||||
self.bands_subgrp = bands_subgrp
|
self.bands_subgrp = bands_subgrp
|
||||||
|
self.fortran_to_replace = {'D':'E'}
|
||||||
|
|
||||||
# Checks if h5 file is there and repacks it if wanted:
|
# Checks if h5 file is there and repacks it if wanted:
|
||||||
import os.path
|
import os.path
|
||||||
if (os.path.exists(self.hdf_file) and repacking):
|
if (os.path.exists(self.hdf_file) and repacking):
|
||||||
self.__repack()
|
ConverterTools.__repack(self)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -79,7 +69,7 @@ class Wien2kConverter:
|
|||||||
mpi.report("Reading input from %s..."%self.lda_file)
|
mpi.report("Reading input from %s..."%self.lda_file)
|
||||||
|
|
||||||
# R is a generator : each R.Next() will return the next number in the file
|
# R is a generator : each R.Next() will return the next number in the file
|
||||||
R = read_fortran_file(self.lda_file)
|
R = ConverterTools.read_fortran_file(self,self.lda_file,self.fortran_to_replace)
|
||||||
try:
|
try:
|
||||||
energy_unit = R.next() # read the energy convertion factor
|
energy_unit = R.next() # read the energy convertion factor
|
||||||
n_k = int(R.next()) # read the number of k points
|
n_k = int(R.next()) # read the number of k points
|
||||||
@ -100,7 +90,7 @@ class Wien2kConverter:
|
|||||||
# now read the information about the shells:
|
# now read the information about the shells:
|
||||||
corr_shells = [ [ int(R.next()) for i in range(6) ] for icrsh in range(n_corr_shells) ] # reads iatom, sort, l, dim, SO flag, irep
|
corr_shells = [ [ int(R.next()) for i in range(6) ] for icrsh in range(n_corr_shells) ] # reads iatom, sort, l, dim, SO flag, irep
|
||||||
|
|
||||||
self.inequiv_shells(corr_shells) # determine the number of inequivalent correlated shells, needed for further reading
|
ConverterTools.inequiv_shells(self,corr_shells) # determine the number of inequivalent correlated shells, needed for further reading
|
||||||
|
|
||||||
use_rotations = 1
|
use_rotations = 1
|
||||||
rot_mat = [numpy.identity(corr_shells[icrsh][3],numpy.complex_) for icrsh in xrange(n_corr_shells)]
|
rot_mat = [numpy.identity(corr_shells[icrsh][3],numpy.complex_) for icrsh in xrange(n_corr_shells)]
|
||||||
@ -222,7 +212,7 @@ class Wien2kConverter:
|
|||||||
dens_mat_below = [ [numpy.zeros([self.shells[ish][3],self.shells[ish][3]],numpy.complex_) for ish in range(self.n_shells)]
|
dens_mat_below = [ [numpy.zeros([self.shells[ish][3],self.shells[ish][3]],numpy.complex_) for ish in range(self.n_shells)]
|
||||||
for isp in range(self.n_spin_blocs) ]
|
for isp in range(self.n_spin_blocs) ]
|
||||||
|
|
||||||
R = read_fortran_file(self.parproj_file)
|
R = ConverterTools.read_fortran_file(self,self.parproj_file,self.fortran_to_replace)
|
||||||
|
|
||||||
n_parproj = [int(R.next()) for i in range(self.n_shells)]
|
n_parproj = [int(R.next()) for i in range(self.n_shells)]
|
||||||
n_parproj = numpy.array(n_parproj)
|
n_parproj = numpy.array(n_parproj)
|
||||||
@ -295,7 +285,7 @@ class Wien2kConverter:
|
|||||||
if not (mpi.is_master_node()): return
|
if not (mpi.is_master_node()): return
|
||||||
mpi.report("Reading bands input from %s..."%self.band_file)
|
mpi.report("Reading bands input from %s..."%self.band_file)
|
||||||
|
|
||||||
R = read_fortran_file(self.band_file)
|
R = ConverterTools.read_fortran_file(self,self.band_file,self.fortran_to_replace)
|
||||||
try:
|
try:
|
||||||
n_k = int(R.next())
|
n_k = int(R.next())
|
||||||
|
|
||||||
@ -380,7 +370,8 @@ class Wien2kConverter:
|
|||||||
mpi.report("Reading symmetry input from %s..."%symm_file)
|
mpi.report("Reading symmetry input from %s..."%symm_file)
|
||||||
|
|
||||||
n_orbits = len(orbits)
|
n_orbits = len(orbits)
|
||||||
R=read_fortran_file(symm_file)
|
|
||||||
|
R = ConverterTools.read_fortran_file(self,symm_file,self.fortran_to_replace)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
n_s = int(R.next()) # Number of symmetry operations
|
n_s = int(R.next()) # Number of symmetry operations
|
||||||
@ -431,51 +422,3 @@ class Wien2kConverter:
|
|||||||
things_to_save = ['n_s','n_atoms','perm','orbits','SO','SP','time_inv','mat','mat_tinv']
|
things_to_save = ['n_s','n_atoms','perm','orbits','SO','SP','time_inv','mat','mat_tinv']
|
||||||
for it in things_to_save: ar[symm_subgrp][it] = locals()[it]
|
for it in things_to_save: ar[symm_subgrp][it] = locals()[it]
|
||||||
del ar
|
del ar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __repack(self):
|
|
||||||
"""Calls the h5repack routine, in order to reduce the file size of the hdf5 archive.
|
|
||||||
Should only be used BEFORE the first invokation of HDFArchive in the program, otherwise
|
|
||||||
the hdf5 linking is broken!!!"""
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
if not (mpi.is_master_node()): return
|
|
||||||
mpi.report("Repacking the file %s"%self.hdf_file)
|
|
||||||
|
|
||||||
return_code = subprocess.call(["h5repack", "-i %s"%self.hdf_file, "-o temphgfrt.h5"])
|
|
||||||
if (return_code != 0):
|
|
||||||
mpi.report("h5repack failed!")
|
|
||||||
else:
|
|
||||||
subprocess.call(["mv", "-f", "temphgfrt.h5", "%s"%self.hdf_file])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def inequiv_shells(self,lst):
|
|
||||||
"""
|
|
||||||
The number of inequivalent shells is calculated from lst, and a mapping is given as
|
|
||||||
map(i_corr_shells) = i_inequiv_corr_shells
|
|
||||||
invmap(i_inequiv_corr_shells) = i_corr_shells
|
|
||||||
in order to put the Self energies to all equivalent shells, and for extracting Gloc
|
|
||||||
"""
|
|
||||||
|
|
||||||
tmp = []
|
|
||||||
self.shellmap = [0 for i in range(len(lst))]
|
|
||||||
self.invshellmap = [0]
|
|
||||||
self.n_inequiv_corr_shells = 1
|
|
||||||
tmp.append( lst[0][1:3] )
|
|
||||||
|
|
||||||
if (len(lst)>1):
|
|
||||||
for i in range(len(lst)-1):
|
|
||||||
|
|
||||||
fnd = False
|
|
||||||
for j in range(self.n_inequiv_corr_shells):
|
|
||||||
if (tmp[j]==lst[i+1][1:3]):
|
|
||||||
fnd = True
|
|
||||||
self.shellmap[i+1] = j
|
|
||||||
if (fnd==False):
|
|
||||||
self.shellmap[i+1] = self.n_inequiv_corr_shells
|
|
||||||
self.n_inequiv_corr_shells += 1
|
|
||||||
tmp.append( lst[i+1][1:3] )
|
|
||||||
self.invshellmap.append(i+1)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user