Source code for pynao.m_openmx_import_scfout


from __future__ import print_function, division
import numpy as np
from ctypes import c_char, c_int, sizeof, c_double

# Maybe even not necessary after all...
#from pyscf.lib import misc
#libopenmx = misc.load_library("libopenmx")
#libopenmx.openmx_unpack.argtypes = (c_int, c_char_p[])

#
#
#
[docs]def openmx_import_scfout(self, **kw): """ Calls libopenmx to get the data and interpret it then """ import struct from pynao.m_openmx_mat import openmx_mat_c #label, cd self.label = label = kw['openmx'] if 'openmx' in kw else 'openmx' self.cd = cd = kw['cd'] if 'cd' in kw else '.' fname = cd+'/'+label+'.scfout' with open(fname, mode='rb') as f: # b is important -> binary header = f.read(6*sizeof(c_int)) (natoms,SpinP_switch,Catomnum,Latomnum,Ratomnum,TCpyCell) = struct.unpack("@6i", header) assert natoms>0 assert SpinP_switch>-1 #print(natoms,SpinP_switch,Catomnum,Latomnum,Ratomnum,TCpyCell) atv = np.fromfile(f, count=(TCpyCell+1)*4).reshape((TCpyCell+1,4)) #print(atv) atv_ijk = np.fromfile(f, count=(TCpyCell+1)*4, dtype=c_int).reshape((TCpyCell+1,4)) #print(atv_ijk) Total_NumOrbs = np.ones(natoms+1, dtype=c_int) Total_NumOrbs[1:] = np.fromfile(f, count=natoms, dtype=c_int) #print('Total_NumOrbs') #print(Total_NumOrbs) FNAN = np.zeros(natoms+1, dtype=c_int) FNAN[1:] = np.fromfile(f, count=natoms, dtype=c_int) #print('FNAN') #print(FNAN, max(FNAN)) natn = np.zeros((natoms+1,max(FNAN)+1), dtype=c_int) ncn = np.zeros((natoms+1,max(FNAN)+1), dtype=c_int) for iatom,count in enumerate(FNAN[1:]): natn[iatom+1,:] = np.fromfile(f, count=count+1, dtype=c_int) for iatom,count in enumerate(FNAN[1:]): ncn[iatom+1,:] = np.fromfile(f, count=count+1, dtype=c_int) #print('natn ') #print(natn) #print('ncn ') #print(ncn) tv = np.zeros((4,4)) for i in range(3): tv[i+1,:] = np.fromfile(f, count=4) rtv = np.zeros((4,4)) for i in range(3): rtv[i+1,:] = np.fromfile(f, count=4) #print('tv ', tv) #print('rtv ', rtv) Gxyz = np.fromfile(f, count=natoms*4).reshape((natoms,4)) #print('Gxyz ') #print(Gxyz) omm = openmx_mat_c(natoms, Total_NumOrbs, FNAN, natn) Hks = np.zeros([SpinP_switch+1]+omm.get_dims()) for spin in range(SpinP_switch+1): omm.fromfile(f, out=Hks[spin]) if SpinP_switch==3: iHks = np.zeros([3]+omm.get_dims()) for spin in range(3): omm.fromfile(f, out=iHks[spin]) OLP = omm.fromfile(f) OLPx = omm.fromfile(f) OLPy = omm.fromfile(f) OLPz = omm.fromfile(f) DM = np.zeros([SpinP_switch+1]+omm.get_dims()) for spin in range(SpinP_switch+1): omm.fromfile(f,out=DM[spin]) solver = struct.unpack("@i", f.read(1*sizeof(c_int)))[0] dipole_moment_core = np.zeros(3) dipole_moment_background = np.zeros(3) ChemP,E_Temp,\ dipole_moment_core[0],dipole_moment_core[1],dipole_moment_core[2],\ dipole_moment_background[0],dipole_moment_background[1],dipole_moment_background[2],\ Valence_Electrons,Total_SpinS = struct.unpack("@10d", f.read(10*sizeof(c_double))) #print(solver) #print(ChemP,E_Temp) #print(dipole_moment_core) #print(dipole_moment_background) #print(Valence_Electrons) #print(Total_SpinS) nlines_input = struct.unpack("@i", f.read(1*sizeof(c_int)))[0] input_file = [] for line in range(nlines_input): input_file.append(str(struct.unpack("@256s", f.read(256*sizeof(c_char)))[0])) self.natm=self.natoms=natoms self.nspin = SpinP_switch+1 self.ucell = tv[1:4,1:4] self.atom2coord = Gxyz[:,0:3] self.atom2s = np.zeros((self.natm+1), dtype=np.int) for atom,norb in enumerate(Total_NumOrbs[1:]): self.atom2s[atom+1]=self.atom2s[atom]+norb self.norbs = self.atom2s[-1] self.nkpoints = 1 #print(self.atom2s) #print(self.norbs) #print(self.nspin) return self