Esempio n. 1
0
    def test_damprep(self):
        tconfig.setup(key, xyz, dloop=True)

        n = len(tconfig.r_list)

        for i in range(n):
            dmpikr = damping.damprep(tconfig.r_list[i], tconfig.r2_list[i],
                                     tconfig.rr1_list[i], tconfig.rr3_list[i],
                                     tconfig.rr5_list[i], tconfig.rr7_list[i],
                                     tconfig.rr9_list[i], 9,
                                     tconfig.dmppri_list[i],
                                     tconfig.dmpprk_list[i])
            self.assertListEqual(list(np.round(kdmpikr[i], 5)),
                                 list(np.round(list(dmpikr), 5)))
Esempio n. 2
0
def uTu_rep(ATOMID, uind=[]):

    n = len(ATOMID)

    rep = 0

    # calculate u*gamma*u
    for i in range(n - 1):
        if len(uind) != 0:
            uix = uind[0, i]
            uiy = uind[1, i]
            uiz = uind[2, i]
        else:
            uix = ATOMID[i].uind[0]
            uiy = ATOMID[i].uind[1]
            uiz = ATOMID[i].uind[2]
        xi = ATOMID[i].coordinates[0]
        yi = ATOMID[i].coordinates[1]
        zi = ATOMID[i].coordinates[2]
        sizi = ATOMID[i].sizpr
        dmpi = ATOMID[i].dmppr
        vali = ATOMID[i].elepr

        rscale = ATOMID[i].returnrscale(ATOMID)

        # evaluate all sites within the cutoff distance
        for k in range(i + 1, n):
            xr = ATOMID[k].coordinates[0] - xi
            yr = ATOMID[k].coordinates[1] - yi
            zr = ATOMID[k].coordinates[2] - zi
            r2 = xr**2 + yr**2 + zr**2
            r = np.sqrt(r2)

            if len(uind) != 0:
                ukx = uind[0, k]
                uky = uind[1, k]
                ukz = uind[2, k]
            else:
                ukx = ATOMID[k].uind[0]
                uky = ATOMID[k].uind[1]
                ukz = ATOMID[k].uind[2]

            uik = uix * ukx + uiy * uky + uiz * ukz
            uir = uix * xr + uiy * yr + uiz * zr
            ukr = ukx * xr + uky * yr + ukz * zr

            sizk = ATOMID[k].sizpr
            dmpk = ATOMID[k].dmppr
            valk = ATOMID[k].elepr

            term2ik = uik
            term3ik = -uir * ukr

            rr1 = 1.0 / r
            rr3 = rr1 / r2
            rr5 = 3.0 * rr3 / r2
            rr7 = 5.0 * rr5 / r2
            rr9 = 7.0 * rr7 / r2

            dmpik = damping.damprep(r, r2, rr1, rr3, rr5, rr7, rr9, 9, dmpi,
                                    dmpk)

            e = term2ik * dmpik[2] + term3ik * dmpik[4]
            sizik = sizi * sizk
            e = sizik * e * rr1 * rscale[k]

            if e != 0.:
                rep = rep + 2 * e

    return rep
Esempio n. 3
0
def erepel3a(ATOMID, uind=[], dipole=False):
    # "erepel3a" calculates the Pauli repulsion energy and also
    # partitions the energy among the atoms using a double loop

    # zero out the repulsion energy and partitioning terms

    if 'exchange-1' in config.param_dict.keys():
        dipole = True

    n = len(ATOMID)

    ner = 0
    er = 0.0
    einter = 0
    aer = np.zeros(n)

    # calculate the Pauli repulsion interaction energy term

    for i in range(n - 1):
        xi = ATOMID[i].coordinates[0]
        yi = ATOMID[i].coordinates[1]
        zi = ATOMID[i].coordinates[2]
        sizi = ATOMID[i].sizpr
        dmpi = ATOMID[i].dmppr
        vali = ATOMID[i].elepr
        ci = ATOMID[i].rpole[0]
        dix = ATOMID[i].rpole[1]
        diy = ATOMID[i].rpole[2]
        diz = ATOMID[i].rpole[3]
        if len(uind) != 0:
            dix = dix + uind[0, i]
            diy = diy + uind[1, i]
            diz = diz + uind[2, i]
        elif dipole:
            dix = dix + ATOMID[i].uind[0]
            diy = diy + ATOMID[i].uind[1]
            diz = diz + ATOMID[i].uind[2]
        qixx = ATOMID[i].rpole[4]
        qixy = ATOMID[i].rpole[5]
        qixz = ATOMID[i].rpole[6]
        qiyy = ATOMID[i].rpole[8]
        qiyz = ATOMID[i].rpole[9]
        qizz = ATOMID[i].rpole[12]

        # set exclusion coefficients for connected atoms

        rscale = ATOMID[i].returnrscale(ATOMID)

        for k in range(i + 1, n):
            xr = ATOMID[k].coordinates[0] - xi
            yr = ATOMID[k].coordinates[1] - yi
            zr = ATOMID[k].coordinates[2] - zi
            r2 = xr * xr + yr * yr + zr * zr
            r = np.sqrt(r2)
            sizk = ATOMID[k].sizpr
            dmpk = ATOMID[k].dmppr
            valk = ATOMID[k].elepr
            ck = ATOMID[k].rpole[0]
            dkx = ATOMID[k].rpole[1]
            dky = ATOMID[k].rpole[2]
            dkz = ATOMID[k].rpole[3]
            if len(uind) != 0:
                dkx = dkx + uind[0, k]
                dky = dky + uind[1, k]
                dkz = dkz + uind[2, k]
            elif dipole:
                dkx = dkx + ATOMID[k].uind[0]
                dky = dky + ATOMID[k].uind[1]
                dkz = dkz + ATOMID[k].uind[2]
            qkxx = ATOMID[k].rpole[4]
            qkxy = ATOMID[k].rpole[5]
            qkxz = ATOMID[k].rpole[6]
            qkyy = ATOMID[k].rpole[8]
            qkyz = ATOMID[k].rpole[9]
            qkzz = ATOMID[k].rpole[12]

            # intermediates involving moments and separation distance

            dir_ = dix * xr + diy * yr + diz * zr
            qix = qixx * xr + qixy * yr + qixz * zr
            qiy = qixy * xr + qiyy * yr + qiyz * zr
            qiz = qixz * xr + qiyz * yr + qizz * zr
            qir = qix * xr + qiy * yr + qiz * zr
            dkr = dkx * xr + dky * yr + dkz * zr
            qkx = qkxx * xr + qkxy * yr + qkxz * zr
            qky = qkxy * xr + qkyy * yr + qkyz * zr
            qkz = qkxz * xr + qkyz * yr + qkzz * zr
            qkr = qkx * xr + qky * yr + qkz * zr
            dik = dix * dkx + diy * dky + diz * dkz
            qik = qix * qkx + qiy * qky + qiz * qkz
            diqk = dix * qkx + diy * qky + diz * qkz
            dkqi = dkx * qix + dky * qiy + dkz * qiz
            qiqk = 2.0 * (qixy * qkxy + qixz * qkxz + qiyz *
                          qkyz) + qixx * qkxx + qiyy * qkyy + qizz * qkzz

            # get reciprocal distance terms for this interaction

            rr1 = 1.0 / r
            rr3 = rr1 / r2
            rr5 = 3.0 * rr3 / r2
            rr7 = 5.0 * rr5 / r2
            rr9 = 7.0 * rr7 / r2

            # get damping coefficients for the Pauli repulsion energy
            dmpik = damping.damprep(r, r2, rr1, rr3, rr5, rr7, rr9, 9, dmpi,
                                    dmpk)

            # compute the Pauli repulsion energy for this interaction

            term1 = vali * valk
            term2 = valk * dir_ - vali * dkr + dik
            term3 = vali*qkr + valk*qir - dir_*dkr \
                       + 2.0*(dkqi-diqk+qiqk)
            term4 = dir_ * qkr - dkr * qir - 4.0 * qik
            term5 = qir * qkr
            eterm = term1*dmpik[0] + term2*dmpik[2] \
                       + term3*dmpik[4] + term4*dmpik[6] \
                       + term5*dmpik[8]
            sizik = sizi * sizk
            e = sizik * rscale[k] * eterm * rr1

            # increment the overall Pauli repulsion energy component

            if e != 0.0:
                ner = ner + 1
                er = er + e
                aer[i] = aer[i] + 0.5 * e
                aer[k] = aer[k] + 0.5 * e
                if ATOMID[k].index not in ATOMID[i].connectivity:
                    einter = einter + e

    return er, einter, ner
