milov_igor

Ewald potential

Nov 15th, 2011
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.       program ewald
  2.       implicit none
  3.  
  4.       real*8 eta
  5.       parameter(eta=0.8d0)     !тот самый параметр,от которого почему-то зависит потенциал
  6.  
  7.       real*8 eps
  8.       parameter(eps=1.0d-9)
  9.      
  10.       integer N_max
  11.       parameter(N_max=100)
  12.  
  13.       integer H_max
  14.       parameter(H_max=30)
  15.  
  16.       integer k_max
  17.       parameter(k_max=3*H_max**2)
  18.  
  19.       integer n,j
  20.       integer H,k,m,n_e
  21.       integer k1,k2,k3
  22.       integer m1,m2,m3
  23.       integer i1,i2,i3
  24.            
  25.       real*8 R_k(-H_max:H_max,-H_max:H_max,-H_max:H_max,3)
  26.       real*8 e(N_max,4)    !   coordinates and values of original charges
  27.       real*8 a1(3),a2(3),a3(3)
  28.  
  29.       real*8 g_m(-H_max:H_max,-H_max:H_max,-H_max:H_max,3)
  30.       real*8 g_m2(-H_max:H_max,-H_max:H_max,-H_max:H_max)
  31.       real*8 a2_a3(3),a3_a1(3),a1_a2(3)
  32.       real*8 b1(3),b2(3),b3(3)
  33.       real*8 Q_r
  34.       real*8 pi
  35.  
  36.       real*8 w1,w2
  37.  
  38.       real*8 V_1(0:k_max,H_max)
  39.       real*8 V_2(0:k_max,H_max)
  40.       real*8 W_1(0:H_max)
  41.       real*8 W_2(0:H_max)
  42.       real*8 V
  43.  
  44. !==========================================================
  45.  
  46.       open(10,file='original_charges.inp',status='old')
  47.       read(10,*)n_e
  48.       do n=1,n_e
  49.         read(10,*)j,(e(n,k),k=1,4)
  50.       enddo
  51.       close(10)    
  52.  
  53.       pi=4*datan(1.0d0)  
  54.  
  55.       a1(1)=0.0d0
  56.       a1(2)=2.0d0
  57.       a1(3)=2.0d0
  58.       a2(1)=2.0d0
  59.       a2(2)=0.0d0
  60.       a2(3)=2.0d0
  61.       a3(1)=2.0d0
  62.       a3(2)=2.0d0
  63.       a3(3)=0.0d0  
  64.  
  65. !==========================================================
  66.  
  67. !   find direct lattice vectors R_k
  68.       do k1=-H_max,H_max
  69.         do k2=-H_max,H_max
  70.           do k3=-H_max,H_max
  71.             do j=1,3
  72.               R_k(k1,k2,k3,j)=k1*a1(j)+k2*a2(j)+k3*a3(j)
  73.             enddo
  74.           enddo
  75.         enddo
  76.       enddo
  77.  
  78. !=================================================================================
  79. !   find W_1(H)
  80. !=================================================================================
  81.  
  82.       do H=1,H_max
  83.         do k=0,k_max
  84.           V_1(k,H)=0.0d0
  85.         enddo
  86.       enddo
  87.  
  88.       do H=1,H_max
  89.         do k1=-H,H
  90.           do k2=-H,H
  91.             do k3=-H,H
  92.               do j=1,n_e
  93.  
  94.                 k=k1**2+k2**2+k3**2
  95.  
  96.                 if (k.eq.0.0d0) then
  97.                   V_1(k,H)=e(2,4)*erfc(eta*sqrt(e(2,1)**2+
  98.      &                     e(2,2)**2+e(2,3)**2))
  99.                 else
  100.  
  101.       V_1(k,H)=V_1(k,H)+e(j,4)*erfc(eta*sqrt
  102.      &         ((R_k(k1,k2,k3,1)+e(j,1))**2+
  103.      &         (R_k(k1,k2,k3,2)+e(j,2))**2+
  104.      &         (R_k(k1,k2,k3,3)+e(j,3))**2))/
  105.      &         sqrt((R_k(k1,k2,k3,1)+e(j,1))**2+
  106.      &         (R_k(k1,k2,k3,2)+e(j,2))**2+
  107.      &         (R_k(k1,k2,k3,3)+e(j,3))**2)
  108.  
  109.                 endif
  110.               enddo
  111.             enddo
  112.           enddo
  113.         enddo
  114.       enddo
  115.  
  116.       do H=0,H_max
  117.         W_1(H)=0.0d0
  118.       enddo
  119.  
  120.       do H=1,H_max
  121.         do k=0,k_max
  122.           W_1(H)=W_1(H)+V_1(k,H)
  123.         enddo
  124.         if (abs(W_1(H)-W_1(H-1)).lt.eps) then
  125.           w1=W_1(H-1)
  126.           write(*,*)H-1,w1
  127.           go to 1
  128.         endif        
  129.       enddo
  130.  
  131. !===========================================================================
  132.  
  133. !   vector product [a2,a3]
  134. 1     do i1=1,3
  135.         i2=i1+1
  136.         if(i2.gt.3)i2=i2-3
  137.         i3=i2+1
  138.         if(i3.gt.3)i3=i3-3
  139.         a2_a3(i1)=a2(i2)*a3(i3)-a2(i3)*a3(i2)
  140.       enddo    
  141.  
  142. !   vector product [a3,a1]
  143.       do i1=1,3
  144.         i2=i1+1
  145.         if(i2.gt.3)i2=i2-3
  146.         i3=i2+1
  147.         if(i3.gt.3)i3=i3-3
  148.         a3_a1(i1)=a3(i2)*a1(i3)-a3(i3)*a1(i2)
  149.       enddo    
  150.  
  151. !   vector product [a1,a2]
  152.       do i1=1,3
  153.         i2=i1+1
  154.         if(i2.gt.3)i2=i2-3
  155.         i3=i2+1
  156.         if(i3.gt.3)i3=i3-3
  157.         a1_a2(i1)=a1(i2)*a2(i3)-a1(i3)*a2(i2)
  158.       enddo
  159.  
  160. !   find Q_r
  161.       Q_r=0.0d0
  162.       do j=1,3
  163.         Q_r=Q_r+a1(j)*a2_a3(j)
  164.       enddo  
  165.  
  166. !   find b1,b2,b3
  167.       do j=1,3
  168.         b1(j)=a2_a3(j)/Q_r
  169.       enddo
  170.  
  171.       do j=1,3
  172.         b2(j)=a3_a1(j)/Q_r
  173.       enddo
  174.  
  175.       do j=1,3
  176.         b3(j)=a1_a2(j)/Q_r
  177.       enddo
  178.  
  179. !   find reciptorical lattice vectors g_m
  180.       do m1=-H_max,H_max
  181.         do m2=-H_max,H_max
  182.           do m3=-H_max,H_max
  183.               do j=1,3
  184.                 g_m(m1,m2,m3,j)=2*pi*(m1*b1(j)+m2*b2(j)+m3*b3(j))
  185.               enddo
  186.           enddo
  187.         enddo
  188.       enddo
  189.  
  190. !   find g_m**2
  191.       do m1=-H_max,H_max
  192.         do m2=-H_max,H_max
  193.           do m3=-H_max,H_max
  194.             g_m2(m1,m2,m3)=0.0d0
  195.           enddo
  196.         enddo
  197.       enddo
  198.  
  199.       do m1=-H_max,H_max
  200.         do m2=-H_max,H_max
  201.           do m3=-H_max,H_max
  202.             do j=1,3
  203.               g_m2(m1,m2,m3)=g_m2(m1,m2,m3)+
  204.      &        g_m(m1,m2,m3,j)*g_m(m1,m2,m3,j)
  205.             enddo
  206.           enddo
  207.         enddo
  208.       enddo
  209.  
  210. !=================================================================================
  211. !   find W_2(H)
  212. !=================================================================================
  213.  
  214.       do H=1,H_max
  215.         do m=0,k_max
  216.           V_2(m,H)=0.0d0
  217.         enddo
  218.       enddo
  219.  
  220.       do H=1,H_max
  221.         do m1=-H,H
  222.           do m2=-H,H
  223.             do m3=-H,H
  224.               do j=1,n_e
  225.  
  226.               m=m1**2+m2**2+m3**2
  227.              
  228.               if (g_m2(m1,m2,m3).ne.0.0d0) then
  229.  
  230.               V_2(m,H)=V_2(m,H)+(4.0d0*pi/Q_r)*e(j,4)/g_m2(m1,m2,m3)*
  231.      &        dcos((g_m(m1,m2,m3,1)*e(j,1))+(g_m(m1,m2,m3,2)*
  232.      &        e(j,2))+(g_m(m1,m2,m3,3)*e(j,3)))*
  233.      &        exp(-g_m2(m1,m2,m3)/(4.0d0*(eta)**2))
  234.  
  235.               endif
  236.  
  237.               enddo
  238.             enddo
  239.           enddo
  240.         enddo
  241.       enddo
  242.  
  243.       do H=0,H_max
  244.         W_2(H)=0.0d0
  245.       enddo
  246.  
  247.       do H=1,H_max
  248.         do m=0,k_max
  249.           W_2(H)=W_2(H)+V_2(m,H)
  250.         enddo
  251.         if (abs(W_2(H)-W_2(H-1)).lt.eps) then
  252.           w2=W_2(H-1)
  253.           write(*,*)H-1,w2
  254.           go to 2
  255.         endif        
  256.       enddo
  257.  
  258. !==============================================================================
  259.  
  260. 2     V=w1+w2-2*eta*e(1,4)/sqrt(pi)
  261.       write(*,*)V
  262.  
  263.       end
Advertisement
Add Comment
Please, Sign In to add comment