ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/DarkSide/sticky.F90
(Generate patch)

Comparing trunk/OOPSE-4/src/UseTheForce/DarkSide/sticky.F90 (file contents):
Revision 2224 by chrisfen, Thu May 12 19:43:48 2005 UTC vs.
Revision 2251 by chrisfen, Sun May 29 21:16:25 2005 UTC

# Line 50 | Line 50
50   !! @author Matthew Meineke
51   !! @author Christopher Fennell
52   !! @author J. Daniel Gezelter
53 < !! @version $Id: sticky.F90,v 1.9 2005-05-12 19:43:48 chrisfen Exp $, $Date: 2005-05-12 19:43:48 $, $Name: not supported by cvs2svn $, $Revision: 1.9 $
53 > !! @version $Id: sticky.F90,v 1.13 2005-05-29 21:16:25 chrisfen Exp $, $Date: 2005-05-29 21:16:25 $, $Name: not supported by cvs2svn $, $Revision: 1.13 $
54  
55   module sticky
56  
# Line 512 | Line 512 | contains
512      if(allocated(StickyMap)) deallocate(StickyMap)
513    end subroutine destroyStickyTypes
514    
515 <    subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
515 >  subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
516         pot, A, f, t, do_pot)
517      !! We assume that the rotation matrices have already been calculated
518      !! and placed in the A array.
519 <
519 >    
520      !! i and j are pointers to the two SSD atoms
521 <
521 >    
522      integer, intent(in) :: atom1, atom2
523      real (kind=dp), intent(inout) :: rij, r2
524      real (kind=dp), dimension(3), intent(in) :: d
# Line 532 | Line 532 | contains
532      real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2
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
535 >    real (kind=dp) :: wi, wj, w, wi2, wj2, eScale, v0scale
536      real (kind=dp) :: dwidx, dwidy, dwidz, dwjdx, dwjdy, dwjdz
537    real (kind=dp) :: dwipdx, dwipdy, dwipdz, dwjpdx, dwjpdy, dwjpdz
537      real (kind=dp) :: dwidux, dwiduy, dwiduz, dwjdux, dwjduy, dwjduz
539    real (kind=dp) :: dwipdux, dwipduy, dwipduz, dwjpdux, dwjpduy, dwjpduz
540    real (kind=dp) :: zif, zis, zjf, zjs, uglyi, uglyj
538      real (kind=dp) :: drdx, drdy, drdz
539      real (kind=dp) :: txi, tyi, tzi, txj, tyj, tzj
540      real (kind=dp) :: fxii, fyii, fzii, fxjj, fyjj, fzjj
# Line 550 | Line 547 | contains
547      integer :: me1, me2
548      real (kind=dp) :: w0, v0, v0p, rl, ru, rlp, rup, rbig
549      real (kind=dp) :: zi3, zi4, zi5, zj3, zj4, zj5
550 <    real (kind=dp) :: oSw1, oSw2, prodVal
551 <    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 <    
550 >    real (kind=dp) :: frac1, frac2
551 >          
552      if (.not.allocated(StickyMap)) then
553         call handleError("sticky", "no StickyMap was present before first call of do_sticky_power_pair!")
554         return
# Line 608 | Line 594 | contains
594         rI4 = rI2*rI2
595         rI5 = rI3*rI2
596         rI6 = rI3*rI3
597 <       rI7 = rI5*rI2
597 >       rI7 = rI4*rI3
598                
599         drdx = d(1) * rI
600         drdy = d(2) * rI
# Line 647 | Line 633 | contains
633         zi2 = zi*zi
634         zi3 = zi2*zi
635         zi4 = zi2*zi2
636 <       zi5 = zi4*zi
636 >       zi5 = zi3*zi2
637         xihat = xi*rI
638         yihat = yi*rI
639         zihat = zi*rI
# Line 657 | Line 643 | contains
643         zj2 = zj*zj
644         zj3 = zj2*zj
645         zj4 = zj2*zj2
646 <       zj5 = zj4*zj
646 >       zj5 = zj3*zj2
647         xjhat = xj*rI
648         yjhat = yj*rI
649         zjhat = zj*rI
650        
651         call calc_sw_fnc(rij, rl, ru, rlp, rup, s, sp, dsdr, dspdr)
652            
653 <       wi = 2.0d0*(xi2-yi2)*zi * rI3
654 <       wj = 2.0d0*(xj2-yj2)*zj * rI3
653 >       frac1 = 0.25d0
654 >       frac2 = 0.75d0
655        
656 < !       prodVal = zihat*zjhat
657 < !       if (prodVal .ge. 0.0d0) then
658 < !         wi = 0.0d0
673 < !         wj = 0.0d0
674 < !       endif
675 <
656 >       wi = 2.0d0*(xi2-yi2)*zi*rI3
657 >       wj = 2.0d0*(xj2-yj2)*zj*rI3
658 >      
659         wi2 = wi*wi
660         wj2 = wj*wj
661  
662 <       w = wi*wi2+wj*wj2
662 >       w = frac1*wi*wi2 + frac2*wi + frac1*wj*wj2 + frac2*wj + v0p
663  
664 <       zif = zihat - 0.6d0
682 <       zis = zihat + 0.8d0
683 <
684 <       zjf = zjhat - 0.6d0
685 <       zjs = zjhat + 0.8d0
686 <
687 <       wip = zif*zif*zis*zis - w0
688 <       wjp = zjf*zjf*zjs*zjs - w0
689 <       wp = wip + wjp
690 <        
691 <       !wip = zihat - 0.2d0
692 <       !wjp = zjhat - 0.2d0
693 <       !wip3 = wip*wip*wip
694 <       !wjp3 = wjp*wjp*wjp
664 >       vpair = vpair + 0.5d0*(v0*s*w)
665        
696       !wp = wip3*wip + wjp3*wjp
697
698       vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp)
699      
666         if (do_pot) then
667   #ifdef IS_MPI
668 <         pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
669 <         pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
668 >         pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w)*sw
669 >         pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w)*sw
670   #else
671 <         pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw
671 >         pot = pot + 0.5d0*(v0*s*w)*sw
672   #endif  
673         endif
674  
675 <       dwidx = 3.0d0*wi2*( 4.0d0*xi*zi*rI3 - 6.0d0*xi*zi*(xi2-yi2)*rI5 )
676 <       dwidy = 3.0d0*wi2*( -4.0d0*yi*zi*rI3 - 6.0d0*yi*zi*(xi2-yi2)*rI5 )
677 <       dwidz = 3.0d0*wi2*( 2.0d0*(xi2-yi2)*rI3 - 6.0d0*zi2*(xi2-yi2)*rI5 )
675 >       dwidx = ( 4.0d0*xi*zi*rI3 - 6.0d0*xi*zi*(xi2-yi2)*rI5 )
676 >       dwidy = ( -4.0d0*yi*zi*rI3 - 6.0d0*yi*zi*(xi2-yi2)*rI5 )
677 >       dwidz = ( 2.0d0*(xi2-yi2)*rI3 - 6.0d0*zi2*(xi2-yi2)*rI5 )
678 >      
679 >       dwidx = frac1*3.0d0*wi2*dwidx + frac2*dwidx
680 >       dwidy = frac1*3.0d0*wi2*dwidy + frac2*dwidy
681 >       dwidz = frac1*3.0d0*wi2*dwidz + frac2*dwidz
682  
683 <       dwjdx = 3.0d0*wj2*( 4.0d0*xj*zj*rI3  - 6.0d0*xj*zj*(xj2-yj2)*rI5 )
684 <       dwjdy = 3.0d0*wj2*( -4.0d0*yj*zj*rI3  - 6.0d0*yj*zj*(xj2-yj2)*rI5 )
685 <       dwjdz = 3.0d0*wj2*( 2.0d0*(xj2-yj2)*rI3  - 6.0d0*zj2*(xj2-yj2)*rI5 )
683 >       dwjdx = ( 4.0d0*xj*zj*rI3  - 6.0d0*xj*zj*(xj2-yj2)*rI5 )
684 >       dwjdy = ( -4.0d0*yj*zj*rI3  - 6.0d0*yj*zj*(xj2-yj2)*rI5 )
685 >       dwjdz = ( 2.0d0*(xj2-yj2)*rI3  - 6.0d0*zj2*(xj2-yj2)*rI5 )
686  
687 <       uglyi = zif*zif*zis + zif*zis*zis
688 <       uglyj = zjf*zjf*zjs + zjf*zjs*zjs
689 <
720 <       dwipdx = -2.0d0*xi*zi*uglyi*rI3
721 <       dwipdy = -2.0d0*yi*zi*uglyi*rI3
722 <       dwipdz = 2.0d0*(rI - zi2*rI3)*uglyi
723 <
724 <       dwjpdx = -2.0d0*xj*zj*uglyj*rI3
725 <       dwjpdy = -2.0d0*yj*zj*uglyj*rI3
726 <       dwjpdz = 2.0d0*(rI - zj2*rI3)*uglyj
727 <
728 <       !dwipdx = -4.0d0*wip3*zi*xihat
729 <       !dwipdy = -4.0d0*wip3*zi*yihat
730 <       !dwipdz = -4.0d0*wip3*(zi2 - 1.0d0)*rI
731 <
732 <       !dwjpdx = -4.0d0*wjp3*zj*xjhat
733 <       !dwjpdy = -4.0d0*wjp3*zj*yjhat
734 <       !dwjpdz = -4.0d0*wjp3*(zj2 - 1.0d0)*rI
687 >       dwjdx = frac1*3.0d0*wj2*dwjdx + frac2*dwjdx
688 >       dwjdy = frac1*3.0d0*wj2*dwjdy + frac2*dwjdy
689 >       dwjdz = frac1*3.0d0*wj2*dwjdz + frac2*dwjdz
690        
691 <       !dwipdx = 0.0d0
692 <       !dwipdy = 0.0d0
693 <       !dwipdz = 0.0d0
691 >       dwidux = ( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))*rI3 )
692 >       dwiduy = ( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))*rI3 )
693 >       dwiduz = ( -8.0d0*xi*yi*zi*rI3 )
694  
695 <       !dwjpdx = 0.0d0
696 <       !dwjpdy = 0.0d0
697 <       !dwjpdz = 0.0d0
743 <      
744 <       dwidux = 3.0d0*wi2*( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))*rI3 )
745 <       dwiduy = 3.0d0*wi2*( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))*rI3 )
746 <       dwiduz = 3.0d0*wi2*( -8.0d0*xi*yi*zi*rI3 )
695 >       dwidux = frac1*3.0d0*wi2*dwidux + frac2*dwidux
696 >       dwiduy = frac1*3.0d0*wi2*dwiduy + frac2*dwiduy
697 >       dwiduz = frac1*3.0d0*wi2*dwiduz + frac2*dwiduz
698  
699 <       dwjdux = 3.0d0*wj2*( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))*rI3 )
700 <       dwjduy = 3.0d0*wj2*( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))*rI3 )
701 <       dwjduz = 3.0d0*wj2*( -8.0d0*xj*yj*zj*rI3 )
699 >       dwjdux = ( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))*rI3 )
700 >       dwjduy = ( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))*rI3 )
701 >       dwjduz = ( -8.0d0*xj*yj*zj*rI3 )
702  
703 <       dwipdux =  2.0d0*yi*uglyi*rI
704 <       dwipduy = -2.0d0*xi*uglyi*rI
705 <       dwipduz =  0.0d0
703 >       dwjdux = frac1*3.0d0*wj2*dwjdux + frac2*dwjdux
704 >       dwjduy = frac1*3.0d0*wj2*dwjduy + frac2*dwjduy
705 >       dwjduz = frac1*3.0d0*wj2*dwjduz + frac2*dwjduz
706  
756       dwjpdux =  2.0d0*yj*uglyj*rI
757       dwjpduy = -2.0d0*xj*uglyj*rI
758       dwjpduz =  0.0d0
759
760       !dwipdux =  4.0d0*wip3*yihat
761       !dwipduy = -4.0d0*wip3*xihat
762       !dwipduz =  0.0d0
763
764       !dwjpdux =  4.0d0*wjp3*yjhat
765       !dwjpduy = -4.0d0*wjp3*xjhat
766       !dwjpduz =  0.0d0
767
768       !dwipdux = 0.0d0
769       !dwipduy = 0.0d0
770       !dwipduz = 0.0d0
771
772       !dwjpdux = 0.0d0
773       !dwjpduy = 0.0d0
774       !dwjpduz = 0.0d0
775      
707         ! do the torques first since they are easy:
708         ! remember that these are still in the body fixed axes
709  
710 <       txi = 0.5d0*(v0*s*dwidux + v0p*sp*dwipdux)*sw
711 <       tyi = 0.5d0*(v0*s*dwiduy + v0p*sp*dwipduy)*sw
712 <       tzi = 0.5d0*(v0*s*dwiduz + v0p*sp*dwipduz)*sw
710 >       txi = 0.5d0*(v0*s*dwidux)*sw
711 >       tyi = 0.5d0*(v0*s*dwiduy)*sw
712 >       tzi = 0.5d0*(v0*s*dwiduz)*sw
713  
714 <       txj = 0.5d0*(v0*s*dwjdux + v0p*sp*dwjpdux)*sw
715 <       tyj = 0.5d0*(v0*s*dwjduy + v0p*sp*dwjpduy)*sw
716 <       tzj = 0.5d0*(v0*s*dwjduz + v0p*sp*dwjpduz)*sw
714 >       txj = 0.5d0*(v0*s*dwjdux)*sw
715 >       tyj = 0.5d0*(v0*s*dwjduy)*sw
716 >       tzj = 0.5d0*(v0*s*dwjduz)*sw
717  
718         ! go back to lab frame using transpose of rotation matrix:
719  
# Line 813 | Line 744 | contains
744  
745         ! first rotate the i terms back into the lab frame:
746  
747 <       radcomxi = (v0*s*dwidx+v0p*sp*dwipdx)*sw
748 <       radcomyi = (v0*s*dwidy+v0p*sp*dwipdy)*sw
749 <       radcomzi = (v0*s*dwidz+v0p*sp*dwipdz)*sw
747 >       radcomxi = (v0*s*dwidx)*sw
748 >       radcomyi = (v0*s*dwidy)*sw
749 >       radcomzi = (v0*s*dwidz)*sw
750  
751 <       radcomxj = (v0*s*dwjdx+v0p*sp*dwjpdx)*sw
752 <       radcomyj = (v0*s*dwjdy+v0p*sp*dwjpdy)*sw
753 <       radcomzj = (v0*s*dwjdz+v0p*sp*dwjpdz)*sw
751 >       radcomxj = (v0*s*dwjdx)*sw
752 >       radcomyj = (v0*s*dwjdy)*sw
753 >       radcomzj = (v0*s*dwjdz)*sw
754  
755   #ifdef IS_MPI    
756         fxii = a_Row(1,atom1)*(radcomxi) + &
# Line 873 | Line 804 | contains
804  
805         ! now assemble these with the radial-only terms:
806  
807 <       fxradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdx + fxii + fxji)
808 <       fyradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdy + fyii + fyji)
809 <       fzradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdz + fzii + fzji)
807 >       fxradial = 0.5d0*(v0*dsdr*w*drdx + fxii + fxji)
808 >       fyradial = 0.5d0*(v0*dsdr*w*drdy + fyii + fyji)
809 >       fzradial = 0.5d0*(v0*dsdr*w*drdz + fzii + fzji)
810  
811   #ifdef IS_MPI
812         f_Row(1,atom1) = f_Row(1,atom1) + fxradial

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines