TB2J 0.9.9rc16__py3-none-any.whl → 0.9.9rc18__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.
Files changed (26) hide show
  1. TB2J/MAEGreen.py +18 -11
  2. TB2J/interfaces/siesta_interface.py +14 -7
  3. TB2J/io_exchange/__init__.py +2 -0
  4. TB2J/magnon/__init__.py +3 -0
  5. TB2J/magnon/io_exchange2.py +688 -0
  6. TB2J/magnon/plot.py +58 -0
  7. TB2J/magnon/structure.py +348 -0
  8. TB2J/mathutils/__init__.py +1 -0
  9. TB2J/mathutils/magnons.py +45 -0
  10. tb2j-0.9.9rc18.data/scripts/TB2J_magnon2.py +77 -0
  11. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/abacus2J.py +2 -2
  12. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/METADATA +1 -1
  13. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/RECORD +26 -20
  14. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/WHEEL +1 -1
  15. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_downfold.py +0 -0
  16. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_eigen.py +0 -0
  17. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_magnon.py +0 -0
  18. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_magnon_dos.py +0 -0
  19. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_merge.py +0 -0
  20. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_rotate.py +0 -0
  21. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/TB2J_rotateDM.py +0 -0
  22. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/siesta2J.py +0 -0
  23. {tb2j-0.9.9rc16.data → tb2j-0.9.9rc18.data}/scripts/wann2J.py +0 -0
  24. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/entry_points.txt +0 -0
  25. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/licenses/LICENSE +0 -0
  26. {tb2j-0.9.9rc16.dist-info → tb2j-0.9.9rc18.dist-info}/top_level.txt +0 -0