Esempio n. 4
0
def rfield0m(ATOMID):
    '''rfield0m computes the field due to permanent repulsion'''

    n = len(ATOMID)

    field = np.zeros((3, n))
    # fieldp = np.zeros((3, n))

    # find the electrostatic field due to permanent multipoles

    for i in range(n - 1):
        xi = ATOMID[i].coordinates[0]
        yi = ATOMID[i].coordinates[1]
        zi = ATOMID[i].coordinates[2]
        sizi = ATOMID[i].sizpr
        dmpi = ATOMID[i].dmppr
        vali = ATOMID[i].elepr
        ci = ATOMID[i].rpole[0]
        dix = ATOMID[i].rpole[1]
        diy = ATOMID[i].rpole[2]
        diz = ATOMID[i].rpole[3]
        qixx = ATOMID[i].rpole[4]
        qixy = ATOMID[i].rpole[5]
        qixz = ATOMID[i].rpole[6]
        qiyy = ATOMID[i].rpole[8]
        qiyz = ATOMID[i].rpole[9]
        qizz = ATOMID[i].rpole[12]

        # set exclusion coefficients for connected atoms

        rscale = ATOMID[i].returnrscale(ATOMID)

        for k in range(i + 1, n):
            xr = ATOMID[k].coordinates[0] - xi
            yr = ATOMID[k].coordinates[1] - yi
            zr = ATOMID[k].coordinates[2] - zi
            r2 = xr**2 + yr**2 + zr**2
            r = np.sqrt(r2)
            sizk = ATOMID[k].sizpr
            dmpk = ATOMID[k].dmppr
            valk = ATOMID[k].elepr
            ck = ATOMID[k].rpole[0]
            dkx = ATOMID[k].rpole[1]
            dky = ATOMID[k].rpole[2]
            dkz = ATOMID[k].rpole[3]
            qkxx = ATOMID[k].rpole[4]
            qkxy = ATOMID[k].rpole[5]
            qkxz = ATOMID[k].rpole[6]
            qkyy = ATOMID[k].rpole[8]
            qkyz = ATOMID[k].rpole[9]
            qkzz = ATOMID[k].rpole[12]

            # intermediates involving moments and separation distance

            dir_ = dix * xr + diy * yr + diz * zr
            qix = qixx * xr + qixy * yr + qixz * zr
            qiy = qixy * xr + qiyy * yr + qiyz * zr
            qiz = qixz * xr + qiyz * yr + qizz * zr
            qir = qix * xr + qiy * yr + qiz * zr
            dkr = dkx * xr + dky * yr + dkz * zr
            qkx = qkxx * xr + qkxy * yr + qkxz * zr
            qky = qkxy * xr + qkyy * yr + qkyz * zr
            qkz = qkxz * xr + qkyz * yr + qkzz * zr
            qkr = qkx * xr + qky * yr + qkz * zr

            # get reciprocal distance terms for this interaction

            rr1 = 1.0 / r
            rr3 = rr1 / r2
            rr5 = 3.0 * rr3 / r2
            rr7 = 5.0 * rr5 / r2
            rr9 = 7.0 * rr7 / r2

            dmpik = damping.damprep(r, r2, rr1, rr3, rr5, rr7, rr9, 9, dmpi,
                                    dmpk)

            # rr1ik = dmpik[0]*rr1
            rr3ik = dmpik[2] * rr3
            rr5ik = dmpik[4] * rr5
            rr7ik = dmpik[6] * rr7

            fid = np.empty(3)
            fkd = np.empty(3)

            fid[0] = (-xr*(dmpik[2]*valk \
                        - dmpik[4]*dkr + dmpik[6]*qkr) \
                        - dmpik[2]*dkx + 2.0*dmpik[4]*qkx)*rr1
            fid[1] = (-yr*(dmpik[2]*valk \
                        - dmpik[4]*dkr + dmpik[6]*qkr) \
                        - dmpik[2]*dky + 2.0*dmpik[4]*qky)*rr1
            fid[2] = (-zr*(dmpik[2]*valk \
                        - dmpik[4]*dkr + dmpik[6]*qkr) \
                        - dmpik[2]*dkz + 2.0*dmpik[4]*qkz)*rr1
            fkd[0] = (xr*(dmpik[2]*vali \
                        + dmpik[4]*dir_ + dmpik[6]*qir) \
                        - dmpik[2]*dix - 2.0*dmpik[4]*qix)*rr1
            fkd[1] = (yr*(dmpik[2]*vali \
                        + dmpik[4]*dir_ + dmpik[6]*qir) \
                        - dmpik[2]*diy - 2.0*dmpik[4]*qiy)*rr1
            fkd[2] = (zr*(dmpik[2]*vali \
                        + dmpik[4]*dir_ + dmpik[6]*qir) \
                        - dmpik[2]*diz - 2.0*dmpik[4]*qiz)*rr1

            fid[0] = fid[0] * sizk
            fid[1] = fid[1] * sizk
            fid[2] = fid[2] * sizk
            fkd[0] = fkd[0] * sizi
            fkd[1] = fkd[1] * sizi
            fkd[2] = fkd[2] * sizi

            for j in range(3):
                field[j, i] = field[j, i] + fid[j] * rscale[k]
                field[j, k] = field[j, k] + fkd[j] * rscale[k]
                # fieldp[j,i] = fieldp[j,i] + fid[j]*rscale[k]
                # fieldp[j,k] = fieldp[j,k] + fkd[j]*rscale[k]

    # return field, fieldp
    return field