Source code for dpdata.plugins.pwmat

import numpy as np

import dpdata.pwmat.atomconfig
import dpdata.pwmat.movement
from dpdata.format import Format


[docs] @Format.register("movement") @Format.register("mlmd") @Format.register("pwmat/movement") @Format.register("pwmat/mlmd") @Format.register("pwmat/output") class PwmatOutputFormat(Format):
[docs] @Format.post("rot_lower_triangular") def from_labeled_system( self, file_name, begin=0, step=1, convergence_check=True, **kwargs ): data = {} ( data["atom_names"], data["atom_numbs"], data["atom_types"], data["cells"], data["coords"], data["energies"], data["forces"], tmp_virial, ) = dpdata.pwmat.movement.get_frames( file_name, begin=begin, step=step, 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["coords"].shape[0]): vol = np.linalg.det(np.reshape(data["cells"][ii], [3, 3])) data["virials"][ii] *= v_pref * vol return data
[docs] @Format.register("atom.config") @Format.register("final.config") @Format.register("pwmat/atom.config") @Format.register("pwmat/final.config") class PwmatAtomconfigFormat(Format):
[docs] @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] return dpdata.pwmat.atomconfig.to_system_data(lines)
[docs] def to_system(self, data, file_name, frame_idx=0, *args, **kwargs): """Dump the system in pwmat atom.config format. Parameters ---------- data : dict The system data file_name : str The output file name frame_idx : int The index of the frame to dump *args : list other parameters **kwargs : dict other parameters """ assert frame_idx < len(data["coords"]) w_str = dpdata.pwmat.atomconfig.from_system_data(data, frame_idx) with open(file_name, "w") as fp: fp.write(w_str)