TB2J/magnon/plot.py ADDED
@@ -0,0 +1,58 @@
1
+ import matplotlib.pyplot as plt
2
+ import numpy as np
3
+
4
+
5
+ class BandsPlot:
6
+ _UNITS = "meV"
7
+ _NSYSTEMS = 1
8
+
9
+ def __init__(self, bands, kpath, **kwargs):
10
+ self.bands = bands
11
+ self.kpath = kpath
12
+ self.bands *= 1000
13
+
14
+ plot_options = kwargs
15
+ self.linewidth = plot_options.pop("linewidth", 1.5)
16
+ self.color = plot_options.pop("color", "blue")
17
+ self.fontsize = plot_options.pop("fontsize", 12)
18
+ self.ticksize = plot_options.pop("ticksize", 10)
19
+ self.plot_options = plot_options
20
+
21
+ def plot(self, filename=None):
22
+ fig, axs = plt.subplots(1, self._NSYSTEMS, constrained_layout=True)
23
+
24
+ kdata = np.arange(self.bands.shape[0])
25
+ for band in self.bands.T:
26
+ axs.plot(
27
+ kdata,
28
+ band,
29
+ linewidth=self.linewidth,
30
+ color=self.color,
31
+ **self.plot_options,
32
+ )
33
+
34
+ bmin, bmax = self.bands.min(), self.bands.max()
35
+ ymin, ymax = (
36
+ bmin - 0.05 * np.abs(bmin - bmax),
37
+ bmax + 0.05 * np.abs(bmax - bmin),
38
+ )
39
+
40
+ axs.set_ylim([ymin, ymax])
41
+ axs.set_xlim([0, kdata[-1]])
42
+
43
+ kpoint_labels = list(zip(*self.kpath))
44
+ axs.set_xticks(*kpoint_labels, fontsize=self.ticksize)
45
+ axs.vlines(
46
+ x=kpoint_labels[0],
47
+ ymin=ymin,
48
+ ymax=ymax,
49
+ color="black",
50
+ linewidth=self.linewidth / 5,
51
+ )
52
+
53
+ axs.set_ylabel(f"Energy ({self._UNITS})", fontsize=self.fontsize)
54
+
55
+ if filename is None:
56
+ plt.show()
57
+ else:
58
+ fig.save(filename, dpi=300, bbox_inches="tight")
@@ -0,0 +1,348 @@
1
+ from warnings import warn
2
+
3
+ import numpy as np
4
+
5
+ valid_symbols = [
6
+ # 0
7
+ "Ae",
8
+ # 1
9
+ "H",
10
+ "He",
11
+ # 2
12
+ "Li",
13
+ "Be",
14
+ "B",
15
+ "C",
16
+ "N",
17
+ "O",
18
+ "F",
19
+ "Ne",
20
+ # 3
21
+ "Na",
22
+ "Mg",
23
+ "Al",
24
+ "Si",
25
+ "P",
26
+ "S",
27
+ "Cl",
28
+ "Ar",
29
+ # 4
30
+ "K",
31
+ "Ca",
32
+ "Sc",
33
+ "Ti",
34
+ "V",
35
+ "Cr",
36
+ "Mn",
37
+ "Fe",
38
+ "Co",
39
+ "Ni",
40
+ "Cu",
41
+ "Zn",
42
+ "Ga",
43
+ "Ge",
44
+ "As",
45
+ "Se",
46
+ "Br",
47
+ "Kr",
48
+ # 5
49
+ "Rb",
50
+ "Sr",
51
+ "Y",
52
+ "Zr",
53
+ "Nb",
54
+ "Mo",
55
+ "Tc",
56
+ "Ru",
57
+ "Rh",
58
+ "Pd",
59
+ "Ag",
60
+ "Cd",
61
+ "In",
62
+ "Sn",
63
+ "Sb",
64
+ "Te",
65
+ "I",
66
+ "Xe",
67
+ # 6
68
+ "Cs",
69
+ "Ba",
70
+ "La",
71
+ "Ce",
72
+ "Pr",
73
+ "Nd",
74
+ "Pm",
75
+ "Sm",
76
+ "Eu",
77
+ "Gd",
78
+ "Tb",
79
+ "Dy",
80
+ "Ho",
81
+ "Er",
82
+ "Tm",
83
+ "Yb",
84
+ "Lu",
85
+ "Hf",
86
+ "Ta",
87
+ "W",
88
+ "Re",
89
+ "Os",
90
+ "Ir",
91
+ "Pt",
92
+ "Au",
93
+ "Hg",
94
+ "Tl",
95
+ "Pb",
96
+ "Bi",
97
+ "Po",
98
+ "At",
99
+ "Rn",
100
+ # 7
101
+ "Fr",
102
+ "Ra",
103
+ "Ac",
104
+ "Th",
105
+ "Pa",
106
+ "U",
107
+ "Np",
108
+ "Pu",
109
+ "Am",
110
+ "Cm",
111
+ "Bk",
112
+ "Cf",
113
+ "Es",
114
+ "Fm",
115
+ "Md",
116
+ "No",
117
+ "Lr",
118
+ "Rf",
119
+ "Db",
120
+ "Sg",
121
+ "Bh",
122
+ "Hs",
123
+ "Mt",
124
+ "Ds",
125
+ "Rg",
126
+ "Cn",
127
+ "Nh",
128
+ "Fl",
129
+ "Mc",
130
+ "Lv",
131
+ "Ts",
132
+ "Og",
133
+ ]
134
+
135
+
136
+ def get_attribute_array(array, attribute, dtype=float):
137
+ try:
138
+ the_array = np.array(array, dtype=dtype)
139
+ except (IndexError, ValueError, TypeError) as err:
140
+ typename = dtype.__name__
141
+ raise type(err)(
142
+ f"'{attribute}' must be an arraylike object of '{typename}' elements."
143
+ )
144
+
145
+ return the_array
146
+
147
+
148
+ def validate_symbols(value):
149
+ try:
150
+ values_list = value.split()
151
+ except AttributeError:
152
+ try:
153
+ values_list = list(value)
154
+ except (ValueError, TypeError):
155
+ raise TypeError("'elements' must be an iterable of 'str' or 'int' entries.")
156
+
157
+ if all(isinstance(s, str) for s in values_list):
158
+ symbols = values_list
159
+ for symbol in symbols:
160
+ if symbol not in valid_symbols:
161
+ raise ValueError(f"Unrecognized element '{symbol}'.")
162
+ elif all(isinstance(i, (int, np.integer)) for i in values_list):
163
+ if any(i < 0 for i in values_list):
164
+ raise ValueError("Atomic numbers must be positive.")
165
+ try:
166
+ symbols = [valid_symbols[i] for i in values_list]
167
+ except IndexError:
168
+ raise ValueError("Atomic number exceeds 118.")
169
+ else:
170
+ raise ValueError("'elements' must be an iterable of 'str' or 'int' entries.")
171
+
172
+ return symbols
173
+
174
+
175
+ class BaseMagneticStructure:
176
+ def __init__(
177
+ self,
178
+ atoms=None,
179
+ cell=None,
180
+ elements=None,
181
+ positions=None,
182
+ magmoms=None,
183
+ pbc=None,
184
+ collinear=True,
185
+ ):
186
+ if atoms is not None:
187
+ if any(arg is not None for arg in [cell, elements, positions]):
188
+ warn(
189
+ "WARNING: 'atoms' overrides the 'cell', 'elements', and 'positions' arguments."
190
+ )
191
+ cell = atoms.cell.array
192
+ elements = atoms.numbers
193
+ positions = atoms.get_scaled_positions()
194
+ pbc = atoms.pbc if pbc is None else pbc
195
+ else:
196
+ if cell is None:
197
+ cell = np.zeros((3, 3))
198
+ if elements is None:
199
+ elements = ()
200
+ if positions is None:
201
+ positions = np.zeros((len(elements), 3))
202
+ if pbc is None:
203
+ pbc = (True, True, True)
204
+ if magmoms is None:
205
+ magmoms_shape = positions.shape[0] if collinear else positions.shape
206
+ magmoms = np.zeros(magmoms_shape)
207
+
208
+ self.cell = cell
209
+ self.elements = elements
210
+ self.positions = positions
211
+ self.collinear = collinear
212
+ self.magmoms = magmoms
213
+ self.pbc = pbc
214
+
215
+ self._Q = None
216
+ self._n = np.array([0, 0, 1])
217
+
218
+ @property
219
+ def cell(self):
220
+ return self._cell
221
+
222
+ @property
223
+ def reciprocal_cell(self):
224
+ return 2 * np.pi * np.linalg.inv(self._cell)
225
+
226
+ @cell.setter
227
+ def cell(self, value):
228
+ cell_array = get_attribute_array(value, "cell")
229
+ if cell_array.shape != (3, 3):
230
+ raise ValueError("'cell' must have a (3, 3) shape.")
231
+
232
+ self._cell = cell_array
233
+
234
+ @property
235
+ def elements(self):
236
+ return self._symbols
237
+
238
+ @elements.setter
239
+ def elements(self, value):
240
+ symbols = validate_symbols(value)
241
+ self._symbols = symbols
242
+
243
+ @property
244
+ def numbers(self):
245
+ return [valid_symbols.index(symbol) for symbol in self._symbols]
246
+
247
+ @property
248
+ def positions(self):
249
+ return self._positions
250
+
251
+ @property
252
+ def cartesian_positions(self):
253
+ return self._positions @ self._cell
254
+
255
+ @positions.setter
256
+ def positions(self, value):
257
+ natoms = len(self.elements)
258
+ posarray = get_attribute_array(value, "positions")
259
+ if posarray.shape != (natoms, 3):
260
+ raise ValueError(
261
+ "'positions' must have a (natoms, 3) shape, where natoms is the length of 'elements'. Make sure to set 'elements' first."
262
+ )
263
+
264
+ self._positions = posarray
265
+
266
+ @property
267
+ def magmoms(self):
268
+ return self._magmoms
269
+
270
+ @magmoms.setter
271
+ def magmoms(self, value):
272
+ magarray = get_attribute_array(value, "magmoms")
273
+ if self.collinear and magarray.shape != (len(self._positions),):
274
+ raise ValueError(
275
+ "'magmoms' must be a 1dim array with the same length as 'positions'. Make sure to set 'positions' first."
276
+ )
277
+ elif not self.collinear and magarray.shape != self._positions.shape:
278
+ raise ValueError(
279
+ "'magmoms' must have the same shape as 'positions'. Make sure to set 'positions' first."
280
+ )
281
+
282
+ self._magmoms = magarray
283
+
284
+ @property
285
+ def pbc(self):
286
+ return self._pbc
287
+
288
+ @pbc.setter
289
+ def pbc(self, value):
290
+ try:
291
+ periodic_boundary_conditions = tuple(bool(b) for b in value)
292
+ except (ValueError, TypeError):
293
+ raise TypeError("'pbc' must be an iterable of 'bool' entries.")
294
+
295
+ if len(periodic_boundary_conditions) != 3:
296
+ raise ValueError("'pbc' must be of length 3.")
297
+
298
+ self._pbc = periodic_boundary_conditions
299
+
300
+ @property
301
+ def propagation_vector(self):
302
+ return self._Q
303
+
304
+ @propagation_vector.setter
305
+ def propagation_vector(self, value):
306
+ Q = get_attribute_array(value, "propagation_vector")
307
+ if Q.shape != (3,):
308
+ raise ValueError(
309
+ "The 'propagation_vector' must be a vector with 3 numbers."
310
+ )
311
+
312
+ self._Q = Q
313
+
314
+ @property
315
+ def normal_vector(self):
316
+ return self._n
317
+
318
+ @normal_vector.setter
319
+ def normal_vector(self, value):
320
+ n = get_attribute_array(value, "normal_vector")
321
+ if n.shape != (3,):
322
+ raise ValueError("The 'normal_vector' must be a vector with 3 numbers.")
323
+
324
+ self._n = n
325
+
326
+ def to_ase(self):
327
+ from ase.atoms import Atoms
328
+
329
+ atoms = Atoms(
330
+ cell=self.cell,
331
+ positions=self.cartesian_positions,
332
+ numbers=[valid_symbols.index(symbol) for symbol in self.elements],
333
+ pbc=self.pbc,
334
+ )
335
+
336
+ return atoms
337
+
338
+ @classmethod
339
+ def from_structure_file(
340
+ cls, filename, magmoms=None, collinear=True, pbc=(True, True, True)
341
+ ):
342
+ from ase.io import read
343
+
344
+ atoms = read(filename)
345
+ atoms.pbc = pbc
346
+ obj = cls(atoms=atoms, magmoms=magmoms, collinear=collinear)
347
+
348
+ return obj
@@ -1 +1,2 @@
1
1
  from .lowdin import Lowdin
