diff --git a/python/build_sigma_from_txt.py b/python/build_sigma_from_txt.py new file mode 100644 index 00000000..8886d41a --- /dev/null +++ b/python/build_sigma_from_txt.py @@ -0,0 +1,92 @@ + # FIXME MOVE OUT OF HERE! THIS IS TEXT FILE READING! + def constr_Sigma_real_axis(self, filename, hdf=True, hdf_dataset='SigmaReFreq',n_om=0,orb=0, tol_mesh=1e-6): + """Uses Data from files to construct Sigma (or GF) on the real axis.""" + + if not hdf: # then read sigma from text files + + # first get the mesh out of any one of the files: + bl = self.gf_struct_solver[orb].items()[0][0] # block name + ol = self.gf_struct_solver[orb].items()[0][1] # list of orbital indices + if (len(ol)==1): # if blocks are of size one + Fname = filename+'_'+bl+'.dat' + else: + Fname = filename+'_'+bl+'/'+str(ol[0])+'_'+str(ol[0])+'.dat' + + R = read_fortran_file(Fname) + mesh = numpy.zeros([n_om],numpy.float_) + try: + for i in xrange(n_om): + mesh[i] = R.next() + sk = R.next() + sk = R.next() + + except StopIteration : # a more explicit error if the file is corrupted. + raise "SumkLDA.read_Sigma_ME : reading mesh failed!" + R.close() + + # check whether the mesh is uniform + bin = (mesh[n_om-1]-mesh[0])/(n_om-1) + for i in xrange(n_om): + assert abs(i*bin+mesh[0]-mesh[i]) < tol_mesh, 'constr_Sigma_ME: real-axis mesh is non-uniform!' + + # construct Sigma + a_list = [a for a,al in self.gf_struct_solver[orb].iteritems()] + glist = lambda : [ GfReFreq(indices = al, window=(mesh[0],mesh[n_om-1]),n_points=n_om) for a,al in self.gf_struct_solver[orb].iteritems()] + SigmaME = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + + #read Sigma + for i,g in SigmaME: + mesh=[w for w in g.mesh] + for iL in g.indices: + for iR in g.indices: + if (len(g.indices) == 1): + Fname = filename+'_%s'%(i)+'.dat' + else: + Fname = 'SigmaME_'+'%s'%(i)+'_%s'%(iL)+'_%s'%(iR)+'.dat' + R = read_fortran_file(Fname) + try: + for iom in xrange(n_om): + sk = R.next() + rsig = R.next() + isig = R.next() + g.data[iom,iL,iR]=rsig+1j*isig + except StopIteration : # a more explicit error if the file is corrupted. + raise "SumkLDA.read_Sigma_ME : reading Sigma from file failed!" + R.close() + + + else: # read sigma from hdf + + omega_min=0.0 + omega_max=0.0 + n_om=0 + if (mpi.is_master_node()): + ar = HDFArchive(filename) + SigmaME = ar[hdf_dataset] + del ar + + #OTHER SOLUTION FIXME + #else: + # SigmaME=0 + #SigmaME = mpi.broadcast.. + + # we need some parameters to construct Sigma on other nodes + omega_min=SigmaME.mesh.omega_min + omega_max=SigmaME.mesh.omega_max + n_om=len(SigmaME.mesh) + omega_min=mpi.bcast(omega_min) + omega_max=mpi.bcast(omega_max) + n_om=mpi.bcast(n_om) + mpi.barrier() + # construct Sigma on other nodes + if (not mpi.is_master_node()): + a_list = [a for a,al in self.gf_struct_solver[orb].iteritems()] + glist = lambda : [ GfReFreq(indices = al, window=(omega_min,omega_max),n_points=n_om) for a,al in self.gf_struct_solver[orb].iteritems()] + SigmaME = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + # pass SigmaME to other nodes + SigmaME = mpi.bcast(SigmaME) + mpi.barrier() + + SigmaME.note='ReFreq' + + return SigmaME diff --git a/python/sumk_lda_tools.py b/python/sumk_lda_tools.py index c449ca69..af01e53d 100644 --- a/python/sumk_lda_tools.py +++ b/python/sumk_lda_tools.py @@ -508,100 +508,6 @@ class SumkLDATools(SumkLDA): f.close() - # FIXME MOVE OUT OF HERE! THIS IS TEXT FILE READING! - def constr_Sigma_real_axis(self, filename, hdf=True, hdf_dataset='SigmaReFreq',n_om=0,orb=0, tol_mesh=1e-6): - """Uses Data from files to construct Sigma (or GF) on the real axis.""" - - if not hdf: # then read sigma from text files - - # first get the mesh out of any one of the files: - bl = self.gf_struct_solver[orb].items()[0][0] # block name - ol = self.gf_struct_solver[orb].items()[0][1] # list of orbital indices - if (len(ol)==1): # if blocks are of size one - Fname = filename+'_'+bl+'.dat' - else: - Fname = filename+'_'+bl+'/'+str(ol[0])+'_'+str(ol[0])+'.dat' - - R = read_fortran_file(Fname) - mesh = numpy.zeros([n_om],numpy.float_) - try: - for i in xrange(n_om): - mesh[i] = R.next() - sk = R.next() - sk = R.next() - - except StopIteration : # a more explicit error if the file is corrupted. - raise "SumkLDA.read_Sigma_ME : reading mesh failed!" - R.close() - - # check whether the mesh is uniform - bin = (mesh[n_om-1]-mesh[0])/(n_om-1) - for i in xrange(n_om): - assert abs(i*bin+mesh[0]-mesh[i]) < tol_mesh, 'constr_Sigma_ME: real-axis mesh is non-uniform!' - - # construct Sigma - a_list = [a for a,al in self.gf_struct_solver[orb].iteritems()] - glist = lambda : [ GfReFreq(indices = al, window=(mesh[0],mesh[n_om-1]),n_points=n_om) for a,al in self.gf_struct_solver[orb].iteritems()] - SigmaME = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) - - #read Sigma - for i,g in SigmaME: - mesh=[w for w in g.mesh] - for iL in g.indices: - for iR in g.indices: - if (len(g.indices) == 1): - Fname = filename+'_%s'%(i)+'.dat' - else: - Fname = 'SigmaME_'+'%s'%(i)+'_%s'%(iL)+'_%s'%(iR)+'.dat' - R = read_fortran_file(Fname) - try: - for iom in xrange(n_om): - sk = R.next() - rsig = R.next() - isig = R.next() - g.data[iom,iL,iR]=rsig+1j*isig - except StopIteration : # a more explicit error if the file is corrupted. - raise "SumkLDA.read_Sigma_ME : reading Sigma from file failed!" - R.close() - - - else: # read sigma from hdf - - omega_min=0.0 - omega_max=0.0 - n_om=0 - if (mpi.is_master_node()): - ar = HDFArchive(filename) - SigmaME = ar[hdf_dataset] - del ar - - #OTHER SOLUTION FIXME - #else: - # SigmaME=0 - #SigmaME = mpi.broadcast.. - - # we need some parameters to construct Sigma on other nodes - omega_min=SigmaME.mesh.omega_min - omega_max=SigmaME.mesh.omega_max - n_om=len(SigmaME.mesh) - omega_min=mpi.bcast(omega_min) - omega_max=mpi.bcast(omega_max) - n_om=mpi.bcast(n_om) - mpi.barrier() - # construct Sigma on other nodes - if (not mpi.is_master_node()): - a_list = [a for a,al in self.gf_struct_solver[orb].iteritems()] - glist = lambda : [ GfReFreq(indices = al, window=(omega_min,omega_max),n_points=n_om) for a,al in self.gf_struct_solver[orb].iteritems()] - SigmaME = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) - # pass SigmaME to other nodes - SigmaME = mpi.bcast(SigmaME) - mpi.barrier() - - SigmaME.note='ReFreq' - - return SigmaME - - def partial_charges(self,beta=40): """Calculates the orbitally-resolved density matrix for all the orbitals considered in the input.