TB2J 0.9.9rc18__tar.gz → 0.9.9rc20__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. tb2j-0.9.9rc20/.github/workflows/pylint.yml.bak +23 -0
  2. tb2j-0.9.9rc20/.github/workflows/python-app.yml +44 -0
  3. tb2j-0.9.9rc20/.gitignore +131 -0
  4. tb2j-0.9.9rc20/.pre-commit-config.yaml +11 -0
  5. tb2j-0.9.9rc20/.readthedocs.yml +28 -0
  6. tb2j-0.9.9rc20/.ruff.toml +78 -0
  7. tb2j-0.9.9rc20/.travis.yml +33 -0
  8. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/PKG-INFO +1 -1
  9. tb2j-0.9.9rc20/TB2J/.gitignore +5 -0
  10. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/Jdownfolder.py +3 -2
  11. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/MAEGreen.py +12 -14
  12. tb2j-0.9.9rc20/TB2J/downfold/Hdownfolder.py +233 -0
  13. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/exchange_params.py +1 -2
  14. tb2j-0.9.9rc20/TB2J/interfaces/abacus/.gitignore +2 -0
  15. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/siesta_interface.py +14 -10
  16. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_exchange.py +40 -12
  17. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/magnon/io_exchange2.py +10 -3
  18. tb2j-0.9.9rc20/TB2J/magnon/magnon3.py +204 -0
  19. tb2j-0.9.9rc18/TB2J/mathutils/magnons.py → tb2j-0.9.9rc20/TB2J/magnon/magnon_math.py +8 -0
  20. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/__init__.py +2 -1
  21. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J.egg-info/PKG-INFO +1 -1
  22. tb2j-0.9.9rc20/TB2J.egg-info/SOURCES.txt +224 -0
  23. tb2j-0.9.9rc20/buildimage.sh +51 -0
  24. tb2j-0.9.9rc20/docs/Makefile +20 -0
  25. tb2j-0.9.9rc20/docs/_static/Logo-ULG.png +0 -0
  26. tb2j-0.9.9rc20/docs/_static/logo_TB2J_horizon.png +0 -0
  27. tb2j-0.9.9rc20/docs/conf.py +67 -0
  28. tb2j-0.9.9rc20/docs/index.rst +44 -0
  29. tb2j-0.9.9rc20/docs/make.bat +35 -0
  30. tb2j-0.9.9rc20/docs/requirements.txt +3 -0
  31. tb2j-0.9.9rc20/docs/src/BFOvarT.png +0 -0
  32. tb2j-0.9.9rc20/docs/src/Contributors.rst +44 -0
  33. tb2j-0.9.9rc20/docs/src/ReleaseNotes.md +226 -0
  34. tb2j-0.9.9rc20/docs/src/SrMnO3_DOS.png +0 -0
  35. tb2j-0.9.9rc20/docs/src/abacus.md +103 -0
  36. tb2j-0.9.9rc20/docs/src/applications.rst +9 -0
  37. tb2j-0.9.9rc20/docs/src/convention.rst +18 -0
  38. tb2j-0.9.9rc20/docs/src/development.md +22 -0
  39. tb2j-0.9.9rc20/docs/src/downfold.md +28 -0
  40. tb2j-0.9.9rc20/docs/src/ecosystem.md +49 -0
  41. tb2j-0.9.9rc20/docs/src/eigen.rst +34 -0
  42. tb2j-0.9.9rc20/docs/src/extend.rst +45 -0
  43. tb2j-0.9.9rc20/docs/src/faq.rst +79 -0
  44. tb2j-0.9.9rc20/docs/src/install.rst +86 -0
  45. tb2j-0.9.9rc20/docs/src/mae.md +127 -0
  46. tb2j-0.9.9rc20/docs/src/magnon_band.assets/exchange_magnon-1593690872101.png +0 -0
  47. tb2j-0.9.9rc20/docs/src/magnon_band.assets/exchange_magnon.png +0 -0
  48. tb2j-0.9.9rc20/docs/src/magnon_band.assets/magnon_dos.png +0 -0
  49. tb2j-0.9.9rc20/docs/src/magnon_band.rst +98 -0
  50. tb2j-0.9.9rc20/docs/src/multibinit.rst +89 -0
  51. tb2j-0.9.9rc20/docs/src/openmx.rst +27 -0
  52. tb2j-0.9.9rc20/docs/src/orbital_contribution.md +80 -0
  53. tb2j-0.9.9rc20/docs/src/output.rst +52 -0
  54. tb2j-0.9.9rc20/docs/src/parameters.rst +89 -0
  55. tb2j-0.9.9rc20/docs/src/references.rst +36 -0
  56. tb2j-0.9.9rc20/docs/src/roadmap.md +8 -0
  57. tb2j-0.9.9rc20/docs/src/rotate_and_merge.rst +54 -0
  58. tb2j-0.9.9rc20/docs/src/siesta.rst +38 -0
  59. tb2j-0.9.9rc20/docs/src/spin_model_assets/canting_DMI.png +0 -0
  60. tb2j-0.9.9rc20/docs/src/spin_model_assets/tmulti5_2.png +0 -0
  61. tb2j-0.9.9rc20/docs/src/symmetry.md +42 -0
  62. tb2j-0.9.9rc20/docs/src/tutorial.rst +18 -0
  63. tb2j-0.9.9rc20/docs/src/wannier.rst +228 -0
  64. tb2j-0.9.9rc20/examples/Siesta/BccFe/Fe.1.psml +1181 -0
  65. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/EigenJq.txt +119 -0
  66. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange.xml +4126 -0
  67. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange_kpth.txt +8 -0
  68. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange_magnon.png +0 -0
  69. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon.py +3 -0
  70. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_band.json +3332 -0
  71. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_band.pdf +0 -0
  72. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_dos.png +0 -0
  73. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_dos.txt +302 -0
  74. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/mb.files +3 -0
  75. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/mb.in +33 -0
  76. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/plot.sh +1 -0
  77. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/plot_magnon_dos.sh +1 -0
  78. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/Multibinit/plot_magnon_from_json_file.py +73 -0
  79. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/TB2J.pickle +0 -0
  80. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/TomASD/exchange.exch +1381 -0
  81. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/TomASD/exchange.ucf +3 -0
  82. tb2j-0.9.9rc20/examples/Siesta/BccFe/TB2J_results/exchange.out +3097 -0
  83. tb2j-0.9.9rc20/examples/Siesta/BccFe/getJ.sh +2 -0
  84. tb2j-0.9.9rc20/examples/Siesta/BccFe/run.sh +3 -0
  85. tb2j-0.9.9rc20/examples/Siesta/BccFe/siesta.fdf +61 -0
  86. tb2j-0.9.9rc20/examples/Siesta/HcpCo/Co.1.psml +3174 -0
  87. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Multibinit/exchange.xml +7610 -0
  88. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Multibinit/mb.files +3 -0
  89. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Multibinit/mb.in +33 -0
  90. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/TB2J.pickle +0 -0
  91. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/TomASD/exchange.exch +2556 -0
  92. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/TomASD/exchange.ucf +4 -0
  93. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Vampire/input +42 -0
  94. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Vampire/vampire.UCF +644 -0
  95. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/Vampire/vampire.mat +24 -0
  96. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/exchange.out +5708 -0
  97. tb2j-0.9.9rc20/examples/Siesta/HcpCo/TB2J_results/summary.txt +10 -0
  98. tb2j-0.9.9rc20/examples/Siesta/HcpCo/getJ.sh +1 -0
  99. tb2j-0.9.9rc20/examples/Siesta/HcpCo/run.sh +3 -0
  100. tb2j-0.9.9rc20/examples/Siesta/HcpCo/siesta.fdf +63 -0
  101. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/JvsR.pdf +0 -0
  102. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/exchange.xml +533 -0
  103. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/mb.files +3 -0
  104. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/mb.in +33 -0
  105. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/TB2J.pickle +0 -0
  106. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/TomASD/exchange.exch +509 -0
  107. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/TomASD/exchange.ucf +3 -0
  108. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/input +42 -0
  109. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/vampire.UCF +135 -0
  110. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/vampire.mat +13 -0
  111. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/assigned_basis.txt +14 -0
  112. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/exchange.out +406 -0
  113. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/TB2J_results/exchange_orb_decomposition.out +1274 -0
  114. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinit.files +8 -0
  115. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinit.in +83 -0
  116. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_down.win +113 -0
  117. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_down_centres.xyz +21 -0
  118. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_down_hr.dat +24512 -0
  119. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_up.win +113 -0
  120. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_up_centres.xyz +21 -0
  121. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/abinito_w90_up_hr.dat +24512 -0
  122. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/get_J.sh +1 -0
  123. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/psp/Mn.GGA-PBESOL-JTH.xml +16818 -0
  124. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/psp/O.GGA-PBESOL-JTH.xml +12782 -0
  125. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/psp/Sr.GGA-PBESOL-JTH.xml +12646 -0
  126. tb2j-0.9.9rc20/examples/abinit-w90/SrMnO3/run.sh +6 -0
  127. tb2j-0.9.9rc20/requirements.txt +11 -0
  128. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_magnon2.py +1 -0
  129. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/abacus2J.py +1 -1
  130. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/setup.py +1 -1
  131. tb2j-0.9.9rc20/upload_to_pip.sh +5 -0
  132. tb2j-0.9.9rc18/TB2J.egg-info/SOURCES.txt +0 -107
  133. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/LICENSE +0 -0
  134. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/README.md +0 -0
  135. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/Jtensor.py +0 -0
  136. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/MAE.py +0 -0
  137. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/Oiju.py +0 -0
  138. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/Oiju_epc.py +0 -0
  139. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/__init__.py +0 -0
  140. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/anisotropy.py +0 -0
  141. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/basis.py +0 -0
  142. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/citation.py +0 -0
  143. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/contour.py +0 -0
  144. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/density_matrix.py +0 -0
  145. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/epc.py +0 -0
  146. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/exchange.py +0 -0
  147. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/exchangeCL2.py +0 -0
  148. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/exchange_pert.py +0 -0
  149. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/exchange_qspace.py +0 -0
  150. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/external/__init__.py +0 -0
  151. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/external/p_tqdm.py +0 -0
  152. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/gpaw_wrapper.py +0 -0
  153. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/green.py +0 -0
  154. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/greentest.py +0 -0
  155. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/__init__.py +0 -0
  156. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/__init__.py +0 -0
  157. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/abacus_api.py +0 -0
  158. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/abacus_wrapper.py +0 -0
  159. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/gen_exchange_abacus.py +0 -0
  160. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/orbital_api.py +0 -0
  161. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/stru_api.py +0 -0
  162. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/test_density_matrix.py +0 -0
  163. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/test_read_HRSR.py +0 -0
  164. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/abacus/test_read_stru.py +0 -0
  165. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/gpaw_interface.py +0 -0
  166. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/lawaf_interface.py +0 -0
  167. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/manager.py +0 -0
  168. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/interfaces/wannier90_interface.py +0 -0
  169. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/__init__.py +0 -0
  170. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_multibinit.py +0 -0
  171. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_tomsasd.py +0 -0
  172. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_txt.py +0 -0
  173. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_uppasd.py +0 -0
  174. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_exchange/io_vampire.py +0 -0
  175. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/io_merge.py +0 -0
  176. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/kpoints.py +0 -0
  177. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/magnon/__init__.py +0 -0
  178. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/magnon/plot.py +0 -0
  179. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/magnon/structure.py +0 -0
  180. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/fermi.py +0 -0
  181. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/fibonacci_sphere.py +0 -0
  182. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/kR_convert.py +0 -0
  183. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/lowdin.py +0 -0
  184. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mathutils/rotate_spin.py +0 -0
  185. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/myTB.py +0 -0
  186. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/mycfr.py +0 -0
  187. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/orbital_magmom.py +0 -0
  188. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/orbmap.py +0 -0
  189. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/pauli.py +0 -0
  190. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/pert.py +0 -0
  191. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/plot.py +0 -0
  192. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/rotate_atoms.py +0 -0
  193. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/rotate_siestaDM.py +0 -0
  194. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/sisl_wrapper.py +0 -0
  195. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/__init__.py +0 -0
  196. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/base_parser.py +0 -0
  197. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/constants.py +0 -0
  198. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/hamiltonian.py +0 -0
  199. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/hamiltonian_terms.py +0 -0
  200. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/plot.py +0 -0
  201. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/qsolver.py +0 -0
  202. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/spin_api.py +0 -0
  203. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/spin_xml.py +0 -0
  204. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/spinham/supercell.py +0 -0
  205. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/symmetrize_J.py +0 -0
  206. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/tensor_rotate.py +0 -0
  207. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/thetaphi.py +0 -0
  208. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/utest.py +0 -0
  209. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/utils.py +0 -0
  210. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/versioninfo.py +0 -0
  211. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/wannier/__init__.py +0 -0
  212. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/wannier/w90_parser.py +0 -0
  213. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J/wannier/w90_tb_parser.py +0 -0
  214. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J.egg-info/dependency_links.txt +0 -0
  215. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J.egg-info/entry_points.txt +0 -0
  216. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J.egg-info/requires.txt +0 -0
  217. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/TB2J.egg-info/top_level.txt +0 -0
  218. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_downfold.py +0 -0
  219. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_eigen.py +0 -0
  220. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_magnon.py +0 -0
  221. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_magnon_dos.py +0 -0
  222. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_merge.py +0 -0
  223. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_rotate.py +0 -0
  224. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/TB2J_rotateDM.py +0 -0
  225. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/siesta2J.py +0 -0
  226. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/scripts/wann2J.py +0 -0
  227. {tb2j-0.9.9rc18 → tb2j-0.9.9rc20}/setup.cfg +0 -0
@@ -0,0 +1,23 @@
1
+ name: Pylint
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ matrix:
10
+ python-version: ["3.8", "3.9", "3.10"]
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ - name: Set up Python ${{ matrix.python-version }}
14
+ uses: actions/setup-python@v3
15
+ with:
16
+ python-version: ${{ matrix.python-version }}
17
+ - name: Install dependencies
18
+ run: |
19
+ python -m pip install --upgrade pip
20
+ pip install pylint
21
+ - name: Analysing the code with pylint
22
+ run: |
23
+ pylint $(git ls-files '*.py')
@@ -0,0 +1,44 @@
1
+ # This workflow will install Python dependencies, run tests and lint with a single version of Python
2
+ # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
3
+
4
+ name: Python application
5
+
6
+ on:
7
+ push:
8
+ branches: [ "master" ]
9
+ pull_request:
10
+ branches: [ "master" ]
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - name: Set up Python 3.10
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.10"
24
+ - name: Install dependencies
25
+ run: |
26
+ python -m pip install --upgrade pip
27
+ pip install flake8 pytest
28
+ if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
29
+ - name: Lint with flake8
30
+ run: |
31
+ # stop the build if there are Python syntax errors or undefined names
32
+ flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
33
+ # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
34
+ flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
35
+ - name: Test with pytest
36
+ run: |
37
+ #pytest
38
+ # - pwd
39
+ python -m pip install .
40
+ cd examples/abinit-w90/SrMnO3
41
+ ls -lah
42
+ sh get_J.sh
43
+ cd TB2J_results/Multibinit
44
+ TB2J_magnon.py --figfname magnon.png
@@ -0,0 +1,131 @@
1
+ doc/refs/*.pdf
2
+
3
+
4
+ *.swp
5
+
6
+ # Latex
7
+ *.aux
8
+
9
+ # xyz files
10
+
11
+ .DS_Store
12
+
13
+ # Byte-compiled / optimized / DLL files
14
+ __pycache__/
15
+ *.py[cod]
16
+ *$py.class
17
+
18
+ # numpy results
19
+ *.npy
20
+
21
+ # png files
22
+
23
+ # C extensions
24
+ *.so
25
+ *.a
26
+
27
+ # Fortran extensions
28
+ *.fpp
29
+ *.mod
30
+ *.o
31
+
32
+ # F90wrap files
33
+ *.plist
34
+
35
+ # Distribution / packaging
36
+ .Python
37
+ env/
38
+ build/
39
+ develop-eggs/
40
+ dist/
41
+ downloads/
42
+ eggs/
43
+ .eggs/
44
+ lib/
45
+ lib64/
46
+ parts/
47
+ sdist/
48
+ var/
49
+ wheels/
50
+ *.egg-info/
51
+ *.egg-info/*
52
+ .installed.cfg
53
+ *.egg
54
+
55
+ # temporary files
56
+ temp/
57
+
58
+ # PyInstaller
59
+ # Usually these files are written by a python script from a template
60
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
61
+ *.manifest
62
+ *.spec
63
+
64
+ # Installer logs
65
+ pip-log.txt
66
+ pip-delete-this-directory.txt
67
+
68
+ # Unit test / coverage reports
69
+ htmlcov/
70
+ .tox/
71
+ .coverage
72
+ .coverage.*
73
+ .cache
74
+ nosetests.xml
75
+ coverage.xml
76
+ *.cover
77
+ .hypothesis/
78
+
79
+ # Translations
80
+ *.mo
81
+ *.pot
82
+
83
+ # Django stuff:
84
+ *.log
85
+ local_settings.py
86
+
87
+ # Flask stuff:
88
+ instance/
89
+ .webassets-cache
90
+
91
+ # Scrapy stuff:
92
+ .scrapy
93
+
94
+ # Sphinx documentation
95
+ docs/_build/
96
+
97
+ # PyBuilder
98
+ target/
99
+
100
+ # Jupyter Notebook
101
+ .ipynb_checkpoints
102
+
103
+ # pyenv
104
+ .python-version
105
+
106
+ # celery beat schedule file
107
+ celerybeat-schedule
108
+
109
+ # SageMath parsed files
110
+ *.sage.py
111
+
112
+ # dotenv
113
+ .env
114
+
115
+ # virtualenv
116
+ .venv
117
+ venv/
118
+ ENV/
119
+
120
+ # Spyder project settings
121
+ .spyderproject
122
+ .spyproject
123
+
124
+ # Rope project settings
125
+ .ropeproject
126
+
127
+ # mkdocs documentation
128
+ /site
129
+
130
+ # mypy
131
+ .mypy_cache/
@@ -0,0 +1,11 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ # Ruff version.
4
+ rev: v0.3.5
5
+ hooks:
6
+ # Run the linter.
7
+ - id: ruff
8
+ # --select I sorts imports
9
+ args: [ --fix, --extend-select, I ]
10
+ # Run the formatter.
11
+ - id: ruff-format
@@ -0,0 +1,28 @@
1
+ # .readthedocs.yml
2
+ # Read the Docs configuration file
3
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4
+
5
+ # Required
6
+ version: 2
7
+ build:
8
+ os: "ubuntu-22.04"
9
+ tools:
10
+ python: "3.11"
11
+
12
+ # Build documentation in the docs/ directory with Sphinx
13
+ sphinx:
14
+ configuration: docs/conf.py
15
+
16
+ # Build documentation with MkDocs
17
+ #mkdocs:
18
+ # configuration: mkdocs.yml
19
+
20
+ # Optionally build your docs in additional formats such as PDF
21
+ formats:
22
+ - pdf
23
+
24
+ # Optionally set the version of Python and requirements required to build your docs
25
+ python:
26
+ install:
27
+ - requirements: requirements.txt
28
+ - requirements: docs/requirements.txt
@@ -0,0 +1,78 @@
1
+ # Exclude a variety of commonly ignored directories.
2
+ exclude = [
3
+ ".bzr",
4
+ ".direnv",
5
+ ".eggs",
6
+ ".git",
7
+ ".git-rewrite",
8
+ ".hg",
9
+ ".ipynb_checkpoints",
10
+ ".mypy_cache",
11
+ ".nox",
12
+ ".pants.d",
13
+ ".pyenv",
14
+ ".pytest_cache",
15
+ ".pytype",
16
+ ".ruff_cache",
17
+ ".svn",
18
+ ".tox",
19
+ ".venv",
20
+ ".vscode",
21
+ "__pypackages__",
22
+ "_build",
23
+ "buck-out",
24
+ "build",
25
+ "dist",
26
+ "node_modules",
27
+ "site-packages",
28
+ "venv",
29
+ ]
30
+
31
+ # Same as Black.
32
+ line-length = 88
33
+ indent-width = 4
34
+
35
+ # Assume Python 3.8
36
+ target-version = "py38"
37
+
38
+ [lint]
39
+ # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
40
+ # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
41
+ # McCabe complexity (`C901`) by default.
42
+ select = ["E4", "E7", "E9", "F"]
43
+ ignore = ["E741"]
44
+
45
+ # Allow fix for all enabled rules (when `--fix`) is provided.
46
+ fixable = ["ALL"]
47
+ unfixable = []
48
+
49
+ # Allow unused variables when underscore-prefixed.
50
+ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
51
+
52
+ [format]
53
+ # Like Black, use double quotes for strings.
54
+ quote-style = "double"
55
+
56
+ # Like Black, indent with spaces, rather than tabs.
57
+ indent-style = "space"
58
+
59
+ # Like Black, respect magic trailing commas.
60
+ skip-magic-trailing-comma = false
61
+
62
+ # Like Black, automatically detect the appropriate line ending.
63
+ line-ending = "auto"
64
+
65
+ # Enable auto-formatting of code examples in docstrings. Markdown,
66
+ # reStructuredText code/literal blocks and doctests are all supported.
67
+ #
68
+ # This is currently disabled by default, but it is planned for this
69
+ # to be opt-out in the future.
70
+ docstring-code-format = false
71
+
72
+ # Set the line length limit used when formatting code snippets in
73
+ # docstrings.
74
+ #
75
+ # This only has an effect when the `docstring-code-format` setting is
76
+ # enabled.
77
+ docstring-code-line-length = "dynamic"
78
+
@@ -0,0 +1,33 @@
1
+ language: python
2
+ python:
3
+ - "3.7"
4
+ - "3.8"
5
+ - "3.9"
6
+ - "3.10"
7
+ - "3.11"
8
+ cache: pip
9
+
10
+ addons:
11
+ apt:
12
+ packages: &common_packages
13
+ - gfortran
14
+ - libatlas-base-dev
15
+ - liblapack-dev
16
+ - libnetcdf-dev
17
+ - libnetcdff-dev
18
+ - eatmydata
19
+ - ccache
20
+ before_install:
21
+ - if [[ $TRAVIS_PYTHON_VERSION == 3.7 ]]; then pip install -U importlib_metadata; fi
22
+
23
+ install:
24
+ - pip install -r requirements.txt
25
+ - pip install sisl
26
+ - pip install -e .
27
+ script:
28
+ - pwd
29
+ - cd examples/abinit-w90/SrMnO3
30
+ - ls -lah
31
+ - sh get_J.sh
32
+ - cd TB2J_results/Multibinit
33
+ - TB2J_magnon.py --figfname magnon.png
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TB2J
3
- Version: 0.9.9rc18
3
+ Version: 0.9.9rc20
4
4
  Summary: TB2J: First principle to Heisenberg exchange J using tight-binding Green function method
5
5
  Author: Xu He
6
6
  Author-email: mailhexu@gmail.com
@@ -0,0 +1,5 @@
1
+ *.o
2
+ *.x
3
+ *.mod
4
+ exchanges.sublime-project
5
+ exchanges.sublime-workspace
@@ -136,7 +136,7 @@ class JDownfolder_pickle:
136
136
  outpath,
137
137
  qmesh=[7, 7, 7],
138
138
  iso_only=False,
139
- method="pwf",
139
+ method="lowdin",
140
140
  **kwargs,
141
141
  ):
142
142
  self.exc = SpinIO.load_pickle(path=inpath, fname="TB2J.pickle")
@@ -146,6 +146,7 @@ class JDownfolder_pickle:
146
146
  self.ligands = ligands
147
147
  self.outpath = outpath
148
148
  self.method = method
149
+ print("Using method:", self.method)
149
150
 
150
151
  # read atomic structure
151
152
  self.atoms = self.exc.atoms
@@ -176,7 +177,7 @@ class JDownfolder_pickle:
176
177
 
177
178
  def _downfold(self, **kwargs):
178
179
  JR2 = self.exc.get_full_Jtensor_for_Rlist(asr=True)
179
- if self.method == "lowdin":
180
+ if self.method.lower() == "lowdin":
180
181
  d = JDownfolder(
181
182
  JR2,
182
183
  self.exc.Rlist,
@@ -1,7 +1,6 @@
1
1
  import gc
2
2
  from pathlib import Path
3
3
 
4
- import matplotlib.pyplot as plt
5
4
  import numpy as np
6
5
  import tqdm
7
6
  from HamiltonIO.abacus.abacus_wrapper import AbacusSplitSOCParser
@@ -55,9 +54,8 @@ class MAEGreen(ExchangeNCL):
55
54
 
56
55
  def set_angles_xyz(self):
57
56
  """theta and phi are defined as the x, y, z, xy, yz, xz, xyz, x-yz, -xyz, -x-yz axis."""
58
- self.thetas = [ np.pi / 2, np.pi / 2, 0.0]
59
- self.phis = [ np.pi / 2, 0, 0.0]
60
-
57
+ self.thetas = [np.pi / 2, np.pi / 2, 0.0]
58
+ self.phis = [np.pi / 2, 0, 0.0]
61
59
 
62
60
  def set_angles_axis(self):
63
61
  """theta and phi are defined as the x, y, z, xy, yz, xz, xyz, x-yz, -xyz, -x-yz axis."""
@@ -255,11 +253,11 @@ class MAEGreen(ExchangeNCL):
255
253
  Path(output_path).mkdir(exist_ok=True)
256
254
  fname = f"{output_path}/MAE.dat"
257
255
  fname_orb = f"{output_path}/MAE_orb.dat"
258
- fname_tensor = f"{output_path}/MAE_tensor.dat"
259
- if figure3d is not None:
260
- fname_fig3d = f"{output_path}/{figure3d}"
261
- if figure_contourf is not None:
262
- fname_figcontourf = f"{output_path}/{figure_contourf}"
256
+ # fname_tensor = f"{output_path}/MAE_tensor.dat"
257
+ # if figure3d is not None:
258
+ # fname_fig3d = f"{output_path}/{figure3d}"
259
+ # if figure_contourf is not None:
260
+ # fname_figcontourf = f"{output_path}/{figure_contourf}"
263
261
 
264
262
  # ouput with eigenvalues.
265
263
  if with_eigen:
@@ -284,18 +282,18 @@ class MAEGreen(ExchangeNCL):
284
282
  f.write(f"{ea*1e3:.8f} ")
285
283
  f.write("\n")
286
284
 
287
- #self.ani = self.fit_anisotropy_tensor()
288
- #with open(fname_tensor, "w") as f:
285
+ # self.ani = self.fit_anisotropy_tensor()
286
+ # with open(fname_tensor, "w") as f:
289
287
  # f.write("# Anisotropy tensor in meV\n")
290
288
  # f.write(f"{self.ani.tensor_strings(include_isotropic=False)}\n")
291
289
 
292
- #if figure3d is not None:
290
+ # if figure3d is not None:
293
291
  # self.ani.plot_3d(figname=fname_fig3d, show=False)
294
292
 
295
- #if figure_contourf is not None:
293
+ # if figure_contourf is not None:
296
294
  # self.ani.plot_contourf(figname=fname_figcontourf, show=False)
297
295
 
298
- #plt.close()
296
+ # plt.close()
299
297
  gc.collect()
300
298
 
301
299
  with open(fname_orb, "w") as f:
@@ -0,0 +1,233 @@
1
+ import numpy as np
2
+
3
+ from .io_exchange import ExchangeIO
4
+ from .io_exchange.structure import get_attribute_array
5
+ from .kpoints import monkhorst_pack
6
+ from .mathutils import get_rotation_arrays
7
+
8
+
9
+ def combine_arrays(u, v):
10
+ return np.concatenate(
11
+ [u * v, np.roll(u, -1, axis=-1) * v, np.roll(v, -1, axis=-1) * u], axis=-1
12
+ )
13
+
14
+
15
+ class ExchangeDownfolder(ExchangeIO):
16
+ def __init__(self, **kwargs):
17
+ reference_axes = kwargs.pop("reference_axes", None)
18
+ kwargs["kmesh"] = kwargs.pop("kmesh", [7, 7, 7])
19
+ super().__init__(**kwargs)
20
+ self._old_values = None
21
+
22
+ if reference_axes is None:
23
+ reference_axes = np.zeros((6, 3))
24
+ reference_axes[:3] = np.eye(3)
25
+ reference_axes[3:] = np.array(
26
+ [[0.0, 1.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 0.0]]
27
+ ) / np.sqrt(2)
28
+ self.reference_axes = reference_axes
29
+
30
+ @property
31
+ def reference_axes(self):
32
+ return self._axes
33
+
34
+ @reference_axes.setter
35
+ def reference_axes(self, values):
36
+ axes = get_attribute_array(values, "reference_axes")
37
+ if axes.ndim != 2 or axes.shape[-1] != 3:
38
+ raise ValueError("The reference axes must be an array of shape (n, 3)")
39
+ self._axes = axes
40
+
41
+ @property
42
+ def kpoints(self):
43
+ return self._kpoints
44
+
45
+ @ExchangeIO.kmesh.setter
46
+ def kmesh(self, value):
47
+ ExchangeIO.kmesh.fset(self, value)
48
+ self._kpoints = monkhorst_pack(self._kmesh)
49
+
50
+ def set_downfolded_magnetic_sites(self, metals):
51
+ # vectors = self.vectors
52
+ old_pairs = self.interacting_pairs
53
+ self._old_magnetic_elements = self.magnetic_elements
54
+
55
+ self.magnetic_elements = metals
56
+ indices = [old_pairs.index(pair) for pair in self.interacting_pairs]
57
+ self._old_values = self._exchange_values.copy()
58
+ self.set_vectors(values=self.vectors[indices])
59
+
60
+ def _generate_u_matrix(self):
61
+ """
62
+ Constructs the matrix with the coefficients that relate the exchange tensor J_{ij} to the matrix A_{ij}.
63
+ These coefficients only depend on the vectors u_i which depend on the orientations of the magnetic moments.
64
+
65
+ """
66
+ i, j = self.i, self.j
67
+ if self.collinear:
68
+ flat_magmoms = self.magmoms[self._index_spin]
69
+ magmoms = np.zeros((flat_magmoms.shape[0], 3))
70
+ magmoms[:, 2] = flat_magmoms
71
+ else:
72
+ magmoms = self.magmoms[self._index_spin]
73
+ magmoms /= np.linalg.norm(magmoms, axis=-1)[:, None]
74
+
75
+ U, _ = zip(
76
+ *[get_rotation_arrays(magmoms, u=u[None, :]) for u in self.reference_axes]
77
+ )
78
+ U = np.stack(U).swapaxes(0, 1)
79
+
80
+ u1 = combine_arrays(U[i], U[j].conj())
81
+ ur = combine_arrays(U[i], U[j])
82
+ ui = combine_arrays(U[i].conj(), U[j].conj())
83
+ u2 = combine_arrays(U[i].conj(), U[j])
84
+ u = np.concatenate([u1, ur, ui, u2], axis=1)
85
+
86
+ self.u_matrix = u
87
+
88
+ def _compute_AB_coefficients(self, Hk):
89
+ """
90
+ Computes the coefficients corresponding to A_{ij}(d), B_{ij}(d) from the dynamical matrix h(k). They are
91
+ required to reconstruct the exchange tensor J_{ij}(d).
92
+ These 18 coefficients are stored in an array with the shape (npairs, 18, nvectors)
93
+
94
+ """
95
+ i, j = self.i, self.j
96
+ n = i.max() + 1
97
+
98
+ ABk = Hk[:, :, [i, i, i + n, i + n], [j, j + n, j, j + n]]
99
+ ABk = np.moveaxis(ABk, [2, 3], [1, 0]).reshape(len(i), 24, -1)
100
+
101
+ exp_summand = np.exp(2j * np.pi * self.vectors @ self.kpoints.T)
102
+ AB = np.einsum("nik,ndk->nid", ABk[..., ::-1], exp_summand) / len(self.kpoints)
103
+
104
+ self.AB_coefficients = AB
105
+
106
+ def compute_exchange_tensor(self, Hk):
107
+ """
108
+ Computes the exchange tensor that best fits the dynamical matrix Hk
109
+
110
+ Parameters
111
+ ----------
112
+ Hk : ndarray
113
+ Dynamical matrix corresponding to the points on a k-grid, constructed for different reference axes.
114
+ It has the shape (naxes, nkpoints, 2*natoms, 2*natoms)
115
+
116
+ Returns
117
+ -------
118
+ output : ndarray
119
+ An exchange tensor with shape (npairs, ninteractions, 3, 3)
120
+ """
121
+ n = Hk.shape[-1] // 2
122
+ # diag = np.diag_indices(n)
123
+ self.i, self.j = np.triu_indices(n)
124
+
125
+ self._generate_u_matrix()
126
+ self._compute_AB_coefficients(Hk)
127
+
128
+ ii = np.where(self.i == self.j)
129
+ i0 = np.where((self.vectors == 0).all(axis=-1))
130
+ J = np.stack(
131
+ [
132
+ np.linalg.lstsq(mat, coeffs, rcond=None)[0]
133
+ for mat, coeffs in zip(self.u_matrix, self.AB_coefficients)
134
+ ]
135
+ ).swapaxes(1, 2)
136
+ J = J[:, :, [0, 6, 5, 3, 1, 7, 8, 4, 2]].reshape(len(self.i), -1, 3, 3)
137
+ J *= -1
138
+ J[ii] *= 2
139
+ J[i0] *= 0
140
+
141
+ del self.i, self.j, self.u_matrix, self.AB_coefficients
142
+
143
+ return J
144
+
145
+ def set_exchange_tensor(self, J):
146
+ idig = np.diag_indices(3)
147
+ Jiso = J[:, :, *idig].mean(axis=-1)
148
+
149
+ idmi = ([1, 2, 0], [2, 0, 1])
150
+ DMI = (J - J.swapaxes(-1, -2)) / 2
151
+
152
+ Jani = (J + J.swapaxes(-1, -2)) / 2
153
+ Jani[:, :, *idig] -= Jiso[:, :, None]
154
+
155
+ self._exchange_values[:, :, 3] = Jiso
156
+ if not self.collinear:
157
+ self._exchange_values[:, :, 6:9] = DMI[:, :, *idmi]
158
+ self._exchange_values[:, :, 9:] = Jani.reshape(Jani.shape[:2] + (9,))
159
+
160
+ @staticmethod
161
+ def downfold_matrix(matrix, basis):
162
+ eigvals, eigvecs = np.linalg.eigh(matrix)
163
+ A = np.einsum("...ki,...kj->...ij", eigvecs.conj(), basis)
164
+ W, _, Vh = np.linalg.svd(A, full_matrices=False)
165
+ U = np.einsum("...ik,...kj->...ij", W, Vh)
166
+ downfolded_matrix = np.einsum(
167
+ "...ki,...kj->...ij", U.conj(), eigvals[..., None] * U
168
+ )
169
+
170
+ return downfolded_matrix
171
+
172
+ @staticmethod
173
+ def lowdin_partition(matrix, indices):
174
+ N = matrix.shape[-1] // 2
175
+ null_indices = np.array([i for i in range(N) if i not in indices])
176
+ diag_indices = np.diag_indices(2 * null_indices.size)
177
+
178
+ idx = np.concatenate([indices, indices + N])[None, :]
179
+ jdx = np.concatenate([null_indices, null_indices + N])[None, :]
180
+
181
+ Hii = matrix[..., idx.T, idx]
182
+ Hij = matrix[..., idx.T, jdx]
183
+ Hji = matrix[..., jdx.T, idx]
184
+ Hjj = matrix[..., jdx.T, jdx]
185
+
186
+ eigvals = np.linalg.eigvalsh(matrix)
187
+ Hjj[..., *diag_indices] -= eigvals.min()
188
+ correction = np.einsum("...ij,...jk,...kl->...il", Hij, np.linalg.inv(Hjj), Hji)
189
+
190
+ return Hii - correction
191
+
192
+ def downfold(self, metals, **params):
193
+ try:
194
+ metals = metals.split()
195
+ except AttributeError:
196
+ try:
197
+ metals = list(metals)
198
+ except (ValueError, TypeError):
199
+ raise TypeError("argument must be a list of element symbols.")
200
+
201
+ if any(metal not in self.magnetic_elements for metal in metals):
202
+ wrong_symbols = [
203
+ metal for metal in metals if metal not in self.magnetic_elements
204
+ ]
205
+ raise ValueError(
206
+ f"The metal symbols '{wrong_symbols}' are not magnetic elements."
207
+ )
208
+ else:
209
+ magnetic_sites = [
210
+ symbol for symbol in self.elements if symbol in self.magnetic_elements
211
+ ]
212
+ # nsites = len(magnetic_sites)
213
+ metal_indices = np.array(
214
+ [i for i, element in enumerate(magnetic_sites) if element in metals]
215
+ )
216
+
217
+ Hq = np.stack(
218
+ [self.Hq(self.kpoints, u=u[None, :]) for u in self.reference_axes]
219
+ )
220
+ downfolded_Hq = self.lowdin_partition(Hq, metal_indices)
221
+
222
+ self.set_downfolded_magnetic_sites(metals)
223
+ J = self.compute_exchange_tensor(downfolded_Hq)
224
+ self.set_exchange_tensor(J.real)
225
+
226
+ return J
227
+
228
+ def reset(self):
229
+ if self.old_values is not None:
230
+ self.magnetic_elements = self._old_magnetic_elements
231
+ self._exchange_values = self._old_values
232
+ self.old_values = None
233
+ self.old_magnetic_elements = None
@@ -177,8 +177,7 @@ def add_exchange_args_to_parser(parser: argparse.ArgumentParser):
177
177
  )
178
178
 
179
179
  parser.add_argument(
180
- "--np",
181
- "--nproc",
180
+ "-np",
182
181
  help="number of cpu cores to use in parallel, default: 1",
183
182
  default=1,
184
183
  type=int,
@@ -0,0 +1,2 @@
1
+ TB2J_results/
2
+ *.png