2
+ from .magnons import *
@@ -0,0 +1,45 @@
1
+ import numpy as np
2
+
3
+ __all__ = ["generate_grid", "get_rotation_arrays", "round_to_precision", "uz", "I"]
4
+
5
+ I = np.eye(3)
6
+ uz = np.array([[0.0, 0.0, 1.0]])
7
+
8
+
9
+ def generate_grid(kmesh, sort=True):
10
+ half_grid = [int(n / 2) for n in kmesh]
11
+ grid = np.stack(
12
+ np.meshgrid(*[np.arange(-n, n + 1) for n in half_grid]), axis=-1
13
+ ).reshape(-1, 3)
14
+
15
+ if sort:
16
+ idx = np.linalg.norm(grid, axis=-1).argsort()
17
+ grid = grid[idx]
18
+
19
+ return grid
20
+
21
+
22
+ def get_rotation_arrays(magmoms, u=uz):
23
+ dim = magmoms.shape[0]
24
+ v = magmoms
25
+ n = np.cross(u, v)
26
+ n /= np.linalg.norm(n, axis=-1).reshape(dim, 1)
27
+ z = np.repeat(u, dim, axis=0)
28
+ A = np.stack([z, np.cross(n, z), n], axis=1)
29
+ B = np.stack([v, np.cross(n, v), n], axis=1)
30
+ R = np.einsum("nki,nkj->nij", A, B)
31
+
32
+ Rnan = np.isnan(R)
33
+ if Rnan.any():
34
+ nanidx = np.where(Rnan)[0]
35
+ R[nanidx] = I
36
+ R[nanidx, 2] = v[nanidx]
37
+
38
+ U = R[:, 0] + 1j * R[:, 1]
39
+ V = R[:, 2]
40
+
41
+ return U, V
42
+
43
+
44
+ def round_to_precision(array, precision):
45
+ return precision * np.round(array / precision)
@@ -0,0 +1,77 @@
1
+ from TB2J.magnon import plot_tb2j_magnon_bands
2
+
3
+
4
+ def plot_tb2j_magnon_bands_cli():
5
+ """Command line interface for plotting magnon band structures from TB2J data."""
6
+ import argparse
7
+
8
+ parser = argparse.ArgumentParser(
9
+ description="Plot magnon band structure from TB2J data",
10
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
11
+ )
12
+
13
+ parser.add_argument(
14
+ "-f", "--file", default="TB2J.pickle", help="Path to TB2J pickle file"
15
+ )
16
+
17
+ parser.add_argument(
18
+ "-p",
19
+ "--path",
20
+ help="High-symmetry k-point path (e.g., 'GXMG' for square lattice)",
21
+ )
22
+
23
+ parser.add_argument(
24
+ "-n",
25
+ "--npoints",
26
+ type=int,
27
+ default=300,
28
+ help="Number of k-points for band structure calculation",
29
+ )
30
+
31
+ parser.add_argument(
32
+ "-a",
33
+ "--anisotropic",
34
+ action="store_true",
35
+ help="Include anisotropic interactions",
36
+ )
37
+
38
+ parser.add_argument(
39
+ "-q",
40
+ "--quadratic",
41
+ action="store_true",
42
+ help="Include biquadratic interactions",
43
+ )
44
+
45
+ parser.add_argument("-o", "--output", help="Output filename for the plot")
46
+
47
+ parser.add_argument(
48
+ "--no-pbc",
49
+ nargs="+",
50
+ type=int,
51
+ choices=[0, 1, 2],
52
+ help="Disable periodic boundary conditions in specified directions (0=x, 1=y, 2=z)",
53
+ )
54
+
55
+ args = parser.parse_args()
56
+
57
+ # Set up periodic boundary conditions
58
+ pbc = [True, True, True]
59
+ if args.no_pbc:
60
+ for direction in args.no_pbc:
61
+ pbc[direction] = False
62
+ pbc = tuple(pbc)
63
+
64
+ # Plot the bands
65
+ plot_tb2j_magnon_bands(
66
+ pickle_file=args.file,
67
+ path=args.path,
68
+ npoints=args.npoints,
69
+ anisotropic=args.anisotropic,
70
+ quadratic=args.quadratic,
71
+ pbc=pbc,
72
+ filename=args.output,
73
+ )
74
+
75
+
76
+ if __name__ == "__main__":
77
+ plot_tb2j_magnon_bands_cli()
@@ -29,8 +29,8 @@ def run_abacus2J():
29
29
  args = parser.parse_args()
