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)))
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
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
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