TB2J 0.9.5rc0__py3-none-any.whl → 0.9.7rc0__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/MAE.py +144 -27
- TB2J/MAEGreen.py +84 -0
- TB2J/anisotropy.py +672 -0
- TB2J/contour.py +8 -0
- TB2J/exchange.py +38 -172
- TB2J/exchangeCL2.py +11 -13
- TB2J/exchange_params.py +213 -0
- TB2J/green.py +62 -27
- TB2J/interfaces/__init__.py +12 -0
- TB2J/interfaces/abacus/__init__.py +4 -0
- TB2J/{abacus → interfaces/abacus}/abacus_api.py +3 -3
- TB2J/{abacus → interfaces/abacus}/abacus_wrapper.py +11 -8
- TB2J/{abacus → interfaces/abacus}/gen_exchange_abacus.py +5 -3
- TB2J/{abacus → interfaces/abacus}/orbital_api.py +4 -4
- TB2J/{abacus → interfaces/abacus}/stru_api.py +11 -11
- TB2J/{abacus → interfaces/abacus}/test_read_HRSR.py +0 -1
- TB2J/{abacus → interfaces/abacus}/test_read_stru.py +5 -3
- TB2J/interfaces/gpaw_interface.py +54 -0
- TB2J/interfaces/lawaf_interface.py +129 -0
- TB2J/interfaces/manager.py +23 -0
- TB2J/interfaces/siesta_interface.py +202 -0
- TB2J/interfaces/wannier90_interface.py +115 -0
- TB2J/io_exchange/io_exchange.py +21 -7
- TB2J/io_merge.py +2 -1
- TB2J/mathutils/fermi.py +11 -6
- TB2J/mathutils/lowdin.py +12 -2
- TB2J/mathutils/rotate_spin.py +222 -4
- TB2J/pauli.py +11 -3
- TB2J/symmetrize_J.py +120 -0
- TB2J/utils.py +82 -1
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/abacus2J.py +5 -4
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/siesta2J.py +21 -4
- TB2J-0.9.7rc0.data/scripts/wann2J.py +96 -0
- {TB2J-0.9.5rc0.dist-info → TB2J-0.9.7rc0.dist-info}/METADATA +5 -3
- {TB2J-0.9.5rc0.dist-info → TB2J-0.9.7rc0.dist-info}/RECORD +47 -46
- {TB2J-0.9.5rc0.dist-info → TB2J-0.9.7rc0.dist-info}/WHEEL +1 -1
- TB2J-0.9.7rc0.dist-info/entry_points.txt +3 -0
- TB2J/abacus/MAE.py +0 -320
- TB2J/abacus/__init__.py +0 -1
- TB2J/abacus/occupations.py +0 -278
- TB2J/cut_cell.py +0 -82
- TB2J/io_exchange/io_pickle.py +0 -0
- TB2J/manager.py +0 -445
- TB2J/mathutils.py +0 -12
- TB2J/patch.py +0 -50
- TB2J/spinham/h_matrix.py +0 -68
- TB2J/spinham/obtain_J.py +0 -79
- TB2J/supercell.py +0 -532
- TB2J-0.9.5rc0.data/scripts/wann2J.py +0 -194
- TB2J/{abacus → interfaces/abacus}/test_density_matrix.py +1 -1
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_downfold.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_eigen.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_magnon.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_magnon_dos.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_merge.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_rotate.py +0 -0
- {TB2J-0.9.5rc0.data → TB2J-0.9.7rc0.data}/scripts/TB2J_rotateDM.py +0 -0
- {TB2J-0.9.5rc0.dist-info → TB2J-0.9.7rc0.dist-info}/LICENSE +0 -0
- {TB2J-0.9.5rc0.dist-info → TB2J-0.9.7rc0.dist-info}/top_level.txt +0 -0
TB2J/pauli.py
CHANGED
@@ -148,7 +148,13 @@ def gather_pauli_blocks(MI, Mx, My, Mz, coeffs=[1.0, 1.0, 1.0, 1.0]):
|
|
148
148
|
Gather the I, x, y, z component of a matrix.
|
149
149
|
"""
|
150
150
|
cI, cx, cy, cz = coeffs
|
151
|
-
return
|
151
|
+
return (
|
152
|
+
cI * np.kron(MI, s0)
|
153
|
+
+ cx * np.kron(Mx, s1)
|
154
|
+
+ cy * np.kron(My, s2)
|
155
|
+
+ cz * np.kron(Mz, s3)
|
156
|
+
)
|
157
|
+
|
152
158
|
|
153
159
|
def pauli_part(M, coeffs=[1.0, 1.0, 1.0, 1.0]):
|
154
160
|
"""
|
@@ -157,23 +163,25 @@ def pauli_part(M, coeffs=[1.0, 1.0, 1.0, 1.0]):
|
|
157
163
|
MI, Mx, My, Mz = pauli_block_all(M)
|
158
164
|
return gather_pauli_blocks(MI, Mx, My, Mz, coeffs=coeffs)
|
159
165
|
|
166
|
+
|
160
167
|
def chargepart(M):
|
161
168
|
"""
|
162
169
|
Get the charge part of a matrix.
|
163
170
|
"""
|
164
171
|
MI = (M[::2, ::2] + M[1::2, 1::2]) / 2.0
|
165
172
|
Mcopy = np.zeros_like(M)
|
166
|
-
Mcopy[::2, ::2]
|
173
|
+
Mcopy[::2, ::2] = MI
|
167
174
|
Mcopy[1::2, 1::2] = MI
|
168
175
|
return Mcopy
|
169
176
|
|
177
|
+
|
170
178
|
def spinpart(M):
|
171
179
|
"""
|
172
180
|
Get the spin part of a matrix.
|
173
181
|
"""
|
174
182
|
MI = (M[::2, ::2] + M[1::2, 1::2]) / 2.0
|
175
183
|
Mcopy = M.copy()
|
176
|
-
Mcopy[::2, ::2]
|
184
|
+
Mcopy[::2, ::2] -= MI
|
177
185
|
Mcopy[1::2, 1::2] -= MI
|
178
186
|
return Mcopy
|
179
187
|
|
TB2J/symmetrize_J.py
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
from sympair import SymmetryPairFinder, SymmetryPairGroupDict
|
2
|
+
import numpy as np
|
3
|
+
from pathlib import Path
|
4
|
+
from TB2J.versioninfo import print_license
|
5
|
+
import copy
|
6
|
+
|
7
|
+
|
8
|
+
class TB2JSymmetrizer:
|
9
|
+
def __init__(self, exc, symprec=1e-8, verbose=True):
|
10
|
+
# list of pairs with the index of atoms
|
11
|
+
ijRs = exc.ijR_list_index_atom()
|
12
|
+
finder = SymmetryPairFinder(atoms=exc.atoms, pairs=ijRs, symprec=symprec)
|
13
|
+
self.verbose = verbose
|
14
|
+
|
15
|
+
if verbose:
|
16
|
+
print("=" * 30)
|
17
|
+
print_license()
|
18
|
+
print("-" * 30)
|
19
|
+
print(
|
20
|
+
"WARNING: The symmetry detection is based on the crystal symmetry, not the magnetic symmetry. Make sure if this is what you want."
|
21
|
+
)
|
22
|
+
print("-" * 30)
|
23
|
+
if exc.has_dmi:
|
24
|
+
print(
|
25
|
+
"WARNING: Currently only the isotropic exchange is symmetrized. Symmetrization of DMI and anisotropic exchange are not yet implemented."
|
26
|
+
)
|
27
|
+
|
28
|
+
print(f"Finding crystal symmetry with symprec of {symprec} Angstrom.")
|
29
|
+
print("Symmetry found:")
|
30
|
+
print(finder.spacegroup)
|
31
|
+
print(f"-" * 30)
|
32
|
+
self.pgdict = finder.get_symmetry_pair_group_dict()
|
33
|
+
self.exc = exc
|
34
|
+
self.new_exc = copy.deepcopy(exc)
|
35
|
+
|
36
|
+
def print_license(self):
|
37
|
+
print_license()
|
38
|
+
|
39
|
+
def symmetrize_J(self):
|
40
|
+
"""
|
41
|
+
Symmetrize the exchange parameters J.
|
42
|
+
"""
|
43
|
+
symJdict = {}
|
44
|
+
Jdict = self.exc.exchange_Jdict
|
45
|
+
ngroup = self.pgdict
|
46
|
+
for pairgroup in self.pgdict.groups:
|
47
|
+
ijRs = pairgroup.get_all_ijR()
|
48
|
+
ijRs_spin = [self.exc.ijR_index_atom_to_spin(*ijR) for ijR in ijRs]
|
49
|
+
Js = [self.exc.get_J(*ijR_spin) for ijR_spin in ijRs_spin]
|
50
|
+
Javg = np.average(Js)
|
51
|
+
for i, j, R in ijRs_spin:
|
52
|
+
symJdict[(R, i, j)] = Javg
|
53
|
+
self.new_exc.exchange_Jdict = symJdict
|
54
|
+
|
55
|
+
def output(self, path="TB2J_symmetrized"):
|
56
|
+
if path is None:
|
57
|
+
path = Path(".")
|
58
|
+
self.new_exc.write_all(path=path)
|
59
|
+
|
60
|
+
def run(self, path=None):
|
61
|
+
print("** Symmetrizing exchange parameters.")
|
62
|
+
self.symmetrize_J()
|
63
|
+
print("** Outputing the symmetrized exchange parameters.")
|
64
|
+
print(f"** Output path: {path} .")
|
65
|
+
self.output(path=path)
|
66
|
+
print("** Finished.")
|
67
|
+
|
68
|
+
|
69
|
+
def symmetrize_J(
|
70
|
+
exc=None,
|
71
|
+
path=None,
|
72
|
+
fname="TB2J.pickle",
|
73
|
+
symprec=1e-5,
|
74
|
+
output_path="TB2J_symmetrized",
|
75
|
+
):
|
76
|
+
"""
|
77
|
+
symmetrize the exchange parameters
|
78
|
+
parameters:
|
79
|
+
exc: exchange
|
80
|
+
"""
|
81
|
+
if exc is None:
|
82
|
+
exc = SpinIO.load_pickle(path=path, fname=fname)
|
83
|
+
symmetrizer = TB2JSymmetrizer(exc, symprec=symprec)
|
84
|
+
symmetrizer.run(path=output_path)
|
85
|
+
|
86
|
+
|
87
|
+
def symmetrize_J_cli():
|
88
|
+
from argparse import ArgumentParser
|
89
|
+
|
90
|
+
parser = ArgumentParser(
|
91
|
+
description="Symmetrize exchange parameters. Currently, it take the crystal symmetry into account and not the magnetic moment into account."
|
92
|
+
)
|
93
|
+
parser.add_argument(
|
94
|
+
"-i",
|
95
|
+
"--inpath",
|
96
|
+
default=None,
|
97
|
+
help="input path to the exchange parameters",
|
98
|
+
)
|
99
|
+
parser.add_argument(
|
100
|
+
"-o",
|
101
|
+
"--outpath",
|
102
|
+
default="TB2J_results_symmetrized",
|
103
|
+
help="output path to the symmetrized exchange parameters",
|
104
|
+
)
|
105
|
+
parser.add_argument(
|
106
|
+
"-s",
|
107
|
+
"--symprec",
|
108
|
+
type=float,
|
109
|
+
default=1e-5,
|
110
|
+
help="precision for symmetry detection. default is 1e-5 Angstrom",
|
111
|
+
)
|
112
|
+
args = parser.parse_args()
|
113
|
+
if args.inpath is None:
|
114
|
+
parser.print_help()
|
115
|
+
raise ValueError("Please provide the input path to the exchange.")
|
116
|
+
symmetrize_J(path=args.inpath, output_path=args.outpath, symprec=args.symprec)
|
117
|
+
|
118
|
+
|
119
|
+
if __name__ == "__main__":
|
120
|
+
symmetrize_J_cli()
|
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()
|
@@ -1,8 +1,9 @@
|
|
1
1
|
#!python
|
2
|
-
from TB2J.abacus.gen_exchange_abacus import gen_exchange_abacus
|
3
|
-
from TB2J.versioninfo import print_license
|
4
|
-
import sys
|
5
2
|
import argparse
|
3
|
+
import sys
|
4
|
+
|
5
|
+
from TB2J.interfaces import gen_exchange_abacus
|
6
|
+
from TB2J.versioninfo import print_license
|
6
7
|
|
7
8
|
|
8
9
|
def run_abacus2J():
|
@@ -141,7 +142,7 @@ def run_abacus2J():
|
|
141
142
|
description=args.description,
|
142
143
|
output_path=args.output_path,
|
143
144
|
use_cache=args.use_cache,
|
144
|
-
|
145
|
+
nproc=args.np,
|
145
146
|
exclude_orbs=args.exclude_orbs,
|
146
147
|
orb_decomposition=args.orb_decomposition,
|
147
148
|
)
|
@@ -1,8 +1,9 @@
|
|
1
1
|
#!python
|
2
|
-
from TB2J.manager import gen_exchange_siesta
|
3
|
-
from TB2J.versioninfo import print_license
|
4
|
-
import sys
|
5
2
|
import argparse
|
3
|
+
import sys
|
4
|
+
|
5
|
+
from TB2J.interfaces import gen_exchange_siesta
|
6
|
+
from TB2J.versioninfo import print_license
|
6
7
|
|
7
8
|
|
8
9
|
def run_siesta2J():
|
@@ -107,6 +108,20 @@ def run_siesta2J():
|
|
107
108
|
default="TB2J_results",
|
108
109
|
)
|
109
110
|
|
111
|
+
parser.add_argument(
|
112
|
+
"--split_soc",
|
113
|
+
help="whether the SOC part of the Hamiltonian can be read from the output of siesta. Default: False",
|
114
|
+
action="store_true",
|
115
|
+
default=False,
|
116
|
+
)
|
117
|
+
|
118
|
+
parser.add_argument(
|
119
|
+
"--orth",
|
120
|
+
help="whether to use orthogonalization before the diagonization of the electron Hamiltonian. Default: False",
|
121
|
+
action="store_true",
|
122
|
+
default=False,
|
123
|
+
)
|
124
|
+
|
110
125
|
args = parser.parse_args()
|
111
126
|
|
112
127
|
if args.elements is None:
|
@@ -134,9 +149,11 @@ def run_siesta2J():
|
|
134
149
|
description=args.description,
|
135
150
|
output_path=args.output_path,
|
136
151
|
use_cache=args.use_cache,
|
137
|
-
|
152
|
+
nproc=args.np,
|
138
153
|
exclude_orbs=args.exclude_orbs,
|
139
154
|
orb_decomposition=args.orb_decomposition,
|
155
|
+
read_H_soc=args.split_soc,
|
156
|
+
orth=args.orth,
|
140
157
|
)
|
141
158
|
|
142
159
|
|
@@ -0,0 +1,96 @@
|
|
1
|
+
#!python
|
2
|
+
import argparse
|
3
|
+
import sys
|
4
|
+
|
5
|
+
from TB2J.exchange_params import add_exchange_args_to_parser
|
6
|
+
from TB2J.interfaces import gen_exchange
|
7
|
+
from TB2J.versioninfo import print_license
|
8
|
+
|
9
|
+
|
10
|
+
def run_wann2J():
|
11
|
+
print_license()
|
12
|
+
parser = argparse.ArgumentParser(
|
13
|
+
description="wann2J: Using magnetic force theorem to calculate exchange parameter J from wannier functions"
|
14
|
+
)
|
15
|
+
parser.add_argument(
|
16
|
+
"--path", help="path to the wannier files", default="./", type=str
|
17
|
+
)
|
18
|
+
parser.add_argument(
|
19
|
+
"--posfile", help="name of the position file", default="POSCAR", type=str
|
20
|
+
)
|
21
|
+
parser.add_argument(
|
22
|
+
"--prefix_spinor",
|
23
|
+
help="prefix to the spinor wannier files",
|
24
|
+
default="wannier90",
|
25
|
+
type=str,
|
26
|
+
)
|
27
|
+
parser.add_argument(
|
28
|
+
"--prefix_up",
|
29
|
+
help="prefix to the spin up wannier files",
|
30
|
+
default="wannier90.up",
|
31
|
+
type=str,
|
32
|
+
)
|
33
|
+
parser.add_argument(
|
34
|
+
"--prefix_down",
|
35
|
+
help="prefix to the spin down wannier files",
|
36
|
+
default="wannier90.dn",
|
37
|
+
type=str,
|
38
|
+
)
|
39
|
+
parser.add_argument(
|
40
|
+
"--groupby",
|
41
|
+
help="In the spinor case, the order of the orbitals have two conventions: 1: group by spin (orb1_up, orb2_up,... orb1_down, ...), 2,group by orbital (orb1_up, orb1_down, orb2_up, ...,). Use 'spin' in the former case and 'orbital' in the latter case. The default is spin.",
|
42
|
+
default="spin",
|
43
|
+
type=str,
|
44
|
+
)
|
45
|
+
parser.add_argument(
|
46
|
+
"--wannier_type",
|
47
|
+
help="The type of Wannier function, either Wannier90 or banddownfolder",
|
48
|
+
type=str,
|
49
|
+
default="Wannier90",
|
50
|
+
)
|
51
|
+
|
52
|
+
# parser.add_argument("--qspace",
|
53
|
+
# action="store_true",
|
54
|
+
# help="Whether to calculate J in qspace first and transform to real space.",
|
55
|
+
# default=False)
|
56
|
+
|
57
|
+
add_exchange_args_to_parser(parser)
|
58
|
+
|
59
|
+
args = parser.parse_args()
|
60
|
+
|
61
|
+
if args.efermi is None:
|
62
|
+
print("Please input fermi energy using --efermi ")
|
63
|
+
sys.exit()
|
64
|
+
if args.elements is None:
|
65
|
+
print("Please input the magnetic elements, e.g. --elements Fe Ni")
|
66
|
+
sys.exit()
|
67
|
+
|
68
|
+
gen_exchange(
|
69
|
+
path=args.path,
|
70
|
+
colinear=(not args.spinor),
|
71
|
+
groupby=args.groupby,
|
72
|
+
posfile=args.posfile,
|
73
|
+
efermi=args.efermi,
|
74
|
+
kmesh=args.kmesh,
|
75
|
+
magnetic_elements=args.elements,
|
76
|
+
Rcut=args.rcut,
|
77
|
+
prefix_SOC=args.prefix_spinor,
|
78
|
+
prefix_up=args.prefix_up,
|
79
|
+
prefix_dn=args.prefix_down,
|
80
|
+
emin=args.emin,
|
81
|
+
emax=args.emax,
|
82
|
+
nz=args.nz,
|
83
|
+
use_cache=args.use_cache,
|
84
|
+
nproc=args.np,
|
85
|
+
description=args.description,
|
86
|
+
output_path=args.output_path,
|
87
|
+
exclude_orbs=args.exclude_orbs,
|
88
|
+
wannier_type=args.wannier_type,
|
89
|
+
# qspace=args.qspace,
|
90
|
+
write_density_matrix=args.write_dm,
|
91
|
+
orb_decomposition=args.orb_decomposition,
|
92
|
+
)
|
93
|
+
|
94
|
+
|
95
|
+
if __name__ == "__main__":
|
96
|
+
run_wann2J()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: TB2J
|
3
|
-
Version: 0.9.
|
3
|
+
Version: 0.9.7rc0
|
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
|
@@ -14,13 +14,15 @@ Classifier: Topic :: Scientific/Engineering :: Physics
|
|
14
14
|
Classifier: License :: OSI Approved :: BSD License
|
15
15
|
Requires-Python: >=3.6
|
16
16
|
License-File: LICENSE
|
17
|
-
Requires-Dist: numpy
|
17
|
+
Requires-Dist: numpy <2.0
|
18
18
|
Requires-Dist: scipy
|
19
19
|
Requires-Dist: matplotlib
|
20
20
|
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.1.
|
24
|
+
Requires-Dist: HamiltonIO >=0.1.7
|
25
|
+
Requires-Dist: pre-commit
|
26
|
+
Requires-Dist: sympair >0.1.0
|
25
27
|
|
26
28
|
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.
|
@@ -1,73 +1,73 @@
|
|
1
1
|
TB2J/Jdownfolder.py,sha256=Rmg6KfQ-Lkhei5daTJ2POzr0XL-R1WM-rzUnDcfoDhc,9595
|
2
2
|
TB2J/Jtensor.py,sha256=t6OsqrSlYW6Im4H7ykVAW8Al_pFXN4C5yj2UEsV6r7g,3181
|
3
|
-
TB2J/MAE.py,sha256
|
3
|
+
TB2J/MAE.py,sha256=9VwwLpUALaaVwn4LTnhSISJMT7MDym247sSKT5Rum0o,10989
|
4
|
+
TB2J/MAEGreen.py,sha256=SkDct7cD5hDAAYW9Y3oYQZVt1AyLA53xDqLL1mT5Nq0,3461
|
4
5
|
TB2J/Oiju.py,sha256=cNGv8N5uH_swGq7cnAt2OyiDfqtjLlLrwseGu0E4iaM,3383
|
5
6
|
TB2J/Oiju_epc.py,sha256=oytM3NYW7nWmklrGgNlqwIpI_JYv_hb7ZnR4o9nYNog,6809
|
6
7
|
TB2J/__init__.py,sha256=hcEWkag_UvLm1ZSbjsgcTWkGVlR3Bwmzg1QYAwsvf-g,24
|
8
|
+
TB2J/anisotropy.py,sha256=zz4ID6_Yjf5gxPJt1psc6liNKhTG8X5AtHdpq0dCEzM,22616
|
7
9
|
TB2J/basis.py,sha256=DFo6_QUwjBwisP6zGxvoO0lpGTMDPAOkiL9giNCjOjA,1558
|
8
10
|
TB2J/citation.py,sha256=gcQeyJZaT1Qrtsl8Y3s4neOH3-vvgmIcCvXeV2o3vj0,2891
|
9
|
-
TB2J/contour.py,sha256=
|
10
|
-
TB2J/cut_cell.py,sha256=kr9WeQhBQLm8QXL2B3NcsSYmSw-OAtJk3f9wksAOZbs,2952
|
11
|
+
TB2J/contour.py,sha256=4wFZSPV81WwuUrvn1MENMnP-cW5ICDy8azOdTO8HJdw,2877
|
11
12
|
TB2J/density_matrix.py,sha256=D5k8Oe21OCiLVORNYbo4TZOFG0slrQSbj91kJ3TMFjs,1514
|
12
13
|
TB2J/epc.py,sha256=zLbtqZJhDr8DnnGN6YENcXwrMb3Qxu6KB08mLy9Pw20,3474
|
13
|
-
TB2J/exchange.py,sha256=
|
14
|
-
TB2J/exchangeCL2.py,sha256=
|
14
|
+
TB2J/exchange.py,sha256=2uTz88pZf3NuKLLiFTHyXf5URhCZkzUlxkVJdtzZPHk,25252
|
15
|
+
TB2J/exchangeCL2.py,sha256=vJgVBpvtTE2K7Xf7hGQNc3C87VvVXTa689Qd5827ItE,11165
|
16
|
+
TB2J/exchange_params.py,sha256=zhOPyvgngPXlYbZ8TUEFXIpYak3MPh3Lh24m8WWWgnU,5846
|
15
17
|
TB2J/exchange_pert.py,sha256=jmFMtQbYa_uczM4VAeS6TijkIHRFIqEzZJswzE9Wfuo,8523
|
16
18
|
TB2J/exchange_qspace.py,sha256=ZL68qBGFUaQ9BsSPsJaaoWOr9RssPiqX34R_9I3nk_8,8436
|
17
19
|
TB2J/gpaw_wrapper.py,sha256=aJ--9Dtyq7jOP1Hkh-Sh1nWcfXm6zKcljOCO0DNCAr0,6890
|
18
|
-
TB2J/green.py,sha256=
|
20
|
+
TB2J/green.py,sha256=Dz189KtGsHlANBU4TiSTZpxGEpETFZaphwyIaNp3a5E,14721
|
19
21
|
TB2J/greentest.py,sha256=2ISSfhor9ecSEOi_E6b4Cv26wEIQlwlzca0ru8z44_E,1603
|
20
|
-
TB2J/io_merge.py,sha256=
|
22
|
+
TB2J/io_merge.py,sha256=E1_GfAB2HGpW-ipaO2lqU9SvaslwkiLxssn4DqJpMT8,6899
|
21
23
|
TB2J/kpoints.py,sha256=6XK2KqTncidEq3o9GuO6VEZRPNTRtWeXg9QfcV-9smI,532
|
22
|
-
TB2J/manager.py,sha256=w_zKrmsTtlNNiR0tO3kNoQqRf9aCKdbIa8s2cgvESwI,15826
|
23
|
-
TB2J/mathutils.py,sha256=tHA6q3KPDpXLIbZHdDZ2NU5s886VVM_oEG490zQ6Ris,300
|
24
24
|
TB2J/myTB.py,sha256=ok_B4my29bOIghMSZfx0Es6G8FaXaIiLP4gPxTdSj00,17659
|
25
25
|
TB2J/orbmap.py,sha256=RCMJkOPGbfPrcZzcc5ia1ZMKBQWxGcyj8W1ve8BJaEw,6669
|
26
|
-
TB2J/
|
27
|
-
TB2J/pauli.py,sha256=2UKVHyWSzNDL43KzbGYa26h550lfrlreksCEh_2tWe4,5246
|
26
|
+
TB2J/pauli.py,sha256=ESpAhk6LG5ugzuW1YFUTqiDxcg-pQ7wNnzR2FtUnvKM,5295
|
28
27
|
TB2J/pert.py,sha256=RaCJfewl0doht4cjAnzzGKe-uj2le4aqe0iPKFrq9fo,1192
|
29
28
|
TB2J/plot.py,sha256=AnFIFWE2vlmj7Z6f_7-dX_O1stJN-qbuiurPj43dUCM,4104
|
30
29
|
TB2J/rotate_atoms.py,sha256=Dwptn-wdDW4zYzjYb95yxTzuZOe9WPuLjh3d3-YcSs0,3277
|
31
30
|
TB2J/rotate_siestaDM.py,sha256=eR97rspdrRaK9YTwQwUKfobI0S9UnEcbEZ2f5IgR7Tk,1070
|
32
31
|
TB2J/sisl_wrapper.py,sha256=A5x1-tt8efUSPeGY5wM5m6-pJYQFXTCzQHVqD6RBa2g,14792
|
33
|
-
TB2J/
|
32
|
+
TB2J/symmetrize_J.py,sha256=2wME5qaPvAfKzaPSefLeXlGvt6AfWzhaCk3N3FDdg2w,3810
|
34
33
|
TB2J/tensor_rotate.py,sha256=4-DfT_Mg5e40fbd74M5W0D5DqmUq-kVOOLDkkkI834A,8083
|
35
34
|
TB2J/utest.py,sha256=z_ahi7tpHQF9WlHNQihcQ7qzfezRJQXQt28eB1X_z64,3897
|
36
|
-
TB2J/utils.py,sha256=
|
35
|
+
TB2J/utils.py,sha256=DHkc7BK0KUGesfoAv1OxMgIw_iZzcFXh--3ybsFSd_c,12535
|
37
36
|
TB2J/versioninfo.py,sha256=wZwS9QDFRVDe7rf8JyPDDI8UGdTQiO6Pb_sWv8GAegA,337
|
38
|
-
TB2J/abacus/MAE.py,sha256=q9aSVDRZFAnZL3gHdNmde7sxj80oe-BRjwDO-ipyfew,12237
|
39
|
-
TB2J/abacus/__init__.py,sha256=5sHiDnF2L-Y80QeET9zOiS83a5T_TQAXvnIhcYB6wNU,56
|
40
|
-
TB2J/abacus/abacus_api.py,sha256=D_NyXW-Pno92d3RVHByx0l1HDPHQAvXsmQVt8cfIGR8,7267
|
41
|
-
TB2J/abacus/abacus_wrapper.py,sha256=MCQt1qjweJ1-NnzxH7QBCVmQ7p9K9cgE3a5mldui9TA,12055
|
42
|
-
TB2J/abacus/gen_exchange_abacus.py,sha256=xdas1BtjLlxWdxtJPqoUousfo-Gk1iOg9jIfkgUrYjU,3017
|
43
|
-
TB2J/abacus/occupations.py,sha256=vaMVeZwldgzGDxjA7i3-2-V6akXjpgJwJFWKozJ-l2k,8947
|
44
|
-
TB2J/abacus/orbital_api.py,sha256=l48Hn5z7TA0TH7Is4NDmz74b6B9L2ztYO4dRR37U4mQ,1562
|
45
|
-
TB2J/abacus/stru_api.py,sha256=aBKKlZ2hvAZChVCfNxRdxH51rfHKqZn6kOlazY-yW8k,67888
|
46
|
-
TB2J/abacus/test_density_matrix.py,sha256=f0xHOTzIssT-XTvBJrQHU0JVbvBYOE1Mduh-j7qiLO8,774
|
47
|
-
TB2J/abacus/test_read_HRSR.py,sha256=cAT-e79jGjCBXLTJ9UYX0WvalG_yD4Awl79tTOUcwaQ,1254
|
48
|
-
TB2J/abacus/test_read_stru.py,sha256=CpK4zWhlCVAMCmYQmp9Hy-A40OblZQLFpo5JokpNcWQ,785
|
49
37
|
TB2J/external/__init__.py,sha256=yD_ZIMi76H49rj6GAQpiB7UlKa3TgSaMkkLHT6M-8w8,137
|
50
38
|
TB2J/external/p_tqdm.py,sha256=ug1jy3-43r8iW7bC37xzPSIe0EjYKH_GUluGzMiQiDw,5831
|
39
|
+
TB2J/interfaces/__init__.py,sha256=4tiLoXQ73Nlyi9L4j8jJXOYzXluVNPxQZkwfkQZEGHg,307
|
40
|
+
TB2J/interfaces/gpaw_interface.py,sha256=GCDlJ-hRWfChvWwsgBDYSmVqO4sH9HAuGZTV9GqgN6c,1504
|
41
|
+
TB2J/interfaces/lawaf_interface.py,sha256=PieLnmppdafOYsgeHznqOou1g9L1sam5jOm3KaObdqo,4408
|
42
|
+
TB2J/interfaces/manager.py,sha256=PQMLEfMCT5GnDWSl2nI4JOgRPm_fysyR-6Y6l97xWcw,860
|
43
|
+
TB2J/interfaces/siesta_interface.py,sha256=1XOTZYM0uRBqdsTbDo86PZOM0J_uaiDZ9-gPW2PXooE,7704
|
44
|
+
TB2J/interfaces/wannier90_interface.py,sha256=qzRgXUBb7t1Aiegrl_RV51BB8csdtVM0EP0Z4pjmTcs,4467
|
45
|
+
TB2J/interfaces/abacus/__init__.py,sha256=leas71oCvM_HxrF4gnO5A_VKcJmDAgsI1BUctLU3OBw,177
|
46
|
+
TB2J/interfaces/abacus/abacus_api.py,sha256=lNV4LNkLcKw7Zux4MQYM9wnh3eFTlcSqbf4Pb7pqhrk,7243
|
47
|
+
TB2J/interfaces/abacus/abacus_wrapper.py,sha256=LyfbiuzsE4NiPIw3GOuZDezxi7CSmLvaYWyn3doV8jQ,12015
|
48
|
+
TB2J/interfaces/abacus/gen_exchange_abacus.py,sha256=U4s1wC_M2h0MJxlCbs92Ue8AHdMXfc6AK9BB5FjdIwU,3008
|
49
|
+
TB2J/interfaces/abacus/orbital_api.py,sha256=9_t89bWptSw0mI9IvmYXODerj0s5e9eiKMAp74YE0Sk,1495
|
50
|
+
TB2J/interfaces/abacus/stru_api.py,sha256=Ac03ikHRsZRXqTul4IUge7D2iG_xLh4_oyYfeP9tzGE,67881
|
51
|
+
TB2J/interfaces/abacus/test_density_matrix.py,sha256=bMWWJYtDS57SpPZ-eZXZ9Hr_UK4mv8ZHM7SzItG3IVA,774
|
52
|
+
TB2J/interfaces/abacus/test_read_HRSR.py,sha256=W1oO_yigT50Yb5_u-KB_IfTpM7kArGkBuMSMs0H4CTs,1235
|
53
|
+
TB2J/interfaces/abacus/test_read_stru.py,sha256=hoKPHVco8vwzC7Gao4bOPCdAPhh29x-9DTJJqRr7AYM,788
|
51
54
|
TB2J/io_exchange/__init__.py,sha256=KfGHum7B8E4G_KKfillqw0lErtoyKEuFUUttHLs-mg4,32
|
52
|
-
TB2J/io_exchange/io_exchange.py,sha256=
|
55
|
+
TB2J/io_exchange/io_exchange.py,sha256=ZeA8lpYUAQO1CqZnQL70IgS9TbAFyfPuadLGfKVf-Ms,19769
|
53
56
|
TB2J/io_exchange/io_multibinit.py,sha256=8PDmWxzGuv-GwJosj2ZTmiyNY_duFVWJ4ekCuSqGdd8,6739
|
54
|
-
TB2J/io_exchange/io_pickle.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
57
|
TB2J/io_exchange/io_tomsasd.py,sha256=NqkAC1Fl-CUnFA21eBzSy_S5F_oeQFJysw4UukQbN8o,4173
|
56
58
|
TB2J/io_exchange/io_txt.py,sha256=BMr1eSILlKpgtjvDx7uw2VMAkEKSvGEPNxpaT_zev0I,10547
|
57
59
|
TB2J/io_exchange/io_uppasd.py,sha256=bI4iPEgnK4TvCZNvb6x2xYXgjW7pEehCqmcizy2pqFU,3301
|
58
60
|
TB2J/io_exchange/io_vampire.py,sha256=UllC4twf06_q2vBCnAYFzEDGvS8mSefwQXDquBuyc0M,5583
|
59
61
|
TB2J/mathutils/__init__.py,sha256=tQLBfHkZqdVfVxPOahy42qMUkFYnFFFhM-uc4QsYFxI,27
|
60
|
-
TB2J/mathutils/fermi.py,sha256=
|
62
|
+
TB2J/mathutils/fermi.py,sha256=72tZ5CptGmYaBUD0xLWltuH7LBXcrMUwODyW6-WqlzI,638
|
61
63
|
TB2J/mathutils/kR_convert.py,sha256=p_9XWJVNanTzTK2rI6KRjTkbSq42la6N448-zJOsMwY,2671
|
62
|
-
TB2J/mathutils/lowdin.py,sha256=
|
63
|
-
TB2J/mathutils/rotate_spin.py,sha256=
|
64
|
+
TB2J/mathutils/lowdin.py,sha256=RYbm9OcnFnjcZFdC5YcNUsI9cOJmoDLsWSSCaP0GqKQ,499
|
65
|
+
TB2J/mathutils/rotate_spin.py,sha256=SfqadtkmoqkrD6lJ7tSCxfnv6QcEQ9_rE6Ee0gHONyk,8333
|
64
66
|
TB2J/spinham/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
67
|
TB2J/spinham/base_parser.py,sha256=oQRHvFE_BlUtTaTZykKgvicu40oXcbICB-D1aAt-qlA,2196
|
66
68
|
TB2J/spinham/constants.py,sha256=y4-hRyl5EAR42k24Oa5XhAsUQtKVn1MAgyqNf-p3PrM,762
|
67
|
-
TB2J/spinham/h_matrix.py,sha256=MfHIz6RViKkEB3Mu-WcwNx5uk7A5sjAlbqVG9wYA4xk,2784
|
68
69
|
TB2J/spinham/hamiltonian.py,sha256=OfsjlGIgFwpXaohopZcgPamSfjm3X46_zc245eyTr_A,16607
|
69
70
|
TB2J/spinham/hamiltonian_terms.py,sha256=7e84tfEjvAfZltUkrSWi1sUEiW_itLKy83lxi5iBpcQ,9714
|
70
|
-
TB2J/spinham/obtain_J.py,sha256=sg8tiCRRLEN57Olb3MHIuqkDhAkmu-w87AkM00ylXtA,2401
|
71
71
|
TB2J/spinham/plot.py,sha256=tLLNqFAATVrP1kmSVLPKzn686i-CUyqu4qgOcs-okHI,6599
|
72
72
|
TB2J/spinham/qsolver.py,sha256=Sr9I3aGfVNYn5wzwPx1QonHe6ZZUXBAujWRa7nTA5u4,4986
|
73
73
|
TB2J/spinham/spin_api.py,sha256=oN3AKg1WQl0YzR4f5ealcJOaVoAy8d7HodIwrbXvQeY,2219
|
@@ -76,18 +76,19 @@ TB2J/spinham/supercell.py,sha256=y17uUC6r3gQb278FhxIW4CABihfLTvKFj6flyXrCPR8,122
|
|
76
76
|
TB2J/wannier/__init__.py,sha256=7ojCbM84PYv1X1Tbo4NHI-d3gWmQsZB_xiYqbfxVV1E,80
|
77
77
|
TB2J/wannier/w90_parser.py,sha256=dbd63LuKyv2DVUzqRINGsbDzEsOxsQyE8_Ear_LQIRg,4620
|
78
78
|
TB2J/wannier/w90_tb_parser.py,sha256=qt8pnuprmPp9iIAYwPkPbmEzk6ZPgMq2xognoQp7vwc,4610
|
79
|
-
TB2J-0.9.
|
80
|
-
TB2J-0.9.
|
81
|
-
TB2J-0.9.
|
82
|
-
TB2J-0.9.
|
83
|
-
TB2J-0.9.
|
84
|
-
TB2J-0.9.
|
85
|
-
TB2J-0.9.
|
86
|
-
TB2J-0.9.
|
87
|
-
TB2J-0.9.
|
88
|
-
TB2J-0.9.
|
89
|
-
TB2J-0.9.
|
90
|
-
TB2J-0.9.
|
91
|
-
TB2J-0.9.
|
92
|
-
TB2J-0.9.
|
93
|
-
TB2J-0.9.
|
79
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_downfold.py,sha256=i4BVqnpDdgrX_amookVWeLGefGBn-qeAutWiwuY9SfQ,2099
|
80
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
|
81
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
|
82
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
|
83
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
|
84
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
|
85
|
+
TB2J-0.9.7rc0.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
|
86
|
+
TB2J-0.9.7rc0.data/scripts/abacus2J.py,sha256=_Wiu0NekWKNZ1XVAEBNQOWTi8hE_KXg6iGxfHgcdKqI,4396
|
87
|
+
TB2J-0.9.7rc0.data/scripts/siesta2J.py,sha256=wQ9fbyiVyau7WwfusNvHxqBGfD_9_7GZmYZ6pqe6RaM,4806
|
88
|
+
TB2J-0.9.7rc0.data/scripts/wann2J.py,sha256=pTFDf6h72I_LN_NX5UivyCoJPgwvyAyHW175nSAJvLo,2987
|
89
|
+
TB2J-0.9.7rc0.dist-info/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
|
90
|
+
TB2J-0.9.7rc0.dist-info/METADATA,sha256=kFTVwu8e7Fcb9srTmKweSf8AmnGq636h4Fu3Ix-e5Tk,1482
|
91
|
+
TB2J-0.9.7rc0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
92
|
+
TB2J-0.9.7rc0.dist-info/entry_points.txt,sha256=Hdz1WC9waUzyFVmowKnbbZ6j-J4adHh_Ko6JpxGYAtE,131
|
93
|
+
TB2J-0.9.7rc0.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
|
94
|
+
TB2J-0.9.7rc0.dist-info/RECORD,,
|