30
30
 
31
31
  index_magnetic_atoms = args.index_magnetic_atoms
32
- if not index_magnetic_atoms is None:
33
- index_magnetic_atoms = [i-1 for i in index_magnetic_atoms]
32
+ if index_magnetic_atoms is not None:
33
+ index_magnetic_atoms = [i - 1 for i in index_magnetic_atoms]
34
34
 
35
35
  if args.elements is None and index_magnetic_atoms is None:
36
36
  print("Please input the magnetic elements, e.g. --elements Fe Ni")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TB2J
3
- Version: 0.9.9rc16
3
+ Version: 0.9.9rc18
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
@@ -1,7 +1,7 @@
1
1
  TB2J/Jdownfolder.py,sha256=xs0gmcKwOA3ejXqk3JPPgnYVu8CvkK8cteuvHuu1oSk,9603
2
2
  TB2J/Jtensor.py,sha256=t6OsqrSlYW6Im4H7ykVAW8Al_pFXN4C5yj2UEsV6r7g,3181
3
3
  TB2J/MAE.py,sha256=fM8U-Dgp9HcQOEeC_kyZV1oVrygBvcux9BraUXVouvY,10994
4
- TB2J/MAEGreen.py,sha256=pCX12GDNaOz8XgMlui8NjAERM43Ux3HyOKfiD80czXI,15306
4
+ TB2J/MAEGreen.py,sha256=IhclMJU6TOp97fYogXWq-3dyyAW8iDJqu1FGRDdi6hM,15551
5
5
  TB2J/Oiju.py,sha256=cNGv8N5uH_swGq7cnAt2OyiDfqtjLlLrwseGu0E4iaM,3383
