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

Comparing trunk/OOPSE-3.0/src/UseTheForce/DarkSide/shapes.F90 (file contents):
Revision 1698 by chrisfen, Tue Nov 2 15:28:25 2004 UTC vs.
Revision 1717 by chrisfen, Fri Nov 5 21:04:33 2004 UTC

# Line 348 | Line 348 | contains  
348      real (kind=dp), intent(inout) :: rij, r2
349      real (kind=dp), dimension(3), intent(in) :: d
350      real (kind=dp), dimension(3), intent(inout) :: fpair
351 <    real (kind=dp) :: pot, vpair, sw
351 >    real (kind=dp) :: pot, vpair, sw, dswdr
352      real (kind=dp), dimension(9,nLocal) :: A
353      real (kind=dp), dimension(3,nLocal) :: f
354      real (kind=dp), dimension(3,nLocal) :: t
# Line 359 | Line 359 | contains  
359      integer :: l, m, lm, id1, id2, localError, function_type
360      real (kind=dp) :: sigma_i, s_i, eps_i, sigma_j, s_j, eps_j
361      real (kind=dp) :: coeff
362 +    real (kind=dp) :: pot_temp
363  
364      real (kind=dp) :: dsigmaidx, dsigmaidy, dsigmaidz
365      real (kind=dp) :: dsigmaidux, dsigmaiduy, dsigmaiduz
# Line 377 | Line 378 | contains  
378  
379      real (kind=dp) :: xi, yi, zi, xj, yj, zj, xi2, yi2, zi2, xj2, yj2, zj2
380  
381 +    real (kind=dp) :: sti2, stj2
382 +
383      real (kind=dp) :: proji, proji3, projj, projj3
384      real (kind=dp) :: cti, ctj, cpi, cpj, spi, spj
385      real (kind=dp) :: Phunc, sigma, s, eps, rtdenom, rt
# Line 517 | Line 520 | contains  
520  
521         xi2 = xi*xi
522         yi2 = yi*yi
523 <       zi2 = zi*zi
521 <      
522 <       proji = sqrt(xi2 + yi2)
523 <       proji3 = proji*proji*proji
524 <      
523 >       zi2 = zi*zi            
524         cti = zi / rij
525 +
526 +       if (cti .gt. 1.0_dp) cti = 1.0_dp
527 +       if (cti .lt. -1.0_dp) cti = -1.0_dp
528  
529         dctidx = - zi * xi / r3
530         dctidy = - zi * yi / r3
531         dctidz = 1.0d0 / rij - zi2 / r3
532 <       dctidux =  yi / rij
533 <       dctiduy = -xi / rij
534 <       dctiduz = 0.0d0
532 >       dctidux = - (zi * xi2) / r3
533 >       dctiduy = - (zi * yi2) / r3
534 >       dctiduz = zi / rij - (zi2 * zi) / r3
535 >
536 >       ! this is an attempt to try to truncate the singularity when
537 >       ! sin(theta) is near 0.0:
538 >
539 >       sti2 = 1.0_dp - cti*cti
540 >       if (dabs(sti2) .lt. 1.0d-12) then
541 >          proji = sqrt(rij * 1.0d-12)
542 >          dcpidx = 1.0d0 / proji
543 >          dcpidy = 0.0d0
544 >          dcpidux = xi / proji
545 >          dcpiduy = 0.0d0
546 >          dspidx = 0.0d0
547 >          dspidy = 1.0d0 / proji
548 >          dspidux = 0.0d0
549 >          dspiduy = yi / proji
550 >       else
551 >          proji = sqrt(xi2 + yi2)
552 >          proji3 = proji*proji*proji
553 >          dcpidx = 1.0d0 / proji - xi2 / proji3
554 >          dcpidy = - xi * yi / proji3
555 >          dcpidux = xi / proji - (xi2 * xi) / proji3
556 >          dcpiduy = - (xi * yi2) / proji3
557 >          dspidx = - xi * yi / proji3
558 >          dspidy = 1.0d0 / proji - yi2 / proji3
559 >          dspidux = - (yi * xi2) / proji3
560 >          dspiduy = yi / proji - (yi2 * yi) / proji3
561 >       endif
562        
563         cpi = xi / proji
535       dcpidx = 1.0d0 / proji - xi2 / proji3
536       dcpidy = - xi * yi / proji3
564         dcpidz = 0.0d0
565 <       dcpidux = xi * yi * zi / proji3
539 <       dcpiduy = -zi * (1.0d0 / proji - xi2 / proji3)
540 <       dcpiduz = -yi * (1.0d0 / proji - xi2 / proji3)  - (xi2 * yi / proji3)
565 >       dcpiduz = 0.0d0
566        
567         spi = yi / proji
543       dspidx = - xi * yi / proji3
544       dspidy = 1.0d0 / proji - yi2 / proji3
568         dspidz = 0.0d0
569 <       dspidux = -zi * (1.0d0 / proji - yi2 / proji3)
547 <       dspiduy = xi * yi * zi / proji3
548 <       dspiduz = xi * (1.0d0 / proji - yi2 / proji3) + (xi * yi2 / proji3)
569 >       dspiduz = 0.0d0
570  
571         call Associated_Legendre(cti, ShapeMap%Shapes(st1)%bigM, &
572              ShapeMap%Shapes(st1)%bigL, LMAX, &
# Line 753 | Line 774 | contains  
774         xj2 = xj*xj
775         yj2 = yj*yj
776         zj2 = zj*zj
756      
757       projj = sqrt(xj2 + yj2)
758       projj3 = projj*projj*projj
759      
777         ctj = zj / rij
778 +      
779 +       if (ctj .gt. 1.0_dp) ctj = 1.0_dp
780 +       if (ctj .lt. -1.0_dp) ctj = -1.0_dp
781 +
782         dctjdx = - zj * xj / r3
783         dctjdy = - zj * yj / r3
784         dctjdz = 1.0d0 / rij - zj2 / r3
785 <       dctjdux =  yj / rij
786 <       dctjduy = -xj / rij
787 <       dctjduz = 0.0d0
785 >       dctjdux = - (zi * xj2) / r3
786 >       dctjduy = - (zj * yj2) / r3
787 >       dctjduz = zj / rij - (zj2 * zj) / r3
788        
789 <       cpj = xj / projj
790 <       dcpjdx = 1.0d0 / projj - xj2 / projj3
791 <       dcpjdy = - xj * yj / projj3
789 >       ! this is an attempt to try to truncate the singularity when
790 >       ! sin(theta) is near 0.0:
791 >
792 >       stj2 = 1.0_dp - ctj*ctj
793 >       if (dabs(stj2) .lt. 1.0d-12) then
794 >          projj = sqrt(rij * 1.0d-12)
795 >          dcpjdx = 1.0d0 / projj
796 >          dcpjdy = 0.0d0
797 >          dcpjdux = xj / projj
798 >          dcpjduy = 0.0d0
799 >          dspjdx = 0.0d0
800 >          dspjdy = 1.0d0 / projj
801 >          dspjdux = 0.0d0
802 >          dspjduy = yj / projj
803 >       else
804 >          projj = sqrt(xj2 + yj2)
805 >          projj3 = projj*projj*projj
806 >          dcpjdx = 1.0d0 / projj - xj2 / projj3
807 >          dcpjdy = - xj * yj / projj3
808 >          dcpjdux = xj / projj - (xj2 * xj) / projj3
809 >          dcpjduy = - (xj * yj2) / projj3
810 >          dspjdx = - xj * yj / projj3
811 >          dspjdy = 1.0d0 / projj - yj2 / projj3
812 >          dspjdux = - (yj * xj2) / projj3
813 >          dspjduy = yj / projj - (yj2 * yj) / projj3
814 >       endif
815 >
816 >       cpj = xj / projj
817         dcpjdz = 0.0d0
818 <       dcpjdux = xj * yj * zj / projj3
773 <       dcpjduy = -zj * (1.0d0 / projj - xj2 / projj3)
774 <       dcpjduz = -yj * (1.0d0 / projj - xj2 / projj3)  - (xj2 * yj / projj3)
818 >       dcpjduz = 0.0d0
819        
820         spj = yj / projj
777       dspjdx = - xj * yj / projj3
778       dspjdy = 1.0d0 / projj - yj2 / projj3
821         dspjdz = 0.0d0
822 <       dspjdux = -zj * (1.0d0 / projj - yj2 / projj3)
823 <       dspjduy = xj * yj * zj / projj3
824 <       dspjduz = xj * (1.0d0 / projj - yi2 / projj3) + (xj * yj2 / projj3)
825 <      
822 >       dspjduz = 0.0d0
823 >
824 >
825 >       write(*,*) 'dcpdu = ' ,dcpidux, dcpiduy, dcpiduz
826 >       write(*,*) 'dcpdu = ' ,dcpjdux, dcpjduy, dcpjduz
827         call Associated_Legendre(ctj, ShapeMap%Shapes(st2)%bigM, &
828              ShapeMap%Shapes(st2)%bigL, LMAX, &
829              plm_j, dlm_j)
# Line 920 | Line 963 | contains  
963               dPhuncdUz = coeff*(spj * dum_j(m-1)*dcpjduz + dspjduz *um_j(m-1))
964            endif
965  
966 +          write(*,*) 'l,m = ', l, m, coeff, dPhuncdUx, dPhuncdUy, dPhuncdUz
967 +
968            eps_j = eps_j + plm_j(m,l)*Phunc
969            
970            depsjdx = depsjdx + plm_j(m,l)*dPhuncdX + &
# Line 990 | Line 1035 | contains  
1035      depsduyj = eps_i * depsjduy / (2.0d0 * eps)
1036      depsduzj = eps_i * depsjduz / (2.0d0 * eps)
1037      
1038 + !!$    write(*,*) 'depsidu = ', depsidux, depsiduy, depsiduz
1039 + !!$    write(*,*) 'depsjdu = ', depsjdux, depsjduy, depsjduz
1040 + !!$
1041 + !!$    write(*,*) 'depsdui = ', depsduxi, depsduyi, depsduzi
1042 + !!$    write(*,*) 'depsduj = ', depsduxj, depsduyj, depsduzj
1043 + !!$
1044 + !!$    write(*,*) 's, sig, eps = ', s, sigma, eps
1045 +
1046      rtdenom = rij-sigma+s
1047      rt = s / rtdenom
1048  
# Line 1014 | Line 1067 | contains  
1067      rt12 = rt6*rt6
1068      rt126 = rt12 - rt6
1069  
1070 +    pot_temp = 4.0d0 * eps * rt126
1071 +
1072 +    vpair = vpair + pot_temp
1073      if (do_pot) then
1074   #ifdef IS_MPI
1075 <       pot_row(atom1) = pot_row(atom1) + 2.0d0*eps*rt126*sw
1076 <       pot_col(atom2) = pot_col(atom2) + 2.0d0*eps*rt126*sw
1075 >       pot_row(atom1) = pot_row(atom1) + 0.5d0*pot_temp*sw
1076 >       pot_col(atom2) = pot_col(atom2) + 0.5d0*pot_temp*sw
1077   #else
1078 <       pot = pot + 4.0d0*eps*rt126*sw
1078 >       pot = pot + pot_temp*sw
1079   #endif
1080      endif
1081 +
1082 + !!$    write(*,*) 'drtdu, depsdu = ', drtduxi, depsduxi
1083      
1084      dvdxi = 24.0d0*eps*(2.0d0*rt11 - rt5)*drtdxi + 4.0d0*depsdxi*rt126
1085      dvdyi = 24.0d0*eps*(2.0d0*rt11 - rt5)*drtdyi + 4.0d0*depsdyi*rt126
# Line 1040 | Line 1098 | contains  
1098      ! do the torques first since they are easy:
1099      ! remember that these are still in the body fixed axes
1100  
1043    txi = dvduxi * sw
1044    tyi = dvduyi * sw
1045    tzi = dvduzi * sw
1101  
1102 <    txj = dvduxj * sw
1103 <    tyj = dvduyj * sw
1104 <    tzj = dvduzj * sw
1102 > !!$    write(*,*) 'sw = ', sw
1103 > !!$    write(*,*) 'dvdu1 = ', dvduxi, dvduyi, dvduzi
1104 > !!$    write(*,*) 'dvdu2 = ', dvduxj, dvduyj, dvduzj
1105 > !!$
1106 >    txi =  (dvduzi - dvduyi) * sw
1107 >    tyi =  (dvduxi - dvduzi) * sw
1108 >    tzi =  (dvduyi - dvduxi) * sw
1109 >
1110 >    txj = (dvduzj - dvduyj) * sw
1111 >    tyj = (dvduxj - dvduzj) * sw
1112 >    tzj = (dvduyj - dvduxj) * sw
1113  
1114 + !!$    txi = -dvduxi * sw
1115 + !!$    tyi = -dvduyi * sw
1116 + !!$    tzi = -dvduzi * sw
1117 + !!$
1118 + !!$    txj = dvduxj * sw
1119 + !!$    tyj = dvduyj * sw
1120 + !!$    tzj = dvduzj * sw
1121 +
1122 +    write(*,*) 't1 = ', txi, tyi, tzi
1123 +    write(*,*) 't2 = ', txj, tyj, tzj
1124 +
1125      ! go back to lab frame using transpose of rotation matrix:
1126      
1127   #ifdef IS_MPI
# Line 1111 | Line 1185 | contains  
1185      fyji = -fyjj
1186      fzji = -fzjj
1187  
1188 <    fxradial = fxii + fxji
1189 <    fyradial = fyii + fyji
1190 <    fzradial = fzii + fzji
1188 >    fxradial = 0.5_dp * (fxii + fxji)
1189 >    fyradial = 0.5_dp * (fyii + fyji)
1190 >    fzradial = 0.5_dp * (fzii + fzji)
1191  
1192   #ifdef IS_MPI
1193      f_Row(1,atom1) = f_Row(1,atom1) + fxradial
# Line 1148 | Line 1222 | contains  
1222         fpair(3) = fpair(3) + fzradial
1223        
1224      endif
1225 <    
1225 >
1226    end subroutine do_shape_pair
1227      
1228    SUBROUTINE Associated_Legendre(x, l, m, lmax, plm, dlm)        

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines