TB2J 0.9.0__py3-none-any.whl → 0.9.0.2__py3-none-any.whl
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/Jdownfolder.py +110 -24
- TB2J/Jtensor.py +1 -1
- TB2J/MAE.py +188 -0
- TB2J/__init__.py +1 -1
- TB2J/abacus/MAE.py +320 -0
- TB2J/abacus/abacus_wrapper.py +20 -2
- TB2J/abacus/occupations.py +278 -0
- TB2J/abacus/test_density_matrix.py +38 -0
- TB2J/exchange.py +1 -1
- TB2J/green.py +2 -13
- TB2J/mathutils/__init__.py +1 -0
- TB2J/mathutils/fermi.py +22 -0
- TB2J/mathutils/kR_convert.py +90 -0
- TB2J/mathutils/lowdin.py +12 -0
- TB2J/mathutils/rotate_spin.py +35 -0
- TB2J/patch.py +50 -0
- TB2J/pauli.py +17 -0
- TB2J/utils.py +82 -1
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_downfold.py +8 -0
- {TB2J-0.9.0.dist-info → TB2J-0.9.0.2.dist-info}/METADATA +6 -9
- {TB2J-0.9.0.dist-info → TB2J-0.9.0.2.dist-info}/RECORD +33 -23
- {TB2J-0.9.0.dist-info → TB2J-0.9.0.2.dist-info}/WHEEL +1 -1
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_eigen.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_magnon.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_magnon_dos.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_merge.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_rotate.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/TB2J_rotateDM.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/abacus2J.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/siesta2J.py +0 -0
- {TB2J-0.9.0.data → TB2J-0.9.0.2.data}/scripts/wann2J.py +0 -0
- {TB2J-0.9.0.dist-info → TB2J-0.9.0.2.dist-info}/LICENSE +0 -0
- {TB2J-0.9.0.dist-info → TB2J-0.9.0.2.dist-info}/top_level.txt +0 -0
TB2J/green.py
CHANGED
@@ -7,6 +7,8 @@ import tempfile
|
|
7
7
|
from pathos.multiprocessing import ProcessPool
|
8
8
|
import sys
|
9
9
|
import pickle
|
10
|
+
import warnings
|
11
|
+
from TB2J.mathutils.fermi import fermi
|
10
12
|
|
11
13
|
MAX_EXP_ARGUMENT = np.log(sys.float_info.max)
|
12
14
|
|
@@ -26,19 +28,6 @@ def eigen_to_G(evals, evecs, efermi, energy):
|
|
26
28
|
)
|
27
29
|
|
28
30
|
|
29
|
-
def fermi(e, mu, width=0.01):
|
30
|
-
"""
|
31
|
-
the fermi function.
|
32
|
-
.. math::
|
33
|
-
f=\\frac{1}{\exp((e-\mu)/width)+1}
|
34
|
-
|
35
|
-
:param e,mu,width: e,\mu,width
|
36
|
-
"""
|
37
|
-
|
38
|
-
x = (e - mu) / width
|
39
|
-
return np.where(x < MAX_EXP_ARGUMENT, 1 / (1.0 + np.exp(x)), 0.0)
|
40
|
-
|
41
|
-
|
42
31
|
def find_energy_ingap(evals, rbound, gap=4.0):
|
43
32
|
"""
|
44
33
|
find a energy inside a gap below rbound (right bound),
|
@@ -0,0 +1 @@
|
|
1
|
+
from .lowdin import Lowdin
|
TB2J/mathutils/fermi.py
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
import numpy as np
|
2
|
+
import warnings
|
3
|
+
import sys
|
4
|
+
|
5
|
+
MAX_EXP_ARGUMENT = np.log(sys.float_info.max)
|
6
|
+
|
7
|
+
|
8
|
+
def fermi(e, mu, width=0.01):
|
9
|
+
"""
|
10
|
+
the fermi function.
|
11
|
+
.. math::
|
12
|
+
f=\\frac{1}{\exp((e-\mu)/width)+1}
|
13
|
+
|
14
|
+
:param e,mu,width: e,\mu,width
|
15
|
+
"""
|
16
|
+
x = (e - mu) / width
|
17
|
+
# disable overflow warning
|
18
|
+
with warnings.catch_warnings():
|
19
|
+
warnings.simplefilter("ignore")
|
20
|
+
ret = np.where(x < MAX_EXP_ARGUMENT, 1 / (1.0 + np.exp(x)), 0.0)
|
21
|
+
|
22
|
+
return ret
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import numpy as np
|
2
|
+
|
3
|
+
|
4
|
+
def HR_to_k(HR, Rlist, kpts):
|
5
|
+
# Hk[k,:,:] = sum_R (H[R] exp(i2pi k.R))
|
6
|
+
phase = np.exp(2.0j * np.pi * np.tensordot(kpts, Rlist, axes=([1], [1])))
|
7
|
+
Hk = np.einsum("rlm, kr -> klm", HR, phase)
|
8
|
+
return Hk
|
9
|
+
|
10
|
+
|
11
|
+
def Hk_to_R(Hk, Rlist, kpts, kweights):
|
12
|
+
phase = np.exp(-2.0j * np.pi * np.tensordot(kpts, Rlist, axes=([1], [1])))
|
13
|
+
HR = np.einsum("klm, kr, k->rlm", Hk, phase, kweights)
|
14
|
+
return HR
|
15
|
+
|
16
|
+
|
17
|
+
def k_to_R(kpts, Rlist, Mk, kweights=None):
|
18
|
+
"""
|
19
|
+
Transform k-space wavefunctions to real space.
|
20
|
+
params:
|
21
|
+
kpts: k-points
|
22
|
+
Rlist: list of R vectors
|
23
|
+
Mk: matrix of shape [nkpt, n1, n2] in k-space.
|
24
|
+
|
25
|
+
return:
|
26
|
+
MR: matrix of shape [nR, n1, n2], the matrix in R-space.
|
27
|
+
|
28
|
+
"""
|
29
|
+
nkpt, n1, n2 = Mk.shape
|
30
|
+
if kweights is None:
|
31
|
+
kweights = np.ones(nkpt, dtype=float) / nkpt
|
32
|
+
phase = np.exp(-2.0j * np.pi * np.tensordot(kpts, Rlist, axes=([1], [1])))
|
33
|
+
MR = np.einsum("klm, kr, k -> rlm", Mk, phase, kweights)
|
34
|
+
return MR
|
35
|
+
|
36
|
+
# nkpt, n1, n2 = Mk.shape
|
37
|
+
# nR = Rlist.shape[0]
|
38
|
+
# MR = np.zeros((nR, n1, n2), dtype=complex)
|
39
|
+
# if kweights is None:
|
40
|
+
# kweights = np.ones(nkpt, dtype=float)/nkpt
|
41
|
+
# for iR, R in enumerate(Rlist):
|
42
|
+
# for ik in range(nkpt):
|
43
|
+
# MR[iR] += Mk[ik] * np.exp(-2.0j*np.pi * np.dot(kpts[ik], R)) * kweights[ik]
|
44
|
+
# return MR
|
45
|
+
|
46
|
+
|
47
|
+
def R_to_k(kpts, Rlist, MR):
|
48
|
+
"""
|
49
|
+
Transform real-space wavefunctions to k-space.
|
50
|
+
params:
|
51
|
+
kpts: k-points
|
52
|
+
Rlist: list of R vectors
|
53
|
+
MR: matrix of shape [nR, n1, n2] in R-space.
|
54
|
+
|
55
|
+
return:
|
56
|
+
Mk: matrix of shape [nkpt, n1, n2], the matrix in k-space.
|
57
|
+
|
58
|
+
"""
|
59
|
+
phase = np.exp(2.0 * np.pi * 1j * np.tensordot(kpts, Rlist, axes=([1], [1])))
|
60
|
+
Mk = np.einsum("rlm, kr -> klm", MR, phase)
|
61
|
+
|
62
|
+
# nkpt, n1, n2 = Mk.shape
|
63
|
+
# nR = Rlist.shape[0]
|
64
|
+
# Mk = np.zeros((nkpt, n1, n2), dtype=complex)
|
65
|
+
# for iR, R in enumerate(Rlist):
|
66
|
+
# for ik in range(nkpt):
|
67
|
+
# Mk[ik] += MR[iR] * np.exp(2.0 * np.pi * 1j * np.dot(kpts[ik], R))
|
68
|
+
return Mk
|
69
|
+
|
70
|
+
|
71
|
+
def R_to_onek(kpt, Rlist, MR):
|
72
|
+
"""
|
73
|
+
Transform real-space wavefunctions to k-space.
|
74
|
+
params:
|
75
|
+
kpt: k-point
|
76
|
+
Rlist: list of R vectors
|
77
|
+
MR: matrix of shape [nR, n1, n2] in R-space.
|
78
|
+
|
79
|
+
return:
|
80
|
+
Mk: matrix of shape [n1, n2], the matrix in k-space.
|
81
|
+
|
82
|
+
"""
|
83
|
+
phase = np.exp(2.0j * np.pi * np.dot(Rlist, kpt))
|
84
|
+
Mk = np.einsum("rlm, r -> lm", MR, phase)
|
85
|
+
return Mk
|
86
|
+
# n1, n2 = MR.shape[1:]
|
87
|
+
# Mk = np.zeros((n1, n2), dtype=complex)
|
88
|
+
# for iR, R in enumerate(Rlist):
|
89
|
+
# Mk += MR[iR] * np.exp(2.0j*np.pi * np.dot(kpt, R))
|
90
|
+
# return Mk
|
TB2J/mathutils/lowdin.py
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
import numpy as np
|
2
|
+
from scipy.linalg import inv, eigh
|
3
|
+
|
4
|
+
|
5
|
+
def Lowdin(S):
|
6
|
+
"""
|
7
|
+
Calculate S^(-1/2).
|
8
|
+
Which is used in lowind's symmetric orthonormalization.
|
9
|
+
psi_prime = S^(-1/2) psi
|
10
|
+
"""
|
11
|
+
eigval, eigvec = eigh(S)
|
12
|
+
return eigvec @ np.diag(np.sqrt(1.0 / eigval)) @ (eigvec.T.conj())
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import numpy as np
|
2
|
+
from TB2J.pauli import pauli_block_all, s0, s1, s2, s3, gather_pauli_blocks
|
3
|
+
|
4
|
+
|
5
|
+
def rotate_Matrix_from_z_to_axis(M, axis, normalize=True):
|
6
|
+
"""
|
7
|
+
Given a spinor matrix M, rotate it from z-axis to axis.
|
8
|
+
The spinor matrix M is a 2x2 matrix, which can be decomposed as I, x, y, z components using Pauli matrices.
|
9
|
+
"""
|
10
|
+
MI, Mx, My, Mz = pauli_block_all(M)
|
11
|
+
axis = axis / np.linalg.norm(axis)
|
12
|
+
# M_new = s0* MI + Mz * (axis[0] * s1 + axis[1] * s2 + axis[2] * s3) *2
|
13
|
+
M_new = gather_pauli_blocks(MI, Mz * axis[0], Mz * axis[1], Mz * axis[2])
|
14
|
+
return M_new
|
15
|
+
|
16
|
+
|
17
|
+
def test_rotate_Matrix_from_z_to_axis():
|
18
|
+
M = np.array([[1.1, 0], [0, 0.9]])
|
19
|
+
print(pauli_block_all(M))
|
20
|
+
Mnew = rotate_Matrix_from_z_to_axis(M, [1, 1, 1])
|
21
|
+
print(pauli_block_all(Mnew))
|
22
|
+
print(Mnew)
|
23
|
+
|
24
|
+
M = np.array(
|
25
|
+
[
|
26
|
+
[-9.90532976e-06 + 0.0j, 0.00000000e00 + 0.0j],
|
27
|
+
[0.00000000e00 + 0.0j, -9.88431291e-06 + 0.0j],
|
28
|
+
]
|
29
|
+
)
|
30
|
+
print(M)
|
31
|
+
print(rotate_Matrix_from_z_to_axis(M, [0, 0, 1]))
|
32
|
+
|
33
|
+
|
34
|
+
if __name__ == "__main__":
|
35
|
+
test_rotate_Matrix_from_z_to_axis()
|
TB2J/patch.py
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
import types
|
2
|
+
from unittest import mock
|
3
|
+
|
4
|
+
class A(object):#but seems to work for old style objects too
|
5
|
+
def funcx(self,x):
|
6
|
+
print("x1=",x)
|
7
|
+
print("called from", self)
|
8
|
+
|
9
|
+
def method(self,x):
|
10
|
+
print("xmethod=",x)
|
11
|
+
print("called from", self)
|
12
|
+
|
13
|
+
def patch_me(target):
|
14
|
+
def method(target,x):
|
15
|
+
print("x=",x)
|
16
|
+
print("called from", target)
|
17
|
+
target.method = types.MethodType(method,target)
|
18
|
+
|
19
|
+
def method(self,x):
|
20
|
+
print("x=",x)
|
21
|
+
print("called from", self)
|
22
|
+
|
23
|
+
@mock.patch("__main__.A")
|
24
|
+
def funcx(self,x):
|
25
|
+
print("new x=",x)
|
26
|
+
print("called from", self)
|
27
|
+
|
28
|
+
A.method=method
|
29
|
+
#add more if needed
|
30
|
+
a = A()
|
31
|
+
print(A.__dict__)
|
32
|
+
print(a)
|
33
|
+
#out: <__main__.A object at 0x2b73ac88bfd0>
|
34
|
+
|
35
|
+
@mock.patch("__main__.a")
|
36
|
+
def funcx(self,x):
|
37
|
+
print("x=",x)
|
38
|
+
print("called from", self)
|
39
|
+
|
40
|
+
a.funcx(3)
|
41
|
+
patch_me(a) #patch instance
|
42
|
+
a.method=method
|
43
|
+
#a.method(5)
|
44
|
+
#out: x= 5
|
45
|
+
#out: called from <__main__.A object at 0x2b73ac88bfd0>
|
46
|
+
patch_me(A)
|
47
|
+
|
48
|
+
a.method(6) #can patch class too
|
49
|
+
#out: x= 6
|
50
|
+
#out: called from <class '__main__.A'>
|
TB2J/pauli.py
CHANGED
@@ -143,7 +143,24 @@ def pauli_block_all(M):
|
|
143
143
|
return MI, Mx, My, Mz
|
144
144
|
|
145
145
|
|
146
|
+
def gather_pauli_blocks(MI, Mx, My, Mz):
|
147
|
+
"""
|
148
|
+
Gather the I, x, y, z component of a matrix.
|
149
|
+
"""
|
150
|
+
return np.kron(MI, s0) + np.kron(Mx, s1) + np.kron(My, s2) + np.kron(Mz, s3)
|
151
|
+
|
152
|
+
|
153
|
+
def test_gather_pauli_blocks():
|
154
|
+
M = np.random.rand(4, 4)
|
155
|
+
MI, Mx, My, Mz = pauli_block_all(M)
|
156
|
+
M2 = gather_pauli_blocks(MI, Mx, My, Mz)
|
157
|
+
assert np.allclose(M, M2)
|
158
|
+
|
159
|
+
|
146
160
|
def op_norm(M):
|
161
|
+
"""
|
162
|
+
Return the operator norm of a matrix.
|
163
|
+
"""
|
147
164
|
return max(svd(M)[1])
|
148
165
|
|
149
166
|
|
TB2J/utils.py
CHANGED
@@ -87,6 +87,7 @@ def auto_assign_wannier_to_atom(positions, atoms, max_distance=0.1, half=False):
|
|
87
87
|
"""
|
88
88
|
pos = np.array(positions)
|
89
89
|
atompos = atoms.get_scaled_positions(wrap=False)
|
90
|
+
cell = atoms.get_cell()
|
90
91
|
ind_atoms = []
|
91
92
|
newpos = []
|
92
93
|
refpos = []
|
@@ -95,8 +96,9 @@ def auto_assign_wannier_to_atom(positions, atoms, max_distance=0.1, half=False):
|
|
95
96
|
dp = p[None, :] - atompos
|
96
97
|
# residual of d
|
97
98
|
r = dp - np.round(dp)
|
99
|
+
r_cart = r @ cell
|
98
100
|
# find the min of residual
|
99
|
-
normd = np.linalg.norm(
|
101
|
+
normd = np.linalg.norm(r_cart, axis=1)
|
100
102
|
iatom = np.argmin(normd)
|
101
103
|
# ref+residual
|
102
104
|
rmin = r[iatom]
|
@@ -330,3 +332,82 @@ def simpson_nonuniform(x, f):
|
|
330
332
|
result += f[N - 1] * (h[N - 1] ** 2 + 3 * h[N - 1] * h[N - 2]) / (6 * h[N - 2])
|
331
333
|
result -= f[N - 2] * h[N - 1] ** 3 / (6 * h[N - 2] * (h[N - 2] + h[N - 1]))
|
332
334
|
return result
|
335
|
+
|
336
|
+
|
337
|
+
def simpson_nonuniform_weight(x):
|
338
|
+
"""
|
339
|
+
Simpson rule for irregularly spaced data.
|
340
|
+
x: list or np.array of floats
|
341
|
+
Sampling points for the function values
|
342
|
+
Returns
|
343
|
+
-------
|
344
|
+
weight : list or np.array of floats
|
345
|
+
weight for the Simpson rule
|
346
|
+
For the function f(x), the integral is approximated as
|
347
|
+
$\int f(x) dx \approx \sum_i weight[i] * f(x[i])$
|
348
|
+
"""
|
349
|
+
|
350
|
+
weight = np.zeros_like(x)
|
351
|
+
N = len(x) - 1
|
352
|
+
h = np.diff(x)
|
353
|
+
|
354
|
+
for i in range(1, N, 2):
|
355
|
+
hph = h[i] + h[i - 1]
|
356
|
+
weight[i] += (h[i] ** 3 + h[i - 1] ** 3 + 3.0 * h[i] * h[i - 1] * hph) / (
|
357
|
+
6 * h[i] * h[i - 1]
|
358
|
+
)
|
359
|
+
weight[i - 1] += (
|
360
|
+
2.0 * h[i - 1] ** 3 - h[i] ** 3 + 3.0 * h[i] * h[i - 1] ** 2
|
361
|
+
) / (6 * h[i - 1] * hph)
|
362
|
+
weight[i + 1] += (
|
363
|
+
2.0 * h[i] ** 3 - h[i - 1] ** 3 + 3.0 * h[i - 1] * h[i] ** 2
|
364
|
+
) / (6 * h[i] * hph)
|
365
|
+
|
366
|
+
if (N + 1) % 2 == 0:
|
367
|
+
weight[N] += (2 * h[N - 1] ** 2 + 3.0 * h[N - 2] * h[N - 1]) / (
|
368
|
+
6 * (h[N - 2] + h[N - 1])
|
369
|
+
)
|
370
|
+
weight[N - 1] += (h[N - 1] ** 2 + 3 * h[N - 1] * h[N - 2]) / (6 * h[N - 2])
|
371
|
+
weight[N - 2] -= h[N - 1] ** 3 / (6 * h[N - 2] * (h[N - 2] + h[N - 1]))
|
372
|
+
return weight
|
373
|
+
|
374
|
+
|
375
|
+
def trapz_nonuniform_weight(x):
|
376
|
+
"""
|
377
|
+
trapezoidal rule for irregularly spaced data.
|
378
|
+
x: list or np.array of floats
|
379
|
+
Sampling points for the function values
|
380
|
+
Returns
|
381
|
+
-------
|
382
|
+
weight : list or np.array of floats
|
383
|
+
weight for the trapezoidal rule
|
384
|
+
For the function f(x), the integral is approximated as
|
385
|
+
$\int f(x) dx \approx \sum_i weight[i] * f(x[i])$
|
386
|
+
"""
|
387
|
+
h = np.diff(x)
|
388
|
+
weight = np.zeros_like(x)
|
389
|
+
weight[0] = h[0] / 2.0
|
390
|
+
weight[1:-1] = (h[1:] + h[:-1]) / 2.0
|
391
|
+
weight[-1] = h[-1] / 2.0
|
392
|
+
return weight
|
393
|
+
|
394
|
+
|
395
|
+
def test_simpson_nonuniform():
|
396
|
+
x = np.array([0.0, 0.1, 0.3, 0.5, 0.8, 1.0])
|
397
|
+
w = simpson_nonuniform_weight(x)
|
398
|
+
# assert np.allclose(w, [0.1, 0.4, 0.4, 0.4, 0.4, 0.1])
|
399
|
+
assert np.allclose(simpson_nonuniform(x, x**8), 0.12714277533333335)
|
400
|
+
print("simpson_weight:", simpson_nonuniform_weight(x) @ x**8, 0.12714277533333335)
|
401
|
+
print("trapz_weight:", trapz_nonuniform_weight(x) @ x**8)
|
402
|
+
|
403
|
+
x2 = np.linspace(0, 1, 500)
|
404
|
+
print(simpson_nonuniform_weight(x2) @ x2**8, 1 / 9.0)
|
405
|
+
print(simpson_nonuniform_weight(x2) @ x2**8)
|
406
|
+
print("simpson_weight:", simpson_nonuniform_weight(x2) @ x2**8)
|
407
|
+
print("trapz_weight:", trapz_nonuniform_weight(x2) @ x2**8)
|
408
|
+
|
409
|
+
assert np.allclose(simpson_nonuniform(x, x**8), 1 / 9.0)
|
410
|
+
|
411
|
+
|
412
|
+
if __name__ == "__main__":
|
413
|
+
test_simpson_nonuniform()
|
@@ -58,6 +58,13 @@ def main():
|
|
58
58
|
default=False,
|
59
59
|
)
|
60
60
|
|
61
|
+
parser.add_argument(
|
62
|
+
"--method",
|
63
|
+
help="The method to downfold the exchange parameter. Options are Lowdin and PWF (projected Wannier function). ",
|
64
|
+
type=str,
|
65
|
+
default="Lowdin",
|
66
|
+
)
|
67
|
+
|
61
68
|
args = parser.parse_args()
|
62
69
|
|
63
70
|
if len(args.metals) == []:
|
@@ -73,6 +80,7 @@ def main():
|
|
73
80
|
outpath=args.outpath,
|
74
81
|
qmesh=args.qmesh,
|
75
82
|
iso_only=args.iso_only,
|
83
|
+
method=args.method,
|
76
84
|
)
|
77
85
|
|
78
86
|
|
@@ -1,12 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: TB2J
|
3
|
-
Version: 0.9.0
|
3
|
+
Version: 0.9.0.2
|
4
4
|
Summary: TB2J: First principle to Heisenberg exchange J using tight-binding Green function method
|
5
|
-
Home-page: UNKNOWN
|
6
5
|
Author: Xu He
|
7
6
|
Author-email: mailhexu@gmail.com
|
8
7
|
License: BSD-2-clause
|
9
|
-
Platform: UNKNOWN
|
10
8
|
Classifier: Development Status :: 3 - Alpha
|
11
9
|
Classifier: Programming Language :: Python :: 3
|
12
10
|
Classifier: Operating System :: OS Independent
|
@@ -16,14 +14,13 @@ Classifier: Topic :: Scientific/Engineering :: Physics
|
|
16
14
|
Classifier: License :: OSI Approved :: BSD License
|
17
15
|
Requires-Python: >=3.6
|
18
16
|
License-File: LICENSE
|
19
|
-
Requires-Dist:
|
17
|
+
Requires-Dist: numpy >1.16.5
|
18
|
+
Requires-Dist: scipy
|
20
19
|
Requires-Dist: matplotlib
|
21
|
-
Requires-Dist:
|
22
|
-
Requires-Dist:
|
20
|
+
Requires-Dist: ase >=3.19
|
21
|
+
Requires-Dist: tqdm
|
23
22
|
Requires-Dist: pathos
|
23
|
+
Requires-Dist: packaging >=20.0
|
24
24
|
Requires-Dist: pre-commit
|
25
|
-
Requires-Dist: scipy
|
26
|
-
Requires-Dist: tqdm
|
27
25
|
|
28
26
|
TB2J is a Python package aimed to compute automatically the magnetic interactions (superexchange and Dzyaloshinskii-Moriya) between atoms of magnetic crystals from DFT Hamiltonian based on Wannier functions or Linear combination of atomic orbitals. It uses the Green's function method and take the local rigid spin rotation as a perturbation. The package can take the output from Wannier90, which is interfaced with many density functional theory codes or from codes based on localised orbitals. A minimal user input is needed, which allows for an easily integration into a high-throughput workflows.
|
29
|
-
|
@@ -1,20 +1,21 @@
|
|
1
|
-
TB2J/Jdownfolder.py,sha256=
|
2
|
-
TB2J/Jtensor.py,sha256=
|
1
|
+
TB2J/Jdownfolder.py,sha256=Rmg6KfQ-Lkhei5daTJ2POzr0XL-R1WM-rzUnDcfoDhc,9595
|
2
|
+
TB2J/Jtensor.py,sha256=t6OsqrSlYW6Im4H7ykVAW8Al_pFXN4C5yj2UEsV6r7g,3181
|
3
|
+
TB2J/MAE.py,sha256=-KWqxjKJvPFuxsMjm0c3nESyUFDeFTqsV7QzPJN-Fxo,7579
|
3
4
|
TB2J/Oiju.py,sha256=cNGv8N5uH_swGq7cnAt2OyiDfqtjLlLrwseGu0E4iaM,3383
|
4
5
|
TB2J/Oiju_epc.py,sha256=oytM3NYW7nWmklrGgNlqwIpI_JYv_hb7ZnR4o9nYNog,6809
|
5
|
-
TB2J/__init__.py,sha256=
|
6
|
+
TB2J/__init__.py,sha256=hcEWkag_UvLm1ZSbjsgcTWkGVlR3Bwmzg1QYAwsvf-g,24
|
6
7
|
TB2J/basis.py,sha256=DFo6_QUwjBwisP6zGxvoO0lpGTMDPAOkiL9giNCjOjA,1558
|
7
8
|
TB2J/citation.py,sha256=gcQeyJZaT1Qrtsl8Y3s4neOH3-vvgmIcCvXeV2o3vj0,2891
|
8
9
|
TB2J/contour.py,sha256=aw8LX6wVFCRPhcpkzuI0jGnHisvk4cezvUhkF_6Yx94,2633
|
9
10
|
TB2J/cut_cell.py,sha256=kr9WeQhBQLm8QXL2B3NcsSYmSw-OAtJk3f9wksAOZbs,2952
|
10
11
|
TB2J/density_matrix.py,sha256=D5k8Oe21OCiLVORNYbo4TZOFG0slrQSbj91kJ3TMFjs,1514
|
11
12
|
TB2J/epc.py,sha256=zLbtqZJhDr8DnnGN6YENcXwrMb3Qxu6KB08mLy9Pw20,3474
|
12
|
-
TB2J/exchange.py,sha256=
|
13
|
+
TB2J/exchange.py,sha256=dsXQhlxXaBurxa7z3YkBjqmEFFtfEy1xaHf0VT3eKZE,29581
|
13
14
|
TB2J/exchangeCL2.py,sha256=TIr-d2X56AiGe4qEhyXyZhRuwXvQG6clJMwDmjnTOaE,10985
|
14
15
|
TB2J/exchange_pert.py,sha256=jmFMtQbYa_uczM4VAeS6TijkIHRFIqEzZJswzE9Wfuo,8523
|
15
16
|
TB2J/exchange_qspace.py,sha256=ZL68qBGFUaQ9BsSPsJaaoWOr9RssPiqX34R_9I3nk_8,8436
|
16
17
|
TB2J/gpaw_wrapper.py,sha256=aJ--9Dtyq7jOP1Hkh-Sh1nWcfXm6zKcljOCO0DNCAr0,6890
|
17
|
-
TB2J/green.py,sha256=
|
18
|
+
TB2J/green.py,sha256=QAJbDaR91QLres5gUPk37iqVsuQdPTt92VtEYLCl240,13170
|
18
19
|
TB2J/greentest.py,sha256=2ISSfhor9ecSEOi_E6b4Cv26wEIQlwlzca0ru8z44_E,1603
|
19
20
|
TB2J/io_merge.py,sha256=t85k3L6IL9X5ys-PWK7CzResb3xJsyqM3LAlKPUe9vM,6825
|
20
21
|
TB2J/kpoints.py,sha256=6XK2KqTncidEq3o9GuO6VEZRPNTRtWeXg9QfcV-9smI,532
|
@@ -22,7 +23,8 @@ TB2J/manager.py,sha256=4-4x9jJRHpUEqJuhc5HqpXfh2-Ze5G9Wg8gOtn-AqR4,15372
|
|
22
23
|
TB2J/mathutils.py,sha256=tHA6q3KPDpXLIbZHdDZ2NU5s886VVM_oEG490zQ6Ris,300
|
23
24
|
TB2J/myTB.py,sha256=ok_B4my29bOIghMSZfx0Es6G8FaXaIiLP4gPxTdSj00,17659
|
24
25
|
TB2J/orbmap.py,sha256=RCMJkOPGbfPrcZzcc5ia1ZMKBQWxGcyj8W1ve8BJaEw,6669
|
25
|
-
TB2J/
|
26
|
+
TB2J/patch.py,sha256=Z3KZklID9U8zKuk6Ek1Tq95JcY3eT4770dsdcXz6mAA,1067
|
27
|
+
TB2J/pauli.py,sha256=zOELm7Vgxw6SMaO5l7qVWx1pBKZt25RLnEpnVM3dz_0,4545
|
26
28
|
TB2J/pert.py,sha256=RaCJfewl0doht4cjAnzzGKe-uj2le4aqe0iPKFrq9fo,1192
|
27
29
|
TB2J/plot.py,sha256=AnFIFWE2vlmj7Z6f_7-dX_O1stJN-qbuiurPj43dUCM,4104
|
28
30
|
TB2J/rotate_atoms.py,sha256=Dwptn-wdDW4zYzjYb95yxTzuZOe9WPuLjh3d3-YcSs0,3277
|
@@ -31,14 +33,17 @@ TB2J/sisl_wrapper.py,sha256=A5x1-tt8efUSPeGY5wM5m6-pJYQFXTCzQHVqD6RBa2g,14792
|
|
31
33
|
TB2J/supercell.py,sha256=4hgLGPBLRUDhtD-eF29v46ex7fHdkH-OENjS2wGLFww,19588
|
32
34
|
TB2J/tensor_rotate.py,sha256=4-DfT_Mg5e40fbd74M5W0D5DqmUq-kVOOLDkkkI834A,8083
|
33
35
|
TB2J/utest.py,sha256=z_ahi7tpHQF9WlHNQihcQ7qzfezRJQXQt28eB1X_z64,3897
|
34
|
-
TB2J/utils.py,sha256=
|
36
|
+
TB2J/utils.py,sha256=DHkc7BK0KUGesfoAv1OxMgIw_iZzcFXh--3ybsFSd_c,12535
|
35
37
|
TB2J/versioninfo.py,sha256=wZwS9QDFRVDe7rf8JyPDDI8UGdTQiO6Pb_sWv8GAegA,337
|
38
|
+
TB2J/abacus/MAE.py,sha256=q9aSVDRZFAnZL3gHdNmde7sxj80oe-BRjwDO-ipyfew,12237
|
36
39
|
TB2J/abacus/__init__.py,sha256=5sHiDnF2L-Y80QeET9zOiS83a5T_TQAXvnIhcYB6wNU,56
|
37
40
|
TB2J/abacus/abacus_api.py,sha256=D_NyXW-Pno92d3RVHByx0l1HDPHQAvXsmQVt8cfIGR8,7267
|
38
|
-
TB2J/abacus/abacus_wrapper.py,sha256=
|
41
|
+
TB2J/abacus/abacus_wrapper.py,sha256=PaO7qEE-h1tv2nKsV8h2RZUrmAWjkw8MKapj8Fk9U5s,9006
|
39
42
|
TB2J/abacus/gen_exchange_abacus.py,sha256=lKZqkWMnLQtaSwgn8O5Fzr-pV6tzwoMqfZU_vbET6gU,2973
|
43
|
+
TB2J/abacus/occupations.py,sha256=vaMVeZwldgzGDxjA7i3-2-V6akXjpgJwJFWKozJ-l2k,8947
|
40
44
|
TB2J/abacus/orbital_api.py,sha256=l48Hn5z7TA0TH7Is4NDmz74b6B9L2ztYO4dRR37U4mQ,1562
|
41
45
|
TB2J/abacus/stru_api.py,sha256=aBKKlZ2hvAZChVCfNxRdxH51rfHKqZn6kOlazY-yW8k,67888
|
46
|
+
TB2J/abacus/test_density_matrix.py,sha256=f0xHOTzIssT-XTvBJrQHU0JVbvBYOE1Mduh-j7qiLO8,774
|
42
47
|
TB2J/abacus/test_read_HRSR.py,sha256=cAT-e79jGjCBXLTJ9UYX0WvalG_yD4Awl79tTOUcwaQ,1254
|
43
48
|
TB2J/abacus/test_read_stru.py,sha256=CpK4zWhlCVAMCmYQmp9Hy-A40OblZQLFpo5JokpNcWQ,785
|
44
49
|
TB2J/external/__init__.py,sha256=yD_ZIMi76H49rj6GAQpiB7UlKa3TgSaMkkLHT6M-8w8,137
|
@@ -51,6 +56,11 @@ TB2J/io_exchange/io_tomsasd.py,sha256=NqkAC1Fl-CUnFA21eBzSy_S5F_oeQFJysw4UukQbN8
|
|
51
56
|
TB2J/io_exchange/io_txt.py,sha256=BMr1eSILlKpgtjvDx7uw2VMAkEKSvGEPNxpaT_zev0I,10547
|
52
57
|
TB2J/io_exchange/io_uppasd.py,sha256=bI4iPEgnK4TvCZNvb6x2xYXgjW7pEehCqmcizy2pqFU,3301
|
53
58
|
TB2J/io_exchange/io_vampire.py,sha256=UllC4twf06_q2vBCnAYFzEDGvS8mSefwQXDquBuyc0M,5583
|
59
|
+
TB2J/mathutils/__init__.py,sha256=tQLBfHkZqdVfVxPOahy42qMUkFYnFFFhM-uc4QsYFxI,27
|
60
|
+
TB2J/mathutils/fermi.py,sha256=tzEicVoxE_5DxPDDZMvi4ynR1_Iqf-Qh0-0zfm-iVBo,480
|
61
|
+
TB2J/mathutils/kR_convert.py,sha256=p_9XWJVNanTzTK2rI6KRjTkbSq42la6N448-zJOsMwY,2671
|
62
|
+
TB2J/mathutils/lowdin.py,sha256=tHA6q3KPDpXLIbZHdDZ2NU5s886VVM_oEG490zQ6Ris,300
|
63
|
+
TB2J/mathutils/rotate_spin.py,sha256=XtfwHGfIqI9nRYZcCd_yQ3Ud1AXVJj9fwqIHloMcaCs,1111
|
54
64
|
TB2J/spinham/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
65
|
TB2J/spinham/base_parser.py,sha256=oQRHvFE_BlUtTaTZykKgvicu40oXcbICB-D1aAt-qlA,2196
|
56
66
|
TB2J/spinham/constants.py,sha256=y4-hRyl5EAR42k24Oa5XhAsUQtKVn1MAgyqNf-p3PrM,762
|
@@ -66,18 +76,18 @@ TB2J/spinham/supercell.py,sha256=y17uUC6r3gQb278FhxIW4CABihfLTvKFj6flyXrCPR8,122
|
|
66
76
|
TB2J/wannier/__init__.py,sha256=7ojCbM84PYv1X1Tbo4NHI-d3gWmQsZB_xiYqbfxVV1E,80
|
67
77
|
TB2J/wannier/w90_parser.py,sha256=dbd63LuKyv2DVUzqRINGsbDzEsOxsQyE8_Ear_LQIRg,4620
|
68
78
|
TB2J/wannier/w90_tb_parser.py,sha256=qt8pnuprmPp9iIAYwPkPbmEzk6ZPgMq2xognoQp7vwc,4610
|
69
|
-
TB2J-0.9.0.data/scripts/TB2J_downfold.py,sha256=
|
70
|
-
TB2J-0.9.0.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
|
71
|
-
TB2J-0.9.0.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
|
72
|
-
TB2J-0.9.0.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
|
73
|
-
TB2J-0.9.0.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
|
74
|
-
TB2J-0.9.0.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
|
75
|
-
TB2J-0.9.0.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
|
76
|
-
TB2J-0.9.0.data/scripts/abacus2J.py,sha256=M4B07lvTCDczTPTqvnDh_PERzCARAd09TLKv4aIdSQM,4408
|
77
|
-
TB2J-0.9.0.data/scripts/siesta2J.py,sha256=hBzS7ZgoHM3oXlTCQd-xVA07Ks2FiIwyRpQWUFITRPE,4303
|
78
|
-
TB2J-0.9.0.data/scripts/wann2J.py,sha256=2t2hWwyELskYCwkGDziCgiIAnfr6odLLJ6cQBJ2RQwQ,5714
|
79
|
-
TB2J-0.9.0.dist-info/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
|
80
|
-
TB2J-0.9.0.dist-info/METADATA,sha256=
|
81
|
-
TB2J-0.9.0.dist-info/WHEEL,sha256=
|
82
|
-
TB2J-0.9.0.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
|
83
|
-
TB2J-0.9.0.dist-info/RECORD,,
|
79
|
+
TB2J-0.9.0.2.data/scripts/TB2J_downfold.py,sha256=i4BVqnpDdgrX_amookVWeLGefGBn-qeAutWiwuY9SfQ,2099
|
80
|
+
TB2J-0.9.0.2.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
|
81
|
+
TB2J-0.9.0.2.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
|
82
|
+
TB2J-0.9.0.2.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
|
83
|
+
TB2J-0.9.0.2.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
|
84
|
+
TB2J-0.9.0.2.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
|
85
|
+
TB2J-0.9.0.2.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
|
86
|
+
TB2J-0.9.0.2.data/scripts/abacus2J.py,sha256=M4B07lvTCDczTPTqvnDh_PERzCARAd09TLKv4aIdSQM,4408
|
87
|
+
TB2J-0.9.0.2.data/scripts/siesta2J.py,sha256=hBzS7ZgoHM3oXlTCQd-xVA07Ks2FiIwyRpQWUFITRPE,4303
|
88
|
+
TB2J-0.9.0.2.data/scripts/wann2J.py,sha256=2t2hWwyELskYCwkGDziCgiIAnfr6odLLJ6cQBJ2RQwQ,5714
|
89
|
+
TB2J-0.9.0.2.dist-info/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
|
90
|
+
TB2J-0.9.0.2.dist-info/METADATA,sha256=WhFy-Jej3lhp1tyTWrIr_J4hbutGY_DD1S5zJk1YqYk,1420
|
91
|
+
TB2J-0.9.0.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
92
|
+
TB2J-0.9.0.2.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
|
93
|
+
TB2J-0.9.0.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|