def dumpbox2box(bounds, tilt): xy = tilt[0] xz = tilt[1] yz = tilt[2] xlo = bounds[0][0] - min(0.0, xy, xz, xy + xz) xhi = bounds[0][1] - max(0.0, xy, xz, xy + xz) ylo = bounds[1][0] - min(0.0, yz) yhi = bounds[1][1] - max(0.0, yz) zlo = bounds[2][0] zhi = bounds[2][1] info = [[xlo, xhi], [ylo, yhi], [zlo, zhi]] return lmp.lmpbox2box(info, tilt)
def add_bonds (lines_, max_roh = 1.3) : lines = lines_ natoms = lmp.get_natoms_vec(lines) assert(len(natoms) == 2) # type 1 == O, type 2 == H assert(natoms[0] == natoms[1] // 2) atype = lmp.get_atype(lines) posis = lmp.get_posi(lines) bounds, tilt = lmp.get_lmpbox(lines) orig, box = lmp.lmpbox2box(bounds, tilt) bonds = compute_bonds(box, atype, posis, max_roh) # check water moles for ii in range(len(bonds)) : if atype[ii] == 1 : assert(len(bonds[ii]) == 2), 'ill defined O atom %d has H %s' % (ii, bonds[ii]) elif atype[ii] == 2 : assert(len(bonds[ii]) == 1), 'ill defined H atom %d has O %s' % (ii, bonds[ii]) # pbc posi for ii in range(sum(natoms)) : if atype[ii] == 1: j0idx = bonds[ii][0] shift0 = posi_shift(box, posis[j0idx], posis[ii]) posis[j0idx] = posis[j0idx] + np.dot(box.T, shift0) j1idx = bonds[ii][1] shift1 = posi_shift(box, posis[j1idx], posis[ii]) posis[j1idx] = posis[j1idx] + np.dot(box.T, shift1) for atoms_idx in range(len(lines)) : if 'Atoms' in lines[atoms_idx] : break for ii in range(sum(natoms)) : words = lines[atoms_idx + 2 +ii].split() words[2] = str(posis[ii][0]) words[3] = str(posis[ii][1]) words[4] = str(posis[ii][2]) lines[atoms_idx+2+ii] = ' '.join(words) ret_bd = [] idx = 1 for ii in range(len(bonds)) : if atype[ii] == 1: ret_bd.append("%d 1 %d %d" % (idx, 1+ii, 1+bonds[ii][0])) idx += 1 ret_bd.append("%d 1 %d %d" % (idx, 1+ii, 1+bonds[ii][1])) idx += 1 ret_ang = [] idx = 1 for ii in range(len(bonds)) : if atype[ii] == 1: ret_ang.append("%d 1 %d %d %d" % (idx, 1+bonds[ii][0], 1+ii, 1+bonds[ii][1])) idx += 1 lines.append('Bonds') lines.append('') lines += ret_bd lines.append('') lines.append('Angles') lines.append('') lines += ret_ang lines.append('') lines.append('') nbonds = len(ret_bd) nangles = len(ret_ang) for atoms_idx in range(len(lines)) : if 'atoms' in lines[atoms_idx] : break lines.insert(atoms_idx+1, '%d angles' % nangles) lines.insert(atoms_idx+1, '%d bonds' % nbonds) for atoms_types_idx in range(len(lines)) : if 'atom types' in lines[atoms_types_idx] : break lines.insert(atoms_types_idx+1, '%d angle types' % 1) lines.insert(atoms_types_idx+1, '%d bond types' % 1) for atoms_idx in range(len(lines)) : if 'Atoms' in lines[atoms_idx] : break mole_idx = np.zeros(sum(natoms), dtype = int) cc = 1 for ii in range(sum(natoms)) : if atype[ii] == 1 : mole_idx[ii] = cc cc += 1 for ii in range(sum(natoms)) : if atype[ii] == 2 : mole_idx[ii] = mole_idx[bonds[ii]] cc = 0 for idx in range(atoms_idx+2, atoms_idx+2+sum(natoms)) : words = lines[idx].split() words.insert(1, '%d' % mole_idx[cc]) lines[idx] = ' '.join(words) cc += 1 return lines
return list_oh def dist_via_oh_list(box, posis, list_oh) : dist = [] for ii in list_oh : dij = np.linalg.norm(posi_diff(box, posis[ii[0]], posis[ii[1]])) dist.append(dij) return dist if __name__ == '__main__' : fname = 'conf.lmp' lines = open(fname).read().split('\n') # lines = add_bonds(lines) # print('\n'.join(ret_bd)) # print('\n'.join(ret_ang)) atype = lmp.get_atype(lines) posis = lmp.get_posi(lines) bounds, tilt = lmp.get_lmpbox(lines) orig, box = lmp.lmpbox2box(bounds, tilt) # md_oo = min_oo(box, atype, posis) # md_ho = min_ho(box, atype, posis) # print(np.average(md_oo), np.average(md_ho), np.min(md_ho), np.max(md_ho)) moh, moh2, moo = min_oho(box, atype, posis) print(np.max(moh), np.average(moh2), np.average(moo))