TB2J 0.9.12.13__tar.gz → 0.9.12.15__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.
Potentially problematic release.
This version of TB2J might be problematic. Click here for more details.
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/PKG-INFO +4 -5
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/MAEGreen.py +78 -59
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/contour.py +3 -2
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/exchange.py +335 -47
- tb2j-0.9.12.15/TB2J/exchangeCL2.py +538 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/exchange_params.py +24 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/green.py +58 -33
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/myTB.py +11 -11
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/pauli.py +32 -2
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/PKG-INFO +4 -5
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/requires.txt +3 -3
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/pyproject.toml +5 -5
- tb2j-0.9.12.13/TB2J/exchangeCL2.py +0 -302
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/.gitignore +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/.readthedocs.yml +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/.travis.yml +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/LICENSE +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/README.md +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/.gitignore +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/Jdownfolder.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/Jtensor.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/MAE.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/Oiju.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/Oiju_epc.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/anisotropy.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/basis.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/citation.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/density_matrix.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/downfold/Hdownfolder.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/epc.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/exchange_pert.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/exchange_qspace.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/external/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/external/p_tqdm.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/gpaw_wrapper.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/greentest.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/abacus_api.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/abacus_wrapper.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/gen_exchange_abacus.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/orbital_api.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/stru_api.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/test_density_matrix.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/test_read_HRSR.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/abacus/test_read_stru.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/gpaw_interface.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/lawaf_interface.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/manager.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/siesta_interface.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/interfaces/wannier90_interface.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_espins.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_exchange.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_multibinit.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_tomsasd.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_txt.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_uppasd.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_exchange/io_vampire.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/io_merge.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/kpoints.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/io_exchange2.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/magnon3.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/magnon_band.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/magnon_dos.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/magnon_io.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/magnon_math.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/plot.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/plot_magnon_dos_cli.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/magnon/structure.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/auto_kpath.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/fermi.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/fibonacci_sphere.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/kR_convert.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/lowdin.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mathutils/rotate_spin.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/mycfr.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/orbital_magmom.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/orbmap.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/pert.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/plot.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/rotate_atoms.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/rotate_siestaDM.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_downfold.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_eigen.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_magnon.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_magnon2.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_magnon_dos.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_merge.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_plot_magnon_bands.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_rotate.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/TB2J_rotateDM.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/abacus2J.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/siesta2J.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/scripts/wann2J.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/sisl_wrapper.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/base_parser.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/constants.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/hamiltonian.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/hamiltonian_terms.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/plot.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/qsolver.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/spin_api.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/spin_xml.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/spinham/supercell.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/symmetrize_J.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/tensor_rotate.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/thetaphi.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/utest.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/utils.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/versioninfo.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/wannier/__init__.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/wannier/w90_parser.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J/wannier/w90_tb_parser.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/SOURCES.txt +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/dependency_links.txt +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/entry_points.txt +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/TB2J.egg-info/top_level.txt +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/buildimage.sh +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/Makefile +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/conf.py +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/index.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/make.bat +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/BFOvarT.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/Contributors.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/SrMnO3_DOS.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/applications.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/convention.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/downfold.md +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/extend.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/faq.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/install.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/magnon_band.assets/exchange_magnon-1593690872101.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/magnon_band.assets/exchange_magnon.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/magnon_band.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/multibinit.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/openmx.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/orbital_contribution.md +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/output.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/parameters.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/references.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/rotate_and_merge.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/siesta.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/spin_model_assets/canting_DMI.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/spin_model_assets/tmulti5_2.png +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/tutorial.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/docs/src/wannier.rst +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/setup.cfg +0 -0
- {tb2j-0.9.12.13 → tb2j-0.9.12.15}/upload_to_pip.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: TB2J
|
|
3
|
-
Version: 0.9.12.
|
|
3
|
+
Version: 0.9.12.15
|
|
4
4
|
Summary: TB2J: First principle to Heisenberg exchange J using tight-binding Green function method
|
|
5
5
|
Author-email: Xu He <mailhexu@gmail.com>
|
|
6
6
|
Maintainer-email: Xu He <mailhexu@gmail.com>
|
|
@@ -23,7 +23,6 @@ Classifier: Intended Audience :: Science/Research
|
|
|
23
23
|
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
24
24
|
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
25
25
|
Classifier: License :: OSI Approved :: BSD License
|
|
26
|
-
Requires-Python: >=3.6
|
|
27
26
|
Description-Content-Type: text/markdown
|
|
28
27
|
License-File: LICENSE
|
|
29
28
|
Requires-Dist: numpy
|
|
@@ -33,7 +32,7 @@ Requires-Dist: ase>=3.19
|
|
|
33
32
|
Requires-Dist: tqdm
|
|
34
33
|
Requires-Dist: pathos
|
|
35
34
|
Requires-Dist: packaging>=20.0
|
|
36
|
-
Requires-Dist: HamiltonIO>=0.2.
|
|
35
|
+
Requires-Dist: HamiltonIO>=0.2.6
|
|
37
36
|
Requires-Dist: pre-commit
|
|
38
37
|
Requires-Dist: sympair>0.1.1
|
|
39
38
|
Requires-Dist: tomli>=2.0.0
|
|
@@ -43,11 +42,11 @@ Provides-Extra: siesta
|
|
|
43
42
|
Requires-Dist: sisl>=0.9.0; extra == "siesta"
|
|
44
43
|
Requires-Dist: netcdf4; extra == "siesta"
|
|
45
44
|
Provides-Extra: lawaf
|
|
46
|
-
Requires-Dist: lawaf
|
|
45
|
+
Requires-Dist: lawaf>=0.2.3; extra == "lawaf"
|
|
47
46
|
Provides-Extra: all
|
|
48
47
|
Requires-Dist: sisl>=0.9.0; extra == "all"
|
|
49
48
|
Requires-Dist: netcdf4; extra == "all"
|
|
50
|
-
Requires-Dist: lawaf
|
|
49
|
+
Requires-Dist: lawaf>=0.2.3; extra == "all"
|
|
51
50
|
Dynamic: license-file
|
|
52
51
|
|
|
53
52
|
[](https://github.com/mailhexu/TB2J/actions/workflows/python-app.yml)
|
|
@@ -51,7 +51,7 @@ class MAEGreen(ExchangeNCL):
|
|
|
51
51
|
|
|
52
52
|
nangles = len(self.thetas)
|
|
53
53
|
self.es = np.zeros(nangles, dtype=complex)
|
|
54
|
-
self.
|
|
54
|
+
self.es_matrix = np.zeros((nangles, self.natoms, self.natoms), dtype=complex)
|
|
55
55
|
self.es_atom_orb = DefaultDict(lambda: 0)
|
|
56
56
|
|
|
57
57
|
def set_angles_xyz(self):
|
|
@@ -153,7 +153,7 @@ class MAEGreen(ExchangeNCL):
|
|
|
153
153
|
Hsoc_k = self.tbmodel.get_Hk_soc(self.G.kpts)
|
|
154
154
|
na = len(thetas)
|
|
155
155
|
dE_angle = np.zeros(na, dtype=complex)
|
|
156
|
-
|
|
156
|
+
dE_angle_matrix = np.zeros((na, self.natoms, self.natoms), dtype=complex)
|
|
157
157
|
# dE_angle_orbitals = np.zeros((na, self.natoms, self.norb, self.norb), dtype=complex)
|
|
158
158
|
dE_angle_atom_orb = DefaultDict(lambda: 0)
|
|
159
159
|
for iangle, (theta, phi) in enumerate(zip(thetas, phis)):
|
|
@@ -178,23 +178,30 @@ class MAEGreen(ExchangeNCL):
|
|
|
178
178
|
# dE_angle[iangle] += np.trace(GdH@GdH) * self.G.kweights[ik]
|
|
179
179
|
# dE_angle[iangle] += np.trace(GdH@G0K[ik].T.conj()@dHi ) * self.G.kweights[ik]
|
|
180
180
|
dE_angle[iangle] += dG2sum * self.G.kweights[ik]
|
|
181
|
+
|
|
182
|
+
# Calculate atom-atom matrix interactions
|
|
181
183
|
for iatom in range(self.natoms):
|
|
182
184
|
iorb = self.iorb(iatom)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
185
|
+
for jatom in range(self.natoms):
|
|
186
|
+
jorb = self.iorb(jatom)
|
|
187
|
+
# Calculate cross terms between atoms i and j
|
|
188
|
+
dE_ij_orb = dG2[np.ix_(iorb, jorb)] * self.G.kweights[ik]
|
|
189
|
+
dE_ij_orb = (
|
|
190
|
+
dE_ij_orb[::2, ::2]
|
|
191
|
+
+ dE_ij_orb[1::2, 1::2]
|
|
192
|
+
+ dE_ij_orb[1::2, ::2]
|
|
193
|
+
+ dE_ij_orb[::2, 1::2]
|
|
194
|
+
)
|
|
195
|
+
dE_ij = np.sum(dE_ij_orb)
|
|
196
|
+
# Transform to local orbital basis
|
|
197
|
+
mmat_i = self.mmats[iatom]
|
|
198
|
+
mmat_j = self.mmats[jatom]
|
|
199
|
+
dE_ij_orb = mmat_i.T @ dE_ij_orb @ mmat_j
|
|
200
|
+
dE_angle_matrix[iangle, iatom, jatom] += dE_ij
|
|
201
|
+
# Store orbital-resolved data for diagonal terms
|
|
202
|
+
if iatom == jatom:
|
|
203
|
+
dE_angle_atom_orb[(iangle, iatom)] += dE_ij_orb
|
|
204
|
+
return dE_angle, dE_angle_matrix, dE_angle_atom_orb
|
|
198
205
|
|
|
199
206
|
def get_perturbed_R(self, e, thetas, phis):
|
|
200
207
|
self.tbmodel.set_so_strength(0.0)
|
|
@@ -232,16 +239,16 @@ class MAEGreen(ExchangeNCL):
|
|
|
232
239
|
npole = len(self.contour.path)
|
|
233
240
|
results = map(func, tqdm.tqdm(self.contour.path, total=npole))
|
|
234
241
|
for i, result in enumerate(results):
|
|
235
|
-
dE_angle,
|
|
242
|
+
dE_angle, dE_angle_matrix, dE_angle_atom_orb = result
|
|
236
243
|
self.es += dE_angle * self.contour.weights[i]
|
|
237
|
-
self.
|
|
244
|
+
self.es_matrix += dE_angle_matrix * self.contour.weights[i]
|
|
238
245
|
for key, value in dE_angle_atom_orb.items():
|
|
239
246
|
self.es_atom_orb[key] += (
|
|
240
247
|
dE_angle_atom_orb[key] * self.contour.weights[i]
|
|
241
248
|
)
|
|
242
249
|
|
|
243
250
|
self.es = -np.imag(self.es) / (2 * np.pi)
|
|
244
|
-
self.
|
|
251
|
+
self.es_matrix = -np.imag(self.es_matrix) / (2 * np.pi)
|
|
245
252
|
for key, value in self.es_atom_orb.items():
|
|
246
253
|
self.es_atom_orb[key] = -np.imag(value) / (2 * np.pi)
|
|
247
254
|
|
|
@@ -259,6 +266,7 @@ class MAEGreen(ExchangeNCL):
|
|
|
259
266
|
Path(output_path).mkdir(exist_ok=True)
|
|
260
267
|
fname = f"{output_path}/MAE.dat"
|
|
261
268
|
fname_orb = f"{output_path}/MAE_orb.dat"
|
|
269
|
+
fname_matrix = f"{output_path}/MAE_matrix.dat"
|
|
262
270
|
# fname_tensor = f"{output_path}/MAE_tensor.dat"
|
|
263
271
|
# if figure3d is not None:
|
|
264
272
|
# fname_fig3d = f"{output_path}/{figure3d}"
|
|
@@ -269,24 +277,32 @@ class MAEGreen(ExchangeNCL):
|
|
|
269
277
|
if with_eigen:
|
|
270
278
|
fname_eigen = f"{output_path}/MAE_eigen.dat"
|
|
271
279
|
with open(fname_eigen, "w") as f:
|
|
272
|
-
f.write("# theta, phi, MAE(total)
|
|
273
|
-
for i, (theta, phi, e
|
|
274
|
-
zip(self.thetas, self.phis, self.es2
|
|
280
|
+
f.write("# theta, phi, MAE(total) Unit: meV\n")
|
|
281
|
+
for i, (theta, phi, e) in enumerate(
|
|
282
|
+
zip(self.thetas, self.phis, self.es2)
|
|
275
283
|
):
|
|
276
|
-
f.write(f"{theta:.5f} {phi:.5f} {e*1e3:.8f}
|
|
277
|
-
for ea in es:
|
|
278
|
-
f.write(f"{ea*1e3:.8f} ")
|
|
279
|
-
f.write("\n")
|
|
284
|
+
f.write(f"{theta:.5f} {phi:.5f} {e*1e3:.8f}\n")
|
|
280
285
|
|
|
281
286
|
with open(fname, "w") as f:
|
|
282
|
-
f.write("# theta (rad), phi(rad), MAE(total)
|
|
283
|
-
for i, (theta, phi, e
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
287
|
+
f.write("# theta (rad), phi(rad), MAE(total) Unit: meV\n")
|
|
288
|
+
for i, (theta, phi, e) in enumerate(zip(self.thetas, self.phis, self.es)):
|
|
289
|
+
f.write(f"{theta%np.pi:.5f} {phi%(2*np.pi):.5f} {e*1e3:.8f}\n")
|
|
290
|
+
|
|
291
|
+
# Write matrix data to MAE_matrix.dat
|
|
292
|
+
with open(fname_matrix, "w") as fmat:
|
|
293
|
+
fmat.write("# MAE atom-atom interaction matrices\n")
|
|
294
|
+
fmat.write("# Format: angle_index theta phi atom_i atom_j MAE_ij(meV)\n")
|
|
295
|
+
fmat.write("# Units: theta and phi in radians, MAE in meV\n")
|
|
296
|
+
for iangle, (theta, phi) in enumerate(zip(self.thetas, self.phis)):
|
|
297
|
+
for iatom in range(self.natoms):
|
|
298
|
+
for jatom in range(self.natoms):
|
|
299
|
+
mae_ij = (
|
|
300
|
+
self.es_matrix[iangle, iatom, jatom] * 1e3
|
|
301
|
+
) # Convert to meV
|
|
302
|
+
fmat.write(
|
|
303
|
+
f"{iangle:4d} {theta:.5f} {phi:.5f} {iatom:4d} {jatom:4d} {mae_ij:.8f}\n"
|
|
304
|
+
)
|
|
305
|
+
fmat.write("\n") # Empty line between angles for readability
|
|
290
306
|
|
|
291
307
|
# self.ani = self.fit_anisotropy_tensor()
|
|
292
308
|
# with open(fname_tensor, "w") as f:
|
|
@@ -312,34 +328,37 @@ class MAEGreen(ExchangeNCL):
|
|
|
312
328
|
for orb in self.orbital_names[iatom]:
|
|
313
329
|
f.write(f"{orb} ")
|
|
314
330
|
f.write("\n")
|
|
315
|
-
for i, (theta, phi, e
|
|
316
|
-
zip(self.thetas, self.phis, self.es, self.es_atom)
|
|
317
|
-
):
|
|
331
|
+
for i, (theta, phi, e) in enumerate(zip(self.thetas, self.phis, self.es)):
|
|
318
332
|
f.write("-" * 60 + "\n")
|
|
319
333
|
f.write(f"Angle {i:03d}: theta={theta:.5f} phi={phi:.5f} \n ")
|
|
320
334
|
f.write(f"E: {e*1e3:.8f} \n")
|
|
321
|
-
for iatom
|
|
322
|
-
f.write(f"Atom {iatom:03d}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
eorb_diff = eorb - self.es_atom_orb[(0, iatom)]
|
|
334
|
-
f.write("Diference to the first angle: ")
|
|
335
|
-
f.write(
|
|
336
|
-
np.array2string(
|
|
337
|
-
eorb_diff * 1e3,
|
|
338
|
-
precision=4,
|
|
339
|
-
separator=",",
|
|
340
|
-
suppress_small=True,
|
|
335
|
+
for iatom in range(self.natoms):
|
|
336
|
+
f.write(f"Atom {iatom:03d} orbital matrix:\n")
|
|
337
|
+
if (i, iatom) in self.es_atom_orb:
|
|
338
|
+
eorb = self.es_atom_orb[(i, iatom)]
|
|
339
|
+
# write numpy matrix to file
|
|
340
|
+
f.write(
|
|
341
|
+
np.array2string(
|
|
342
|
+
eorb * 1e3,
|
|
343
|
+
precision=4,
|
|
344
|
+
separator=",",
|
|
345
|
+
suppress_small=True,
|
|
346
|
+
)
|
|
341
347
|
)
|
|
342
|
-
|
|
348
|
+
f.write("\n")
|
|
349
|
+
|
|
350
|
+
if (0, iatom) in self.es_atom_orb:
|
|
351
|
+
eorb_diff = eorb - self.es_atom_orb[(0, iatom)]
|
|
352
|
+
f.write("Difference to the first angle: ")
|
|
353
|
+
f.write(
|
|
354
|
+
np.array2string(
|
|
355
|
+
eorb_diff * 1e3,
|
|
356
|
+
precision=4,
|
|
357
|
+
separator=",",
|
|
358
|
+
suppress_small=True,
|
|
359
|
+
)
|
|
360
|
+
)
|
|
361
|
+
f.write("\n")
|
|
343
362
|
f.write("\n")
|
|
344
363
|
|
|
345
364
|
def run(self, output_path="TB2J_anisotropy", with_eigen=False):
|
|
@@ -27,8 +27,9 @@ class Contour:
|
|
|
27
27
|
integrate f along the path
|
|
28
28
|
"""
|
|
29
29
|
ret = 0
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
ret = np.einsum("i...,i->...", values, self.weights)
|
|
31
|
+
# for i in range(len(values)):
|
|
32
|
+
# ret += values[i] * self.weights[i]
|
|
32
33
|
return ret
|
|
33
34
|
|
|
34
35
|
def build_path_semicircle(self, npoints, endpoint=True):
|