PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/MnZrTe2/vdw-DF2-b86r/make_dos_files.py

https://gitlab.com/ppferreira/mzrte2
Python | 167 lines | 119 code | 43 blank | 5 comment | 24 complexity | 007cba65dd08bbc6187043d2e1828bf7 MD5 | raw file
  1. import numpy as np
  2. import os
  3. import glob
  4. import fermiEnergy
  5. class dos_files:
  6. def __init__(self, path_dos, prefix, atoms, orbitals = {'s':1,'p':3,'d':5,'f':7}):
  7. self.path_dos = path_dos
  8. self.prefix = prefix
  9. self.atoms = atoms
  10. self.orbitals = orbitals
  11. os.chdir(path_dos)
  12. self.atom_orbt = []
  13. self.files = []
  14. self.all_sumpdos = []
  15. for current_atom in self.atoms: #maps through the atoms
  16. for current_orbital in self.orbitals: #maps through the orbitals
  17. current_orbital_files = glob.glob(f'{prefix}*({current_atom})*({current_orbital})*')
  18. num_files = len(current_orbital_files) #number of files in current orbital
  19. self.atom_orbt.append([current_atom, current_orbital, num_files])
  20. self.files.append(current_orbital_files)
  21. self.all_sumpdos.append([])
  22. #print('-'*50)
  23. #print(current_orbital, current_orbital_files)
  24. if num_files: #if there are files in current orbital
  25. file_content = np.genfromtxt(current_orbital_files[0])
  26. lenthE = len(file_content)
  27. self.energy = file_content[:, 0] #file column 1
  28. sumpdos = np.zeros((orbitals[current_orbital], lenthE))
  29. for current_file in current_orbital_files:
  30. file_content = np.genfromtxt(current_file)
  31. #ldos = file_content[:, 1] #column 2
  32. pdos = [] #other columns
  33. for pdos_column in range(2,self.orbitals[current_orbital]+2):
  34. pdos.append(file_content[:, pdos_column])
  35. pdos = np.array(pdos)
  36. sumpdos += pdos
  37. self.all_sumpdos[-1] = sumpdos
  38. else:
  39. self.files[-1] = f'There are no files in {current_orbital} orbital'
  40. self.all_sumpdos[-1] = f'There are no files in {current_orbital} orbital'
  41. def return_values(self):
  42. return self.files, self.all_sumpdos
  43. def pdos_files(self):
  44. column_names = {'s':{0:'s', 1:'total'}, 'p':{0:'pz', 1:'px', 2:'py', 3:'total'}, 'd':{0:'dz2', 1:'dzx', 2:'dzy', 3:'dx2-y2', 4:'dxy', 5:'total'}, 'f':{0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:'total'}}
  45. for current_atom_orbt in self.atom_orbt:
  46. current_atom_orbt_index = self.atom_orbt.index(current_atom_orbt)
  47. current_sumpdos = self.all_sumpdos[current_atom_orbt_index]
  48. name = f'{current_atom_orbt[0]}_{current_atom_orbt[1]}'
  49. num_files = current_atom_orbt[2]
  50. current_columns_names = column_names[current_atom_orbt[1]]
  51. if num_files:
  52. with open(f'{name}.dos','w') as wrt_file: #open writable file
  53. wrt_file.write('#E ')
  54. for column in range(len(current_sumpdos)+1):
  55. wrt_file.write(f'{current_columns_names[column]} ')
  56. wrt_file.write('\n')
  57. for line in range(len(self.energy)): #maps through all values of energy
  58. pdos_totalsum = 0
  59. wrt_file.write(f'{self.energy[line]:.6f} ')
  60. for column in current_sumpdos: #maps trhough all columns of sumpdos
  61. current_value = column[line]
  62. wrt_file.write(f'{current_value:.6f} ')
  63. pdos_totalsum += current_value
  64. wrt_file.write(f'{pdos_totalsum:.6f}')
  65. wrt_file.write('\n')
  66. def pdos_graphs(self):
  67. pass
  68. #test area
  69. if __name__ == '__main__':
  70. dirs = glob.glob('S*')
  71. dirs = sorted(dirs)
  72. print(dirs)
  73. prefix = 'MnZrTe2'
  74. atoms = ['Zr','Te','Mn']
  75. orbitals = {'s':2,'p':4,'d':6}
  76. orbital_names = {'s':{0:'', 1:'_total'}, 'p':{0:'_pz', 1:'_px', 2:'_py', 3:'_total'}, 'd':{0:'_dz2', 1:'_dzx', 2:'_dzy', 3:'_dx2-y2', 4:'_dxy', 5:'_total'}, 'f':{0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:'total'}}
  77. with open('dos.dat','w') as arq:
  78. arq.write('#clusters ')
  79. for currentAtom in atoms:
  80. for currentOrbital in orbitals:
  81. currentOrbitalName = orbital_names[currentOrbital]
  82. for i in range(orbitals[currentOrbital]):
  83. arq.write(f'{currentAtom}_{currentOrbital}{currentOrbitalName[i]} ')
  84. arq.write('total\n')
  85. for currentDir in dirs:
  86. os.chdir(currentDir)
  87. clusters = glob.glob('MnZrTe2*')
  88. clusters = sorted(clusters)
  89. for currentCluster in clusters:
  90. print(currentCluster)
  91. arq.write(f'{currentCluster} ')
  92. os.chdir(currentCluster)
  93. print(os.getcwd())
  94. path = './'
  95. sistema = dos_files(path, prefix, atoms)
  96. #values = sistema.return_values()
  97. sistema.pdos_files() #save files
  98. Efermi = fermiEnergy.fermiEnergy(path, fileName='scf.out')
  99. print(Efermi)
  100. filesExtension='.dos'
  101. dosFiles, allDOS = fermiEnergy.calculateDosFermi(path, Efermi, filesExtension=filesExtension)
  102. print(dosFiles)
  103. print(allDOS)
  104. soma = 0
  105. for currentAtom in atoms:
  106. for currentOrbital in orbitals:
  107. try:
  108. currentFile = f'{currentAtom}_{currentOrbital}{filesExtension}'
  109. fileIndex = dosFiles.index(currentFile)
  110. dosCurrentFile = allDOS[fileIndex]
  111. for i in range(orbitals[currentOrbital]):
  112. if i!=orbitals[currentOrbital]-1:
  113. soma += dosCurrentFile[i]
  114. arq.write(f'{dosCurrentFile[i]:.5f} ')
  115. except:
  116. for i in range(orbitals[currentOrbital]):
  117. arq.write('0.00000 ')
  118. arq.write(f'{soma}')
  119. print(os.getcwd(), 'done')
  120. os.chdir('..')
  121. arq.write('\n')
  122. os.chdir('..')