50 |
|
!! @author Matthew Meineke |
51 |
|
!! @author Christopher Fennell |
52 |
|
!! @author J. Daniel Gezelter |
53 |
< |
!! @version $Id: sticky.F90,v 1.8 2005-05-05 14:47:35 chrisfen Exp $, $Date: 2005-05-05 14:47:35 $, $Name: not supported by cvs2svn $, $Revision: 1.8 $ |
53 |
> |
!! @version $Id: sticky.F90,v 1.10 2005-05-17 22:35:01 chrisfen Exp $, $Date: 2005-05-17 22:35:01 $, $Name: not supported by cvs2svn $, $Revision: 1.10 $ |
54 |
|
|
55 |
|
module sticky |
56 |
|
|
530 |
|
logical, intent(in) :: do_pot |
531 |
|
|
532 |
|
real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2 |
533 |
< |
real (kind=dp) :: r3, r5, r6, s, sp, dsdr, dspdr |
534 |
< |
real (kind=dp) :: wi, wj, w, wip, wjp, wp, wi2, wj2 |
533 |
> |
real (kind=dp) :: xihat, yihat, zihat, xjhat, yjhat, zjhat |
534 |
> |
real (kind=dp) :: rI, rI2, rI3, rI4, rI5, rI6, rI7, s, sp, dsdr, dspdr |
535 |
> |
real (kind=dp) :: wi, wj, w, wip, wjp, wp, wi2, wj2, wip3, wjp3 |
536 |
|
real (kind=dp) :: dwidx, dwidy, dwidz, dwjdx, dwjdy, dwjdz |
537 |
|
real (kind=dp) :: dwipdx, dwipdy, dwipdz, dwjpdx, dwjpdy, dwjpdz |
538 |
|
real (kind=dp) :: dwidux, dwiduy, dwiduz, dwjdux, dwjduy, dwjduz |
549 |
|
integer :: id1, id2 |
550 |
|
integer :: me1, me2 |
551 |
|
real (kind=dp) :: w0, v0, v0p, rl, ru, rlp, rup, rbig |
552 |
< |
|
552 |
> |
real (kind=dp) :: zi3, zi4, zi5, zj3, zj4, zj5 |
553 |
> |
real (kind=dp) :: frac1, frac2, prodVal |
554 |
> |
real (kind=dp) :: prei1, prei2, prei, prej1, prej2, prej |
555 |
> |
real (kind=dp) :: walt, walti, waltj, dwaltidx, dwaltidy, dwaltidz |
556 |
> |
real (kind=dp) :: dwaltjdx, dwaltjdy, dwaltjdz |
557 |
> |
real (kind=dp) :: dwaltidux, dwaltiduy, dwaltiduz |
558 |
> |
real (kind=dp) :: dwaltjdux, dwaltjduy, dwaltjduz |
559 |
> |
real (kind=dp) :: doSw1idx, doSw1idy, doSw1idz, doSw1jdx, doSw1jdy, doSw1jdz |
560 |
> |
real (kind=dp) :: doSw1idux, doSw1iduy, doSw1iduz |
561 |
> |
real (kind=dp) :: doSw1jdux, doSw1jduy, doSw1jduz |
562 |
> |
real (kind=dp) :: doSw2idx, doSw2idy, doSw2idz, doSw2jdx, doSw2jdy, doSw2jdz |
563 |
> |
real (kind=dp) :: doSw2idux, doSw2iduy, doSw2iduz |
564 |
> |
real (kind=dp) :: doSw2jdux, doSw2jduy, doSw2jduz |
565 |
> |
|
566 |
|
if (.not.allocated(StickyMap)) then |
567 |
|
call handleError("sticky", "no StickyMap was present before first call of do_sticky_power_pair!") |
568 |
|
return |
602 |
|
|
603 |
|
if ( rij .LE. rbig ) then |
604 |
|
|
605 |
< |
r3 = r2*rij |
606 |
< |
r5 = r3*r2 |
607 |
< |
|
608 |
< |
drdx = d(1) / rij |
609 |
< |
drdy = d(2) / rij |
610 |
< |
drdz = d(3) / rij |
605 |
> |
rI = 1.0d0/rij |
606 |
> |
rI2 = rI*rI |
607 |
> |
rI3 = rI2*rI |
608 |
> |
rI4 = rI2*rI2 |
609 |
> |
rI5 = rI3*rI2 |
610 |
> |
rI6 = rI3*rI3 |
611 |
> |
rI7 = rI4*rI3 |
612 |
> |
|
613 |
> |
drdx = d(1) * rI |
614 |
> |
drdy = d(2) * rI |
615 |
> |
drdz = d(3) * rI |
616 |
|
|
617 |
|
#ifdef IS_MPI |
618 |
|
! rotate the inter-particle separation into the two different |
645 |
|
xi2 = xi*xi |
646 |
|
yi2 = yi*yi |
647 |
|
zi2 = zi*zi |
648 |
< |
|
648 |
> |
zi3 = zi2*zi |
649 |
> |
zi4 = zi2*zi2 |
650 |
> |
zi5 = zi4*zi |
651 |
> |
xihat = xi*rI |
652 |
> |
yihat = yi*rI |
653 |
> |
zihat = zi*rI |
654 |
> |
|
655 |
|
xj2 = xj*xj |
656 |
|
yj2 = yj*yj |
657 |
|
zj2 = zj*zj |
658 |
< |
|
658 |
> |
zj3 = zj2*zj |
659 |
> |
zj4 = zj2*zj2 |
660 |
> |
zj5 = zj4*zj |
661 |
> |
xjhat = xj*rI |
662 |
> |
yjhat = yj*rI |
663 |
> |
zjhat = zj*rI |
664 |
> |
|
665 |
|
call calc_sw_fnc(rij, rl, ru, rlp, rup, s, sp, dsdr, dspdr) |
666 |
+ |
|
667 |
+ |
frac1 = 0.5d0 |
668 |
+ |
frac2 = 0.5d0 |
669 |
+ |
|
670 |
+ |
wi = 2.0d0*(xi2-yi2)*zi*rI3 |
671 |
+ |
wj = 2.0d0*(xj2-yj2)*zj*rI3 |
672 |
+ |
|
673 |
+ |
! prodVal = zihat*zjhat |
674 |
+ |
! if (prodVal .ge. 0.0d0) then |
675 |
+ |
! wi = 0.0d0 |
676 |
+ |
! wj = 0.0d0 |
677 |
+ |
! endif |
678 |
|
|
636 |
– |
wi = 2.0d0*(xi2-yi2)*zi / r3 |
637 |
– |
wj = 2.0d0*(xj2-yj2)*zj / r3 |
638 |
– |
!rootwi = sqrt(abs(wi)) |
639 |
– |
!rootwj = sqrt(abs(wj)) |
679 |
|
wi2 = wi*wi |
680 |
|
wj2 = wj*wj |
681 |
|
|
682 |
< |
|
644 |
< |
w = wi*wi2+wj*wj2 |
682 |
> |
w = frac1*wi*wi2 + frac2*wi + wj*wj2 |
683 |
|
|
684 |
< |
zif = zi/rij - 0.6d0 |
685 |
< |
zis = zi/rij + 0.8d0 |
684 |
> |
zif = zihat - 0.6d0 |
685 |
> |
zis = zihat + 0.8d0 |
686 |
|
|
687 |
< |
zjf = zj/rij - 0.6d0 |
688 |
< |
zjs = zj/rij + 0.8d0 |
687 |
> |
zjf = zjhat - 0.6d0 |
688 |
> |
zjs = zjhat + 0.8d0 |
689 |
|
|
690 |
|
wip = zif*zif*zis*zis - w0 |
691 |
|
wjp = zjf*zjf*zjs*zjs - w0 |
692 |
|
wp = wip + wjp |
693 |
+ |
|
694 |
+ |
!wip = zihat - 0.2d0 |
695 |
+ |
!wjp = zjhat - 0.2d0 |
696 |
+ |
!wip3 = wip*wip*wip |
697 |
+ |
!wjp3 = wjp*wjp*wjp |
698 |
+ |
|
699 |
+ |
!wp = wip3*wip + wjp3*wjp |
700 |
|
|
701 |
|
vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp) |
702 |
+ |
|
703 |
|
if (do_pot) then |
704 |
|
#ifdef IS_MPI |
705 |
< |
pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw |
706 |
< |
pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw |
705 |
> |
pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw |
706 |
> |
pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw |
707 |
|
#else |
708 |
< |
pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw |
708 |
> |
pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw |
709 |
|
#endif |
710 |
|
endif |
711 |
|
|
712 |
< |
! dwidx = 1.5d0*rootwi*( 4.0d0*xi*zi/r3 - 6.0d0*xi*zi*(xi2-yi2)/r5 ) |
713 |
< |
! dwidy = 1.5d0*rootwi*( -4.0d0*yi*zi/r3 - 6.0d0*yi*zi*(xi2-yi2)/r5 ) |
714 |
< |
! dwidz = 1.5d0*rootwi*( 2.0d0*(xi2-yi2)/r3 - 6.0d0*zi2*(xi2-yi2)/r5 ) |
669 |
< |
|
670 |
< |
! dwjdx = 1.5d0*rootwj*( 4.0d0*xj*zj/r3 - 6.0d0*xj*zj*(xj2-yj2)/r5 ) |
671 |
< |
! dwjdy = 1.5d0*rootwj*( -4.0d0*yj*zj/r3 - 6.0d0*yj*zj*(xj2-yj2)/r5 ) |
672 |
< |
! dwjdz = 1.5d0*rootwj*( 2.0d0*(xj2-yj2)/r3 - 6.0d0*zj2*(xj2-yj2)/r5 ) |
712 |
> |
dwidx = ( 4.0d0*xi*zi*rI3 - 6.0d0*xi*zi*(xi2-yi2)*rI5 ) |
713 |
> |
dwidy = ( -4.0d0*yi*zi*rI3 - 6.0d0*yi*zi*(xi2-yi2)*rI5 ) |
714 |
> |
dwidz = ( 2.0d0*(xi2-yi2)*rI3 - 6.0d0*zi2*(xi2-yi2)*rI5 ) |
715 |
|
|
716 |
< |
dwidx = 3.0d0*wi2*( 4.0d0*xi*zi/r3 - 6.0d0*xi*zi*(xi2-yi2)/r5 ) |
717 |
< |
dwidy = 3.0d0*wi2*( -4.0d0*yi*zi/r3 - 6.0d0*yi*zi*(xi2-yi2)/r5 ) |
718 |
< |
dwidz = 3.0d0*wi2*( 2.0d0*(xi2-yi2)/r3 - 6.0d0*zi2*(xi2-yi2)/r5 ) |
716 |
> |
dwidx = frac1*3.0d0*wi2*dwidx + frac2*dwidx |
717 |
> |
dwidy = frac1*3.0d0*wi2*dwidy + frac2*dwidy |
718 |
> |
dwidz = frac1*3.0d0*wi2*dwidz + frac2*dwidz |
719 |
|
|
720 |
< |
dwjdx = 3.0d0*wj2*( 4.0d0*xj*zj/r3 - 6.0d0*xj*zj*(xj2-yj2)/r5 ) |
721 |
< |
dwjdy = 3.0d0*wj2*( -4.0d0*yj*zj/r3 - 6.0d0*yj*zj*(xj2-yj2)/r5 ) |
722 |
< |
dwjdz = 3.0d0*wj2*( 2.0d0*(xj2-yj2)/r3 - 6.0d0*zj2*(xj2-yj2)/r5 ) |
720 |
> |
dwjdx = ( 4.0d0*xj*zj*rI3 - 6.0d0*xj*zj*(xj2-yj2)*rI5 ) |
721 |
> |
dwjdy = ( -4.0d0*yj*zj*rI3 - 6.0d0*yj*zj*(xj2-yj2)*rI5 ) |
722 |
> |
dwjdz = ( 2.0d0*(xj2-yj2)*rI3 - 6.0d0*zj2*(xj2-yj2)*rI5 ) |
723 |
|
|
724 |
+ |
dwjdx = frac1*3.0d0*wj2*dwjdx + frac2*dwjdx |
725 |
+ |
dwjdy = frac1*3.0d0*wj2*dwjdy + frac2*dwjdy |
726 |
+ |
dwjdz = frac1*3.0d0*wj2*dwjdz + frac2*dwjdz |
727 |
+ |
|
728 |
|
uglyi = zif*zif*zis + zif*zis*zis |
729 |
|
uglyj = zjf*zjf*zjs + zjf*zjs*zjs |
730 |
|
|
731 |
< |
dwipdx = -2.0d0*xi*zi*uglyi/r3 |
732 |
< |
dwipdy = -2.0d0*yi*zi*uglyi/r3 |
733 |
< |
dwipdz = 2.0d0*(1.0d0/rij - zi2/r3)*uglyi |
731 |
> |
dwipdx = -2.0d0*xi*zi*uglyi*rI3 |
732 |
> |
dwipdy = -2.0d0*yi*zi*uglyi*rI3 |
733 |
> |
dwipdz = 2.0d0*(rI - zi2*rI3)*uglyi |
734 |
|
|
735 |
< |
dwjpdx = -2.0d0*xj*zj*uglyj/r3 |
736 |
< |
dwjpdy = -2.0d0*yj*zj*uglyj/r3 |
737 |
< |
dwjpdz = 2.0d0*(1.0d0/rij - zj2/r3)*uglyj |
735 |
> |
dwjpdx = -2.0d0*xj*zj*uglyj*rI3 |
736 |
> |
dwjpdy = -2.0d0*yj*zj*uglyj*rI3 |
737 |
> |
dwjpdz = 2.0d0*(rI - zj2*rI3)*uglyj |
738 |
|
|
739 |
< |
! dwidux = 1.5d0*rootwi*( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))/r3 ) |
740 |
< |
! dwiduy = 1.5d0*rootwi*( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))/r3 ) |
741 |
< |
! dwiduz = 1.5d0*rootwi*( -8.0d0*xi*yi*zi/r3 ) |
739 |
> |
!dwipdx = -4.0d0*wip3*zi*xihat |
740 |
> |
!dwipdy = -4.0d0*wip3*zi*yihat |
741 |
> |
!dwipdz = -4.0d0*wip3*(zi2 - 1.0d0)*rI |
742 |
|
|
743 |
< |
! dwjdux = 1.5d0*rootwj*( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))/r3 ) |
744 |
< |
! dwjduy = 1.5d0*rootwj*( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))/r3 ) |
745 |
< |
! dwjduz = 1.5d0*rootwj*( -8.0d0*xj*yj*zj/r3 ) |
743 |
> |
!dwjpdx = -4.0d0*wjp3*zj*xjhat |
744 |
> |
!dwjpdy = -4.0d0*wjp3*zj*yjhat |
745 |
> |
!dwjpdz = -4.0d0*wjp3*(zj2 - 1.0d0)*rI |
746 |
|
|
747 |
< |
dwidux = 3.0d0*wi2*( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))/r3 ) |
748 |
< |
dwiduy = 3.0d0*wi2*( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))/r3 ) |
749 |
< |
dwiduz = 3.0d0*wi2*( -8.0d0*xi*yi*zi/r3 ) |
747 |
> |
!dwipdx = 0.0d0 |
748 |
> |
!dwipdy = 0.0d0 |
749 |
> |
!dwipdz = 0.0d0 |
750 |
|
|
751 |
< |
dwjdux = 3.0d0*wj2*( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))/r3 ) |
752 |
< |
dwjduy = 3.0d0*wj2*( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))/r3 ) |
753 |
< |
dwjduz = 3.0d0*wj2*( -8.0d0*xj*yj*zj/r3 ) |
751 |
> |
!dwjpdx = 0.0d0 |
752 |
> |
!dwjpdy = 0.0d0 |
753 |
> |
!dwjpdz = 0.0d0 |
754 |
> |
|
755 |
> |
dwidux = ( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))*rI3 ) |
756 |
> |
dwiduy = ( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))*rI3 ) |
757 |
> |
dwiduz = ( -8.0d0*xi*yi*zi*rI3 ) |
758 |
|
|
759 |
< |
dwipdux = 2.0d0*yi*uglyi/rij |
760 |
< |
dwipduy = -2.0d0*xi*uglyi/rij |
759 |
> |
dwidux = frac1*3.0d0*wi2*dwidux + frac2*dwidux |
760 |
> |
dwiduy = frac1*3.0d0*wi2*dwiduy + frac2*dwiduy |
761 |
> |
dwiduz = frac1*3.0d0*wi2*dwiduz + frac2*dwiduz |
762 |
> |
|
763 |
> |
dwjdux = ( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))*rI3 ) |
764 |
> |
dwjduy = ( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))*rI3 ) |
765 |
> |
dwjduz = ( -8.0d0*xj*yj*zj*rI3 ) |
766 |
> |
|
767 |
> |
dwjdux = frac1*3.0d0*wj2*dwjdux + frac2*dwjdux |
768 |
> |
dwjduy = frac1*3.0d0*wj2*dwjduy + frac2*dwjduy |
769 |
> |
dwjduz = frac1*3.0d0*wj2*dwjduz + frac2*dwjduz |
770 |
> |
|
771 |
> |
dwipdux = 2.0d0*yi*uglyi*rI |
772 |
> |
dwipduy = -2.0d0*xi*uglyi*rI |
773 |
|
dwipduz = 0.0d0 |
774 |
|
|
775 |
< |
dwjpdux = 2.0d0*yj*uglyj/rij |
776 |
< |
dwjpduy = -2.0d0*xj*uglyj/rij |
775 |
> |
dwjpdux = 2.0d0*yj*uglyj*rI |
776 |
> |
dwjpduy = -2.0d0*xj*uglyj*rI |
777 |
|
dwjpduz = 0.0d0 |
778 |
|
|
779 |
+ |
!dwipdux = 4.0d0*wip3*yihat |
780 |
+ |
!dwipduy = -4.0d0*wip3*xihat |
781 |
+ |
!dwipduz = 0.0d0 |
782 |
+ |
|
783 |
+ |
!dwjpdux = 4.0d0*wjp3*yjhat |
784 |
+ |
!dwjpduy = -4.0d0*wjp3*xjhat |
785 |
+ |
!dwjpduz = 0.0d0 |
786 |
+ |
|
787 |
+ |
!dwipdux = 0.0d0 |
788 |
+ |
!dwipduy = 0.0d0 |
789 |
+ |
!dwipduz = 0.0d0 |
790 |
+ |
|
791 |
+ |
!dwjpdux = 0.0d0 |
792 |
+ |
!dwjpduy = 0.0d0 |
793 |
+ |
!dwjpduz = 0.0d0 |
794 |
+ |
|
795 |
|
! do the torques first since they are easy: |
796 |
|
! remember that these are still in the body fixed axes |
797 |
|
|
892 |
|
|
893 |
|
! now assemble these with the radial-only terms: |
894 |
|
|
895 |
< |
fxradial = 0.5d0*(v0*dsdr*drdx*w + v0p*dspdr*drdx*wp + fxii + fxji) |
896 |
< |
fyradial = 0.5d0*(v0*dsdr*drdy*w + v0p*dspdr*drdy*wp + fyii + fyji) |
897 |
< |
fzradial = 0.5d0*(v0*dsdr*drdz*w + v0p*dspdr*drdz*wp + fzii + fzji) |
895 |
> |
fxradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdx + fxii + fxji) |
896 |
> |
fyradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdy + fyii + fyji) |
897 |
> |
fzradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdz + fzii + fzji) |
898 |
|
|
899 |
|
#ifdef IS_MPI |
900 |
|
f_Row(1,atom1) = f_Row(1,atom1) + fxradial |