Source code for dpdata.md.pbc

import numpy as np


[docs] def posi_diff(box, r0, r1): rbox = np.linalg.inv(box) rbox = rbox.T p0 = np.dot(rbox, r0) p1 = np.dot(rbox, r1) dp = p0 - p1 shift = np.zeros(3) for dd in range(3): if dp[dd] >= 0.5: dp[dd] -= 1 elif dp[dd] < -0.5: dp[dd] += 1 dr = np.dot(box.T, dp) return dr
[docs] def posi_shift(box, r0, r1): rbox = np.linalg.inv(box) rbox = rbox.T p0 = np.dot(rbox, r0) p1 = np.dot(rbox, r1) dp = p0 - p1 shift = np.zeros(3) for dd in range(3): if dp[dd] >= 0.5: shift[dd] -= 1 elif dp[dd] < -0.5: shift[dd] += 1 return shift
[docs] def dir_coord(coord, box): rbox = np.linalg.inv(box) return np.matmul(coord, rbox)
[docs] def system_pbc_shift(system): f_idx = 0 prev_ncoord = dir_coord(system["coords"][f_idx], system["cells"][f_idx]) shifts = np.zeros([system.get_nframes(), system.get_natoms(), 3], dtype=int) curr_shift = np.zeros([system.get_natoms(), 3], dtype=int) half = 0.5 * np.ones([system.get_natoms(), 3]) for ii in range(system.get_nframes()): curr_ncoord = dir_coord(system["coords"][ii], system["cells"][ii]) diff_ncoord = curr_ncoord - prev_ncoord curr_shift -= diff_ncoord > half curr_shift += diff_ncoord < -half shifts[ii] = np.copy(curr_shift) prev_ncoord = curr_ncoord return np.array(shifts, dtype=int)
[docs] def apply_pbc(system_coords, system_cells): coords = [] nframes = system_cells.shape[0] for ff in range(nframes): ncoord = dir_coord(system_coords[ff], system_cells[ff]) ncoord = ncoord % 1 coords.append(np.matmul(ncoord, system_cells[ff])) return np.array(coords)