예제 #1
0
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)
예제 #2
0
파일: water.py 프로젝트: felix5572/DeepTI
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
예제 #3
0
파일: water.py 프로젝트: felix5572/DeepTI
    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))