-
Notifications
You must be signed in to change notification settings - Fork 137
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add support for spin, DeltaSpin and LAMMPS SPIN #728
base: devel
Are you sure you want to change the base?
Changes from all commits
f82f3cd
3b2a4b9
c3096e8
6fe4418
febb01f
d4aa752
4110f13
5cf335c
01fd375
d39e1f1
6233b8f
9bc8a68
614fde7
4339232
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -132,6 +132,42 @@ | |||||||||||||||||||||||||||||
) # Convert scaled coordinates back to Cartesien coordinates with wraping at periodic boundary conditions | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def get_spintype(keys): | ||||||||||||||||||||||||||||||
key_sp = ["sp", "spx", "spy", "spz"] | ||||||||||||||||||||||||||||||
key_csp = ["c_spin[1]", "c_spin[2]", "c_spin[3]", "c_spin[4]"] | ||||||||||||||||||||||||||||||
lmp_sp_type = [key_sp, key_csp] | ||||||||||||||||||||||||||||||
for k in range(2): | ||||||||||||||||||||||||||||||
if all(i in keys for i in lmp_sp_type[k]): | ||||||||||||||||||||||||||||||
return lmp_sp_type[k] | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def safe_get_spin_force(lines): | ||||||||||||||||||||||||||||||
blk, head = _get_block(lines, "ATOMS") | ||||||||||||||||||||||||||||||
keys = head.split() | ||||||||||||||||||||||||||||||
sp_type = get_spintype(keys) | ||||||||||||||||||||||||||||||
assert sp_type is not None, "Dump file does not contain spin!" | ||||||||||||||||||||||||||||||
id_idx = keys.index("id") - 2 | ||||||||||||||||||||||||||||||
sp = keys.index(sp_type[0]) - 2 | ||||||||||||||||||||||||||||||
spx = keys.index(sp_type[1]) - 2 | ||||||||||||||||||||||||||||||
spy = keys.index(sp_type[2]) - 2 | ||||||||||||||||||||||||||||||
spz = keys.index(sp_type[3]) - 2 | ||||||||||||||||||||||||||||||
sp_force = [] | ||||||||||||||||||||||||||||||
for ii in blk: | ||||||||||||||||||||||||||||||
words = ii.split() | ||||||||||||||||||||||||||||||
sp_force.append( | ||||||||||||||||||||||||||||||
[ | ||||||||||||||||||||||||||||||
float(words[id_idx]), | ||||||||||||||||||||||||||||||
float(words[sp]), | ||||||||||||||||||||||||||||||
float(words[spx]), | ||||||||||||||||||||||||||||||
float(words[spy]), | ||||||||||||||||||||||||||||||
float(words[spz]), | ||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
sp_force.sort() | ||||||||||||||||||||||||||||||
sp_force = np.array(sp_force)[:, 1:] | ||||||||||||||||||||||||||||||
return sp_force | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
Comment on lines
+144
to
+169
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add unit tests for The I can help create unit tests for this function if you'd like. ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
def get_dumpbox(lines): | ||||||||||||||||||||||||||||||
blk, h = _get_block(lines, "BOX BOUNDS") | ||||||||||||||||||||||||||||||
bounds = np.zeros([3, 2]) | ||||||||||||||||||||||||||||||
|
@@ -216,6 +252,12 @@ | |||||||||||||||||||||||||||||
system["cells"] = [np.array(cell)] | ||||||||||||||||||||||||||||||
system["atom_types"] = get_atype(lines, type_idx_zero=type_idx_zero) | ||||||||||||||||||||||||||||||
system["coords"] = [safe_get_posi(lines, cell, np.array(orig), unwrap)] | ||||||||||||||||||||||||||||||
contain_spin = False | ||||||||||||||||||||||||||||||
blk, head = _get_block(lines, "ATOMS") | ||||||||||||||||||||||||||||||
if "sp" in head: | ||||||||||||||||||||||||||||||
contain_spin = True | ||||||||||||||||||||||||||||||
spin_force = safe_get_spin_force(lines) | ||||||||||||||||||||||||||||||
system["spins"] = [spin_force[:, :1] * spin_force[:, 1:4]] | ||||||||||||||||||||||||||||||
Comment on lines
+255
to
+260
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use Currently, the code checks Apply this diff to improve spin data detection: contain_spin = False
blk, head = _get_block(lines, "ATOMS")
+ keys = head.split()
+ sp_type = get_spintype(keys)
+ if sp_type is not None:
contain_spin = True
spin_force = safe_get_spin_force(lines)
system["spins"] = [spin_force[:, :1] * spin_force[:, 1:4]] Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||
for ii in range(1, len(array_lines)): | ||||||||||||||||||||||||||||||
bounds, tilt = get_dumpbox(array_lines[ii]) | ||||||||||||||||||||||||||||||
orig, cell = dumpbox2box(bounds, tilt) | ||||||||||||||||||||||||||||||
|
@@ -228,6 +270,13 @@ | |||||||||||||||||||||||||||||
system["coords"].append( | ||||||||||||||||||||||||||||||
safe_get_posi(array_lines[ii], cell, np.array(orig), unwrap)[idx] | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
if contain_spin: | ||||||||||||||||||||||||||||||
system["spins"].append( | ||||||||||||||||||||||||||||||
safe_get_spin_force(array_lines[ii])[:, :1] | ||||||||||||||||||||||||||||||
* safe_get_spin_force(array_lines[ii])[:, 1:4] | ||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||
Comment on lines
+273
to
+277
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Optimize by storing the result of In the loop, Apply this diff to optimize the code: if contain_spin:
+ spin_force = safe_get_spin_force(array_lines[ii])
system["spins"].append(
- safe_get_spin_force(array_lines[ii])[:, :1]
- * safe_get_spin_force(array_lines[ii])[:, 1:4]
+ spin_force[:, :1] * spin_force[:, 1:4]
) Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||
if contain_spin: | ||||||||||||||||||||||||||||||
system["spins"] = np.array(system["spins"]) | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add tests to verify spin data array conversion Converting Would you like assistance in creating tests for this functionality? ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||
system["cells"] = np.array(system["cells"]) | ||||||||||||||||||||||||||||||
system["coords"] = np.array(system["coords"]) | ||||||||||||||||||||||||||||||
return system | ||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -127,6 +127,19 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return np.array(posis) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_spins(lines): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
atom_lines = get_atoms(lines) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(atom_lines[0].split()) < 8: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_ori = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_norm = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for ii in atom_lines: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_ori.append([float(jj) for jj in ii.split()[5:8]]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_norm.append([float(jj) for jj in ii.split()[-1:]]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify extraction of In line 138, you can simplify the extraction of Apply this diff to simplify the code: - spins_norm.append([float(jj) for jj in ii.split()[-1:]])
+ spins_norm.append(float(ii.split()[-1])) Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins = np.array(spins_ori) * np.array(spins_norm) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return spins | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_lmpbox(lines): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
box_info = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tilt = np.zeros(3) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -151,6 +164,9 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def system_data(lines, type_map=None, type_idx_zero=True): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system = {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_numbs"] = get_natoms_vec(lines) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins = get_spins(lines) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if spins is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"] = np.array([spins]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_names"] = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if type_map is None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for ii in range(len(system["atom_numbs"])): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -216,14 +232,54 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ ptr_float_fmt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ "\n" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for ii in range(natoms): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ret += coord_fmt % ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ii + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_types"][ii] + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][0] - system["orig"][0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][1] - system["orig"][1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][2] - system["orig"][2], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if "spins" in system.keys(): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify dictionary key check by removing unnecessary In line 235, you can check for the existence of a key in a dictionary directly using Apply this diff to simplify the condition: - if "spins" in system.keys():
+ if "spins" in system: Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
coord_fmt = ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
coord_fmt.strip("\n") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ " " | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ ptr_float_fmt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ " " | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ ptr_float_fmt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ " " | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ ptr_float_fmt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ " " | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ ptr_float_fmt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ "\n" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_norm = np.linalg.norm(system["spins"][f_idx], axis=1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for ii in range(natoms): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if "spins" in system.keys(): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify dictionary key check by removing unnecessary Similarly, in line 250, you can simplify the key check in the same manner. Apply this diff: - if "spins" in system.keys():
+ if "spins" in system: Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if spins_norm[ii] != 0: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ret += coord_fmt % ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ii + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_types"][ii] + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][0] - system["orig"][0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][1] - system["orig"][1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][2] - system["orig"][2], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][0] / spins_norm[ii], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][1] / spins_norm[ii], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][2] / spins_norm[ii], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_norm[ii], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ret += coord_fmt % ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ii + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_types"][ii] + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][0] - system["orig"][0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][1] - system["orig"][1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][2] - system["orig"][2], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["spins"][f_idx][ii][2] + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
spins_norm[ii], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+251
to
+274
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potential logic error when handling zero spin norms In the If unintended, apply this diff to correct the code: - system["spins"][f_idx][ii][2] + 1,
+ system["spins"][f_idx][ii][2], Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ret += coord_fmt % ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ii + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["atom_types"][ii] + 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][0] - system["orig"][0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][1] - system["orig"][1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
system["coords"][f_idx][ii][2] - system["orig"][2], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ret | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,107 @@ | ||||||||||||||||||||||||
from __future__ import annotations | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import re | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import numpy as np | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import dpdata.vasp_deltaspin.outcar | ||||||||||||||||||||||||
import dpdata.vasp_deltaspin.poscar | ||||||||||||||||||||||||
from dpdata.format import Format | ||||||||||||||||||||||||
from dpdata.utils import uniq_atom_names | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
@Format.register("vasp_deltaspin/poscar") | ||||||||||||||||||||||||
@Format.register("vasp_deltaspin/contcar") | ||||||||||||||||||||||||
class VASPPoscarFormat(Format): | ||||||||||||||||||||||||
@Format.post("rot_lower_triangular") | ||||||||||||||||||||||||
def from_system(self, file_name, **kwargs): | ||||||||||||||||||||||||
with open(file_name) as fp: | ||||||||||||||||||||||||
lines = [line.rstrip("\n") for line in fp] | ||||||||||||||||||||||||
with open(file_name[:-6] + "INCAR") as fp: | ||||||||||||||||||||||||
lines_incar = [line.rstrip("\n") for line in fp] | ||||||||||||||||||||||||
data = dpdata.vasp_deltaspin.poscar.to_system_data(lines, lines_incar) | ||||||||||||||||||||||||
data = uniq_atom_names(data) | ||||||||||||||||||||||||
return data | ||||||||||||||||||||||||
Comment on lines
+18
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure robust error handling when opening files Currently, the code opens Consider adding error handling to manage file-related exceptions and provide meaningful error messages. + import os
+ if not os.path.exists(file_name):
+ raise FileNotFoundError(f"File not found: {file_name}")
+ if not os.path.exists(file_name[:-6] + "INCAR"):
+ raise FileNotFoundError(f"File not found: {file_name[:-6] + 'INCAR'}")
+
with open(file_name) as fp:
lines = [line.rstrip("\n") for line in fp]
with open(file_name[:-6] + "INCAR") as fp:
lines_incar = [line.rstrip("\n") for line in fp]
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
def to_system(self, data, file_name, frame_idx=0, **kwargs): | ||||||||||||||||||||||||
"""Dump the system in vasp POSCAR format. | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Parameters | ||||||||||||||||||||||||
---------- | ||||||||||||||||||||||||
data : dict | ||||||||||||||||||||||||
The system data | ||||||||||||||||||||||||
file_name : str | ||||||||||||||||||||||||
The output file name | ||||||||||||||||||||||||
frame_idx : int | ||||||||||||||||||||||||
The index of the frame to dump | ||||||||||||||||||||||||
**kwargs : dict | ||||||||||||||||||||||||
other parameters | ||||||||||||||||||||||||
""" | ||||||||||||||||||||||||
w_str, m_str = VASPStringFormat().to_system(data, frame_idx=frame_idx) | ||||||||||||||||||||||||
with open(file_name, "w") as fp: | ||||||||||||||||||||||||
fp.write(w_str) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
with open(file_name[:-6] + "INCAR") as fp: | ||||||||||||||||||||||||
tmp_incar = fp.read() | ||||||||||||||||||||||||
res_incar = re.sub( | ||||||||||||||||||||||||
Comment on lines
+44
to
+46
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling when reading 'INCAR' file When opening Include error handling to gracefully handle potential file access issues. + import os
+ incar_path = file_name[:-6] + "INCAR"
+ if not os.path.exists(incar_path):
+ raise FileNotFoundError(f"File not found: {incar_path}")
+
with open(incar_path) as fp:
tmp_incar = fp.read() Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||
r"MAGMOM[\s\S]*?\n\nM_CONST[\s\S]*?\n\n", m_str, tmp_incar, re.S | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
Comment on lines
+46
to
+48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use 'flags' as a keyword argument in 're.sub' To improve code readability and avoid confusion with positional arguments, pass the Apply this diff to address the concern: res_incar = re.sub(
r"MAGMOM[\s\S]*?\n\nM_CONST[\s\S]*?\n\n", m_str, tmp_incar, flags=re.S
) Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||||||||||||
with open(file_name[:-6] + "INCAR", "w") as fp: | ||||||||||||||||||||||||
fp.write(res_incar) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
@Format.register("vasp/string") | ||||||||||||||||||||||||
class VASPStringFormat(Format): | ||||||||||||||||||||||||
def to_system(self, data, frame_idx=0, **kwargs): | ||||||||||||||||||||||||
"""Dump the system in vasp POSCAR format string. | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
Parameters | ||||||||||||||||||||||||
---------- | ||||||||||||||||||||||||
data : dict | ||||||||||||||||||||||||
The system data | ||||||||||||||||||||||||
frame_idx : int | ||||||||||||||||||||||||
The index of the frame to dump | ||||||||||||||||||||||||
**kwargs : dict | ||||||||||||||||||||||||
other parameters | ||||||||||||||||||||||||
""" | ||||||||||||||||||||||||
assert frame_idx < len(data["coords"]) | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Replace 'assert' with exception handling for input validation Using Replace the - assert frame_idx < len(data["coords"])
+ if frame_idx >= len(data["coords"]):
+ raise IndexError(f"frame_idx {frame_idx} is out of range.") Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||
return dpdata.vasp_deltaspin.poscar.from_system_data(data, frame_idx) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
# rotate the system to lammps convention | ||||||||||||||||||||||||
@Format.register("vasp_deltaspin/outcar") | ||||||||||||||||||||||||
class VASPOutcarFormat(Format): | ||||||||||||||||||||||||
@Format.post("rot_lower_triangular") | ||||||||||||||||||||||||
def from_labeled_system( | ||||||||||||||||||||||||
self, file_name, begin=0, step=1, convergence_check=True, **kwargs | ||||||||||||||||||||||||
): | ||||||||||||||||||||||||
data = {} | ||||||||||||||||||||||||
ml = kwargs.get("ml", False) | ||||||||||||||||||||||||
( | ||||||||||||||||||||||||
data["atom_names"], | ||||||||||||||||||||||||
data["atom_numbs"], | ||||||||||||||||||||||||
data["atom_types"], | ||||||||||||||||||||||||
data["cells"], | ||||||||||||||||||||||||
data["coords"], | ||||||||||||||||||||||||
data["spins"], | ||||||||||||||||||||||||
data["energies"], | ||||||||||||||||||||||||
data["forces"], | ||||||||||||||||||||||||
data["mag_forces"], | ||||||||||||||||||||||||
tmp_virial, | ||||||||||||||||||||||||
) = dpdata.vasp_deltaspin.outcar.get_frames( | ||||||||||||||||||||||||
file_name, | ||||||||||||||||||||||||
begin=begin, | ||||||||||||||||||||||||
step=step, | ||||||||||||||||||||||||
ml=ml, | ||||||||||||||||||||||||
convergence_check=convergence_check, | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
if tmp_virial is not None: | ||||||||||||||||||||||||
data["virials"] = tmp_virial | ||||||||||||||||||||||||
# scale virial to the unit of eV | ||||||||||||||||||||||||
if "virials" in data: | ||||||||||||||||||||||||
v_pref = 1 * 1e3 / 1.602176621e6 | ||||||||||||||||||||||||
for ii in range(data["cells"].shape[0]): | ||||||||||||||||||||||||
vol = np.linalg.det(np.reshape(data["cells"][ii], [3, 3])) | ||||||||||||||||||||||||
data["virials"][ii] *= v_pref * vol | ||||||||||||||||||||||||
data = uniq_atom_names(data) | ||||||||||||||||||||||||
return data | ||||||||||||||||||||||||
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -95,6 +95,7 @@ class System: | |||||||||||||
DataType( | ||||||||||||||
"coords", np.ndarray, (Axis.NFRAMES, Axis.NATOMS, 3), deepmd_name="coord" | ||||||||||||||
), | ||||||||||||||
DataType("spins", np.ndarray, (Axis.NFRAMES, Axis.NATOMS, 3), required=False), | ||||||||||||||
DataType( | ||||||||||||||
"real_atom_types", np.ndarray, (Axis.NFRAMES, Axis.NATOMS), required=False | ||||||||||||||
), | ||||||||||||||
|
@@ -712,6 +713,10 @@ def affine_map(self, trans, f_idx: int | numbers.Integral = 0): | |||||||||||||
assert np.linalg.det(trans) != 0 | ||||||||||||||
self.data["cells"][f_idx] = np.matmul(self.data["cells"][f_idx], trans) | ||||||||||||||
self.data["coords"][f_idx] = np.matmul(self.data["coords"][f_idx], trans) | ||||||||||||||
try: | ||||||||||||||
self.data["spins"][f_idx] = np.matmul(self.data["spins"][f_idx], trans) | ||||||||||||||
except: | ||||||||||||||
pass | ||||||||||||||
Comment on lines
+716
to
+719
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use Consider the following improvements:
Apply this diff to address the suggestions: - try:
- self.data["spins"][f_idx] = np.matmul(self.data["spins"][f_idx], trans)
- except:
- pass
+ with contextlib.suppress(KeyError):
+ self.data["spins"][f_idx] = np.matmul(self.data["spins"][f_idx], trans) Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||
|
||||||||||||||
@post_funcs.register("shift_orig_zero") | ||||||||||||||
def _shift_orig_zero(self): | ||||||||||||||
|
@@ -1210,6 +1215,9 @@ class LabeledSystem(System): | |||||||||||||
DataType( | ||||||||||||||
"forces", np.ndarray, (Axis.NFRAMES, Axis.NATOMS, 3), deepmd_name="force" | ||||||||||||||
), | ||||||||||||||
DataType( | ||||||||||||||
"mag_forces", np.ndarray, (Axis.NFRAMES, Axis.NATOMS, 3), required=False | ||||||||||||||
), | ||||||||||||||
DataType( | ||||||||||||||
"virials", | ||||||||||||||
np.ndarray, | ||||||||||||||
|
@@ -1793,3 +1801,5 @@ def to_format(self, *args, **kwargs): | |||||||||||||
|
||||||||||||||
|
||||||||||||||
add_format_methods() | ||||||||||||||
|
||||||||||||||
# %% |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add unit tests for the
get_spintype
function to ensure correctnessThe newly added
get_spintype
function is not covered by unit tests. Implementing tests for this function will help verify that it accurately identifies different spin types based on the provided keys, enhancing the reliability of spin data processing.Would you like assistance in creating unit tests for this function?
Tools
GitHub Check: codecov/patch