12 integer,
parameter ::
dp = kind(1.0d0)
29 DELTAQ,J,U,Element_Pointer,Nr_atoms,COULACC,HDIM,Max_Nr_Neigh)
33 integer,
parameter :: prec = 8
34 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
35 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
36 real(prec),
parameter :: pi = 3.14159265358979323846264d0
37 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
38 integer,
intent(in) :: nr_atoms, nr_elem, hdim, max_nr_neigh, i, j, element_pointer(nr_atoms)
39 real(prec),
intent(in) :: coulacc, deltaq(nr_atoms)
40 real(prec) :: tfact, relperm, keconst
41 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3)
42 real(prec),
intent(in) :: u(nr_elem)
43 real(prec) :: coulcut, coulcut2
44 real(prec),
intent(out) :: coulombv
45 real(prec) :: ra(3), rb(3), dr, rab(3)
46 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
47 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
48 real(prec) :: numrep_erfc, ca, force, expti, exptj
49 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
50 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
52 integer :: k, ccnt,l,m,n
54 coulvol = box(1,1)*box(2,2)*box(3,3)
55 sqrtx = sqrt(-log(coulacc))
59 calpha = sqrtx/coulcut
60 coulcut2 = coulcut*coulcut
61 calpha2 = calpha*calpha
64 keconst = 14.3996437701414d0*relperm
65 tfact = 16.0d0/(5.0d0*keconst)
69 ti = tfact*u(element_pointer(i))
89 rb(1) = rxyz(1,j)+k*box(1,1)
90 rb(2) = rxyz(2,j)+m*box(2,2)
91 rb(3) = rxyz(3,j)+l*box(3,3)
97 if ((dr <= coulcut).and.(dr > 1e-12))
then
99 tj = tfact*u(element_pointer(j))
103 numrep_erfc = erfc(z)
105 ca = numrep_erfc/magr
106 coulombv = coulombv + deltaq(j)*ca
108 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
109 expti = exp(-ti*magr )
111 if (element_pointer(i).eq.element_pointer(j))
then
112 coulombv = coulombv - deltaq(j)*expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
119 exptj = exp( -tj*magr )
123 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
124 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
126 se = ti4*tj/(two * tj2mti2 * tj2mti2)
127 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
129 coulombv = coulombv - (deltaq(j)*(expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
136 coulombv = keconst*coulombv
141 DELTAQ,J,U,Element_Type,Nr_atoms,COULACC,TIMERATIO,HDIM,Max_Nr_Neigh)
146 integer,
parameter :: prec = 8
147 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
148 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
149 real(prec),
parameter :: pi = 3.14159265358979323846264d0
150 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
151 integer,
intent(in) :: nr_atoms, hdim, max_nr_neigh, i, j
152 real(prec),
intent(in) :: coulacc, timeratio,deltaq(nr_atoms)
153 real(prec) :: tfact, relperm, keconst
154 real(prec),
intent(in) :: rx(nr_atoms), ry(nr_atoms), rz(nr_atoms), lbox(3)
155 real(prec),
intent(in) :: u(nr_atoms)
156 real(prec) :: coulcut, coulcut2
157 character(10),
intent(in) :: element_type(nr_atoms)
158 real(prec),
intent(out) :: coulombv, fcoul(3)
159 real(prec) :: ra(3), rb(3), dr, rab(3)
160 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
161 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
162 real(prec) :: numrep_erfc, ca, force, expti, exptj
163 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
164 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
166 integer :: k, ccnt,l,m,n
168 coulvol = lbox(1)*lbox(2)*lbox(3)
169 sqrtx = sqrt(-log(coulacc))
173 calpha = sqrtx/coulcut
174 coulcut2 = coulcut*coulcut
175 calpha2 = calpha*calpha
178 keconst = 14.3996437701414d0*relperm
179 tfact = 16.0d0/(5.0d0*keconst)
204 rb(1) = rx(j)+k*lbox(1)
205 rb(2) = ry(j)+m*lbox(2)
206 rb(3) = rz(j)+l*lbox(3)
212 if ((dr <= coulcut).and.(dr > 1e-12))
then
218 numrep_erfc = erfc(z)
220 ca = numrep_erfc/magr
221 coulombv = coulombv + deltaq(j)*ca
223 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
224 force = -keconst*deltaq(i)*deltaq(j)*ca/magr
225 expti = exp(-ti*magr )
227 if (element_type(i).eq.element_type(j))
then
228 coulombv = coulombv - deltaq(j)*expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
230 force = force + (keconst*deltaq(i)*deltaq(j)*expti)*((sse/magr2 - two*ssb*magr - ssc) &
231 + ssa*(ssb*magr2 + ssc*magr + ssd + sse/magr))
237 exptj = exp( -tj*magr )
241 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
242 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
244 se = ti4*tj/(two * tj2mti2 * tj2mti2)
245 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
247 coulombv = coulombv - (deltaq(j)*(expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
248 force = force + keconst*deltaq(i)*deltaq(j)*((expti*(sa*(sb - (sc/magr)) - (sc/magr2))) &
249 + (exptj*(sd*(se - (sf/magr)) - (sf/magr2))))
252 fcoul(1) = fcoul(1) + dc(1)*force
253 fcoul(2) = fcoul(2) + dc(2)*force
254 fcoul(3) = fcoul(3) + dc(3)*force
260 coulombv = keconst*coulombv
264 subroutine ewald_real_space_matrix_latte(E,RXYZ,Box,U,Element_Pointer,Nr_atoms,COULACC,nebcoul,totnebcoul,HDIM,Max_Nr_Neigh,Nr_Elem)
268 integer,
parameter :: prec = 8
269 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
270 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
271 real(prec),
parameter :: pi = 3.14159265358979323846264d0
272 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
273 integer,
intent(in) :: nr_atoms, hdim, max_nr_neigh, nr_elem
274 real(prec),
intent(in) :: coulacc
275 real(prec),
intent(out) :: e(nr_atoms,nr_atoms)
276 real(prec) :: tfact, relperm, keconst
277 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3)
278 real(prec),
intent(in) :: u(nr_elem)
279 real(prec) :: coulcut, coulcut2
280 integer,
intent(in) :: element_pointer(nr_atoms)
281 integer,
intent(in) :: totnebcoul(nr_atoms), nebcoul(4,max_nr_neigh,nr_atoms)
282 real(prec) :: ra(3), rb(3), dr, rab(3)
283 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
284 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
285 real(prec) :: numrep_erfc, ca, force, expti, exptj
286 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
287 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
288 integer :: i,j,k, ccnt, newj, pbci,pbcj,pbck
290 coulvol = box(1,1)*box(2,2)*box(3,3)
291 sqrtx = sqrt(-log(coulacc))
295 calpha = sqrtx/coulcut
296 coulcut2 = coulcut*coulcut
297 calpha2 = calpha*calpha
300 keconst = 14.3996437701414d0*relperm
301 tfact = 16.0d0/(5.0d0*keconst)
309 ti = tfact*u(element_pointer(i))
325 do newj = 1,totnebcoul(i)
326 j = nebcoul(1, newj, i)
327 pbci = nebcoul(2, newj, i)
328 pbcj = nebcoul(3, newj, i)
329 pbck = nebcoul(4, newj, i)
330 rb(1) = rxyz(1,j) + real(pbci)*box(1,1) + real(pbcj)*box(2,1) + &
333 rb(2) = rxyz(2,j) + real(pbci)*box(1,2) + real(pbcj)*box(2,2) + &
336 rb(3) = rxyz(3,j) + real(pbci)*box(1,3) + real(pbcj)*box(2,3) + &
343 if ((dr <= coulcut).and.(dr > 1e-12))
then
345 tj = tfact*u(element_pointer(j))
349 numrep_erfc = erfc(z)
351 ca = numrep_erfc/magr
354 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
355 expti = exp(-ti*magr )
357 if (element_pointer(i).eq.element_pointer(j))
then
358 e(i,j) = e(i,j) - expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
365 exptj = exp( -tj*magr )
369 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
370 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
372 se = ti4*tj/(two * tj2mti2 * tj2mti2)
373 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
375 e(i,j) = e(i,j) - ((expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
388 DELTAQ,U,Element_Pointer,Nr_atoms,COULACC,nebcoul,totnebcoul,HDIM,Max_Nr_Neigh,Nr_Elem)
392 integer,
parameter :: prec = 8
393 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
394 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
395 real(prec),
parameter :: pi = 3.14159265358979323846264d0
396 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
397 integer,
intent(in) :: nr_atoms, hdim, max_nr_neigh, i, nr_elem
398 real(prec),
intent(in) :: coulacc
399 real(prec) :: tfact, relperm, keconst
400 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3), deltaq(nr_atoms)
401 real(prec),
intent(in) :: u(nr_elem)
402 real(prec) :: coulcut, coulcut2
403 integer,
intent(in) :: element_pointer(nr_atoms)
404 integer,
intent(in) :: totnebcoul(nr_atoms), nebcoul(4,max_nr_neigh,nr_atoms)
405 real(prec),
intent(out) :: coulombv
406 real(prec) :: ra(3), rb(3), dr, rab(3)
407 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
408 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
409 real(prec) :: numrep_erfc, ca, force, expti, exptj
410 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
411 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
412 integer :: j,k, ccnt, newj, pbci,pbcj,pbck
414 coulvol = box(1,1)*box(2,2)*box(3,3)
415 sqrtx = sqrt(-log(coulacc))
419 calpha = sqrtx/coulcut
420 coulcut2 = coulcut*coulcut
421 calpha2 = calpha*calpha
424 keconst = 14.3996437701414d0*relperm
425 tfact = 16.0d0/(5.0d0*keconst)
429 ti = tfact*u(element_pointer(i))
445 do newj = 1,totnebcoul(i)
446 j = nebcoul(1, newj, i)
447 pbci = nebcoul(2, newj, i)
448 pbcj = nebcoul(3, newj, i)
449 pbck = nebcoul(4, newj, i)
450 rb(1) = rxyz(1,j) + real(pbci)*box(1,1) + real(pbcj)*box(2,1) + &
453 rb(2) = rxyz(2,j) + real(pbci)*box(1,2) + real(pbcj)*box(2,2) + &
456 rb(3) = rxyz(3,j) + real(pbci)*box(1,3) + real(pbcj)*box(2,3) + &
463 if ((dr <= coulcut).and.(dr > 1e-12))
then
465 tj = tfact*u(element_pointer(j))
469 numrep_erfc = erfc(z)
471 ca = numrep_erfc/magr
472 coulombv = coulombv + deltaq(j)*ca
474 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
475 expti = exp(-ti*magr )
477 if (element_pointer(i).eq.element_pointer(j))
then
478 coulombv = coulombv - deltaq(j)*expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
485 exptj = exp( -tj*magr )
489 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
490 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
492 se = ti4*tj/(two * tj2mti2 * tj2mti2)
493 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
495 coulombv = coulombv - (deltaq(j)*(expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
500 coulombv = keconst*coulombv
505 DELTAQ,U,Element_Type,Nr_atoms,COULACC,nnRx,nnRy,nnRz,nrnnlist,nnType,Max_Nr_Neigh)
509 integer,
parameter :: prec = 8
510 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
511 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
512 real(prec),
parameter :: pi = 3.14159265358979323846264d0
513 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
514 integer,
intent(in) :: nr_atoms, max_nr_neigh, i
515 real(prec),
intent(in) :: coulacc
516 real(prec) :: tfact, relperm, keconst
517 real(prec),
intent(in) :: rx(nr_atoms), ry(nr_atoms), rz(nr_atoms), lbox(3), deltaq(nr_atoms)
518 real(prec),
intent(in) :: u(nr_atoms)
519 real(prec) :: coulcut, coulcut2
520 character(10),
intent(in) :: element_type(nr_atoms)
521 integer,
intent(in) :: nrnnlist(nr_atoms), nntype(nr_atoms,max_nr_neigh)
522 real(prec),
intent(in) :: nnrx(nr_atoms,max_nr_neigh)
523 real(prec),
intent(in) :: nnry(nr_atoms,max_nr_neigh), nnrz(nr_atoms,max_nr_neigh)
524 real(prec),
intent(out) :: coulombv
525 real(prec) :: ra(3), rb(3), dr, rab(3)
526 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
527 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
528 real(prec) :: numrep_erfc, ca, force, expti, exptj
529 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
530 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
531 integer :: j,k, ccnt, nni
533 coulvol = lbox(1)*lbox(2)*lbox(3)
534 sqrtx = sqrt(-log(coulacc))
538 calpha = sqrtx/coulcut
539 coulcut2 = coulcut*coulcut
540 calpha2 = calpha*calpha
543 keconst = 14.3996437701414d0*relperm
544 tfact = 16.0d0/(5.0d0*keconst)
566 do nni = 1,nrnnlist(i)
576 if ((dr <= coulcut).and.(dr > 1e-12))
then
583 numrep_erfc = erfc(z)
585 ca = numrep_erfc/magr
586 coulombv = coulombv + deltaq(j)*ca
589 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
590 expti = exp(-ti*magr )
592 if (element_type(i).eq.element_type(j))
then
593 coulombv = coulombv - deltaq(j)*expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
601 exptj = exp( -tj*magr )
605 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
606 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
608 se = ti4*tj/(two * tj2mti2 * tj2mti2)
609 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
611 coulombv = coulombv - (deltaq(j)*(expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
617 coulombv = keconst*coulombv
622 DELTAQ,U,Element_Type,Nr_atoms,COULACC,TIMERATIO,nnRx,nnRy,nnRz,nrnnlist,nnType,HDIM,Max_Nr_Neigh)
626 integer,
parameter :: prec = 8
627 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0
628 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0
629 real(prec),
parameter :: pi = 3.14159265358979323846264d0
630 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
631 integer,
intent(in) :: nr_atoms, hdim, max_nr_neigh, i
632 real(prec),
intent(in) :: coulacc, timeratio
633 real(prec) :: tfact, relperm, keconst
634 real(prec),
intent(in) :: rx(nr_atoms), ry(nr_atoms), rz(nr_atoms), lbox(3), deltaq(nr_atoms)
635 real(prec),
intent(in) :: u(nr_atoms)
636 real(prec) :: coulcut, coulcut2
637 character(10),
intent(in) :: element_type(nr_atoms)
638 integer,
intent(in) :: nrnnlist(nr_atoms), nntype(nr_atoms,max_nr_neigh)
639 real(prec),
intent(in) :: nnrx(nr_atoms,max_nr_neigh)
640 real(prec),
intent(in) :: nnry(nr_atoms,max_nr_neigh), nnrz(nr_atoms,max_nr_neigh)
641 real(prec),
intent(out) :: coulombv, fcoul(3)
642 real(prec) :: ra(3), rb(3), dr, rab(3)
643 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
644 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
645 real(prec) :: numrep_erfc, ca, force, expti, exptj
646 real(prec) :: tj,tj2,tj3,tj4,tj6,ti2mtj2a,sa,sb,sc,sd,se,sf
647 real(prec) :: ti2mtj2, ti2mti2, tj2mti2
648 integer :: j,k, ccnt, nni
650 coulvol = lbox(1)*lbox(2)*lbox(3)
651 sqrtx = sqrt(-log(coulacc))
655 calpha = sqrtx/coulcut
656 coulcut2 = coulcut*coulcut
657 calpha2 = calpha*calpha
660 keconst = 14.3996437701414d0*relperm
661 tfact = 16.0d0/(5.0d0*keconst)
682 do nni = 1,nrnnlist(i)
692 if ((dr <= coulcut).and.(dr > 1e-12))
then
699 numrep_erfc = erfc(z)
701 ca = numrep_erfc/magr
702 coulombv = coulombv + deltaq(j)*ca
705 ca = ca + two*calpha*exp( -calpha2*magr2 )/sqrtpi
706 force = -keconst*deltaq(i)*deltaq(j)*ca/magr
707 expti = exp(-ti*magr )
709 if (element_type(i).eq.element_type(j))
then
710 coulombv = coulombv - deltaq(j)*expti*(ssb*magr2 + ssc*magr + ssd + sse/magr)
713 force = force + (keconst*deltaq(i)*deltaq(j)*expti)*((sse/magr2 - two*ssb*magr - ssc) &
714 + ssa*(ssb*magr2 + ssc*magr + ssd + sse/magr))
720 exptj = exp( -tj*magr )
724 sb = tj4*ti/(two*ti2mtj2*ti2mtj2)
725 sc = (tj6 - three*tj4*ti2)/(ti2mtj2*ti2mtj2*ti2mtj2)
727 se = ti4*tj/(two * tj2mti2 * tj2mti2)
728 sf = (ti6 - three*ti4*tj2)/(tj2mti2*tj2mti2*tj2mti2)
730 coulombv = coulombv - (deltaq(j)*(expti*(sb - (sc/magr)) + exptj*(se - (sf/magr))))
731 force = force + keconst*deltaq(i)*deltaq(j)*((expti*(sa*(sb - (sc/magr)) - (sc/magr2))) &
732 + (exptj*(sd*(se - (sf/magr)) - (sf/magr2))))
735 fcoul(1) = fcoul(1) + dc(1)*force
736 fcoul(2) = fcoul(2) + dc(2)*force
737 fcoul(3) = fcoul(3) + dc(3)*force
740 coulombv = keconst*coulombv
748 integer,
parameter :: prec = 8
749 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0, four = 4.d0
750 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0, eight = 8.d0
751 real(prec),
parameter :: pi = 3.14159265358979323846264d0
752 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
753 integer,
intent(in) :: nr_atoms, max_nr_neigh
754 real(prec),
intent(in) :: coulacc
755 real(prec) :: keconst, tfact, relperm
756 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3), deltaq(nr_atoms)
757 real(prec) :: coulcut, coulcut2
758 real(prec),
intent(out) :: coulombv(nr_atoms)
759 real(prec) :: ra(3), rb(3), dr, rab(3)
760 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
761 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
762 real(prec) :: corrfact,fourcalpha2, force
763 real(prec) :: recipvecs(3,3),sinlist(nr_atoms),coslist(nr_atoms)
764 real(prec) :: k(3),l11,l12,l13,m21,m22,m23,k2,kcutoff,kcutoff2,prefactor
765 real(prec) :: previr, cossum,sinsum,dot, kepref, cossum2, sinsum2
767 integer :: i,j,l,m,n, ccnt, nni, lmax,mmax,nmax,nmin,mmin
769 coulvol = box(1,1)*box(2,2)*box(3,3)
770 sqrtx = sqrt(-log(coulacc))
775 calpha = sqrtx/coulcut
777 coulcut2 = coulcut*coulcut
778 kcutoff = two*calpha*sqrtx
779 kcutoff2 = kcutoff*kcutoff
780 calpha2 = calpha*calpha
781 fourcalpha2 = four*calpha2
784 recipvecs(1,1) = two*pi/box(1,1)
785 recipvecs(2,2) = two*pi/box(2,2)
786 recipvecs(3,3) = two*pi/box(3,3)
787 lmax = floor(kcutoff / sqrt(recipvecs(1,1)*recipvecs(1,1)))
788 mmax = floor(kcutoff / sqrt(recipvecs(2,2)*recipvecs(2,2)))
789 nmax = floor(kcutoff / sqrt(recipvecs(3,3)*recipvecs(3,3)))
792 keconst = 14.3996437701414d0*relperm
806 l11 = l*recipvecs(1,1)
807 l12 = l*recipvecs(1,2)
808 l13 = l*recipvecs(1,3)
813 if ((l==0).and.(m==0))
then
817 m21 = l11 + m*recipvecs(2,1)
818 m22 = l12 + m*recipvecs(2,2)
819 m23 = l13 + m*recipvecs(2,3)
822 k(1) = m21 + n*recipvecs(3,1)
823 k(2) = m22 + n*recipvecs(3,2)
824 k(3) = m23 + n*recipvecs(3,3)
825 k2 = k(1)*k(1) + k(2)*k(2) + k(3)*k(3)
826 if (k2.le.kcutoff2)
then
827 prefactor = eight*pi*exp(-k2/(4.d0*calpha2))/(coulvol*k2)
828 previr = (2.d0/k2) + (2.d0/(4.d0*calpha2));
838 dot = k(1)*rxyz(1,i) + k(2)*rxyz(2,i) + k(3)*rxyz(3,i)
840 sinlist(i) = sin(dot)
841 coslist(i) = cos(dot)
842 cossum = cossum + deltaq(i)*coslist(i)
843 sinsum = sinsum + deltaq(i)*sinlist(i)
846 cossum2 = cossum*cossum
847 sinsum2 = sinsum*sinsum
851 kepref = keconst*prefactor
854 coulombv(i) = coulombv(i) + kepref*(coslist(i)*cossum + sinlist(i)*sinsum)
858 kepref = kepref*(cossum2 + sinsum2)
865 corrfact = 2.d0*keconst*calpha/sqrtpi;
866 coulombv = coulombv - corrfact*deltaq;
874 integer,
parameter :: prec = 8
875 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0, four = 4.d0
876 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0, eight = 8.d0
877 real(prec),
parameter :: pi = 3.14159265358979323846264d0
878 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
879 integer,
intent(in) :: nr_atoms, max_nr_neigh,nebcoul(4,max_nr_neigh,nr_atoms),totnebcoul(nr_atoms)
880 real(prec),
intent(in) :: coulacc
881 real(prec) :: keconst, tfact, relperm
882 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3)
883 real(prec) :: coulcut, coulcut2
884 real(prec),
intent(out) :: e(nr_atoms,nr_atoms)
885 real(prec) :: ra(3), rb(3), dr, rab(3)
886 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
887 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
888 real(prec) :: corrfact,fourcalpha2, force
889 real(prec) :: recipvecs(3,3),sinlist(nr_atoms),coslist(nr_atoms)
890 real(prec) :: k(3),l11,l12,l13,m21,m22,m23,k2,kcutoff,kcutoff2,prefactor
891 real(prec) :: previr, cossum,sinsum,dot, kepref, cossum2, sinsum2
893 integer :: i,j,l,m,n, newj, ccnt, nni, lmax,mmax,nmax,nmin,mmin
895 coulvol = box(1,1)*box(2,2)*box(3,3)
896 sqrtx = sqrt(-log(coulacc))
901 calpha = sqrtx/coulcut
903 coulcut2 = coulcut*coulcut
904 kcutoff = two*calpha*sqrtx
905 kcutoff2 = kcutoff*kcutoff
906 calpha2 = calpha*calpha
907 fourcalpha2 = four*calpha2
910 recipvecs(1,1) = two*pi/box(1,1)
911 recipvecs(2,2) = two*pi/box(2,2)
912 recipvecs(3,3) = two*pi/box(3,3)
913 lmax = floor(kcutoff / sqrt(recipvecs(1,1)*recipvecs(1,1)))
914 mmax = floor(kcutoff / sqrt(recipvecs(2,2)*recipvecs(2,2)))
915 nmax = floor(kcutoff / sqrt(recipvecs(3,3)*recipvecs(3,3)))
918 keconst = 14.3996437701414d0*relperm
934 l11 = l*recipvecs(1,1)
935 l12 = l*recipvecs(1,2)
936 l13 = l*recipvecs(1,3)
941 if ((l==0).and.(m==0))
then
945 m21 = l11 + m*recipvecs(2,1)
946 m22 = l12 + m*recipvecs(2,2)
947 m23 = l13 + m*recipvecs(2,3)
950 k(1) = m21 + n*recipvecs(3,1)
951 k(2) = m22 + n*recipvecs(3,2)
952 k(3) = m23 + n*recipvecs(3,3)
953 k2 = k(1)*k(1) + k(2)*k(2) + k(3)*k(3)
954 if (k2.le.kcutoff2)
then
955 prefactor = eight*pi*exp(-k2/(4.d0*calpha2))/(coulvol*k2)
956 previr = (2.d0/k2) + (2.d0/(4.d0*calpha2));
962 dot = k(1)*rxyz(1,i) + k(2)*rxyz(2,i) + k(3)*rxyz(3,i)
964 sinlist(i) = sin(dot)
965 coslist(i) = cos(dot)
973 kepref = keconst*prefactor
974 corrfact = 2.d0*keconst*calpha/sqrtpi;
977 do newj = 1,totnebcoul(i)
978 j = nebcoul(1, newj, i)
979 e(i,j) = e(i,j) + kepref*(coslist(i)*coslist(j)+sinlist(i)*sinlist(j))
982 e(i,i) = e(i,i) - corrfact
1002 integer,
parameter :: prec = 8
1003 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0, four = 4.d0
1004 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0, eight = 8.d0
1005 real(prec),
parameter :: pi = 3.14159265358979323846264d0
1006 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
1007 integer,
intent(in) :: nr_atoms, j
1008 real(prec),
intent(in) :: coulacc
1009 real(prec) :: keconst, tfact, relperm
1010 real(prec),
intent(in) :: rxyz(3,nr_atoms), box(3,3), deltaq(nr_atoms)
1011 real(prec) :: coulcut, coulcut2
1012 real(prec),
intent(out) :: coulombv(nr_atoms)
1013 real(prec) :: ra(3), rb(3), dr, rab(3)
1014 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
1015 real(prec) :: calpha2
1016 real(prec) :: corrfact,fourcalpha2
1017 real(prec) :: recipvecs(3,3)
1018 real(prec) :: k(3),l11,l12,l13,m21,m22,m23,k2,kcutoff,kcutoff2,prefactor
1019 real(prec) :: idot, jdot, cosjdot, sinjdot, kepref
1021 integer :: i,l,m,n, ccnt, nni, lmax,mmax,nmax,nmin,mmin
1023 coulvol = box(1,1)*box(2,2)*box(3,3)
1024 sqrtx = sqrt(-log(coulacc))
1029 calpha = sqrtx/coulcut
1031 coulcut2 = coulcut*coulcut
1032 kcutoff = two*calpha*sqrtx
1033 kcutoff2 = kcutoff*kcutoff
1034 calpha2 = calpha*calpha
1035 fourcalpha2 = four*calpha2
1038 recipvecs(1,1) = two*pi/box(1,1)
1039 recipvecs(2,2) = two*pi/box(2,2)
1040 recipvecs(3,3) = two*pi/box(3,3)
1041 lmax = floor(kcutoff / sqrt(recipvecs(1,1)*recipvecs(1,1)))
1042 mmax = floor(kcutoff / sqrt(recipvecs(2,2)*recipvecs(2,2)))
1043 nmax = floor(kcutoff / sqrt(recipvecs(3,3)*recipvecs(3,3)))
1046 keconst = 14.3996437701414d0*relperm
1059 l11 = l*recipvecs(1,1)
1064 if ((l==0).and.(m==0))
then
1068 m22 = m*recipvecs(2,2)
1073 k(3) = n*recipvecs(3,3)
1074 k2 = k(1)*k(1) + k(2)*k(2) + k(3)*k(3)
1076 prefactor = eight*pi*exp(-k2/(4.d0*calpha2))/(coulvol*k2)
1077 kepref = keconst*prefactor
1078 jdot = k(1)*rxyz(1,j) + k(2)*rxyz(2,j) + k(3)*rxyz(3,j)
1082 idot = k(1)*rxyz(1,i) + k(2)*rxyz(2,i) + k(3)*rxyz(3,i)
1083 coulombv(i) = coulombv(i) + kepref*deltaq(j)*(cosjdot*cos(idot)+sinjdot*sin(idot))
1091 corrfact = 2.d0*keconst*calpha/sqrtpi;
1092 coulombv = coulombv - corrfact*deltaq;
1100 integer,
parameter :: prec = 8
1101 real(prec),
parameter :: one = 1.d0, two = 2.d0, zero = 0.d0, six = 6.d0, three = 3.d0, four = 4.d0
1102 real(prec),
parameter :: fourtyeight = 48.d0, eleven = 11.d0, sixteen = 16.d0, eight = 8.d0
1103 real(prec),
parameter :: pi = 3.14159265358979323846264d0
1104 real(prec),
parameter :: sqrtpi = 1.772453850905516d0
1105 integer,
intent(in) :: nr_atoms, max_nr_neigh
1106 real(prec),
intent(in) :: coulacc
1107 real(prec) :: keconst, tfact, relperm
1108 real(prec),
intent(in) :: rx(nr_atoms), ry(nr_atoms), rz(nr_atoms), lbox(3), deltaq(nr_atoms)
1109 real(prec) :: coulcut, coulcut2
1110 real(prec),
intent(out) :: coulombv(nr_atoms)
1111 real(prec) :: ra(3), rb(3), dr, rab(3)
1112 real(prec) :: coulvol, sqrtx, calpha, dc(3), magr, magr2, z
1113 real(prec) :: calpha2, ti,ti2,ti3,ti4,ti6,ssa,ssb,ssc,ssd,sse
1114 real(prec) :: corrfact,fourcalpha2, force
1115 real(prec) :: recipvecs(3,3),sinlist(nr_atoms),coslist(nr_atoms)
1116 real(prec) :: k(3),l11,l12,l13,m21,m22,m23,k2,kcutoff,kcutoff2,prefactor
1117 real(prec) :: previr, cossum,sinsum,dot, kepref, cossum2, sinsum2
1119 integer :: i,j,l,m,n, ccnt, nni, lmax,mmax,nmax,nmin,mmin
1121 coulvol = lbox(1)*lbox(2)*lbox(3)
1122 sqrtx = sqrt(-log(coulacc))
1127 calpha = sqrtx/coulcut
1129 coulcut2 = coulcut*coulcut
1130 kcutoff = two*calpha*sqrtx
1131 kcutoff2 = kcutoff*kcutoff
1132 calpha2 = calpha*calpha
1133 fourcalpha2 = four*calpha2
1136 recipvecs(1,1) = two*pi/lbox(1)
1137 recipvecs(2,2) = two*pi/lbox(2)
1138 recipvecs(3,3) = two*pi/lbox(3)
1139 lmax = floor(kcutoff / sqrt(recipvecs(1,1)*recipvecs(1,1)))
1140 mmax = floor(kcutoff / sqrt(recipvecs(2,2)*recipvecs(2,2)))
1141 nmax = floor(kcutoff / sqrt(recipvecs(3,3)*recipvecs(3,3)))
1144 keconst = 14.3996437701414d0*relperm
1158 l11 = l*recipvecs(1,1)
1159 l12 = l*recipvecs(1,2)
1160 l13 = l*recipvecs(1,3)
1165 if ((l==0).and.(m==0))
then
1169 m21 = l11 + m*recipvecs(2,1)
1170 m22 = l12 + m*recipvecs(2,2)
1171 m23 = l13 + m*recipvecs(2,3)
1174 k(1) = m21 + n*recipvecs(3,1)
1175 k(2) = m22 + n*recipvecs(3,2)
1176 k(3) = m23 + n*recipvecs(3,3)
1177 k2 = k(1)*k(1) + k(2)*k(2) + k(3)*k(3)
1178 if (k2.le.kcutoff2)
then
1179 prefactor = eight*pi*exp(-k2/(4.d0*calpha2))/(coulvol*k2)
1180 previr = (2.d0/k2) + (2.d0/(4.d0*calpha2));
1190 dot = k(1)*rx(i) + k(2)*ry(i) + k(3)*rz(i)
1192 sinlist(i) = sin(dot)
1193 coslist(i) = cos(dot)
1194 cossum = cossum + deltaq(i)*coslist(i)
1195 sinsum = sinsum + deltaq(i)*sinlist(i)
1198 cossum2 = cossum*cossum
1199 sinsum2 = sinsum*sinsum
1203 kepref = keconst*prefactor
1206 coulombv(i) = coulombv(i) + kepref*(coslist(i)*cossum + sinlist(i)*sinsum)
1210 kepref = kepref*(cossum2 + sinsum2)
1217 corrfact = 2.d0*keconst*calpha/sqrtpi;
1218 coulombv = coulombv - corrfact*deltaq;
subroutine, public ewald_k_space_latte(COULOMBV, RXYZ, Box, DELTAQ, Nr_atoms, COULACC, Max_Nr_Neigh)
subroutine, public ewald_k_space_latte_single(COULOMBV, J, RXYZ, Box, DELTAQ, Nr_atoms, COULACC)
subroutine, public ewald_real_space_single_latte(COULOMBV, I, RXYZ, Box, Nr_elem, DELTAQ, J, U, Element_Pointer, Nr_atoms, COULACC, HDIM, Max_Nr_Neigh)
Find Coulomb potential on site I from single charge at site J.
subroutine, public ewald_k_space_test(COULOMBV, RX, RY, RZ, LBox, DELTAQ, Nr_atoms, COULACC, Max_Nr_Neigh)
subroutine, public ewald_real_space(COULOMBV, FCOUL, I, RX, RY, RZ, LBox, DELTAQ, U, Element_Type, Nr_atoms, COULACC, TIMERATIO, nnRx, nnRy, nnRz, nrnnlist, nnType, HDIM, Max_Nr_Neigh)
subroutine, public ewald_real_space_test(COULOMBV, I, RX, RY, RZ, LBox, DELTAQ, U, Element_Type, Nr_atoms, COULACC, nnRx, nnRy, nnRz, nrnnlist, nnType, Max_Nr_Neigh)
subroutine, public ewald_real_space_latte(COULOMBV, I, RXYZ, Box, DELTAQ, U, Element_Pointer, Nr_atoms, COULACC, nebcoul, totnebcoul, HDIM, Max_Nr_Neigh, Nr_Elem)
subroutine, public ewald_k_space_matrix_latte(E, RXYZ, Box, Nr_atoms, COULACC, Max_Nr_Neigh, nebcoul, totnebcoul)
subroutine, public ewald_real_space_matrix_latte(E, RXYZ, Box, U, Element_Pointer, Nr_atoms, COULACC, nebcoul, totnebcoul, HDIM, Max_Nr_Neigh, Nr_Elem)
subroutine, public ewald_real_space_single(COULOMBV, FCOUL, I, RX, RY, RZ, LBox, DELTAQ, J, U, Element_Type, Nr_atoms, COULACC, TIMERATIO, HDIM, Max_Nr_Neigh)