TB2J 0.9.9.9__py3-none-any.whl → 0.9.9.12__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/Jtensor.py +5 -6
- TB2J/MAEGreen.py +8 -0
- TB2J/__init__.py +1 -1
- TB2J/exchange.py +1 -1
- TB2J/interfaces/abacus/stru_api.py +3 -1
- TB2J/interfaces/siesta_interface.py +2 -1
- TB2J/io_exchange/io_exchange.py +65 -23
- TB2J/io_exchange/io_vampire.py +6 -3
- TB2J/io_merge.py +15 -1
- TB2J/magnon/__init__.py +2 -2
- TB2J/magnon/magnon3.py +566 -56
- TB2J/magnon/magnon_band.py +185 -0
- TB2J/magnon/magnon_math.py +1 -0
- TB2J/magnon/plot.py +60 -21
- TB2J/mathutils/auto_kpath.py +151 -0
- tb2j-0.9.9.12.data/scripts/TB2J_plot_magnon_bands.py +7 -0
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/METADATA +4 -2
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/RECORD +33 -30
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_downfold.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_eigen.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_magnon.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_magnon2.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_magnon_dos.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_merge.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_rotate.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/TB2J_rotateDM.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/abacus2J.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/siesta2J.py +0 -0
- {tb2j-0.9.9.9.data → tb2j-0.9.9.12.data}/scripts/wann2J.py +0 -0
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/WHEEL +0 -0
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/entry_points.txt +0 -0
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/licenses/LICENSE +0 -0
- {tb2j-0.9.9.9.dist-info → tb2j-0.9.9.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,185 @@
|
|
1
|
+
"""Module for handling magnon band structure data and plotting."""
|
2
|
+
|
3
|
+
import json
|
4
|
+
from dataclasses import dataclass
|
5
|
+
from typing import List, Optional, Tuple, Union
|
6
|
+
|
7
|
+
import matplotlib.pyplot as plt
|
8
|
+
import numpy as np
|
9
|
+
|
10
|
+
|
11
|
+
@dataclass
|
12
|
+
class MagnonBand:
|
13
|
+
"""Magnon band structure data and plotting functionality.
|
14
|
+
|
15
|
+
Parameters
|
16
|
+
----------
|
17
|
+
energies : np.ndarray
|
18
|
+
Band energies of shape (nkpts, nbands)
|
19
|
+
kpoints : np.ndarray
|
20
|
+
k-points coordinates of shape (nkpts, 3)
|
21
|
+
kpath_labels : List[Tuple[int, str]]
|
22
|
+
List of (index, label) tuples for special k-points
|
23
|
+
special_points : dict
|
24
|
+
Dictionary mapping k-point names to their coordinates
|
25
|
+
xcoords : Optional[Union[np.ndarray, List[np.ndarray]]]
|
26
|
+
x-coordinates for plotting. Can be continuous or segmented.
|
27
|
+
"""
|
28
|
+
|
29
|
+
energies: np.ndarray
|
30
|
+
kpoints: np.ndarray
|
31
|
+
kpath_labels: List[Tuple[int, str]]
|
32
|
+
special_points: dict
|
33
|
+
xcoords: Optional[Union[np.ndarray, List[np.ndarray]]] = None
|
34
|
+
|
35
|
+
def __post_init__(self):
|
36
|
+
"""Convert input arrays to numpy arrays and set default x-coordinates."""
|
37
|
+
self.energies = np.array(self.energies)
|
38
|
+
self.kpoints = np.array(self.kpoints)
|
39
|
+
|
40
|
+
if self.xcoords is None:
|
41
|
+
self.xcoords = np.arange(len(self.kpoints))
|
42
|
+
|
43
|
+
def plot(self, ax=None, filename=None, show=False, shift=0.0,**kwargs):
|
44
|
+
"""Plot the magnon band structure.
|
45
|
+
|
46
|
+
Parameters
|
47
|
+
----------
|
48
|
+
ax : matplotlib.axes.Axes, optional
|
49
|
+
Matplotlib axes for plotting. If None, creates new figure.
|
50
|
+
filename : str, optional
|
51
|
+
If provided, saves plot to this file.
|
52
|
+
show : bool, optional
|
53
|
+
Whether to show the plot on screen. Default is False.
|
54
|
+
**kwargs : dict
|
55
|
+
Additional arguments passed to plot function:
|
56
|
+
- linewidth: float, default 1.5
|
57
|
+
- color: str, default 'blue'
|
58
|
+
- linestyle: str, default '-'
|
59
|
+
|
60
|
+
Returns
|
61
|
+
-------
|
62
|
+
matplotlib.axes.Axes
|
63
|
+
The axes object containing the plot
|
64
|
+
"""
|
65
|
+
if ax is None:
|
66
|
+
fig, ax = plt.subplots(constrained_layout=True)
|
67
|
+
|
68
|
+
# Plot settings
|
69
|
+
linewidth = kwargs.pop("linewidth", 1.5)
|
70
|
+
color = kwargs.pop("color", "blue")
|
71
|
+
linestyle = kwargs.pop("linestyle", "-")
|
72
|
+
|
73
|
+
# Plot bands
|
74
|
+
if isinstance(self.xcoords, list): # Segmented path
|
75
|
+
start_idx = 0
|
76
|
+
for x in self.xcoords:
|
77
|
+
nbands = x.shape[0]
|
78
|
+
segment_bands = self.energies[start_idx : start_idx + nbands].T
|
79
|
+
for band in segment_bands:
|
80
|
+
ax.plot(
|
81
|
+
x,
|
82
|
+
band[start_idx : start_idx + nbands]+shift,
|
83
|
+
linewidth=linewidth,
|
84
|
+
color=color,
|
85
|
+
linestyle=linestyle,
|
86
|
+
**kwargs,
|
87
|
+
)
|
88
|
+
start_idx += nbands
|
89
|
+
ax.set_xlim([self.xcoords[0][0], self.xcoords[-1][-1]])
|
90
|
+
else: # Continuous path
|
91
|
+
for band in self.energies.T:
|
92
|
+
ax.plot(
|
93
|
+
self.xcoords,
|
94
|
+
band+shift,
|
95
|
+
linewidth=linewidth,
|
96
|
+
color=color,
|
97
|
+
linestyle=linestyle,
|
98
|
+
**kwargs,
|
99
|
+
)
|
100
|
+
ax.set_xlim([self.xcoords[0], self.xcoords[-1]])
|
101
|
+
|
102
|
+
# Set y-limits with padding
|
103
|
+
bmin, bmax = self.energies.min(), self.energies.max()
|
104
|
+
ymin = bmin - 0.05 * abs(bmin - bmax)
|
105
|
+
ymax = bmax + 0.05 * abs(bmax - bmin)
|
106
|
+
ax.set_ylim([ymin, ymax])
|
107
|
+
|
108
|
+
# Add k-point labels and vertical lines
|
109
|
+
kpoint_pos = [i for i, _ in self.kpath_labels]
|
110
|
+
kpoint_labels = [label for _, label in self.kpath_labels]
|
111
|
+
ax.set_xticks(kpoint_pos)
|
112
|
+
ax.set_xticklabels(kpoint_labels)
|
113
|
+
ax.vlines(
|
114
|
+
x=kpoint_pos,
|
115
|
+
ymin=ymin,
|
116
|
+
ymax=ymax,
|
117
|
+
color="black",
|
118
|
+
linewidth=linewidth / 5,
|
119
|
+
)
|
120
|
+
|
121
|
+
ax.set_ylabel("Energy (meV)")
|
122
|
+
|
123
|
+
if filename is not None:
|
124
|
+
plt.savefig(filename, dpi=300, bbox_inches="tight")
|
125
|
+
if show:
|
126
|
+
plt.show()
|
127
|
+
|
128
|
+
return ax
|
129
|
+
|
130
|
+
def save(self, filename: str):
|
131
|
+
"""Save band structure data to a JSON file.
|
132
|
+
|
133
|
+
Parameters
|
134
|
+
----------
|
135
|
+
filename : str
|
136
|
+
Output filename (will append .json if needed)
|
137
|
+
"""
|
138
|
+
if not filename.endswith(".json"):
|
139
|
+
filename = filename + ".json"
|
140
|
+
|
141
|
+
data = {
|
142
|
+
"kpoints": self.kpoints.tolist(),
|
143
|
+
"energies": self.energies.tolist(),
|
144
|
+
"kpath_labels": [(int(i), str(l)) for i, l in self.kpath_labels],
|
145
|
+
"special_points": {k: v.tolist() for k, v in self.special_points.items()},
|
146
|
+
"xcoords": self.xcoords.tolist()
|
147
|
+
if isinstance(self.xcoords, np.ndarray)
|
148
|
+
else [x.tolist() for x in self.xcoords]
|
149
|
+
if self.xcoords is not None
|
150
|
+
else None,
|
151
|
+
}
|
152
|
+
|
153
|
+
with open(filename, "w") as f:
|
154
|
+
json.dump(data, f, indent=2)
|
155
|
+
|
156
|
+
@classmethod
|
157
|
+
def load(cls, filename: str) -> "MagnonBand":
|
158
|
+
"""Load band structure from a JSON file.
|
159
|
+
|
160
|
+
Parameters
|
161
|
+
----------
|
162
|
+
filename : str
|
163
|
+
Input JSON filename
|
164
|
+
|
165
|
+
Returns
|
166
|
+
-------
|
167
|
+
MagnonBand
|
168
|
+
Loaded band structure object
|
169
|
+
"""
|
170
|
+
with open(filename) as f:
|
171
|
+
data = json.load(f)
|
172
|
+
|
173
|
+
# Convert lists back to numpy arrays
|
174
|
+
data["kpoints"] = np.array(data["kpoints"])
|
175
|
+
data["energies"] = np.array(data["energies"])
|
176
|
+
if data["xcoords"] is not None:
|
177
|
+
if isinstance(data["xcoords"][0], list): # Segmented path
|
178
|
+
data["xcoords"] = [np.array(x) for x in data["xcoords"]]
|
179
|
+
else: # Continuous path
|
180
|
+
data["xcoords"] = np.array(data["xcoords"])
|
181
|
+
data["special_points"] = {
|
182
|
+
k: np.array(v) for k, v in data["special_points"].items()
|
183
|
+
}
|
184
|
+
|
185
|
+
return cls(**data)
|
TB2J/magnon/magnon_math.py
CHANGED
@@ -32,6 +32,7 @@ def get_rotation_arrays(magmoms, u=uz):
|
|
32
32
|
v = magmoms
|
33
33
|
n = np.cross(u, v)
|
34
34
|
n /= np.linalg.norm(n, axis=-1).reshape(dim, 1)
|
35
|
+
#z = u #np.repeat(u, dim, axis=0)
|
35
36
|
z = np.repeat(u, dim, axis=0)
|
36
37
|
A = np.stack([z, np.cross(n, z), n], axis=1)
|
37
38
|
B = np.stack([v, np.cross(n, v), n], axis=1)
|
TB2J/magnon/plot.py
CHANGED
@@ -6,10 +6,23 @@ class BandsPlot:
|
|
6
6
|
_UNITS = "meV"
|
7
7
|
_NSYSTEMS = 1
|
8
8
|
|
9
|
-
def __init__(self, bands, kpath, **kwargs):
|
10
|
-
|
9
|
+
def __init__(self, bands, kpath, xlist=None, **kwargs):
|
10
|
+
"""Initialize BandsPlot.
|
11
|
+
|
12
|
+
Parameters
|
13
|
+
----------
|
14
|
+
bands : array_like
|
15
|
+
Band energies
|
16
|
+
kpath : list of (index, label) tuples
|
17
|
+
K-point labels and their indices
|
18
|
+
xlist : list of arrays, optional
|
19
|
+
X-coordinates for segmented paths. If None, uses range(nbands)
|
20
|
+
**kwargs : dict
|
21
|
+
Additional plotting options
|
22
|
+
"""
|
23
|
+
self.bands = bands * 1000 # Convert to meV
|
11
24
|
self.kpath = kpath
|
12
|
-
self.
|
25
|
+
self.xlist = xlist
|
13
26
|
|
14
27
|
plot_options = kwargs
|
15
28
|
self.linewidth = plot_options.pop("linewidth", 1.5)
|
@@ -19,29 +32,55 @@ class BandsPlot:
|
|
19
32
|
self.plot_options = plot_options
|
20
33
|
|
21
34
|
def plot(self, filename=None):
|
22
|
-
|
35
|
+
"""Plot the band structure.
|
23
36
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
color=self.color,
|
31
|
-
**self.plot_options,
|
32
|
-
)
|
37
|
+
Parameters
|
38
|
+
----------
|
39
|
+
filename : str, optional
|
40
|
+
If provided, saves the plot to this file
|
41
|
+
"""
|
42
|
+
fig, axs = plt.subplots(1, self._NSYSTEMS, constrained_layout=True)
|
33
43
|
|
44
|
+
# Get min/max for y-axis limits
|
34
45
|
bmin, bmax = self.bands.min(), self.bands.max()
|
35
|
-
ymin
|
36
|
-
|
37
|
-
bmax + 0.05 * np.abs(bmax - bmin),
|
38
|
-
)
|
39
|
-
|
46
|
+
ymin = bmin - 0.05 * np.abs(bmin - bmax)
|
47
|
+
ymax = bmax + 0.05 * np.abs(bmax - bmin)
|
40
48
|
axs.set_ylim([ymin, ymax])
|
41
|
-
axs.set_xlim([0, kdata[-1]])
|
42
49
|
|
50
|
+
# Plot bands
|
51
|
+
if self.xlist is not None:
|
52
|
+
# Plot segments
|
53
|
+
start_idx = 0
|
54
|
+
for x in self.xlist:
|
55
|
+
nbands = x.shape[0]
|
56
|
+
segment_bands = self.bands[start_idx : start_idx + nbands].T
|
57
|
+
for band in segment_bands:
|
58
|
+
axs.plot(
|
59
|
+
x,
|
60
|
+
band[start_idx : start_idx + nbands],
|
61
|
+
linewidth=self.linewidth,
|
62
|
+
color=self.color,
|
63
|
+
**self.plot_options,
|
64
|
+
)
|
65
|
+
start_idx += nbands
|
66
|
+
# Set xlim to cover all segments
|
67
|
+
axs.set_xlim([self.xlist[0][0], self.xlist[-1][-1]])
|
68
|
+
else:
|
69
|
+
# Standard continuous plotting
|
70
|
+
kdata = np.arange(self.bands.shape[0])
|
71
|
+
for band in self.bands.T:
|
72
|
+
axs.plot(
|
73
|
+
kdata,
|
74
|
+
band,
|
75
|
+
linewidth=self.linewidth,
|
76
|
+
color=self.color,
|
77
|
+
**self.plot_options,
|
78
|
+
)
|
79
|
+
axs.set_xlim([0, kdata[-1]])
|
80
|
+
|
81
|
+
# Add k-point labels and vertical lines
|
43
82
|
kpoint_labels = list(zip(*self.kpath))
|
44
|
-
axs.set_xticks(
|
83
|
+
axs.set_xticks(kpoint_labels[0], kpoint_labels[1], fontsize=self.ticksize)
|
45
84
|
axs.vlines(
|
46
85
|
x=kpoint_labels[0],
|
47
86
|
ymin=ymin,
|
@@ -55,4 +94,4 @@ class BandsPlot:
|
|
55
94
|
if filename is None:
|
56
95
|
plt.show()
|
57
96
|
else:
|
58
|
-
|
97
|
+
plt.savefig(filename, dpi=300, bbox_inches="tight")
|
@@ -0,0 +1,151 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
from __future__ import division
|
3
|
+
|
4
|
+
import ase
|
5
|
+
import matplotlib.pyplot as plt
|
6
|
+
import numpy as np
|
7
|
+
from ase.cell import Cell
|
8
|
+
from ase.dft.kpoints import bandpath
|
9
|
+
|
10
|
+
# from minimulti.spin.hamiltonian import SpinHamiltonian
|
11
|
+
# from minimulti.spin.mover import SpinMover
|
12
|
+
|
13
|
+
|
14
|
+
def group_band_path(bp, eps=1e-8, shift=0.15):
|
15
|
+
"""Groups band paths by separating segments with small distances between points.
|
16
|
+
|
17
|
+
Parameters
|
18
|
+
----------
|
19
|
+
bp : ASE.cell.BandPath
|
20
|
+
The band path object containing k-points and special points
|
21
|
+
eps : float, optional
|
22
|
+
The threshold distance below which points are considered to be in the same group.
|
23
|
+
Default is 1e-8.
|
24
|
+
shift : float, optional
|
25
|
+
The shift distance to apply between different segments for visualization.
|
26
|
+
Default is 0.15.
|
27
|
+
|
28
|
+
Returns
|
29
|
+
-------
|
30
|
+
tuple
|
31
|
+
Contains:
|
32
|
+
- xlist : list of arrays
|
33
|
+
The x-coordinates for each segment, shifted for visualization
|
34
|
+
- kptlist : list of arrays
|
35
|
+
The k-points for each segment
|
36
|
+
- Xs : array
|
37
|
+
The x-coordinates of special points, shifted for visualization
|
38
|
+
- knames : list
|
39
|
+
The names of special k-points
|
40
|
+
"""
|
41
|
+
xs, Xs, knames = bp.get_linear_kpoint_axis()
|
42
|
+
kpts = bp.kpts
|
43
|
+
|
44
|
+
m = xs[1:] - xs[:-1] < eps
|
45
|
+
segments = [0] + list(np.where(m)[0] + 1) + [len(xs)]
|
46
|
+
|
47
|
+
# split Xlist
|
48
|
+
xlist, kptlist = [], []
|
49
|
+
for i, (start, end) in enumerate(zip(segments[:-1], segments[1:])):
|
50
|
+
kptlist.append(kpts[start:end])
|
51
|
+
xlist.append(xs[start:end] + i * shift)
|
52
|
+
|
53
|
+
m = Xs[1:] - Xs[:-1] < eps
|
54
|
+
|
55
|
+
s = np.where(m)[0] + 1
|
56
|
+
|
57
|
+
for i in s:
|
58
|
+
Xs[i:] += shift
|
59
|
+
|
60
|
+
return xlist, kptlist, Xs, knames
|
61
|
+
|
62
|
+
|
63
|
+
def test_group_band_path():
|
64
|
+
"""Visualize the band path grouping functionality.
|
65
|
+
|
66
|
+
This function demonstrates how group_band_path works by:
|
67
|
+
1. Creating a simple test case (H atom with rectangular cell)
|
68
|
+
2. Generating a band path with 50 points
|
69
|
+
3. Grouping the path segments using group_band_path
|
70
|
+
4. Plotting each segment to visualize how segments are shifted
|
71
|
+
|
72
|
+
The resulting plot shows:
|
73
|
+
- Each path segment plotted separately
|
74
|
+
- Special k-points labeled on x-axis
|
75
|
+
- Segments shifted relative to each other for clarity
|
76
|
+
|
77
|
+
Note: This is a visualization function rather than a unit test.
|
78
|
+
It helps understand the band path grouping behavior visually.
|
79
|
+
"""
|
80
|
+
atoms = ase.Atoms("H", cell=[1, 1, 2])
|
81
|
+
bp = atoms.cell.bandpath(npoints=50)
|
82
|
+
xlist, kptlist, Xs, knames, spk = group_band_path(bp)
|
83
|
+
|
84
|
+
for x, k in zip(xlist, kptlist):
|
85
|
+
plt.plot(x, x)
|
86
|
+
|
87
|
+
plt.xticks(Xs, knames)
|
88
|
+
plt.show()
|
89
|
+
|
90
|
+
|
91
|
+
def auto_kpath(cell, knames, kvectors=None, npoints=100, supercell_matrix=None):
|
92
|
+
"""Generates an automatic k-path for band structure calculations.
|
93
|
+
|
94
|
+
Parameters
|
95
|
+
----------
|
96
|
+
cell : array_like
|
97
|
+
The unit cell vectors
|
98
|
+
knames : list or None
|
99
|
+
Names of the high-symmetry k-points. If None and kvectors is None,
|
100
|
+
automatically determines the path. If kvectors is provided, these names
|
101
|
+
correspond to the provided k-vectors.
|
102
|
+
kvectors : array_like, optional
|
103
|
+
Explicit k-vectors for the path. If None, vectors are determined from
|
104
|
+
knames or automatically. Default is None.
|
105
|
+
npoints : int, optional
|
106
|
+
Number of k-points along the path. Default is 100.
|
107
|
+
supercell_matrix : array_like, optional
|
108
|
+
Transformation matrix for supercell calculations. If provided, k-points
|
109
|
+
are transformed accordingly. Default is None.
|
110
|
+
|
111
|
+
Returns
|
112
|
+
-------
|
113
|
+
tuple
|
114
|
+
Contains:
|
115
|
+
- xlist : list of arrays
|
116
|
+
The x-coordinates for each path segment
|
117
|
+
- kptlist : list of arrays
|
118
|
+
The k-points for each segment
|
119
|
+
- Xs : array
|
120
|
+
The x-coordinates of special points
|
121
|
+
- knames : list
|
122
|
+
The names of special k-points
|
123
|
+
- spk : dict
|
124
|
+
Dictionary mapping k-point names to their coordinates
|
125
|
+
"""
|
126
|
+
if knames is None and kvectors is None:
|
127
|
+
# fully automatic k-path
|
128
|
+
bp = Cell(cell).bandpath(npoints=npoints)
|
129
|
+
spk = bp.special_points
|
130
|
+
xlist, kptlist, Xs, knames = group_band_path(bp)
|
131
|
+
elif knames is not None and kvectors is None:
|
132
|
+
# user specified kpath by name
|
133
|
+
bp = Cell(cell).bandpath(knames, npoints=npoints)
|
134
|
+
spk = bp.special_points
|
135
|
+
kpts = bp.kpts
|
136
|
+
xlist, kptlist, Xs, knames = group_band_path(bp)
|
137
|
+
else:
|
138
|
+
# user spcified kpath and kvector.
|
139
|
+
kpts, x, Xs = bandpath(kvectors, cell, npoints)
|
140
|
+
spk = dict(zip(knames, kvectors))
|
141
|
+
xlist = [x]
|
142
|
+
kptlist = [kpts]
|
143
|
+
|
144
|
+
if supercell_matrix is not None:
|
145
|
+
kptlist = [np.dot(k, supercell_matrix) for k in kptlist]
|
146
|
+
print("High symmetry k-points:")
|
147
|
+
for name, k in spk.items():
|
148
|
+
if name == "G":
|
149
|
+
name = "Gamma"
|
150
|
+
print(f"{name}: {k}")
|
151
|
+
return xlist, kptlist, Xs, knames, spk
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: TB2J
|
3
|
-
Version: 0.9.9.
|
3
|
+
Version: 0.9.9.12
|
4
4
|
Summary: TB2J: First principle to Heisenberg exchange J using tight-binding Green function method
|
5
5
|
Author: Xu He
|
6
6
|
Author-email: mailhexu@gmail.com
|
@@ -21,10 +21,12 @@ Requires-Dist: ase>=3.19
|
|
21
21
|
Requires-Dist: tqdm
|
22
22
|
Requires-Dist: pathos
|
23
23
|
Requires-Dist: packaging>=20.0
|
24
|
-
Requires-Dist: HamiltonIO>=0.2.
|
24
|
+
Requires-Dist: HamiltonIO>=0.2.4
|
25
25
|
Requires-Dist: pre-commit
|
26
26
|
Requires-Dist: sympair>0.1.0
|
27
27
|
Requires-Dist: sisl>=0.9.0
|
28
|
+
Requires-Dist: tomli>=2.0.0
|
29
|
+
Requires-Dist: tomli-w>=1.0.0
|
28
30
|
Dynamic: author
|
29
31
|
Dynamic: author-email
|
30
32
|
Dynamic: classifier
|
@@ -1,17 +1,17 @@
|
|
1
1
|
TB2J/Jdownfolder.py,sha256=n5BeQCYP4mD9JsAPeE1F3ZKKR3SUxADfDbaG_rzi77k,9658
|
2
|
-
TB2J/Jtensor.py,sha256=
|
2
|
+
TB2J/Jtensor.py,sha256=Wi06AAbfKFU6f2a2jkFr9zU2cwwfVroajTp-dwCtkTE,3160
|
3
3
|
TB2J/MAE.py,sha256=fM8U-Dgp9HcQOEeC_kyZV1oVrygBvcux9BraUXVouvY,10994
|
4
|
-
TB2J/MAEGreen.py,sha256=
|
4
|
+
TB2J/MAEGreen.py,sha256=DHoU6nlM0Fk42T_SYd_s-VafB6wCZNzVzRXhuv-hCwM,15762
|
5
5
|
TB2J/Oiju.py,sha256=cNGv8N5uH_swGq7cnAt2OyiDfqtjLlLrwseGu0E4iaM,3383
|
6
6
|
TB2J/Oiju_epc.py,sha256=oytM3NYW7nWmklrGgNlqwIpI_JYv_hb7ZnR4o9nYNog,6809
|
7
|
-
TB2J/__init__.py,sha256=
|
7
|
+
TB2J/__init__.py,sha256=TcMW0FTsZFR9McJTh8TBwZl2lylHc2uwsxVV9PsgSwY,25
|
8
8
|
TB2J/anisotropy.py,sha256=0zmvXkmDmakbBOwGYLa3IIkv5cE99SHLAQJsGoZz7JQ,25463
|
9
9
|
TB2J/basis.py,sha256=DFo6_QUwjBwisP6zGxvoO0lpGTMDPAOkiL9giNCjOjA,1558
|
10
10
|
TB2J/citation.py,sha256=gcQeyJZaT1Qrtsl8Y3s4neOH3-vvgmIcCvXeV2o3vj0,2891
|
11
11
|
TB2J/contour.py,sha256=zLHQZZ3hhgLkLFPATCraLOJyLJKLC0fba_L_5sRz23o,3246
|
12
12
|
TB2J/density_matrix.py,sha256=D5k8Oe21OCiLVORNYbo4TZOFG0slrQSbj91kJ3TMFjs,1514
|
13
13
|
TB2J/epc.py,sha256=zLbtqZJhDr8DnnGN6YENcXwrMb3Qxu6KB08mLy9Pw20,3474
|
14
|
-
TB2J/exchange.py,sha256=
|
14
|
+
TB2J/exchange.py,sha256=rJ7XeHOo6j9A0alauM2XQ5DvTO741dq_pDQQxyyn8mE,26981
|
15
15
|
TB2J/exchangeCL2.py,sha256=P7bklMXVYX_tn9DbjEPqeTir1SeZyfPBIP1fhWUzLmY,11419
|
16
16
|
TB2J/exchange_params.py,sha256=VW9nGVio6M_Ub9-36L_LExhjgdD1E_joYpI8AxmM360,8029
|
17
17
|
TB2J/exchange_pert.py,sha256=jmFMtQbYa_uczM4VAeS6TijkIHRFIqEzZJswzE9Wfuo,8523
|
@@ -19,7 +19,7 @@ TB2J/exchange_qspace.py,sha256=ZL68qBGFUaQ9BsSPsJaaoWOr9RssPiqX34R_9I3nk_8,8436
|
|
19
19
|
TB2J/gpaw_wrapper.py,sha256=aJ--9Dtyq7jOP1Hkh-Sh1nWcfXm6zKcljOCO0DNCAr0,6890
|
20
20
|
TB2J/green.py,sha256=ySXjoV3Cj_E2C41dRfc3TkS7M4vmM6qcHXkt-_-jxsY,17071
|
21
21
|
TB2J/greentest.py,sha256=2ISSfhor9ecSEOi_E6b4Cv26wEIQlwlzca0ru8z44_E,1603
|
22
|
-
TB2J/io_merge.py,sha256=
|
22
|
+
TB2J/io_merge.py,sha256=xj5sIo5o62HYwSnijGycem_rAc8kSzY-HI2IJDRhzyE,7405
|
23
23
|
TB2J/kpoints.py,sha256=9L7tBarFBHoIhpuc9zuwA6HdnlgH834SQrPek4yRoWk,3191
|
24
24
|
TB2J/myTB.py,sha256=ok_B4my29bOIghMSZfx0Es6G8FaXaIiLP4gPxTdSj00,17659
|
25
25
|
TB2J/mycfr.py,sha256=ZF1PEE2khlKd_4gPyMkoNXepX3XqwWAL2kDbRJNVX-Y,3908
|
@@ -43,32 +43,34 @@ 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=
|
46
|
+
TB2J/interfaces/siesta_interface.py,sha256=Y4rRn_MRZUOI4y4btgCKTtVy8iXrSpaBuK7SMCJ1C2o,7594
|
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
|
50
50
|
TB2J/interfaces/abacus/abacus_wrapper.py,sha256=bQFnvvy-0hruTavH_VspMk1wD32t2UFybEkCgwkwle0,11941
|
51
51
|
TB2J/interfaces/abacus/gen_exchange_abacus.py,sha256=v-AUHGkJWeMNf4D5A4wOpCjM6DygQsFB6SWu-BGdTxM,3262
|
52
52
|
TB2J/interfaces/abacus/orbital_api.py,sha256=QEAyy4y_uM5GnwRyLvmShjd_z5A2fwqk7L8yj0Y2Mgc,1577
|
53
|
-
TB2J/interfaces/abacus/stru_api.py,sha256=
|
53
|
+
TB2J/interfaces/abacus/stru_api.py,sha256=UsIs55Y_1AM31N2oCjwmgHIMgRIcusKA6g3K2tjr3uM,67945
|
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
57
|
TB2J/io_exchange/__init__.py,sha256=LqEnG67qDVKt4hCUywDEQvUIJ7jsQjmtueOW_J16NOE,54
|
58
|
-
TB2J/io_exchange/io_exchange.py,sha256=
|
58
|
+
TB2J/io_exchange/io_exchange.py,sha256=KnR2UyvMSoBye8dD6ETqZW6nld-CcYchcCrAmHbVsBA,22735
|
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
|
-
TB2J/io_exchange/io_vampire.py,sha256=
|
64
|
-
TB2J/magnon/__init__.py,sha256=
|
63
|
+
TB2J/io_exchange/io_vampire.py,sha256=u4NZhqoC_JBcVq19WZfBkyM5p8u-OMuRoUrtFIcPp5E,5762
|
64
|
+
TB2J/magnon/__init__.py,sha256=Q69duroGIIotgW_71ZdHYarSiJLGAu9NPYgEacUk6eI,117
|
65
65
|
TB2J/magnon/io_exchange2.py,sha256=EcC3x6H13qq61WBsr__xKzHDtSvy_dMz1tEdUaqSG2I,23265
|
66
|
-
TB2J/magnon/magnon3.py,sha256=
|
66
|
+
TB2J/magnon/magnon3.py,sha256=75YmSTT652q7lLEmJmn4-TbIkwJnjjelMfu0eyEzjA0,27401
|
67
|
+
TB2J/magnon/magnon_band.py,sha256=8HJWl1zcYSxJQflFUj4qaITnTWE-rhF5zQ1YgQN78oU,6098
|
67
68
|
TB2J/magnon/magnon_io.py,sha256=H4bmzCcnh1D3Sb6UBIIKWa6jIrA20dg9lX4wfLXHEjo,1241
|
68
|
-
TB2J/magnon/magnon_math.py,sha256=
|
69
|
-
TB2J/magnon/plot.py,sha256=
|
69
|
+
TB2J/magnon/magnon_math.py,sha256=b4Po_aZm8aIhr5u2nbjjtDDMTKV_ecI2d6Fc_AhiuNc,1358
|
70
|
+
TB2J/magnon/plot.py,sha256=oNavax15jRfW4Sxl6FgwLXSrMntyVz2cgVDbmgkWehw,3193
|
70
71
|
TB2J/magnon/structure.py,sha256=rKefzXgQlEjVvV-A7E2IogVDWwf5egZr3Wxxu6HuJU4,7685
|
71
72
|
TB2J/mathutils/__init__.py,sha256=E70Mx8mLXh3DJGmdN3TLWmGYMcsbvKxmgxUbAI6Mzmo,49
|
73
|
+
TB2J/mathutils/auto_kpath.py,sha256=bDXDyQzRByVpPSOpz7NU7F5hYqS6IX-47lwWoMU89lM,4978
|
72
74
|
TB2J/mathutils/fermi.py,sha256=72tZ5CptGmYaBUD0xLWltuH7LBXcrMUwODyW6-WqlzI,638
|
73
75
|
TB2J/mathutils/fibonacci_sphere.py,sha256=1rqf5n3a9aDjSydA4qGkR1eIeLJKuoblA73cchWJzNg,2342
|
74
76
|
TB2J/mathutils/kR_convert.py,sha256=p_9XWJVNanTzTK2rI6KRjTkbSq42la6N448-zJOsMwY,2671
|
@@ -87,20 +89,21 @@ TB2J/spinham/supercell.py,sha256=y17uUC6r3gQb278FhxIW4CABihfLTvKFj6flyXrCPR8,122
|
|
87
89
|
TB2J/wannier/__init__.py,sha256=7ojCbM84PYv1X1Tbo4NHI-d3gWmQsZB_xiYqbfxVV1E,80
|
88
90
|
TB2J/wannier/w90_parser.py,sha256=dbd63LuKyv2DVUzqRINGsbDzEsOxsQyE8_Ear_LQIRg,4620
|
89
91
|
TB2J/wannier/w90_tb_parser.py,sha256=qt8pnuprmPp9iIAYwPkPbmEzk6ZPgMq2xognoQp7vwc,4610
|
90
|
-
tb2j-0.9.9.
|
91
|
-
tb2j-0.9.9.
|
92
|
-
tb2j-0.9.9.
|
93
|
-
tb2j-0.9.9.
|
94
|
-
tb2j-0.9.9.
|
95
|
-
tb2j-0.9.9.
|
96
|
-
tb2j-0.9.9.
|
97
|
-
tb2j-0.9.9.
|
98
|
-
tb2j-0.9.9.
|
99
|
-
tb2j-0.9.9.
|
100
|
-
tb2j-0.9.9.
|
101
|
-
tb2j-0.9.9.
|
102
|
-
tb2j-0.9.9.
|
103
|
-
tb2j-0.9.9.
|
104
|
-
tb2j-0.9.9.
|
105
|
-
tb2j-0.9.9.
|
106
|
-
tb2j-0.9.9.
|
92
|
+
tb2j-0.9.9.12.data/scripts/TB2J_downfold.py,sha256=i4BVqnpDdgrX_amookVWeLGefGBn-qeAutWiwuY9SfQ,2099
|
93
|
+
tb2j-0.9.9.12.data/scripts/TB2J_eigen.py,sha256=Qs9v2hnMm2Tpfoa4h53muUKty2dZjwx8948MBoQooNg,1128
|
94
|
+
tb2j-0.9.9.12.data/scripts/TB2J_magnon.py,sha256=q7UwAmorRcFNk4tfE7gl_ny05l6p7pbD9Wm_LkIpKEw,3101
|
95
|
+
tb2j-0.9.9.12.data/scripts/TB2J_magnon2.py,sha256=tMa7Fg_Wd2UytnrH3C_AsgGM7BciUW0iy6NiPlWvar8,1920
|
96
|
+
tb2j-0.9.9.12.data/scripts/TB2J_magnon_dos.py,sha256=TMXQvD2dIbO5FZ4tUMmxJgCgH2O2hDAPUNfEKO4z-x4,110
|
97
|
+
tb2j-0.9.9.12.data/scripts/TB2J_merge.py,sha256=y834SF4rIRn1L1ptkhczvavQpC-8Px6DTmDOOSaq_DE,1854
|
98
|
+
tb2j-0.9.9.12.data/scripts/TB2J_plot_magnon_bands.py,sha256=qUbisPFLvW_j1IdTpc_jU0WiT-7CT-WErbkhNvAPM0Y,91
|
99
|
+
tb2j-0.9.9.12.data/scripts/TB2J_rotate.py,sha256=zgiDFuYZNmzKK0rwDmTaYD2OpRlmKA_VGeBx83w2Xwc,873
|
100
|
+
tb2j-0.9.9.12.data/scripts/TB2J_rotateDM.py,sha256=kCvF7gotuqAX1VnJ06cwfVm7RrhrdtiV5v7d9P2Pn_E,567
|
101
|
+
tb2j-0.9.9.12.data/scripts/abacus2J.py,sha256=ozYI7qZyja1WEs9oCYVpeYAfVj5PGhehhmdZFcvrd3g,1795
|
102
|
+
tb2j-0.9.9.12.data/scripts/siesta2J.py,sha256=QJ6c0DbqxaqYEesxiL5R9nK9-flNLrr7hajKfCwirYc,2318
|
103
|
+
tb2j-0.9.9.12.data/scripts/wann2J.py,sha256=OA31VHEXbQMD-JozoLUHDF6vB9Sr62d804OApSKtSnU,3240
|
104
|
+
tb2j-0.9.9.12.dist-info/licenses/LICENSE,sha256=CbZI-jyRTjiqIcWa244cRSHJdjjtUNqGR4HeJkgEwJw,1332
|
105
|
+
tb2j-0.9.9.12.dist-info/METADATA,sha256=Anj_G_XNOwWJm5YoXyx4drNpy1N0-aJTqpGpk5YX6lE,1745
|
106
|
+
tb2j-0.9.9.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
107
|
+
tb2j-0.9.9.12.dist-info/entry_points.txt,sha256=Hdz1WC9waUzyFVmowKnbbZ6j-J4adHh_Ko6JpxGYAtE,131
|
108
|
+
tb2j-0.9.9.12.dist-info/top_level.txt,sha256=whYa5ByLYhl5XnTPBHSWr-IGD6VWmr5Ql2bye2qwV_s,5
|
109
|
+
tb2j-0.9.9.12.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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|