6
6
  TB2J/Oiju_epc.py,sha256=oytM3NYW7nWmklrGgNlqwIpI_JYv_hb7ZnR4o9nYNog,6809
7
7
  TB2J/__init__.py,sha256=hcEWkag_UvLm1ZSbjsgcTWkGVlR3Bwmzg1QYAwsvf-g,24
@@ -43,7 +43,7 @@ TB2J/interfaces/__init__.py,sha256=4tiLoXQ73Nlyi9L4j8jJXOYzXluVNPxQZkwfkQZEGHg,3
43
43
  TB2J/interfaces/gpaw_interface.py,sha256=GCDlJ-hRWfChvWwsgBDYSmVqO4sH9HAuGZTV9GqgN6c,1504
44
44
  TB2J/interfaces/lawaf_interface.py,sha256=PieLnmppdafOYsgeHznqOou1g9L1sam5jOm3KaObdqo,4408
45
45
  TB2J/interfaces/manager.py,sha256=PQMLEfMCT5GnDWSl2nI4JOgRPm_fysyR-6Y6l97xWcw,860
46
- TB2J/interfaces/siesta_interface.py,sha256=olvo2xdBOSNk3zn67nuKrxbW--EKPoWwEzKRBwJbrVY,7366
46
+ TB2J/interfaces/siesta_interface.py,sha256=DACmRG89IKt_MHfmZDTORCjaUhQ6LRloLzoE1x-5IQM,7625
47
47
  TB2J/interfaces/wannier90_interface.py,sha256=qzRgXUBb7t1Aiegrl_RV51BB8csdtVM0EP0Z4pjmTcs,4467
48
48
  TB2J/interfaces/abacus/__init__.py,sha256=leas71oCvM_HxrF4gnO5A_VKcJmDAgsI1BUctLU3OBw,177
49
49
  TB2J/interfaces/abacus/abacus_api.py,sha256=lNV4LNkLcKw7Zux4MQYM9wnh3eFTlcSqbf4Pb7pqhrk,7243
@@ -54,18 +54,23 @@ TB2J/interfaces/abacus/stru_api.py,sha256=Ac03ikHRsZRXqTul4IUge7D2iG_xLh4_oyYfeP
54
54
  TB2J/interfaces/abacus/test_density_matrix.py,sha256=bMWWJYtDS57SpPZ-eZXZ9Hr_UK4mv8ZHM7SzItG3IVA,774
55
55
  TB2J/interfaces/abacus/test_read_HRSR.py,sha256=W1oO_yigT50Yb5_u-KB_IfTpM7kArGkBuMSMs0H4CTs,1235
56
56
  TB2J/interfaces/abacus/test_read_stru.py,sha256=hoKPHVco8vwzC7Gao4bOPCdAPhh29x-9DTJJqRr7AYM,788
57
- TB2J/io_exchange/__init__.py,sha256=KfGHum7B8E4G_KKfillqw0lErtoyKEuFUUttHLs-mg4,32
57
+ TB2J/io_exchange/__init__.py,sha256=LqEnG67qDVKt4hCUywDEQvUIJ7jsQjmtueOW_J16NOE,54
58
58
  TB2J/io_exchange/io_exchange.py,sha256=6fefcfYAyRojkCJA5bFwAa2Hjwx6epysfyX8Snj9DWc,20102
