Skip to content

Commit f9c4d66

Browse files
authored
add manually input overlap matrix feature with example (deepmodeling#253)
* add manually input overlap matrix feature with example * add manually input overlap matrix feature with example * fix expected_value_k1 with more accurate average values * fix: update kpath values in normal_jdata for accurate band testing
1 parent 07c9871 commit f9c4d66

21 files changed

+574
-14
lines changed

dptb/postprocess/bandstructure/band.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,12 @@ def get_bands(self, data: Union[AtomicData, ase.Atoms, str], kpath_kwargs: dict,
207207
else:
208208
log.error('Error, now, kline_type only support ase_kpath, abacus, or vasp.')
209209
raise ValueError
210+
211+
override_overlap = None
212+
if kpath_kwargs.get("override_overlap", None):
213+
override_overlap = kpath_kwargs["override_overlap"]
210214

211-
data, eigenvalues = self.get_eigs(data=data, klist=klist, pbc=pbc, AtomicData_options=AtomicData_options)
215+
data, eigenvalues = self.get_eigs(data=data, klist=klist, pbc=pbc, AtomicData_options=AtomicData_options, override_overlap=override_overlap)
212216

213217

214218
# get the E_fermi from data

dptb/postprocess/elec_struc_cal.py

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
import h5py
13
import numpy as np
24
from ase.io import read
35
import ase
@@ -7,7 +9,7 @@
79
from typing import Optional
810
import logging
911
log = logging.getLogger(__name__)
10-
from dptb.data import AtomicData, AtomicDataDict
12+
from dptb.data import AtomicData, AtomicDataDict, block_to_feature
1113
from dptb.nn.energy import Eigenvalues
1214
from dptb.utils.argcheck import get_cutoffs_from_model_options
1315
from copy import deepcopy
@@ -66,7 +68,12 @@ def __init__ (
6668
)
6769
r_max, er_max, oer_max = get_cutoffs_from_model_options(model.model_options)
6870
self.cutoffs = {'r_max': r_max, 'er_max': er_max, 'oer_max': oer_max}
69-
def get_data(self,data: Union[AtomicData, ase.Atoms, str],pbc:Union[bool,list]=None, device: Union[str, torch.device]=None, AtomicData_options:dict=None):
71+
def get_data(self,
72+
data: Union[AtomicData, ase.Atoms, str],
73+
pbc:Union[bool,list]=None,
74+
device: Union[str, torch.device]=None,
75+
AtomicData_options:dict=None,
76+
override_overlap:Optional[str]=None):
7077
'''The function `get_data` takes input data in the form of a string, ase.Atoms object, or AtomicData
7178
object, processes it accordingly, and returns the AtomicData class.
7279
@@ -81,6 +88,7 @@ def get_data(self,data: Union[AtomicData, ase.Atoms, str],pbc:Union[bool,list]=N
8188
device : Union[str, torch.device]
8289
The `device` parameter in the `get_data` function is used to specify the device on which the data
8390
should be processed. If no device is provided, it defaults to `self.device`.
91+
override_overlap : the path for overlap.h5 to use and override overlap matrix from model.
8492
8593
Returns
8694
-------
@@ -130,7 +138,30 @@ def get_data(self,data: Union[AtomicData, ase.Atoms, str],pbc:Union[bool,list]=N
130138
data = data
131139
else:
132140
raise ValueError('data should be either a string, ase.Atoms, or AtomicData')
133-
141+
142+
if isinstance(override_overlap, str):
143+
assert os.path.exists(override_overlap), "Overlap file not found."
144+
overlap_blocks = h5py.File(override_overlap, "r")
145+
if len(overlap_blocks) != 1:
146+
log.info('Overlap file contains more than one overlap matrix, only first will be used.')
147+
if self.overlap:
148+
log.warning('override_overlap is enabled while model contains overlap, override_overlap will be used.')
149+
if "0" in overlap_blocks:
150+
overlaps = overlap_blocks["0"]
151+
else:
152+
overlaps = overlap_blocks["1"]
153+
block_to_feature(data, self.model.idp, blocks=False, overlap_blocks=overlaps)
154+
if not self.overlap:
155+
self.eigv = Eigenvalues(
156+
idp=self.model.idp,
157+
device=self.device,
158+
s_edge_field=AtomicDataDict.EDGE_OVERLAP_KEY,
159+
s_node_field=AtomicDataDict.NODE_OVERLAP_KEY,
160+
s_out_field=AtomicDataDict.OVERLAP_KEY,
161+
dtype=self.model.dtype,
162+
)
163+
overlap_blocks.close()
164+
134165
if device is None:
135166
device = self.device
136167
data = AtomicData.to_AtomicDataDict(data.to(device))
@@ -139,7 +170,12 @@ def get_data(self,data: Union[AtomicData, ase.Atoms, str],pbc:Union[bool,list]=N
139170
return data
140171

141172

142-
def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, pbc:Union[bool,list]=None, AtomicData_options:dict=None):
173+
def get_eigs(self,
174+
data: Union[AtomicData, ase.Atoms, str],
175+
klist: np.ndarray,
176+
pbc:Union[bool,list]=None,
177+
AtomicData_options:dict=None,
178+
override_overlap:Optional[str]=None):
143179
'''This function calculates eigenvalues for Hk at specified k-points.
144180
145181
Parameters
@@ -152,20 +188,27 @@ def get_eigs(self, data: Union[AtomicData, ase.Atoms, str], klist: np.ndarray, p
152188
AtomicData_options : dict
153189
The `AtomicData_options` parameter is a dictionary that contains options for configuring the
154190
`AtomicData` object.
191+
override_overlap : the path for overlap.h5 to use and override overlap matrix from model.
155192
156193
Returns
157194
-------
158195
The function `get_eigs` returns the loaded data and the energy eigenvalues as a numpy array.
159196
160197
'''
161198

162-
data = self.get_data(data=data, pbc=pbc, device=self.device,AtomicData_options=AtomicData_options)
199+
data = self.get_data(data=data, pbc=pbc, device=self.device,AtomicData_options=AtomicData_options, override_overlap=override_overlap)
163200
# set the kpoint of the AtomicData
164201
data[AtomicDataDict.KPOINT_KEY] = \
165202
torch.nested.as_nested_tensor([torch.as_tensor(klist, dtype=self.model.dtype, device=self.device)])
203+
if isinstance(override_overlap, str):
204+
override_overlap_edge = data[AtomicDataDict.EDGE_OVERLAP_KEY]
205+
override_overlap_node = data[AtomicDataDict.NODE_OVERLAP_KEY]
166206
# get the eigenvalues
167207
data = self.model(data)
168-
if self.overlap == True:
208+
if isinstance(override_overlap, str):
209+
data[AtomicDataDict.EDGE_OVERLAP_KEY] = override_overlap_edge
210+
data[AtomicDataDict.NODE_OVERLAP_KEY] = override_overlap_node
211+
if self.overlap or isinstance(override_overlap, str):
169212
assert data.get(AtomicDataDict.EDGE_OVERLAP_KEY) is not None
170213
data = self.eigv(data)
171214

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
14
2+
14
3+
14
4+
14
5+
14
6+
14
7+
14
8+
14
9+
14
10+
14
11+
14
12+
14
13+
14
14+
14
15+
14
16+
14
17+
14
18+
14
19+
14
20+
14
21+
14
22+
14
23+
14
24+
14
25+
14
26+
14
27+
14
28+
14
29+
14
30+
14
31+
14
32+
14
33+
14
34+
14
35+
14
36+
14
37+
14
38+
14
39+
14
40+
14
41+
14
42+
14
43+
14
44+
14
45+
14
46+
14
47+
14
48+
14
49+
14
50+
14
51+
14
52+
14
53+
14
54+
14
55+
14
56+
14
57+
14
58+
14
59+
14
60+
14
61+
14
62+
14
63+
14
64+
14
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{'Si': '1s1p'}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1.088740444183349609e+01 0.000000000000000000e+00 0.000000000000000000e+00
2+
0.000000000000000000e+00 1.088740444183349609e+01 0.000000000000000000e+00
3+
0.000000000000000000e+00 0.000000000000000000e+00 1.088740444183349609e+01
Binary file not shown.
992 Bytes
Binary file not shown.
2.21 MB
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1.000000000000000000e+00
2+
1.000000000000000000e+00
3+
1.000000000000000000e+00
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
1.085161685943603516e+01 1.280032098293304443e-01 1.078928661346435547e+01
2+
1.841060072183609009e-02 1.989128626883029938e-02 5.386826038360595703e+00
3+
1.083230304718017578e+01 5.443179607391357422e+00 1.084113216400146484e+01
4+
1.073209476470947266e+01 5.354926109313964844e+00 5.515145301818847656e+00
5+
5.484899997711181641e+00 1.084975528717041016e+01 1.489288061857223511e-01
6+
5.495874404907226562e+00 5.350070446729660034e-02 5.522494316101074219e+00
7+
5.428655624389648438e+00 5.469603061676025391e+00 5.730040743947029114e-02
8+
5.486892223358154297e+00 5.412618637084960938e+00 5.512423515319824219e+00
9+
5.753992870450019836e-02 2.735220670700073242e+00 2.737147808074951172e+00
10+
9.110579639673233032e-02 2.743179321289062500e+00 8.217595100402832031e+00
11+
5.919481441378593445e-02 8.242929458618164062e+00 2.665236473083496094e+00
12+
1.213727816939353943e-01 8.150724411010742188e+00 8.206772804260253906e+00
13+
5.396494388580322266e+00 2.671355247497558594e+00 2.717561483383178711e+00
14+
5.411704063415527344e+00 2.765727281570434570e+00 8.161295890808105469e+00
15+
5.338889122009277344e+00 8.191737174987792969e+00 2.803484678268432617e+00
16+
5.485008716583251953e+00 8.147904396057128906e+00 8.188732147216796875e+00
17+
2.697985887527465820e+00 2.655328989028930664e+00 1.086999511718750000e+01
18+
2.803299665451049805e+00 2.753925323486328125e+00 5.408394336700439453e+00
19+
2.731758594512939453e+00 8.291128158569335938e+00 1.087376213073730469e+01
20+
2.743048667907714844e+00 8.140621185302734375e+00 5.500893592834472656e+00
21+
8.194023132324218750e+00 2.727316379547119141e+00 1.087789916992187500e+01
22+
8.145998954772949219e+00 2.603254556655883789e+00 5.454698085784912109e+00
23+
7.996123313903808594e+00 8.126315116882324219e+00 5.489429086446762085e-02
24+
8.157540321350097656e+00 8.178661346435546875e+00 5.396069526672363281e+00
25+
2.724681615829467773e+00 1.085770320892333984e+01 2.624702692031860352e+00
26+
2.642884731292724609e+00 1.709322445094585419e-02 8.155264854431152344e+00
27+
2.728481531143188477e+00 5.489842891693115234e+00 2.687501192092895508e+00
28+
2.719804286956787109e+00 5.382710933685302734e+00 8.202189445495605469e+00
29+
8.232271194458007812e+00 1.088958159089088440e-01 2.695187807083129883e+00
30+
8.190147399902343750e+00 1.076476860046386719e+01 8.095950126647949219e+00
31+
8.187970161437988281e+00 5.468699455261230469e+00 2.664496183395385742e+00
32+
8.083069801330566406e+00 5.405988216400146484e+00 8.226228713989257812e+00
33+
4.130180358886718750e+00 1.358443140983581543e+00 4.137616157531738281e+00
34+
4.051333904266357422e+00 1.297201514244079590e+00 9.625466346740722656e+00
35+
4.133435726165771484e+00 6.705410480499267578e+00 4.101284980773925781e+00
36+
4.076243877410888672e+00 6.794273376464843750e+00 9.562548637390136719e+00
37+
9.573958396911621094e+00 1.423081636428833008e+00 4.038333892822265625e+00
38+
9.454534530639648438e+00 1.340337395668029785e+00 9.410832405090332031e+00
39+
9.585140228271484375e+00 6.824736595153808594e+00 3.959444046020507812e+00
40+
9.489406585693359375e+00 6.853000164031982422e+00 9.511748313903808594e+00
41+
1.335405468940734863e+00 1.307370305061340332e+00 1.314915299415588379e+00
42+
1.366260290145874023e+00 1.351388096809387207e+00 6.778203964233398438e+00
43+
1.336178421974182129e+00 6.824344635009765625e+00 1.330636739730834961e+00
44+
1.347283601760864258e+00 6.734087944030761719e+00 6.762024879455566406e+00
45+
6.878825187683105469e+00 1.403963446617126465e+00 1.293412685394287109e+00
46+
6.797452926635742188e+00 1.434306621551513672e+00 6.866337299346923828e+00
47+
6.644256114959716797e+00 6.731377124786376953e+00 1.499554872512817383e+00
48+
6.844486236572265625e+00 6.848329544067382812e+00 6.809374332427978516e+00
49+
1.377604961395263672e+00 4.136429786682128906e+00 4.032868862152099609e+00
50+
1.389494061470031738e+00 4.109994888305664062e+00 9.576973915100097656e+00
51+
1.447992086410522461e+00 9.560729980468750000e+00 4.123854637145996094e+00
52+
1.328622579574584961e+00 9.550005912780761719e+00 9.473250389099121094e+00
53+
6.836505889892578125e+00 4.088655471801757812e+00 4.096276760101318359e+00
54+
6.809603214263916016e+00 4.098802566528320312e+00 9.570180892944335938e+00
55+
6.812346458435058594e+00 9.609702110290527344e+00 3.982939004898071289e+00
56+
6.827219009399414062e+00 9.470495223999023438e+00 9.475601196289062500e+00
57+
4.046401500701904297e+00 4.024322032928466797e+00 1.342819690704345703e+00
58+
4.066891670227050781e+00 4.043124675750732422e+00 6.784518241882324219e+00
59+
4.096853733062744141e+00 9.517572402954101562e+00 1.429788351058959961e+00
60+
4.126554965972900391e+00 9.538574218750000000e+00 6.838574409484863281e+00
61+
9.460348129272460938e+00 4.077964305877685547e+00 1.332836031913757324e+00
62+
9.455187797546386719e+00 3.956558942794799805e+00 6.875069141387939453e+00
63+
9.541971206665039062e+00 9.649669647216796875e+00 1.294305443763732910e+00
64+
9.570387840270996094e+00 9.492716789245605469e+00 6.793272018432617188e+00

0 commit comments

Comments
 (0)