def find_mic(v, cell, pbc=True): """Finds the minimum-image representation of vector(s) v using either one of two find mic algorithms depending on the given cell, v and pbc.""" cell = Cell(cell) pbc = cell.any(1) & pbc2pbc(pbc) dim = np.sum(pbc) v = np.asarray(v) single = v.ndim == 1 v = np.atleast_2d(v) if dim > 0: naive_find_mic_is_safe = False if dim == 3: vmin, vlen = naive_find_mic(v, cell) # naive find mic is safe only for the following condition if (vlen < 0.5 * min(cell.lengths())).all(): naive_find_mic_is_safe = True # hence skip Minkowski reduction if not naive_find_mic_is_safe: vmin, vlen = general_find_mic(v, cell, pbc=pbc) else: vmin = v.copy() vlen = np.linalg.norm(vmin, axis=1) if single: return vmin[0], vlen[0] else: return vmin, vlen
def update(self, cell, pbc): cell = Cell(cell) mags = cell.lengths() angles = cell.angles() for i in range(3): for j in range(3): if np.isnan(cell[i][j]): cell[i][j] = 0 self.cell_grid[i][j].value = cell[i][j] if np.isnan(mags[i]): mags[i] = 0 self.cell_grid[i][3].value = mags[i] if np.isnan(angles[i]): angles[i] = 0 self.angles[i].value = angles[i] self.pbc[i].var.set(bool(pbc[i]))