59
59
  TB2J/io_exchange/io_multibinit.py,sha256=8PDmWxzGuv-GwJosj2ZTmiyNY_duFVWJ4ekCuSqGdd8,6739
60
60
  TB2J/io_exchange/io_tomsasd.py,sha256=NqkAC1Fl-CUnFA21eBzSy_S5F_oeQFJysw4UukQbN8o,4173
61
61
  TB2J/io_exchange/io_txt.py,sha256=BMr1eSILlKpgtjvDx7uw2VMAkEKSvGEPNxpaT_zev0I,10547
62
62
  TB2J/io_exchange/io_uppasd.py,sha256=bI4iPEgnK4TvCZNvb6x2xYXgjW7pEehCqmcizy2pqFU,3301
63
63
  TB2J/io_exchange/io_vampire.py,sha256=UllC4twf06_q2vBCnAYFzEDGvS8mSefwQXDquBuyc0M,5583
64
- TB2J/mathutils/__init__.py,sha256=tQLBfHkZqdVfVxPOahy42qMUkFYnFFFhM-uc4QsYFxI,27
64
+ TB2J/magnon/__init__.py,sha256=jdUFkOlhrpHRmKavAXVcFdZgtY7lKZVzMPFlLmmCErM,113
65
+ TB2J/magnon/io_exchange2.py,sha256=vKKQXhPSvoeKNIc0Kh0GaTFph36jSW0Z46nAAbSEcAg,22993
66
+ TB2J/magnon/plot.py,sha256=kwq9LL0FRVo-SLYNkE-ghlyjz8DZD-c4LAWg8si5GJo,1674
67
+ TB2J/magnon/structure.py,sha256=rKefzXgQlEjVvV-A7E2IogVDWwf5egZr3Wxxu6HuJU4,7685
68
+ TB2J/mathutils/__init__.py,sha256=u3QCXBUmKOtJc5PWMFS65e1WhP43UpSf48S7aJZCohc,50
65
69
  TB2J/mathutils/fermi.py,sha256=72tZ5CptGmYaBUD0xLWltuH7LBXcrMUwODyW6-WqlzI,638
66
70
  TB2J/mathutils/fibonacci_sphere.py,sha256=l0USn25ZCAWF6l4UleyWaeLthsj9TThV9iWmfi6DbaM,2344
67
71
  TB2J/mathutils/kR_convert.py,sha256=p_9XWJVNanTzTK2rI6KRjTkbSq42la6N448-zJOsMwY,2671
68
72
  TB2J/mathutils/lowdin.py,sha256=RYbm9OcnFnjcZFdC5YcNUsI9cOJmoDLsWSSCaP0GqKQ,499
73
+ TB2J/mathutils/magnons.py,sha256=o9O7OR39RK1cl46MtiUO9Kd1IZYDOR3ANe82FZ7laY8,1085
69
74
  TB2J/mathutils/rotate_spin.py,sha256=lbGzve_36FyNjanXqdxYDb102kA4_5OycRlBcm-tH-g,8360
70
75
  TB2J/spinham/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
76
  TB2J/spinham/base_parser.py,sha256=oQRHvFE_BlUtTaTZykKgvicu40oXcbICB-D1aAt-qlA,2196
@@ -80,19 +85,20 @@ TB2J/spinham/supercell.py,sha256=y17uUC6r3gQb278FhxIW4CABihfLTvKFj6flyXrCPR8,122
80
85
  TB2J/wannier/__init__.py,sha256=7ojCbM84PYv1X1Tbo4NHI-d3gWmQsZB_xiYqbfxVV1E,80
81
86
  TB2J/wannier/w90_parser.py,sha256=dbd63LuKyv2DVUzqRINGsbDzEsOxsQyE8_Ear_LQIRg,4620
82
87
  TB2J/wannier/w90_tb_parser.py,sha256=qt8pnuprmPp9iIAYwPkPbmEzk6ZPgMq2xognoQp7vwc,4610
83
- tb2j-0.9.9rc16.data/scripts/TB2J_downfold.py,sha256=i4BVqnpDdgrX_amookVWeLGefGBn-qeAutWiwuY9SfQ,2099
84
- tb2j-0.9.9rc16.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
85
- tb2j-0.9.9rc16.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
86
- tb2j-0.9.9rc16.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
87
- tb2j-0.9.9rc16.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
88
- tb2j-0.9.9rc16.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
89
- tb2j-0.9.9rc16.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
90
- tb2j-0.9.9rc16.data/scripts/abacus2J.py,sha256=d84wBYkZJn6BfIFi2QorCLLdW32HB00cuZKM5RHrO-g,1824
91
- tb2j-0.9.9rc16.data/scripts/siesta2J.py,sha256=QJ6c0DbqxaqYEesxiL5R9nK9-flNLrr7hajKfCwirYc,2318
92
- tb2j-0.9.9rc16.data/scripts/wann2J.py,sha256=OA31VHEXbQMD-JozoLUHDF6vB9Sr62d804OApSKtSnU,3240
93
- tb2j-0.9.9rc16.dist-info/licenses/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
94
- tb2j-0.9.9rc16.dist-info/METADATA,sha256=xNYF0Ciw882g-_mqBsHoZ7r3wrKNDy8dWN_0s1HFiII,1688
95
- tb2j-0.9.9rc16.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
96
- tb2j-0.9.9rc16.dist-info/entry_points.txt,sha256=Hdz1WC9waUzyFVmowKnbbZ6j-J4adHh_Ko6JpxGYAtE,131
97
- tb2j-0.9.9rc16.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
98
- tb2j-0.9.9rc16.dist-info/RECORD,,
88
+ tb2j-0.9.9rc18.data/scripts/TB2J_downfold.py,sha256=i4BVqnpDdgrX_amookVWeLGefGBn-qeAutWiwuY9SfQ,2099
89
+ tb2j-0.9.9rc18.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
90
+ tb2j-0.9.9rc18.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
91
+ tb2j-0.9.9rc18.data/scripts/TB2J_magnon2.py,sha256=9HKNXwPlwaEnAlJXVLrbQFhWj3fGLlBAp-nMXWDTbE0,1911
92
+ tb2j-0.9.9rc18.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
93
+ tb2j-0.9.9rc18.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
94
+ tb2j-0.9.9rc18.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
95
+ tb2j-0.9.9rc18.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
96
+ tb2j-0.9.9rc18.data/scripts/abacus2J.py,sha256=VD1ldQP-PIMyxo3Rzzwk_06fJEbbU7oiU3aRXNHK0a0,1826
97
+ tb2j-0.9.9rc18.data/scripts/siesta2J.py,sha256=QJ6c0DbqxaqYEesxiL5R9nK9-flNLrr7hajKfCwirYc,2318
98
+ tb2j-0.9.9rc18.data/scripts/wann2J.py,sha256=OA31VHEXbQMD-JozoLUHDF6vB9Sr62d804OApSKtSnU,3240
99
+ tb2j-0.9.9rc18.dist-info/licenses/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
100
+ tb2j-0.9.9rc18.dist-info/METADATA,sha256=wvdtn-fBIkBMcOJlL_j812z31FWaGEAWdmLoQMc0yOA,1688
101
+ tb2j-0.9.9rc18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
102
+ tb2j-0.9.9rc18.dist-info/entry_points.txt,sha256=Hdz1WC9waUzyFVmowKnbbZ6j-J4adHh_Ko6JpxGYAtE,131
103
+ tb2j-0.9.9rc18.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
104
+ tb2j-0.9.9rc18.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5