TB2J 0.9.9.6__tar.gz → 0.9.9.8__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.
- tb2j-0.9.9.8/.github/workflows/pylint.yml.bak +23 -0
- tb2j-0.9.9.8/.github/workflows/python-app.yml +44 -0
- tb2j-0.9.9.8/.gitignore +131 -0
- tb2j-0.9.9.8/.pre-commit-config.yaml +11 -0
- tb2j-0.9.9.8/.readthedocs.yml +28 -0
- tb2j-0.9.9.8/.ruff.toml +78 -0
- tb2j-0.9.9.8/.travis.yml +33 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/PKG-INFO +2 -2
- tb2j-0.9.9.8/TB2J/.gitignore +5 -0
- tb2j-0.9.9.8/TB2J/__init__.py +1 -0
- tb2j-0.9.9.8/TB2J/downfold/Hdownfolder.py +233 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/exchange.py +0 -1
- tb2j-0.9.9.8/TB2J/interfaces/abacus/.gitignore +2 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/abacus_wrapper.py +0 -3
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/orbital_api.py +1 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J.egg-info/PKG-INFO +2 -2
- tb2j-0.9.9.8/TB2J.egg-info/SOURCES.txt +225 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J.egg-info/requires.txt +1 -1
- tb2j-0.9.9.8/buildimage.sh +51 -0
- tb2j-0.9.9.8/docs/Makefile +20 -0
- tb2j-0.9.9.8/docs/_static/Logo-ULG.png +0 -0
- tb2j-0.9.9.8/docs/_static/logo_TB2J_horizon.png +0 -0
- tb2j-0.9.9.8/docs/conf.py +67 -0
- tb2j-0.9.9.8/docs/index.rst +44 -0
- tb2j-0.9.9.8/docs/make.bat +35 -0
- tb2j-0.9.9.8/docs/requirements.txt +3 -0
- tb2j-0.9.9.8/docs/src/BFOvarT.png +0 -0
- tb2j-0.9.9.8/docs/src/Contributors.rst +44 -0
- tb2j-0.9.9.8/docs/src/ReleaseNotes.md +226 -0
- tb2j-0.9.9.8/docs/src/SrMnO3_DOS.png +0 -0
- tb2j-0.9.9.8/docs/src/abacus.md +103 -0
- tb2j-0.9.9.8/docs/src/applications.rst +9 -0
- tb2j-0.9.9.8/docs/src/convention.rst +18 -0
- tb2j-0.9.9.8/docs/src/development.md +22 -0
- tb2j-0.9.9.8/docs/src/downfold.md +28 -0
- tb2j-0.9.9.8/docs/src/ecosystem.md +49 -0
- tb2j-0.9.9.8/docs/src/eigen.rst +34 -0
- tb2j-0.9.9.8/docs/src/extend.rst +45 -0
- tb2j-0.9.9.8/docs/src/faq.rst +79 -0
- tb2j-0.9.9.8/docs/src/install.rst +86 -0
- tb2j-0.9.9.8/docs/src/mae.md +127 -0
- tb2j-0.9.9.8/docs/src/magnon_band.assets/exchange_magnon-1593690872101.png +0 -0
- tb2j-0.9.9.8/docs/src/magnon_band.assets/exchange_magnon.png +0 -0
- tb2j-0.9.9.8/docs/src/magnon_band.assets/magnon_dos.png +0 -0
- tb2j-0.9.9.8/docs/src/magnon_band.rst +98 -0
- tb2j-0.9.9.8/docs/src/multibinit.rst +89 -0
- tb2j-0.9.9.8/docs/src/openmx.rst +27 -0
- tb2j-0.9.9.8/docs/src/orbital_contribution.md +80 -0
- tb2j-0.9.9.8/docs/src/output.rst +52 -0
- tb2j-0.9.9.8/docs/src/parameters.rst +89 -0
- tb2j-0.9.9.8/docs/src/references.rst +36 -0
- tb2j-0.9.9.8/docs/src/roadmap.md +8 -0
- tb2j-0.9.9.8/docs/src/rotate_and_merge.rst +54 -0
- tb2j-0.9.9.8/docs/src/siesta.rst +38 -0
- tb2j-0.9.9.8/docs/src/spin_model_assets/canting_DMI.png +0 -0
- tb2j-0.9.9.8/docs/src/spin_model_assets/tmulti5_2.png +0 -0
- tb2j-0.9.9.8/docs/src/symmetry.md +42 -0
- tb2j-0.9.9.8/docs/src/tutorial.rst +18 -0
- tb2j-0.9.9.8/docs/src/wannier.rst +228 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/Fe.1.psml +1181 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/EigenJq.txt +119 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange.xml +4126 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange_kpth.txt +8 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/exchange_magnon.png +0 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon.py +3 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_band.json +3332 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_band.pdf +0 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_dos.png +0 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/magnon_dos.txt +302 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/mb.files +3 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/mb.in +33 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/plot.sh +1 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/plot_magnon_dos.sh +1 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/Multibinit/plot_magnon_from_json_file.py +73 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/TB2J.pickle +0 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/TomASD/exchange.exch +1381 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/TomASD/exchange.ucf +3 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/TB2J_results/exchange.out +3097 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/getJ.sh +2 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/run.sh +3 -0
- tb2j-0.9.9.8/examples/Siesta/BccFe/siesta.fdf +61 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/Co.1.psml +3174 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Multibinit/exchange.xml +7610 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Multibinit/mb.files +3 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Multibinit/mb.in +33 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/TB2J.pickle +0 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/TomASD/exchange.exch +2556 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/TomASD/exchange.ucf +4 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Vampire/input +42 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Vampire/vampire.UCF +644 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/Vampire/vampire.mat +24 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/exchange.out +5708 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/TB2J_results/summary.txt +10 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/getJ.sh +1 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/run.sh +3 -0
- tb2j-0.9.9.8/examples/Siesta/HcpCo/siesta.fdf +63 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/JvsR.pdf +0 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/exchange.xml +533 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/mb.files +3 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Multibinit/mb.in +33 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/TB2J.pickle +0 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/TomASD/exchange.exch +509 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/TomASD/exchange.ucf +3 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/input +42 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/vampire.UCF +135 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/Vampire/vampire.mat +13 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/assigned_basis.txt +14 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/exchange.out +406 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/TB2J_results/exchange_orb_decomposition.out +1274 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinit.files +8 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinit.in +83 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_down.win +113 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_down_centres.xyz +21 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_down_hr.dat +24512 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_up.win +113 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_up_centres.xyz +21 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/abinito_w90_up_hr.dat +24512 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/get_J.sh +1 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/psp/Mn.GGA-PBESOL-JTH.xml +16818 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/psp/O.GGA-PBESOL-JTH.xml +12782 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/psp/Sr.GGA-PBESOL-JTH.xml +12646 -0
- tb2j-0.9.9.8/examples/abinit-w90/SrMnO3/run.sh +6 -0
- tb2j-0.9.9.8/requirements.txt +11 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/abacus2J.py +0 -1
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/setup.py +2 -2
- tb2j-0.9.9.8/upload_to_pip.sh +5 -0
- tb2j-0.9.9.6/TB2J/__init__.py +0 -1
- tb2j-0.9.9.6/TB2J.egg-info/SOURCES.txt +0 -109
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/LICENSE +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/README.md +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/Jdownfolder.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/Jtensor.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/MAE.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/MAEGreen.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/Oiju.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/Oiju_epc.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/anisotropy.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/basis.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/citation.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/contour.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/density_matrix.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/epc.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/exchangeCL2.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/exchange_params.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/exchange_pert.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/exchange_qspace.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/external/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/external/p_tqdm.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/gpaw_wrapper.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/green.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/greentest.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/abacus_api.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/gen_exchange_abacus.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/stru_api.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/test_density_matrix.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/test_read_HRSR.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/abacus/test_read_stru.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/gpaw_interface.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/lawaf_interface.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/manager.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/siesta_interface.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/interfaces/wannier90_interface.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_exchange.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_multibinit.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_tomsasd.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_txt.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_uppasd.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_exchange/io_vampire.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/io_merge.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/kpoints.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/io_exchange2.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/magnon3.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/magnon_io.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/magnon_math.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/plot.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/magnon/structure.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/fermi.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/fibonacci_sphere.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/kR_convert.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/lowdin.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mathutils/rotate_spin.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/myTB.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/mycfr.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/orbital_magmom.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/orbmap.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/pauli.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/pert.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/plot.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/rotate_atoms.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/rotate_siestaDM.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/sisl_wrapper.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/base_parser.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/constants.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/hamiltonian.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/hamiltonian_terms.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/plot.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/qsolver.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/spin_api.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/spin_xml.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/spinham/supercell.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/symmetrize_J.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/tensor_rotate.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/thetaphi.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/utest.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/utils.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/versioninfo.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/wannier/__init__.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/wannier/w90_parser.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J/wannier/w90_tb_parser.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J.egg-info/dependency_links.txt +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J.egg-info/entry_points.txt +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/TB2J.egg-info/top_level.txt +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_downfold.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_eigen.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_magnon.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_magnon2.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_magnon_dos.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_merge.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_rotate.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/TB2J_rotateDM.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/siesta2J.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/scripts/wann2J.py +0 -0
- {tb2j-0.9.9.6 → tb2j-0.9.9.8}/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
|
tb2j-0.9.9.8/.gitignore
ADDED
@@ -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,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
|
tb2j-0.9.9.8/.ruff.toml
ADDED
@@ -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
|
+
|
tb2j-0.9.9.8/.travis.yml
ADDED
@@ -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.9.
|
3
|
+
Version: 0.9.9.8
|
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
|
@@ -21,7 +21,7 @@ Requires-Dist: ase>=3.19
|
|
21
21
|
Requires-Dist: tqdm
|
22
22
|
Requires-Dist: pathos
|
23
23
|
Requires-Dist: packaging>=20.0
|
24
|
-
Requires-Dist: HamiltonIO>=0.2.
|
24
|
+
Requires-Dist: HamiltonIO>=0.2.3
|
25
25
|
Requires-Dist: pre-commit
|
26
26
|
Requires-Dist: sympair>0.1.0
|
27
27
|
Requires-Dist: sisl>=0.9.0
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.9.9.8"
|
@@ -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
|
@@ -157,7 +157,6 @@ class Exchange(ExchangeParams):
|
|
157
157
|
or f"{sym}{tag}" in self.magnetic_elements
|
158
158
|
):
|
159
159
|
self.ind_mag_atoms.append(atom_idx)
|
160
|
-
print(f"Magnetic atoms: {self.ind_mag_atoms}")
|
161
160
|
|
162
161
|
def _validate_orbital_assignments(self):
|
163
162
|
"""Validate that magnetic atoms have proper orbital assignments."""
|
@@ -160,8 +160,6 @@ class AbacusParser:
|
|
160
160
|
self.read_atoms()
|
161
161
|
self.efermi = self.read_efermi()
|
162
162
|
self.nel = self.read_nel()
|
163
|
-
print(f"efermi: {self.efermi}")
|
164
|
-
print(f"nel: {self.nel}")
|
165
163
|
self.read_basis()
|
166
164
|
|
167
165
|
def read_spin(self):
|
@@ -192,7 +190,6 @@ class AbacusParser:
|
|
192
190
|
def read_basis(self):
|
193
191
|
fname = str(Path(self.outpath) / "Orbital")
|
194
192
|
self.basis = parse_abacus_orbital(fname)
|
195
|
-
print(self.basis)
|
196
193
|
return self.basis
|
197
194
|
|
198
195
|
def read_HSR_collinear(self, binary=None):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: TB2J
|
3
|
-
Version: 0.9.9.
|
3
|
+
Version: 0.9.9.8
|
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
|
@@ -21,7 +21,7 @@ Requires-Dist: ase>=3.19
|
|
21
21
|
Requires-Dist: tqdm
|
22
22
|
Requires-Dist: pathos
|
23
23
|
Requires-Dist: packaging>=20.0
|
24
|
-
Requires-Dist: HamiltonIO>=0.2.
|
24
|
+
Requires-Dist: HamiltonIO>=0.2.3
|
25
25
|
Requires-Dist: pre-commit
|
26
26
|
Requires-Dist: sympair>0.1.0
|
27
27
|
Requires-Dist: sisl>=0.9.0
|