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

Comparing trunk/OOPSE-4/src/UseTheForce/DarkSide/shapes.F90 (file contents):
Revision 1689 by chrisfen, Fri Oct 29 22:28:45 2004 UTC vs.
Revision 1948 by gezelter, Fri Jan 14 20:31:16 2005 UTC

# Line 1 | Line 1
1 + !!
2 + !! Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 + !!
4 + !! The University of Notre Dame grants you ("Licensee") a
5 + !! non-exclusive, royalty free, license to use, modify and
6 + !! redistribute this software in source and binary code form, provided
7 + !! that the following conditions are met:
8 + !!
9 + !! 1. Acknowledgement of the program authors must be made in any
10 + !!    publication of scientific results based in part on use of the
11 + !!    program.  An acceptable form of acknowledgement is citation of
12 + !!    the article in which the program was described (Matthew
13 + !!    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 + !!    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 + !!    Parallel Simulation Engine for Molecular Dynamics,"
16 + !!    J. Comput. Chem. 26, pp. 252-271 (2005))
17 + !!
18 + !! 2. Redistributions of source code must retain the above copyright
19 + !!    notice, this list of conditions and the following disclaimer.
20 + !!
21 + !! 3. Redistributions in binary form must reproduce the above copyright
22 + !!    notice, this list of conditions and the following disclaimer in the
23 + !!    documentation and/or other materials provided with the
24 + !!    distribution.
25 + !!
26 + !! This software is provided "AS IS," without a warranty of any
27 + !! kind. All express or implied conditions, representations and
28 + !! warranties, including any implied warranty of merchantability,
29 + !! fitness for a particular purpose or non-infringement, are hereby
30 + !! excluded.  The University of Notre Dame and its licensors shall not
31 + !! be liable for any damages suffered by licensee as a result of
32 + !! using, modifying or distributing the software or its
33 + !! derivatives. In no event will the University of Notre Dame or its
34 + !! licensors be liable for any lost revenue, profit or data, or for
35 + !! direct, indirect, special, consequential, incidental or punitive
36 + !! damages, however caused and regardless of the theory of liability,
37 + !! arising out of the use of or inability to use software, even if the
38 + !! University of Notre Dame has been advised of the possibility of
39 + !! such damages.
40 + !!
41 +
42 +
43   module shapes
44  
45    use force_globals
# Line 62 | Line 104 | module shapes
104    type(ShapeList), save :: ShapeMap
105  
106    integer :: lmax
65  real (kind=dp), allocatable, dimension(:,:) :: plm_i, dlm_i, plm_j, dlm_j
66  real (kind=dp), allocatable, dimension(:) :: tm_i, dtm_i, um_i, dum_i
67  real (kind=dp), allocatable, dimension(:) :: tm_j, dtm_j, um_j, dum_j
107  
108   contains  
109  
# Line 351 | Line 390 | contains  
390      real (kind=dp), intent(inout) :: rij, r2
391      real (kind=dp), dimension(3), intent(in) :: d
392      real (kind=dp), dimension(3), intent(inout) :: fpair
393 <    real (kind=dp) :: pot, vpair, sw
393 >    real (kind=dp) :: pot, vpair, sw, dswdr
394      real (kind=dp), dimension(9,nLocal) :: A
395      real (kind=dp), dimension(3,nLocal) :: f
396      real (kind=dp), dimension(3,nLocal) :: t
# Line 362 | Line 401 | contains  
401      integer :: l, m, lm, id1, id2, localError, function_type
402      real (kind=dp) :: sigma_i, s_i, eps_i, sigma_j, s_j, eps_j
403      real (kind=dp) :: coeff
404 +    real (kind=dp) :: pot_temp
405  
406      real (kind=dp) :: dsigmaidx, dsigmaidy, dsigmaidz
407      real (kind=dp) :: dsigmaidux, dsigmaiduy, dsigmaiduz
# Line 379 | Line 419 | contains  
419      real (kind=dp) :: depsjdux, depsjduy, depsjduz
420  
421      real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2
422 +
423 +    real (kind=dp) :: sti2, stj2
424  
425      real (kind=dp) :: proji, proji3, projj, projj3
426      real (kind=dp) :: cti, ctj, cpi, cpj, spi, spj
# Line 438 | Line 480 | contains  
480      real (kind=dp) :: fxji, fyji, fzji, fxjj, fyjj, fzjj
481      real (kind=dp) :: fxradial, fyradial, fzradial
482  
483 <    real (kind=dp) :: plm_i(LMAX,MMAX), dlm_i(LMAX,MMAX)
484 <    real (kind=dp) :: plm_j(LMAX,MMAX), dlm_j(LMAX,MMAX)
485 <    real (kind=dp) :: tm_i(MMAX), dtm_i(MMAX), um_i(MMAX), dum_i(MMAX)
486 <    real (kind=dp) :: tm_j(MMAX), dtm_j(MMAX), um_j(MMAX), dum_j(MMAX)
483 >    real (kind=dp) :: plm_i(0:LMAX,0:MMAX), dlm_i(0:LMAX,0:MMAX)
484 >    real (kind=dp) :: plm_j(0:LMAX,0:MMAX), dlm_j(0:LMAX,0:MMAX)
485 >    real (kind=dp) :: tm_i(0:MMAX), dtm_i(0:MMAX), um_i(0:MMAX), dum_i(0:MMAX)
486 >    real (kind=dp) :: tm_j(0:MMAX), dtm_j(0:MMAX), um_j(0:MMAX), dum_j(0:MMAX)
487  
488      if (.not.haveShapeMap) then
489         call handleError("calc_shape", "NO SHAPEMAP!!!!")
# Line 520 | Line 562 | contains  
562  
563         xi2 = xi*xi
564         yi2 = yi*yi
565 <       zi2 = zi*zi
524 <      
525 <       proji = sqrt(xi2 + yi2)
526 <       proji3 = proji*proji*proji
527 <      
565 >       zi2 = zi*zi            
566         cti = zi / rij
567  
568 +       if (cti .gt. 1.0_dp) cti = 1.0_dp
569 +       if (cti .lt. -1.0_dp) cti = -1.0_dp
570 +
571         dctidx = - zi * xi / r3
572         dctidy = - zi * yi / r3
573         dctidz = 1.0d0 / rij - zi2 / r3
574 <       dctidux =  yi / rij
575 <       dctiduy = -xi / rij
576 <       dctiduz = 0.0d0
574 >       dctidux = - (zi * xi2) / r3
575 >       dctiduy = - (zi * yi2) / r3
576 >       dctiduz = zi / rij - (zi2 * zi) / r3
577 >
578 >       ! this is an attempt to try to truncate the singularity when
579 >       ! sin(theta) is near 0.0:
580 >
581 >       sti2 = 1.0_dp - cti*cti
582 >       if (dabs(sti2) .lt. 1.0d-12) then
583 >          proji = sqrt(rij * 1.0d-12)
584 >          dcpidx = 1.0d0 / proji
585 >          dcpidy = 0.0d0
586 >          dcpidux = xi / proji
587 >          dcpiduy = 0.0d0
588 >          dspidx = 0.0d0
589 >          dspidy = 1.0d0 / proji
590 >          dspidux = 0.0d0
591 >          dspiduy = yi / proji
592 >       else
593 >          proji = sqrt(xi2 + yi2)
594 >          proji3 = proji*proji*proji
595 >          dcpidx = 1.0d0 / proji - xi2 / proji3
596 >          dcpidy = - xi * yi / proji3
597 >          dcpidux = xi / proji - (xi2 * xi) / proji3
598 >          dcpiduy = - (xi * yi2) / proji3
599 >          dspidx = - xi * yi / proji3
600 >          dspidy = 1.0d0 / proji - yi2 / proji3
601 >          dspidux = - (yi * xi2) / proji3
602 >          dspiduy = yi / proji - (yi2 * yi) / proji3
603 >       endif
604        
605         cpi = xi / proji
538       dcpidx = 1.0d0 / proji - xi2 / proji3
539       dcpidy = - xi * yi / proji3
606         dcpidz = 0.0d0
607 <       dcpidux = xi * yi * zi / proji3
542 <       dcpiduy = -zi * (1.0d0 / proji - xi2 / proji3)
543 <       dcpiduz = -yi * (1.0d0 / proji - xi2 / proji3)  - (xi2 * yi / proji3)
607 >       dcpiduz = 0.0d0
608        
609         spi = yi / proji
546       dspidx = - xi * yi / proji3
547       dspidy = 1.0d0 / proji - yi2 / proji3
610         dspidz = 0.0d0
611 <       dspidux = -zi * (1.0d0 / proji - yi2 / proji3)
550 <       dspiduy = xi * yi * zi / proji3
551 <       dspiduz = xi * (1.0d0 / proji - yi2 / proji3) + (xi * yi2 / proji3)
611 >       dspiduz = 0.0d0
612  
613 <       call Associated_Legendre(cti, ShapeMap%Shapes(st1)%bigL, &
614 <            ShapeMap%Shapes(st1)%bigM, LMAX, &
613 >       call Associated_Legendre(cti, ShapeMap%Shapes(st1)%bigM, &
614 >            ShapeMap%Shapes(st1)%bigL, LMAX, &
615              plm_i, dlm_i)
616  
617         call Orthogonal_Polynomial(cpi, ShapeMap%Shapes(st1)%bigM, MMAX, &
# Line 588 | Line 648 | contains  
648            function_type = ShapeMap%Shapes(st1)%ContactFunctionType(lm)
649  
650            if ((function_type .eq. SH_COS).or.(m.eq.0)) then
591           !  write(*,*) tm_i(m), ' is tm_i'
651               Phunc = coeff * tm_i(m)
652               dPhuncdX = coeff * dtm_i(m) * dcpidx
653               dPhuncdY = coeff * dtm_i(m) * dcpidy
# Line 606 | Line 665 | contains  
665               dPhuncdUz = coeff*(spi * dum_i(m-1)*dcpiduz + dspiduz *um_i(m-1))
666            endif
667  
668 <          sigma_i = sigma_i + plm_i(l,m)*Phunc
669 <          write(*,*) plm_i(l,m), l, m
670 <          dsigmaidx = dsigmaidx + plm_i(l,m)*dPhuncdX + &
671 <               Phunc * dlm_i(l,m) * dctidx
672 <          dsigmaidy = dsigmaidy + plm_i(l,m)*dPhuncdY + &
673 <               Phunc * dlm_i(l,m) * dctidy
674 <          dsigmaidz = dsigmaidz + plm_i(l,m)*dPhuncdZ + &
675 <               Phunc * dlm_i(l,m) * dctidz
668 >          sigma_i = sigma_i + plm_i(m,l)*Phunc
669 >
670 >          dsigmaidx = dsigmaidx + plm_i(m,l)*dPhuncdX + &
671 >               Phunc * dlm_i(m,l) * dctidx
672 >          dsigmaidy = dsigmaidy + plm_i(m,l)*dPhuncdY + &
673 >               Phunc * dlm_i(m,l) * dctidy
674 >          dsigmaidz = dsigmaidz + plm_i(m,l)*dPhuncdZ + &
675 >               Phunc * dlm_i(m,l) * dctidz
676            
677 <          dsigmaidux = dsigmaidux + plm_i(l,m)* dPhuncdUx + &
678 <               Phunc * dlm_i(l,m) * dctidux
679 <          dsigmaiduy = dsigmaiduy + plm_i(l,m)* dPhuncdUy + &
680 <               Phunc * dlm_i(l,m) * dctiduy
681 <          dsigmaiduz = dsigmaiduz + plm_i(l,m)* dPhuncdUz + &
682 <               Phunc * dlm_i(l,m) * dctiduz
677 >          dsigmaidux = dsigmaidux + plm_i(m,l)* dPhuncdUx + &
678 >               Phunc * dlm_i(m,l) * dctidux
679 >          dsigmaiduy = dsigmaiduy + plm_i(m,l)* dPhuncdUy + &
680 >               Phunc * dlm_i(m,l) * dctiduy
681 >          dsigmaiduz = dsigmaiduz + plm_i(m,l)* dPhuncdUz + &
682 >               Phunc * dlm_i(m,l) * dctiduz
683  
684         end do
685  
# Line 648 | Line 707 | contains  
707               dPhuncdUz = coeff*(spi * dum_i(m-1)*dcpiduz + dspiduz *um_i(m-1))
708            endif
709  
710 <          s_i = s_i + plm_i(l,m)*Phunc
710 >          s_i = s_i + plm_i(m,l)*Phunc
711            
712 <          dsidx = dsidx + plm_i(l,m)*dPhuncdX + &
713 <               Phunc * dlm_i(l,m) * dctidx
714 <          dsidy = dsidy + plm_i(l,m)*dPhuncdY + &
715 <               Phunc * dlm_i(l,m) * dctidy
716 <          dsidz = dsidz + plm_i(l,m)*dPhuncdZ + &
717 <               Phunc * dlm_i(l,m) * dctidz
712 >          dsidx = dsidx + plm_i(m,l)*dPhuncdX + &
713 >               Phunc * dlm_i(m,l) * dctidx
714 >          dsidy = dsidy + plm_i(m,l)*dPhuncdY + &
715 >               Phunc * dlm_i(m,l) * dctidy
716 >          dsidz = dsidz + plm_i(m,l)*dPhuncdZ + &
717 >               Phunc * dlm_i(m,l) * dctidz
718            
719 <          dsidux = dsidux + plm_i(l,m)* dPhuncdUx + &
720 <               Phunc * dlm_i(l,m) * dctidux
721 <          dsiduy = dsiduy + plm_i(l,m)* dPhuncdUy + &
722 <               Phunc * dlm_i(l,m) * dctiduy
723 <          dsiduz = dsiduz + plm_i(l,m)* dPhuncdUz + &
724 <               Phunc * dlm_i(l,m) * dctiduz      
719 >          dsidux = dsidux + plm_i(m,l)* dPhuncdUx + &
720 >               Phunc * dlm_i(m,l) * dctidux
721 >          dsiduy = dsiduy + plm_i(m,l)* dPhuncdUy + &
722 >               Phunc * dlm_i(m,l) * dctiduy
723 >          dsiduz = dsiduz + plm_i(m,l)* dPhuncdUz + &
724 >               Phunc * dlm_i(m,l) * dctiduz      
725  
726         end do
727                
# Line 689 | Line 748 | contains  
748               dPhuncdUy = coeff*(spi * dum_i(m-1)*dcpiduy + dspiduy *um_i(m-1))
749               dPhuncdUz = coeff*(spi * dum_i(m-1)*dcpiduz + dspiduz *um_i(m-1))
750            endif
751 <          !write(*,*) eps_i, plm_i(l,m), Phunc
752 <          eps_i = eps_i + plm_i(l,m)*Phunc
751 >
752 >          eps_i = eps_i + plm_i(m,l)*Phunc
753            
754 <          depsidx = depsidx + plm_i(l,m)*dPhuncdX + &
755 <               Phunc * dlm_i(l,m) * dctidx
756 <          depsidy = depsidy + plm_i(l,m)*dPhuncdY + &
757 <               Phunc * dlm_i(l,m) * dctidy
758 <          depsidz = depsidz + plm_i(l,m)*dPhuncdZ + &
759 <               Phunc * dlm_i(l,m) * dctidz
754 >          depsidx = depsidx + plm_i(m,l)*dPhuncdX + &
755 >               Phunc * dlm_i(m,l) * dctidx
756 >          depsidy = depsidy + plm_i(m,l)*dPhuncdY + &
757 >               Phunc * dlm_i(m,l) * dctidy
758 >          depsidz = depsidz + plm_i(m,l)*dPhuncdZ + &
759 >               Phunc * dlm_i(m,l) * dctidz
760            
761 <          depsidux = depsidux + plm_i(l,m)* dPhuncdUx + &
762 <               Phunc * dlm_i(l,m) * dctidux
763 <          depsiduy = depsiduy + plm_i(l,m)* dPhuncdUy + &
764 <               Phunc * dlm_i(l,m) * dctiduy
765 <          depsiduz = depsiduz + plm_i(l,m)* dPhuncdUz + &
766 <               Phunc * dlm_i(l,m) * dctiduz      
761 >          depsidux = depsidux + plm_i(m,l)* dPhuncdUx + &
762 >               Phunc * dlm_i(m,l) * dctidux
763 >          depsiduy = depsiduy + plm_i(m,l)* dPhuncdUy + &
764 >               Phunc * dlm_i(m,l) * dctiduy
765 >          depsiduz = depsiduz + plm_i(m,l)* dPhuncdUz + &
766 >               Phunc * dlm_i(m,l) * dctiduz      
767  
768         end do
769  
# Line 757 | Line 816 | contains  
816         xj2 = xj*xj
817         yj2 = yj*yj
818         zj2 = zj*zj
760      
761       projj = sqrt(xj2 + yj2)
762       projj3 = projj*projj*projj
763      
819         ctj = zj / rij
820 +      
821 +       if (ctj .gt. 1.0_dp) ctj = 1.0_dp
822 +       if (ctj .lt. -1.0_dp) ctj = -1.0_dp
823 +
824         dctjdx = - zj * xj / r3
825         dctjdy = - zj * yj / r3
826         dctjdz = 1.0d0 / rij - zj2 / r3
827 <       dctjdux =  yj / rij
828 <       dctjduy = -xj / rij
829 <       dctjduz = 0.0d0
827 >       dctjdux = - (zi * xj2) / r3
828 >       dctjduy = - (zj * yj2) / r3
829 >       dctjduz = zj / rij - (zj2 * zj) / r3
830        
831 <       cpj = xj / projj
832 <       dcpjdx = 1.0d0 / projj - xj2 / projj3
833 <       dcpjdy = - xj * yj / projj3
831 >       ! this is an attempt to try to truncate the singularity when
832 >       ! sin(theta) is near 0.0:
833 >
834 >       stj2 = 1.0_dp - ctj*ctj
835 >       if (dabs(stj2) .lt. 1.0d-12) then
836 >          projj = sqrt(rij * 1.0d-12)
837 >          dcpjdx = 1.0d0 / projj
838 >          dcpjdy = 0.0d0
839 >          dcpjdux = xj / projj
840 >          dcpjduy = 0.0d0
841 >          dspjdx = 0.0d0
842 >          dspjdy = 1.0d0 / projj
843 >          dspjdux = 0.0d0
844 >          dspjduy = yj / projj
845 >       else
846 >          projj = sqrt(xj2 + yj2)
847 >          projj3 = projj*projj*projj
848 >          dcpjdx = 1.0d0 / projj - xj2 / projj3
849 >          dcpjdy = - xj * yj / projj3
850 >          dcpjdux = xj / projj - (xj2 * xj) / projj3
851 >          dcpjduy = - (xj * yj2) / projj3
852 >          dspjdx = - xj * yj / projj3
853 >          dspjdy = 1.0d0 / projj - yj2 / projj3
854 >          dspjdux = - (yj * xj2) / projj3
855 >          dspjduy = yj / projj - (yj2 * yj) / projj3
856 >       endif
857 >
858 >       cpj = xj / projj
859         dcpjdz = 0.0d0
860 <       dcpjdux = xj * yj * zj / projj3
777 <       dcpjduy = -zj * (1.0d0 / projj - xj2 / projj3)
778 <       dcpjduz = -yj * (1.0d0 / projj - xj2 / projj3)  - (xj2 * yj / projj3)
860 >       dcpjduz = 0.0d0
861        
862         spj = yj / projj
781       dspjdx = - xj * yj / projj3
782       dspjdy = 1.0d0 / projj - yj2 / projj3
863         dspjdz = 0.0d0
864 <       dspjdux = -zj * (1.0d0 / projj - yj2 / projj3)
865 <       dspjduy = xj * yj * zj / projj3
866 <       dspjduz = xj * (1.0d0 / projj - yi2 / projj3) + (xj * yj2 / projj3)
867 <      
868 <       call Associated_Legendre(ctj, ShapeMap%Shapes(st2)%bigL, &
869 <            ShapeMap%Shapes(st2)%bigM, LMAX, &
864 >       dspjduz = 0.0d0
865 >
866 >
867 >       write(*,*) 'dcpdu = ' ,dcpidux, dcpiduy, dcpiduz
868 >       write(*,*) 'dcpdu = ' ,dcpjdux, dcpjduy, dcpjduz
869 >       call Associated_Legendre(ctj, ShapeMap%Shapes(st2)%bigM, &
870 >            ShapeMap%Shapes(st2)%bigL, LMAX, &
871              plm_j, dlm_j)
872        
873         call Orthogonal_Polynomial(cpj, ShapeMap%Shapes(st2)%bigM, MMAX, &
# Line 840 | Line 921 | contains  
921               dPhuncdUz = coeff*(spj * dum_j(m-1)*dcpjduz + dspjduz *um_j(m-1))
922            endif
923  
924 <          sigma_j = sigma_j + plm_j(l,m)*Phunc
924 >          sigma_j = sigma_j + plm_j(m,l)*Phunc
925            
926 <          dsigmajdx = dsigmajdx + plm_j(l,m)*dPhuncdX + &
927 <               Phunc * dlm_j(l,m) * dctjdx
928 <          dsigmajdy = dsigmajdy + plm_j(l,m)*dPhuncdY + &
929 <               Phunc * dlm_j(l,m) * dctjdy
930 <          dsigmajdz = dsigmajdz + plm_j(l,m)*dPhuncdZ + &
931 <               Phunc * dlm_j(l,m) * dctjdz
926 >          dsigmajdx = dsigmajdx + plm_j(m,l)*dPhuncdX + &
927 >               Phunc * dlm_j(m,l) * dctjdx
928 >          dsigmajdy = dsigmajdy + plm_j(m,l)*dPhuncdY + &
929 >               Phunc * dlm_j(m,l) * dctjdy
930 >          dsigmajdz = dsigmajdz + plm_j(m,l)*dPhuncdZ + &
931 >               Phunc * dlm_j(m,l) * dctjdz
932            
933 <          dsigmajdux = dsigmajdux + plm_j(l,m)* dPhuncdUx + &
934 <               Phunc * dlm_j(l,m) * dctjdux
935 <          dsigmajduy = dsigmajduy + plm_j(l,m)* dPhuncdUy + &
936 <               Phunc * dlm_j(l,m) * dctjduy
937 <          dsigmajduz = dsigmajduz + plm_j(l,m)* dPhuncdUz + &
938 <               Phunc * dlm_j(l,m) * dctjduz
933 >          dsigmajdux = dsigmajdux + plm_j(m,l)* dPhuncdUx + &
934 >               Phunc * dlm_j(m,l) * dctjdux
935 >          dsigmajduy = dsigmajduy + plm_j(m,l)* dPhuncdUy + &
936 >               Phunc * dlm_j(m,l) * dctjduy
937 >          dsigmajduz = dsigmajduz + plm_j(m,l)* dPhuncdUz + &
938 >               Phunc * dlm_j(m,l) * dctjduz
939  
940         end do
941  
# Line 882 | Line 963 | contains  
963               dPhuncdUz = coeff*(spj * dum_j(m-1)*dcpjduz + dspjduz *um_j(m-1))
964            endif
965  
966 <          s_j = s_j + plm_j(l,m)*Phunc
966 >          s_j = s_j + plm_j(m,l)*Phunc
967            
968 <          dsjdx = dsjdx + plm_j(l,m)*dPhuncdX + &
969 <               Phunc * dlm_j(l,m) * dctjdx
970 <          dsjdy = dsjdy + plm_j(l,m)*dPhuncdY + &
971 <               Phunc * dlm_j(l,m) * dctjdy
972 <          dsjdz = dsjdz + plm_j(l,m)*dPhuncdZ + &
973 <               Phunc * dlm_j(l,m) * dctjdz
968 >          dsjdx = dsjdx + plm_j(m,l)*dPhuncdX + &
969 >               Phunc * dlm_j(m,l) * dctjdx
970 >          dsjdy = dsjdy + plm_j(m,l)*dPhuncdY + &
971 >               Phunc * dlm_j(m,l) * dctjdy
972 >          dsjdz = dsjdz + plm_j(m,l)*dPhuncdZ + &
973 >               Phunc * dlm_j(m,l) * dctjdz
974            
975 <          dsjdux = dsjdux + plm_j(l,m)* dPhuncdUx + &
976 <               Phunc * dlm_j(l,m) * dctjdux
977 <          dsjduy = dsjduy + plm_j(l,m)* dPhuncdUy + &
978 <               Phunc * dlm_j(l,m) * dctjduy
979 <          dsjduz = dsjduz + plm_j(l,m)* dPhuncdUz + &
980 <               Phunc * dlm_j(l,m) * dctjduz
975 >          dsjdux = dsjdux + plm_j(m,l)* dPhuncdUx + &
976 >               Phunc * dlm_j(m,l) * dctjdux
977 >          dsjduy = dsjduy + plm_j(m,l)* dPhuncdUy + &
978 >               Phunc * dlm_j(m,l) * dctjduy
979 >          dsjduz = dsjduz + plm_j(m,l)* dPhuncdUz + &
980 >               Phunc * dlm_j(m,l) * dctjduz
981  
982         end do
983  
# Line 924 | Line 1005 | contains  
1005               dPhuncdUz = coeff*(spj * dum_j(m-1)*dcpjduz + dspjduz *um_j(m-1))
1006            endif
1007  
1008 <          eps_j = eps_j + plm_j(l,m)*Phunc
1008 >          write(*,*) 'l,m = ', l, m, coeff, dPhuncdUx, dPhuncdUy, dPhuncdUz
1009 >
1010 >          eps_j = eps_j + plm_j(m,l)*Phunc
1011            
1012 <          depsjdx = depsjdx + plm_j(l,m)*dPhuncdX + &
1013 <               Phunc * dlm_j(l,m) * dctjdx
1014 <          depsjdy = depsjdy + plm_j(l,m)*dPhuncdY + &
1015 <               Phunc * dlm_j(l,m) * dctjdy
1016 <          depsjdz = depsjdz + plm_j(l,m)*dPhuncdZ + &
1017 <               Phunc * dlm_j(l,m) * dctjdz
1012 >          depsjdx = depsjdx + plm_j(m,l)*dPhuncdX + &
1013 >               Phunc * dlm_j(m,l) * dctjdx
1014 >          depsjdy = depsjdy + plm_j(m,l)*dPhuncdY + &
1015 >               Phunc * dlm_j(m,l) * dctjdy
1016 >          depsjdz = depsjdz + plm_j(m,l)*dPhuncdZ + &
1017 >               Phunc * dlm_j(m,l) * dctjdz
1018            
1019 <          depsjdux = depsjdux + plm_j(l,m)* dPhuncdUx + &
1020 <               Phunc * dlm_j(l,m) * dctjdux
1021 <          depsjduy = depsjduy + plm_j(l,m)* dPhuncdUy + &
1022 <               Phunc * dlm_j(l,m) * dctjduy
1023 <          depsjduz = depsjduz + plm_j(l,m)* dPhuncdUz + &
1024 <               Phunc * dlm_j(l,m) * dctjduz
1019 >          depsjdux = depsjdux + plm_j(m,l)* dPhuncdUx + &
1020 >               Phunc * dlm_j(m,l) * dctjdux
1021 >          depsjduy = depsjduy + plm_j(m,l)* dPhuncdUy + &
1022 >               Phunc * dlm_j(m,l) * dctjduy
1023 >          depsjduz = depsjduz + plm_j(m,l)* dPhuncdUz + &
1024 >               Phunc * dlm_j(m,l) * dctjduz
1025  
1026         end do
1027  
# Line 977 | Line 1060 | contains  
1060      dsduxj = 0.5*dsjdux
1061      dsduyj = 0.5*dsjduy
1062      dsduzj = 0.5*dsjduz
1063 <    !write(*,*) eps_i, eps_j
1063 >
1064      eps = sqrt(eps_i * eps_j)
1065  
1066      depsdxi = eps_j * depsidx / (2.0d0 * eps)
# Line 994 | Line 1077 | contains  
1077      depsduyj = eps_i * depsjduy / (2.0d0 * eps)
1078      depsduzj = eps_i * depsjduz / (2.0d0 * eps)
1079      
1080 + !!$    write(*,*) 'depsidu = ', depsidux, depsiduy, depsiduz
1081 + !!$    write(*,*) 'depsjdu = ', depsjdux, depsjduy, depsjduz
1082 + !!$
1083 + !!$    write(*,*) 'depsdui = ', depsduxi, depsduyi, depsduzi
1084 + !!$    write(*,*) 'depsduj = ', depsduxj, depsduyj, depsduzj
1085 + !!$
1086 + !!$    write(*,*) 's, sig, eps = ', s, sigma, eps
1087 +
1088      rtdenom = rij-sigma+s
1089      rt = s / rtdenom
1090  
# Line 1018 | Line 1109 | contains  
1109      rt12 = rt6*rt6
1110      rt126 = rt12 - rt6
1111  
1112 +    pot_temp = 4.0d0 * eps * rt126
1113 +
1114 +    vpair = vpair + pot_temp
1115      if (do_pot) then
1116   #ifdef IS_MPI
1117 <       pot_row(atom1) = pot_row(atom1) + 2.0d0*eps*rt126*sw
1118 <       pot_col(atom2) = pot_col(atom2) + 2.0d0*eps*rt126*sw
1117 >       pot_row(atom1) = pot_row(atom1) + 0.5d0*pot_temp*sw
1118 >       pot_col(atom2) = pot_col(atom2) + 0.5d0*pot_temp*sw
1119   #else
1120 <       pot = pot + 4.0d0*eps*rt126*sw
1120 >       pot = pot + pot_temp*sw
1121   #endif
1122      endif
1123 +
1124 + !!$    write(*,*) 'drtdu, depsdu = ', drtduxi, depsduxi
1125      
1126      dvdxi = 24.0d0*eps*(2.0d0*rt11 - rt5)*drtdxi + 4.0d0*depsdxi*rt126
1127      dvdyi = 24.0d0*eps*(2.0d0*rt11 - rt5)*drtdyi + 4.0d0*depsdyi*rt126
# Line 1044 | Line 1140 | contains  
1140      ! do the torques first since they are easy:
1141      ! remember that these are still in the body fixed axes
1142  
1047    txi = dvduxi * sw
1048    tyi = dvduyi * sw
1049    tzi = dvduzi * sw
1143  
1144 <    txj = dvduxj * sw
1145 <    tyj = dvduyj * sw
1146 <    tzj = dvduzj * sw
1144 > !!$    write(*,*) 'sw = ', sw
1145 > !!$    write(*,*) 'dvdu1 = ', dvduxi, dvduyi, dvduzi
1146 > !!$    write(*,*) 'dvdu2 = ', dvduxj, dvduyj, dvduzj
1147 > !!$
1148 >    txi =  (dvduzi - dvduyi) * sw
1149 >    tyi =  (dvduxi - dvduzi) * sw
1150 >    tzi =  (dvduyi - dvduxi) * sw
1151  
1152 +    txj = (dvduzj - dvduyj) * sw
1153 +    tyj = (dvduxj - dvduzj) * sw
1154 +    tzj = (dvduyj - dvduxj) * sw
1155 +
1156 + !!$    txi = -dvduxi * sw
1157 + !!$    tyi = -dvduyi * sw
1158 + !!$    tzi = -dvduzi * sw
1159 + !!$
1160 + !!$    txj = dvduxj * sw
1161 + !!$    tyj = dvduyj * sw
1162 + !!$    tzj = dvduzj * sw
1163 +
1164 +    write(*,*) 't1 = ', txi, tyi, tzi
1165 +    write(*,*) 't2 = ', txj, tyj, tzj
1166 +
1167      ! go back to lab frame using transpose of rotation matrix:
1168      
1169   #ifdef IS_MPI
# Line 1115 | Line 1227 | contains  
1227      fyji = -fyjj
1228      fzji = -fzjj
1229  
1230 <    fxradial = fxii + fxji
1231 <    fyradial = fyii + fyji
1232 <    fzradial = fzii + fzji
1230 >    fxradial = 0.5_dp * (fxii + fxji)
1231 >    fyradial = 0.5_dp * (fyii + fyji)
1232 >    fzradial = 0.5_dp * (fzii + fzji)
1233  
1234   #ifdef IS_MPI
1235      f_Row(1,atom1) = f_Row(1,atom1) + fxradial
# Line 1152 | Line 1264 | contains  
1264         fpair(3) = fpair(3) + fzradial
1265        
1266      endif
1267 <    
1267 >
1268    end subroutine do_shape_pair
1269      
1270    SUBROUTINE Associated_Legendre(x, l, m, lmax, plm, dlm)        
# Line 1311 | Line 1423 | contains  
1423         DY0 = DY1
1424         DY1 = DYN
1425      end DO
1426 +
1427 +
1428      RETURN
1429      
1430    end subroutine Orthogonal_Polynomial
1431    
1432   end module shapes
1319
1320 subroutine makeShape(nContactFuncs, ContactFuncLValue, &
1321     ContactFuncMValue, ContactFunctionType, ContactFuncCoefficient, &
1322     nRangeFuncs, RangeFuncLValue, RangeFuncMValue, RangeFunctionType, &
1323     RangeFuncCoefficient, nStrengthFuncs, StrengthFuncLValue, &
1324     StrengthFuncMValue, StrengthFunctionType, StrengthFuncCoefficient, &
1325     myATID, status)
1326
1327  use definitions
1328  use shapes, only: newShapeType
1329  
1330  integer :: nContactFuncs
1331  integer :: nRangeFuncs
1332  integer :: nStrengthFuncs
1333  integer :: status
1334  integer :: myATID
1335  
1336  integer, dimension(nContactFuncs) :: ContactFuncLValue          
1337  integer, dimension(nContactFuncs) :: ContactFuncMValue          
1338  integer, dimension(nContactFuncs) :: ContactFunctionType        
1339  real(kind=dp), dimension(nContactFuncs) :: ContactFuncCoefficient
1340  integer, dimension(nRangeFuncs) :: RangeFuncLValue            
1341  integer, dimension(nRangeFuncs) :: RangeFuncMValue            
1342  integer, dimension(nRangeFuncs) :: RangeFunctionType          
1343  real(kind=dp), dimension(nRangeFuncs) :: RangeFuncCoefficient  
1344  integer, dimension(nStrengthFuncs) :: StrengthFuncLValue          
1345  integer, dimension(nStrengthFuncs) :: StrengthFuncMValue          
1346  integer, dimension(nStrengthFuncs) :: StrengthFunctionType        
1347  real(kind=dp), dimension(nStrengthFuncs) :: StrengthFuncCoefficient
1348  
1349  call newShapeType(nContactFuncs, ContactFuncLValue, &
1350       ContactFuncMValue, ContactFunctionType, ContactFuncCoefficient, &
1351       nRangeFuncs, RangeFuncLValue, RangeFuncMValue, RangeFunctionType, &
1352       RangeFuncCoefficient, nStrengthFuncs, StrengthFuncLValue, &
1353       StrengthFuncMValue, StrengthFunctionType, StrengthFuncCoefficient, &
1354       myATID, status)
1355
1356  return
1357 end subroutine makeShape
1358
1359 subroutine completeShapeFF(status)
1360
1361  use shapes, only: complete_Shape_FF
1362
1363  integer, intent(out)  :: status
1364  integer :: myStatus
1365
1366  myStatus = 0
1367
1368  call complete_Shape_FF(myStatus)
1369
1370  status = myStatus
1371
1372  return
1373 end subroutine completeShapeFF
1374

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines