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 2229 by chrisfen, Tue May 17 22:35:01 2005 UTC vs.
Revision 2355 by chuckv, Wed Oct 12 18:59:16 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.10 2005-05-17 22:35:01 chrisfen Exp $, $Date: 2005-05-17 22:35:01 $, $Name: not supported by cvs2svn $, $Revision: 1.10 $
53 > !! @version $Id: sticky.F90,v 1.15 2005-10-12 18:59:16 chuckv Exp $, $Date: 2005-10-12 18:59:16 $, $Name: not supported by cvs2svn $, $Revision: 1.15 $
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 148 | Line 151 | contains
151      return
152    end subroutine newStickyType
153  
154 +  function getStickyCut(atomID) result(cutValue)
155 +    integer, intent(in) :: atomID
156 +    real(kind=dp) :: cutValue
157 +
158 +    cutValue = StickyMap(atomID)%rbig
159 +  end function getStickyCut
160 +
161 +  function getStickyPowerCut(atomID) result(cutValue)
162 +    integer, intent(in) :: atomID
163 +    real(kind=dp) :: cutValue
164 +
165 +    cutValue = StickyMap(atomID)%rbig
166 +  end function getStickyPowerCut
167 +
168    subroutine do_sticky_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
169         pot, A, f, t, do_pot)
170  
# Line 291 | Line 308 | contains
308         vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp)
309         if (do_pot) then
310   #ifdef IS_MPI
311 <          pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
312 <          pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
311 >          pot_row(STICKY_POT,atom1) = pot_row(STICKY_POT,atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
312 >          pot_col(STICKY_POT,atom2) = pot_col(STICKY_POT,atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
313   #else
314            pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw
315   #endif  
# Line 512 | Line 529 | contains
529      if(allocated(StickyMap)) deallocate(StickyMap)
530    end subroutine destroyStickyTypes
531    
532 <    subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
532 >  subroutine do_sticky_power_pair(atom1, atom2, d, rij, r2, sw, vpair, fpair, &
533         pot, A, f, t, do_pot)
534      !! We assume that the rotation matrices have already been calculated
535      !! and placed in the A array.
536 <
536 >    
537      !! i and j are pointers to the two SSD atoms
538 <
538 >    
539      integer, intent(in) :: atom1, atom2
540      real (kind=dp), intent(inout) :: rij, r2
541      real (kind=dp), dimension(3), intent(in) :: d
# Line 532 | Line 549 | contains
549      real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2
550      real (kind=dp) :: xihat, yihat, zihat, xjhat, yjhat, zjhat
551      real (kind=dp) :: rI, rI2, rI3, rI4, rI5, rI6, rI7, s, sp, dsdr, dspdr
552 <    real (kind=dp) :: wi, wj, w, wip, wjp, wp, wi2, wj2, wip3, wjp3
552 >    real (kind=dp) :: wi, wj, w, wi2, wj2, eScale, v0scale
553      real (kind=dp) :: dwidx, dwidy, dwidz, dwjdx, dwjdy, dwjdz
537    real (kind=dp) :: dwipdx, dwipdy, dwipdz, dwjpdx, dwjpdy, dwjpdz
554      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
555      real (kind=dp) :: drdx, drdy, drdz
556      real (kind=dp) :: txi, tyi, tzi, txj, tyj, tzj
557      real (kind=dp) :: fxii, fyii, fzii, fxjj, fyjj, fzjj
# Line 550 | Line 564 | contains
564      integer :: me1, me2
565      real (kind=dp) :: w0, v0, v0p, rl, ru, rlp, rup, rbig
566      real (kind=dp) :: zi3, zi4, zi5, zj3, zj4, zj5
567 <    real (kind=dp) :: frac1, frac2, prodVal
568 <    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 <    
567 >    real (kind=dp) :: frac1, frac2
568 >          
569      if (.not.allocated(StickyMap)) then
570         call handleError("sticky", "no StickyMap was present before first call of do_sticky_power_pair!")
571         return
# Line 647 | Line 650 | contains
650         zi2 = zi*zi
651         zi3 = zi2*zi
652         zi4 = zi2*zi2
653 <       zi5 = zi4*zi
653 >       zi5 = zi3*zi2
654         xihat = xi*rI
655         yihat = yi*rI
656         zihat = zi*rI
# Line 657 | Line 660 | contains
660         zj2 = zj*zj
661         zj3 = zj2*zj
662         zj4 = zj2*zj2
663 <       zj5 = zj4*zj
663 >       zj5 = zj3*zj2
664         xjhat = xj*rI
665         yjhat = yj*rI
666         zjhat = zj*rI
667        
668         call calc_sw_fnc(rij, rl, ru, rlp, rup, s, sp, dsdr, dspdr)
669            
670 <       frac1 = 0.5d0
671 <       frac2 = 0.5d0
670 >       frac1 = 0.25d0
671 >       frac2 = 0.75d0
672        
673         wi = 2.0d0*(xi2-yi2)*zi*rI3
674         wj = 2.0d0*(xj2-yj2)*zj*rI3
675        
673 !       prodVal = zihat*zjhat
674 !       if (prodVal .ge. 0.0d0) then
675 !         wi = 0.0d0
676 !         wj = 0.0d0
677 !       endif
678
676         wi2 = wi*wi
677         wj2 = wj*wj
678  
679 <       w = frac1*wi*wi2 + frac2*wi + wj*wj2
679 >       w = frac1*wi*wi2 + frac2*wi + frac1*wj*wj2 + frac2*wj + v0p
680  
681 <       zif = zihat - 0.6d0
685 <       zis = zihat + 0.8d0
686 <
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
681 >       vpair = vpair + 0.5d0*(v0*s*w)
682        
699       !wp = wip3*wip + wjp3*wjp
700
701       vpair = vpair + 0.5d0*(v0*s*w + v0p*sp*wp)
702      
683         if (do_pot) then
684   #ifdef IS_MPI
685 <         pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
686 <         pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w + v0p*sp*wp)*sw
685 >         pot_row(atom1) = pot_row(atom1) + 0.25d0*(v0*s*w)*sw
686 >         pot_col(atom2) = pot_col(atom2) + 0.25d0*(v0*s*w)*sw
687   #else
688 <         pot = pot + 0.5d0*(v0*s*w + v0p*sp*wp)*sw
688 >         pot = pot + 0.5d0*(v0*s*w)*sw
689   #endif  
690         endif
691  
# Line 725 | Line 705 | contains
705         dwjdy = frac1*3.0d0*wj2*dwjdy + frac2*dwjdy
706         dwjdz = frac1*3.0d0*wj2*dwjdz + frac2*dwjdz
707        
728       uglyi = zif*zif*zis + zif*zis*zis
729       uglyj = zjf*zjf*zjs + zjf*zjs*zjs
730
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*rI3
736       dwjpdy = -2.0d0*yj*zj*uglyj*rI3
737       dwjpdz = 2.0d0*(rI - zj2*rI3)*uglyj
738
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       !dwjpdx = -4.0d0*wjp3*zj*xjhat
744       !dwjpdy = -4.0d0*wjp3*zj*yjhat
745       !dwjpdz = -4.0d0*wjp3*(zj2 - 1.0d0)*rI
746      
747       !dwipdx = 0.0d0
748       !dwipdy = 0.0d0
749       !dwipdz = 0.0d0
750
751       !dwjpdx = 0.0d0
752       !dwjpdy = 0.0d0
753       !dwjpdz = 0.0d0
754      
708         dwidux = ( 4.0d0*(yi*zi2 + 0.5d0*yi*(xi2-yi2))*rI3 )
709         dwiduy = ( 4.0d0*(xi*zi2 - 0.5d0*xi*(xi2-yi2))*rI3 )
710         dwiduz = ( -8.0d0*xi*yi*zi*rI3 )
# Line 768 | Line 721 | contains
721         dwjduy = frac1*3.0d0*wj2*dwjduy + frac2*dwjduy
722         dwjduz = frac1*3.0d0*wj2*dwjduz + frac2*dwjduz
723  
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*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      
724         ! do the torques first since they are easy:
725         ! remember that these are still in the body fixed axes
726  
727 <       txi = 0.5d0*(v0*s*dwidux + v0p*sp*dwipdux)*sw
728 <       tyi = 0.5d0*(v0*s*dwiduy + v0p*sp*dwipduy)*sw
729 <       tzi = 0.5d0*(v0*s*dwiduz + v0p*sp*dwipduz)*sw
727 >       txi = 0.5d0*(v0*s*dwidux)*sw
728 >       tyi = 0.5d0*(v0*s*dwiduy)*sw
729 >       tzi = 0.5d0*(v0*s*dwiduz)*sw
730  
731 <       txj = 0.5d0*(v0*s*dwjdux + v0p*sp*dwjpdux)*sw
732 <       tyj = 0.5d0*(v0*s*dwjduy + v0p*sp*dwjpduy)*sw
733 <       tzj = 0.5d0*(v0*s*dwjduz + v0p*sp*dwjpduz)*sw
731 >       txj = 0.5d0*(v0*s*dwjdux)*sw
732 >       tyj = 0.5d0*(v0*s*dwjduy)*sw
733 >       tzj = 0.5d0*(v0*s*dwjduz)*sw
734  
735         ! go back to lab frame using transpose of rotation matrix:
736  
# Line 832 | Line 761 | contains
761  
762         ! first rotate the i terms back into the lab frame:
763  
764 <       radcomxi = (v0*s*dwidx+v0p*sp*dwipdx)*sw
765 <       radcomyi = (v0*s*dwidy+v0p*sp*dwipdy)*sw
766 <       radcomzi = (v0*s*dwidz+v0p*sp*dwipdz)*sw
764 >       radcomxi = (v0*s*dwidx)*sw
765 >       radcomyi = (v0*s*dwidy)*sw
766 >       radcomzi = (v0*s*dwidz)*sw
767  
768 <       radcomxj = (v0*s*dwjdx+v0p*sp*dwjpdx)*sw
769 <       radcomyj = (v0*s*dwjdy+v0p*sp*dwjpdy)*sw
770 <       radcomzj = (v0*s*dwjdz+v0p*sp*dwjpdz)*sw
768 >       radcomxj = (v0*s*dwjdx)*sw
769 >       radcomyj = (v0*s*dwjdy)*sw
770 >       radcomzj = (v0*s*dwjdz)*sw
771  
772   #ifdef IS_MPI    
773         fxii = a_Row(1,atom1)*(radcomxi) + &
# Line 892 | Line 821 | contains
821  
822         ! now assemble these with the radial-only terms:
823  
824 <       fxradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdx + fxii + fxji)
825 <       fyradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdy + fyii + fyji)
826 <       fzradial = 0.5d0*((v0*dsdr*w + v0p*dspdr*wp)*drdz + fzii + fzji)
824 >       fxradial = 0.5d0*(v0*dsdr*w*drdx + fxii + fxji)
825 >       fyradial = 0.5d0*(v0*dsdr*w*drdy + fyii + fyji)
826 >       fzradial = 0.5d0*(v0*dsdr*w*drdz + fzii + fzji)
827  
828   #ifdef IS_MPI
829         f_Row(1,atom1) = f_Row(1,atom1) + fxradial

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines