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 2220 by chrisfen, Thu May 5 14:47:35 2005 UTC vs.
Revision 2717 by gezelter, Mon Apr 17 21:49:12 2006 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.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.18 2006-04-17 21:49:12 gezelter Exp $, $Date: 2006-04-17 21:49:12 $, $Name: not supported by cvs2svn $, $Revision: 1.18 $
54  
55   module sticky
56  
# Line 66 | Line 66 | module sticky
66    implicit none
67  
68    PRIVATE
69 + #define __FORTRAN90
70 + #include "UseTheForce/DarkSide/fInteractionMap.h"
71  
72    public :: newStickyType
73    public :: do_sticky_pair
74    public :: destroyStickyTypes
75    public :: do_sticky_power_pair
76 +  public :: getStickyCut
77 +  public :: getStickyPowerCut
78  
75
79    type :: StickyList
80       integer :: c_ident
81       real( kind = dp ) :: w0 = 0.0_dp
# Line 86 | Line 89 | module sticky
89    end type StickyList
90  
91    type(StickyList), dimension(:),allocatable :: StickyMap
92 +  logical, save :: hasStickyMap = .false.
93  
94   contains
95  
# Line 145 | Line 149 | contains
149         StickyMap(myATID)%rbig = StickyMap(myATID)%rup
150      endif
151  
152 +    hasStickyMap = .true.
153 +
154      return
155    end subroutine newStickyType
156 +
157 +  function getStickyCut(atomID) result(cutValue)
158 +    integer, intent(in) :: atomID
159 +    real(kind=dp) :: cutValue
160 +
161 +    cutValue = StickyMap(atomID)%rbig
162 +  end function getStickyCut
163  
164 +  function getStickyPowerCut(atomID) result(cutValue)
165 +    integer, intent(in) :: atomID
166 +    real(kind=dp) :: cutValue
167 +
168 +    cutValue = StickyMap(atomID)%rbig
169 +  end function getStickyPowerCut
170 +
171    subroutine do_sticky_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
172         pot, A, f, t, do_pot)
173  
# Line 190 | Line 210 | contains
210      integer :: me1, me2
211      real (kind=dp) :: w0, v0, v0p, rl, ru, rlp, rup, rbig
212  
193    if (.not.allocated(StickyMap)) then
194       call handleError("sticky", "no StickyMap was present before first call of do_sticky_pair!")
195       return
196    end if
197
213   #ifdef IS_MPI
214      me1 = atid_Row(atom1)
215      me2 = atid_Col(atom2)
# Line 291 | Line 306 | contains
306         vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp)
307         if (do_pot) then
308   #ifdef IS_MPI
309 <          pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
310 <          pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
309 >          pot_row(HB_POT,atom1) = pot_row(HB_POT,atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
310 >          pot_col(HB_POT,atom2) = pot_col(HB_POT,atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
311   #else
312            pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw
313   #endif  
# Line 512 | Line 527 | contains
527      if(allocated(StickyMap)) deallocate(StickyMap)
528    end subroutine destroyStickyTypes
529    
530 <    subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
530 >  subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
531         pot, A, f, t, do_pot)
532      !! We assume that the rotation matrices have already been calculated
533      !! and placed in the A array.
534 <
534 >    
535      !! i and j are pointers to the two SSD atoms
536 <
536 >    
537      integer, intent(in) :: atom1, atom2
538      real (kind=dp), intent(inout) :: rij, r2
539      real (kind=dp), dimension(3), intent(in) :: d
# Line 530 | Line 545 | contains
545      logical, intent(in) :: do_pot
546  
547      real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2
548 <    real (kind=dp) :: r3, r5, r6, s, sp, dsdr, dspdr
549 <    real (kind=dp) :: wi, wj, w, wip, wjp, wp, wi2, wj2
548 >    real (kind=dp) :: xihat, yihat, zihat, xjhat, yjhat, zjhat
549 >    real (kind=dp) :: rI, rI2, rI3, rI4, rI5, rI6, rI7, s, sp, dsdr, dspdr
550 >    real (kind=dp) :: wi, wj, w, wi2, wj2, eScale, v0scale
551      real (kind=dp) :: dwidx, dwidy, dwidz, dwjdx, dwjdy, dwjdz
536    real (kind=dp) :: dwipdx, dwipdy, dwipdz, dwjpdx, dwjpdy, dwjpdz
552      real (kind=dp) :: dwidux, dwiduy, dwiduz, dwjdux, dwjduy, dwjduz
538    real (kind=dp) :: dwipdux, dwipduy, dwipduz, dwjpdux, dwjpduy, dwjpduz
539    real (kind=dp) :: zif, zis, zjf, zjs, uglyi, uglyj
553      real (kind=dp) :: drdx, drdy, drdz
554      real (kind=dp) :: txi, tyi, tzi, txj, tyj, tzj
555      real (kind=dp) :: fxii, fyii, fzii, fxjj, fyjj, fzjj
# Line 548 | Line 561 | contains
561      integer :: id1, id2
562      integer :: me1, me2
563      real (kind=dp) :: w0, v0, v0p, rl, ru, rlp, rup, rbig
564 <
564 >    real (kind=dp) :: zi3, zi4, zi5, zj3, zj4, zj5
565 >    real (kind=dp) :: frac1, frac2
566 >          
567      if (.not.allocated(StickyMap)) then
568         call handleError("sticky", "no StickyMap was present before first call of do_sticky_power_pair!")
569         return
# Line 588 | Line 603 | contains
603  
604      if ( rij .LE. rbig ) then
605  
606 <       r3 = r2*rij
607 <       r5 = r3*r2
608 <
609 <       drdx = d(1) / rij
610 <       drdy = d(2) / rij
611 <       drdz = d(3) / rij
606 >       rI = 1.0d0/rij
607 >       rI2 = rI*rI
608 >       rI3 = rI2*rI
609 >       rI4 = rI2*rI2
610 >       rI5 = rI3*rI2
611 >       rI6 = rI3*rI3
612 >       rI7 = rI4*rI3
613 >              
614 >       drdx = d(1) * rI
615 >       drdy = d(2) * rI
616 >       drdz = d(3) * rI
617  
618   #ifdef IS_MPI
619         ! rotate the inter-particle separation into the two different
# Line 626 | Line 646 | contains
646         xi2 = xi*xi
647         yi2 = yi*yi
648         zi2 = zi*zi
649 <
649 >       zi3 = zi2*zi
650 >       zi4 = zi2*zi2
651 >       zi5 = zi3*zi2
652 >       xihat = xi*rI
653 >       yihat = yi*rI
654 >       zihat = zi*rI
655 >      
656         xj2 = xj*xj
657         yj2 = yj*yj
658         zj2 = zj*zj
659 <
659 >       zj3 = zj2*zj
660 >       zj4 = zj2*zj2
661 >       zj5 = zj3*zj2
662 >       xjhat = xj*rI
663 >       yjhat = yj*rI
664 >       zjhat = zj*rI
665 >      
666         call calc_sw_fnc(rij, rl, ru, rlp, rup, s, sp, dsdr, dspdr)
667 <
668 <       wi = 2.0d0*(xi2-yi2)*zi / r3
669 <       wj = 2.0d0*(xj2-yj2)*zj / r3
670 <       !rootwi = sqrt(abs(wi))
671 <       !rootwj = sqrt(abs(wj))
667 >          
668 >       frac1 = 0.25d0
669 >       frac2 = 0.75d0
670 >      
671 >       wi = 2.0d0*(xi2-yi2)*zi*rI3
672 >       wj = 2.0d0*(xj2-yj2)*zj*rI3
673 >      
674         wi2 = wi*wi
675         wj2 = wj*wj
676  
677 <      
644 <       w = wi*wi2+wj*wj2
677 >       w = frac1*wi*wi2 + frac2*wi + frac1*wj*wj2 + frac2*wj + v0p
678  
679 <       zif = zi/rij - 0.6d0
680 <       zis = zi/rij + 0.8d0
648 <
649 <       zjf = zj/rij - 0.6d0
650 <       zjs = zj/rij + 0.8d0
651 <
652 <       wip = zif*zif*zis*zis - w0
653 <       wjp = zjf*zjf*zjs*zjs - w0
654 <       wp = wip + wjp
655 <
656 <       vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp)
679 >       vpair = vpair + 0.5d0*(v0*s*w)
680 >      
681         if (do_pot) then
682   #ifdef IS_MPI
683 <          pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
684 <          pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
683 >         pot_row(HB_POT,atom1) = pot_row(HB_POT,atom1) + 0.25d0*(v0*s*w)*sw
684 >         pot_col(HB_POT,atom2) = pot_col(HB_POT,atom2) + 0.25d0*(v0*s*w)*sw
685   #else
686 <          pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw
686 >         pot = pot + 0.5d0*(v0*s*w)*sw
687   #endif  
688         endif
689  
690 < !       dwidx = 1.5d0*rootwi*( 4.0d0*xi*zi/r3 - 6.0d0*xi*zi*(xi2-yi2)/r5 )
691 < !       dwidy = 1.5d0*rootwi*( -4.0d0*yi*zi/r3 - 6.0d0*yi*zi*(xi2-yi2)/r5 )
692 < !       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 )
690 >       dwidx = ( 4.0d0*xi*zi*rI3 - 6.0d0*xi*zi*(xi2-yi2)*rI5 )
691 >       dwidy = ( -4.0d0*yi*zi*rI3 - 6.0d0*yi*zi*(xi2-yi2)*rI5 )
692 >       dwidz = ( 2.0d0*(xi2-yi2)*rI3 - 6.0d0*zi2*(xi2-yi2)*rI5 )
693        
694 <       dwidx = 3.0d0*wi2*( 4.0d0*xi*zi/r3 - 6.0d0*xi*zi*(xi2-yi2)/r5 )
695 <       dwidy = 3.0d0*wi2*( -4.0d0*yi*zi/r3 - 6.0d0*yi*zi*(xi2-yi2)/r5 )
696 <       dwidz = 3.0d0*wi2*( 2.0d0*(xi2-yi2)/r3 - 6.0d0*zi2*(xi2-yi2)/r5 )
694 >       dwidx = frac1*3.0d0*wi2*dwidx + frac2*dwidx
695 >       dwidy = frac1*3.0d0*wi2*dwidy + frac2*dwidy
696 >       dwidz = frac1*3.0d0*wi2*dwidz + frac2*dwidz
697  
698 <       dwjdx = 3.0d0*wj2*( 4.0d0*xj*zj/r3  - 6.0d0*xj*zj*(xj2-yj2)/r5 )
699 <       dwjdy = 3.0d0*wj2*( -4.0d0*yj*zj/r3  - 6.0d0*yj*zj*(xj2-yj2)/r5 )
700 <       dwjdz = 3.0d0*wj2*( 2.0d0*(xj2-yj2)/r3  - 6.0d0*zj2*(xj2-yj2)/r5 )
698 >       dwjdx = ( 4.0d0*xj*zj*rI3  - 6.0d0*xj*zj*(xj2-yj2)*rI5 )
699 >       dwjdy = ( -4.0d0*yj*zj*rI3  - 6.0d0*yj*zj*(xj2-yj2)*rI5 )
700 >       dwjdz = ( 2.0d0*(xj2-yj2)*rI3  - 6.0d0*zj2*(xj2-yj2)*rI5 )
701  
702 <       uglyi = zif*zif*zis + zif*zis*zis
703 <       uglyj = zjf*zjf*zjs + zjf*zjs*zjs
704 <
685 <       dwipdx = -2.0d0*xi*zi*uglyi/r3
686 <       dwipdy = -2.0d0*yi*zi*uglyi/r3
687 <       dwipdz = 2.0d0*(1.0d0/rij - zi2/r3)*uglyi
688 <
689 <       dwjpdx = -2.0d0*xj*zj*uglyj/r3
690 <       dwjpdy = -2.0d0*yj*zj*uglyj/r3
691 <       dwjpdz = 2.0d0*(1.0d0/rij - zj2/r3)*uglyj
692 <
693 < !       dwidux = 1.5d0*rootwi*( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))/r3 )
694 < !       dwiduy = 1.5d0*rootwi*( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))/r3 )
695 < !       dwiduz = 1.5d0*rootwi*( -8.0d0*xi*yi*zi/r3 )
696 <
697 < !       dwjdux = 1.5d0*rootwj*( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))/r3 )
698 < !       dwjduy = 1.5d0*rootwj*( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))/r3 )
699 < !       dwjduz = 1.5d0*rootwj*( -8.0d0*xj*yj*zj/r3 )
702 >       dwjdx = frac1*3.0d0*wj2*dwjdx + frac2*dwjdx
703 >       dwjdy = frac1*3.0d0*wj2*dwjdy + frac2*dwjdy
704 >       dwjdz = frac1*3.0d0*wj2*dwjdz + frac2*dwjdz
705        
706 <       dwidux = 3.0d0*wi2*( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))/r3 )
707 <       dwiduy = 3.0d0*wi2*( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))/r3 )
708 <       dwiduz = 3.0d0*wi2*( -8.0d0*xi*yi*zi/r3 )
706 >       dwidux = ( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))*rI3 )
707 >       dwiduy = ( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))*rI3 )
708 >       dwiduz = ( -8.0d0*xi*yi*zi*rI3 )
709  
710 <       dwjdux = 3.0d0*wj2*( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))/r3 )
711 <       dwjduy = 3.0d0*wj2*( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))/r3 )
712 <       dwjduz = 3.0d0*wj2*( -8.0d0*xj*yj*zj/r3 )
710 >       dwidux = frac1*3.0d0*wi2*dwidux + frac2*dwidux
711 >       dwiduy = frac1*3.0d0*wi2*dwiduy + frac2*dwiduy
712 >       dwiduz = frac1*3.0d0*wi2*dwiduz + frac2*dwiduz
713  
714 <       dwipdux =  2.0d0*yi*uglyi/rij
715 <       dwipduy = -2.0d0*xi*uglyi/rij
716 <       dwipduz =  0.0d0
714 >       dwjdux = ( 4.0d0*(yj*zj2 + 0.5d0*yj*(xj2-yj2))*rI3 )
715 >       dwjduy = ( 4.0d0*(xj*zj2 - 0.5d0*xj*(xj2-yj2))*rI3 )
716 >       dwjduz = ( -8.0d0*xj*yj*zj*rI3 )
717  
718 <       dwjpdux =  2.0d0*yj*uglyj/rij
719 <       dwjpduy = -2.0d0*xj*uglyj/rij
720 <       dwjpduz =  0.0d0
718 >       dwjdux = frac1*3.0d0*wj2*dwjdux + frac2*dwjdux
719 >       dwjduy = frac1*3.0d0*wj2*dwjduy + frac2*dwjduy
720 >       dwjduz = frac1*3.0d0*wj2*dwjduz + frac2*dwjduz
721  
722         ! do the torques first since they are easy:
723         ! remember that these are still in the body fixed axes
724  
725 <       txi = 0.5d0*(v0*s*dwidux + v0p*sp*dwipdux)*sw
726 <       tyi = 0.5d0*(v0*s*dwiduy + v0p*sp*dwipduy)*sw
727 <       tzi = 0.5d0*(v0*s*dwiduz + v0p*sp*dwipduz)*sw
725 >       txi = 0.5d0*(v0*s*dwidux)*sw
726 >       tyi = 0.5d0*(v0*s*dwiduy)*sw
727 >       tzi = 0.5d0*(v0*s*dwiduz)*sw
728  
729 <       txj = 0.5d0*(v0*s*dwjdux + v0p*sp*dwjpdux)*sw
730 <       tyj = 0.5d0*(v0*s*dwjduy + v0p*sp*dwjpduy)*sw
731 <       tzj = 0.5d0*(v0*s*dwjduz + v0p*sp*dwjpduz)*sw
729 >       txj = 0.5d0*(v0*s*dwjdux)*sw
730 >       tyj = 0.5d0*(v0*s*dwjduy)*sw
731 >       tzj = 0.5d0*(v0*s*dwjduz)*sw
732  
733         ! go back to lab frame using transpose of rotation matrix:
734  
# Line 754 | Line 759 | contains
759  
760         ! first rotate the i terms back into the lab frame:
761  
762 <       radcomxi = (v0*s*dwidx+v0p*sp*dwipdx)*sw
763 <       radcomyi = (v0*s*dwidy+v0p*sp*dwipdy)*sw
764 <       radcomzi = (v0*s*dwidz+v0p*sp*dwipdz)*sw
762 >       radcomxi = (v0*s*dwidx)*sw
763 >       radcomyi = (v0*s*dwidy)*sw
764 >       radcomzi = (v0*s*dwidz)*sw
765  
766 <       radcomxj = (v0*s*dwjdx+v0p*sp*dwjpdx)*sw
767 <       radcomyj = (v0*s*dwjdy+v0p*sp*dwjpdy)*sw
768 <       radcomzj = (v0*s*dwjdz+v0p*sp*dwjpdz)*sw
766 >       radcomxj = (v0*s*dwjdx)*sw
767 >       radcomyj = (v0*s*dwjdy)*sw
768 >       radcomzj = (v0*s*dwjdz)*sw
769  
770   #ifdef IS_MPI    
771         fxii = a_Row(1,atom1)*(radcomxi) + &
# Line 814 | Line 819 | contains
819  
820         ! now assemble these with the radial-only terms:
821  
822 <       fxradial = 0.5d0*(v0*dsdr*drdx*w + v0p*dspdr*drdx*wp + fxii + fxji)
823 <       fyradial = 0.5d0*(v0*dsdr*drdy*w + v0p*dspdr*drdy*wp + fyii + fyji)
824 <       fzradial = 0.5d0*(v0*dsdr*drdz*w + v0p*dspdr*drdz*wp + fzii + fzji)
822 >       fxradial = 0.5d0*(v0*dsdr*w*drdx + fxii + fxji)
823 >       fyradial = 0.5d0*(v0*dsdr*w*drdy + fyii + fyji)
824 >       fzradial = 0.5d0*(v0*dsdr*w*drdz + fzii + fzji)
825  
826   #ifdef IS_MPI
827         f_Row(1,atom1) = f_Row(1,atom1) + fxradial

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines