Statistiques
| Révision :

root / src / egrad_chamfre.f90 @ 2

Historique | Voir | Annoter | Télécharger (24,8 ko)

1
!*************############### Attention	###############*************
2
!(a) Two parameters aa and br(3,3) must be provided in main program
3
!(b) At first, z=0 for the outmost surface 
4
!(c) The units of all parameters are not atomic units, but angstrom, eV etc.
5
!(d) Before using this routine, you must confirm that the energy is CONSISTENT with its derivative. 
6
!                        This check of consistency is VERY IMPORTANT for energy conservation in MD.
7
!!!
8
!!  xa, ya,za present the positions of atoms. v is the energy of the system. dvdr present the force along the x,y,z directions.
9
!!
10
subroutine egrad_chamfre(Nat,V,Geom,Grad)
11
! WAS xa,ya,za,v,dvdr)
12

    
13

    
14
  use Path_module, only : Lat_a,Lat_b,Lat_c,order,orderinv,renum
15
  use Io_module
16

    
17

    
18
   IMPLICIT NONE
19

    
20
       INTEGER(KINT), INTENT(IN) :: Nat
21
       REAL(KREAL), INTENT(OUT) :: V,grad(Nat*3)
22
       REAL(KREAL), INTENT(IN) :: Geom(Nat,3)
23

    
24
!     Bohr --> Angstr
25
      real(KREAL), parameter :: BOHR   = 0.52917726D+00
26

    
27
!! PFL 2010 Nov. 28 ->
28
! for now I keep this old F77 scheme. This has to be replaced by ALLOCATABLE
29
! things
30
! <- PFL 2010 Nov 28.
31
  REAL(KREAL) :: xa(100),ya(100),za(100),dvdr(100,3)
32
  REAL(KREAL) :: rshort,rlong,zshort,zlong
33
  REAL(KREAL), SAVE :: rnc,rnn,rhh,rch,rnh,ann(100),anc(100),anh(100),ach(100),ahh(100),a(100)
34
  REAL(KREAL) :: dv(100,10,3),df(100,10,3)
35
  REAL(KREAL) :: px(9000),py(9000),pz(9000),tmp,temp,rtemp,yf
36
  INTEGER(KINT) :: ka(9000),kx(9000),ky(9000),itx,ity,nf(100),mf(100,500)
37
  REAL(KREAL) :: xi(3),xj(3),xk(3),rij,rik,rjk,rji,rki,er,eb
38
  REAL(KREAL) :: fcut,tf,bodij,bodji,bod,cost,gtheta,dgdt,xt,t1,t2,t3
39
  REAL(KREAL) :: zi,fcut2
40
  INTEGER(KINT) :: np,nq,nh,nc
41
  INTEGER(KINT) :: i, j, nn, m, n, mid, n1, im, jm, n2,n3,n4, iat
42
  LOGICAL, SAVE :: First=.TRUE.
43
  LOGICAL :: debug, FExist
44

    
45
  common/zdis/zshort,zlong
46
  common/rdistanc/rshort,rlong
47

    
48

    
49
  INTERFACE
50
     function valid(string) result (isValid)
51
       CHARACTER(*), intent(in) :: string
52
       logical                  :: isValid
53
     END function VALID
54
     
55
  END INTERFACE
56

    
57
!**********************************************
58

    
59

    
60
  debug=valid('egrad_chamfre')
61

    
62
 if (debug) Call Header('Entering Egrad_chamfre')
63

    
64
  v=0.0;dvdr=0.0
65
!******prepare the parameters of REBO potential
66
!rshort=3.5 
67
!rlong=3.9
68
zshort=3.5
69
zlong=4.5
70

    
71
rnn=3.2    !! to adjust
72
rnc=3.5    !! to adjust
73
rnh=3.0    !! to adjust
74
rch=3.2    !! to adjust
75
rhh=3.2    !! to adjust
76

    
77
!rph=rlong
78

    
79
 if (First) THEN
80
    First=.FALSE.
81
    INQUIRE(FILE="parameter.dat",EXIST=FExist)
82
    if (.NOT.Fexist) THEN
83
       WRITE(*,*) "!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!"
84
       WRITE(*,*) "!!   egrad_chamfre             !!!!"
85
       WRITE(*,*) "The file parameter.dat does not exists."
86
       WRITE(*,*) "!!   egrad_chamfre             !!!!"
87
       WRITE(*,*) "!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!"
88
       STOP
89
    END IF
90
open(1,file="parameter.dat")
91
do i=1,5   !Ni-Ni
92
read(1,*)ann(i)
93
enddo
94

    
95
do i=1,5   !Ni-C
96
read(1,*)anc(i)
97
enddo
98

    
99
do i=1,5   !Ni-H
100
read(1,*)anh(i)
101
enddo
102

    
103
do i=1,5   !H-H
104
read(1,*)ahh(i)
105
enddo
106
do i=1,5  !C-H
107
read(1,*)ach(i)
108
enddo
109
!********LONG INTERACTION **********
110
!do i=1,2
111
!read(1,*)a(i)
112
!enddo
113
close(1)
114
END IF
115
!************************************
116
np=45
117
nh=4
118
nc=1
119
nq=np+nh+nc
120
!************************************
121

    
122
 DO I=1,Nat
123
    Iat=Order(I)
124
    xa(I)=Geom(Iat,1)
125
    ya(I)=Geom(Iat,2)
126
    za(I)=Geom(Iat,3)
127
 END DO
128

    
129
px=0.0;py=0.0;pz=0.0
130
nn=0
131
 do m=-1,1
132
    do n=-1,1
133
       do i=1,nq
134
          if(m==0.and.n==0.and.i==1)mid=nn
135
            nn=nn+1
136
            px(nn)=xa(i)+m*lat_a(1)+n*lat_b(1)
137
            py(nn)=ya(i)+m*lat_a(2)+n*lat_b(2)
138
            pz(nn)=za(i)
139
            ka(nn)=i;kx(nn)=m;ky(nn)=n
140
       enddo
141
    enddo
142
 enddo
143
!***********************xyz file required for MS input
144
 open(123,file="111.xyz",ACCESS='APPEND')
145
    write(123,*)nn
146
    write(123,*)
147
   do i=1,nn
148
       if(ka(i)<(np+1))then
149
            write(123,10)'Ni',px(i),py(i),pz(i)
150
       elseif (ka(i)<np+5) then
151
            write(123,10)'H',px(i),py(i),pz(i)
152
       else
153
            write(123,10)'C',px(i),py(i),pz(i)
154
  10 format(a6,3f15.8)
155
       endif
156
   enddo
157
 close(123)
158
!******************************************
159
 do i=1,nq
160
    tmp=px(i);px(i)=px(i+mid);px(i+mid)=tmp
161
    tmp=py(i);py(i)=py(i+mid);py(i+mid)=tmp
162
    tmp=pz(i);pz(i)=pz(i+mid);pz(i+mid)=tmp
163
    itx=kx(i);kx(i)=kx(i+mid);kx(i+mid)=itx
164
    ity=ky(i);ky(i)=ky(i+mid);ky(i+mid)=ity
165
 enddo
166
 mid=0
167
!******************************************
168
  nf=0;mf=0
169
    do i=1,nq
170
        nf(i)=0
171
           do j=1,nn
172
             temp=sqrt((px(i)-px(j))**2+(py(i)-py(j))**2+(pz(i)-pz(j))**2)
173
!
174
!rtemp=rlong
175
    if (ka(i+mid)<np+1.and.ka(j+mid)<np+1)then     ! Ni-Ni
176
	     
177
	      rtemp=rnn
178
	 endif
179
    if (ka(i+mid)<np+1.and.ka(j+mid)>np.and.ka(j+mid)<np+5)then  ! Ni-H
180
          
181
           rtemp=rnh
182
     endif
183
    if (ka(i+mid)<np+1.and.ka(j+mid)>np+4) then   ! Ni-C
184
           
185
           rtemp=rnc
186
     endif
187
      if (ka(i+mid)>np.and.ka(i+mid)<np+5.and.ka(j+mid)>np+4)  then ! H-C
188
           
189
            rtemp=rch
190
     endif
191
    if (ka(i+mid)>np.and.ka(i+mid)<np+5.and.ka(j+mid)>np.and.ka(j+mid)<np+5)then  ! H-H
192
	       
193
	        rtemp=rhh
194
	 endif
195
    if (ka(i+mid)>np.and.ka(i+mid)<np+5.and.ka(j+mid)<np+1) then  ! H-Ni
196
            
197
             rtemp=rnh
198
       endif
199
    if (ka(i+mid)>np+4.and.ka(j+mid)<np+1) then !  C-Ni
200
            
201
             rtemp=rnc
202
     endif
203
    if (ka(i+mid)>np+4.and.ka(j+mid)>np.and.ka(j+mid)<np+5) then ! C-H
204
             
205
              rtemp=rch
206
     endif
207

    
208
      if(temp>0.1.and.temp<rtemp)then
209
         nf(i)=nf(i)+1
210
         mf(i,nf(i))=j
211
      endif
212
!
213
    enddo
214
  !write(*,*)nf(i)
215
 enddo
216
!**************************************
217
!stop
218

    
219
!*************************************Starting to calculate the sum
220
  yf=0.0;dvdr=0.0
221
   do i=1,nq
222
      er=0.0;eb=0.0
223
      dv=0.0;df=0.0
224
      do j=1,nf(i)
225

    
226
             xi(1)=px(i);      xi(2)=py(i);      xi(3)=pz(i)
227
             xj(1)=px(mf(i,j));xj(2)=py(mf(i,j));xj(3)=pz(mf(i,j))
228
             rij=sqrt((xj(1)-xi(1))**2.0+(xj(2)-xi(2))**2.0+(xj(3)-xi(3))**2.0)
229
             n1=ka(i)/(np+1);n2=ka(mf(i,j))/(np+1)    !!!  Ni 46  H  50  C
230
             n3=ka(i)/(np+5);n4=ka(mf(i,j))/(np+5)
231
	
232
 !**********************************Ni-Ni interaction
233
 ! **********
234
         if(n1==0.and.n3==0.and.n2==0.and.n4==0)then		 !Ni-Ni
235
           call fctNiNi(rnn,rij,fcut)
236
           call dfcutNiNi(rnn,rij,tf)
237
            eb=eb+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut
238
            er=er+ann(4)*exp(-1.0*ann(2)*(rij/ann(3)-1.0))*fcut
239

    
240
!Calculation of FORCE
241
do im=1,3
242
dv(i,1,im)=dv(i,1,im)+ann(4)*exp(-1.0*ann(2)*(rij/ann(3)-1.0))*fcut*(-ann(2)/ann(3))*(xi(im)-xj(im))/rij
243
dv(i,2,im)=dv(i,2,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut
244
dv(i,3,im)=dv(i,3,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut*(-2.0*ann(1)/ann(3))*(xi(im)-xj(im))/rij
245
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+ann(4)*exp(-1.0*ann(2)*(rij/ann(3)-1.0))*fcut*(-ann(2)/ann(3))*(xj(im)-xi(im))/rij
246
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut
247
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut*(-2.0*ann(1)/ann(3))*(xj(im)-xi(im))/rij
248

    
249
df(i,1,im)=df(i,1,im)+ann(4)*exp(-1.0*ann(2)*(rij/ann(3)-1.0))*tf*(xi(im)-xj(im))/rij
250
df(i,2,im)=df(i,2,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut
251
df(i,3,im)=df(i,3,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*tf*(xi(im)-xj(im))/rij
252
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+ann(4)*exp(-1.0*ann(2)*(rij/ann(3)-1.0))*tf*(xj(im)-xi(im))/rij
253
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*fcut
254
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+ann(5)*exp(-2.0*ann(1)*(rij/ann(3)-1.0))*tf*(xj(im)-xi(im))/rij
255
enddo
256
!
257
             endif
258

    
259
 !**********************************Ni-H interaction
260
! **********
261
         if(n1==0.and.n3==0.and.n2==1.and.n4==0)then		 !Ni-H
262
           call fctNiH(rnh,rij,fcut)
263
           call dfcutNiH(rnh,rij,tf)
264
             eb=eb+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
265
             er=er+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut
266

    
267
!Calculation of FORCE
268
do im=1,3
269
dv(i,1,im)=dv(i,1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut*(-anh(2)/anh(3))*(xi(im)-xj(im))/rij
270
dv(i,2,im)=dv(i,2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
271
dv(i,3,im)=dv(i,3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut*(-2.0*anh(1)/anh(3))*(xi(im)-xj(im))/rij
272
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut*(-anh(2)/anh(3))*(xj(im)-xi(im))/rij
273
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
274
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut*(-2.0*anh(1)/anh(3))*(xj(im)-xi(im))/rij
275

    
276
df(i,1,im)=df(i,1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*tf*(xi(im)-xj(im))/rij
277
df(i,2,im)=df(i,2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
278
df(i,3,im)=df(i,3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*tf*(xi(im)-xj(im))/rij
279
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*tf*(xj(im)-xi(im))/rij
280
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
281
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*tf*(xj(im)-xi(im))/rij
282
enddo
283
!
284
!
285
             endif
286

    
287
!**********************************Ni-C interaction
288
! **********
289
         if(n1==0.and.n3==0.and.n2==1.and.n4==1)then		 !Ni-C
290
           call fctNiC(rnc,rij,fcut)
291
           call dfcutNiC(rnc,rij,tf)
292
            eb=eb+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
293
            er=er+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut
294

    
295
!Calculation of FORCE
296
do im=1,3
297
dv(i,1,im)=dv(i,1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut*(-anc(2)/anc(3))*(xi(im)-xj(im))/rij
298
dv(i,2,im)=dv(i,2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
299
dv(i,3,im)=dv(i,3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut*(-2.0*anc(1)/anc(3))*(xi(im)-xj(im))/rij
300
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut*(-anc(2)/anc(3))*(xj(im)-xi(im))/rij
301
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
302
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut*(-2.0*anc(1)/anc(3))*(xj(im)-xi(im))/rij
303

    
304
df(i,1,im)=df(i,1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*tf*(xi(im)-xj(im))/rij
305
df(i,2,im)=df(i,2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
306
df(i,3,im)=df(i,3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*tf*(xi(im)-xj(im))/rij
307
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*tf*(xj(im)-xi(im))/rij
308
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
309
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*tf*(xj(im)-xi(im))/rij
310
enddo
311
!
312
               endif
313
!!**********************************H-Ni interaction
314
! **********
315
         if(n1==1.and.n3==0.and.n2==0.and.n4==0)then        ! H-Ni
316
           call fctNiH(rnh,rij,fcut)
317
           call dfcutNiH(rnh,rij,tf)
318
             eb=eb+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
319
             er=er+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut
320

    
321
!Calculation of FORCE
322
do im=1,3
323
dv(i,1,im)=dv(i,1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut*(-anh(2)/anh(3))*(xi(im)-xj(im))/rij
324
dv(i,2,im)=dv(i,2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
325
dv(i,3,im)=dv(i,3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut*(-2.0*anh(1)/anh(3))*(xi(im)-xj(im))/rij
326
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*fcut*(-anh(2)/anh(3))*(xj(im)-xi(im))/rij
327
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
328
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut*(-2.0*anh(1)/anh(3))*(xj(im)-xi(im))/rij
329

    
330
df(i,1,im)=df(i,1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*tf*(xi(im)-xj(im))/rij
331
df(i,2,im)=df(i,2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
332
df(i,3,im)=df(i,3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*tf*(xi(im)-xj(im))/rij
333
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+anh(4)*exp(-1.0*anh(2)*(rij/anh(3)-1.0))*tf*(xj(im)-xi(im))/rij
334
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*fcut
335
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+anh(5)*exp(-2.0*anh(1)*(rij/anh(3)-1.0))*tf*(xj(im)-xi(im))/rij
336
enddo
337
!
338
              endif
339
!!**********************************H-H interaction
340
! **********
341
        if(n1==1.and.n3==0.and.n2==1.and.n4==0)then   !H-H
342
           call fctHH(rhh,rij,fcut)
343
           call dfcutHH(rhh,rij,tf)
344
              eb=eb+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut
345
              er=er+ahh(4)*exp(-1.0*ahh(2)*(rij/ahh(3)-1.0))*fcut
346

    
347
!Calculation of FORCE
348
do im=1,3
349
dv(i,1,im)=dv(i,1,im)+ahh(4)*exp(-1.0*ahh(2)*(rij/ahh(3)-1.0))*fcut*(-ahh(2)/ahh(3))*(xi(im)-xj(im))/rij
350
dv(i,2,im)=dv(i,2,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut
351
dv(i,3,im)=dv(i,3,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut*(-2.0*ahh(1)/ahh(3))*(xi(im)-xj(im))/rij
352
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+ahh(4)*exp(-1.0*ahh(2)*(rij/ahh(3)-1.0))*fcut*(-ahh(2)/ahh(3))*(xj(im)-xi(im))/rij
353
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut
354
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut*(-2.0*ahh(1)/ahh(3))*(xj(im)-xi(im))/rij
355

    
356
df(i,1,im)=df(i,1,im)+ahh(4)*exp(-1.0*ahh(2)*(rij/ahh(3)-1.0))*tf*(xi(im)-xj(im))/rij
357
df(i,2,im)=df(i,2,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut
358
df(i,3,im)=df(i,3,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*tf*(xi(im)-xj(im))/rij
359
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+ahh(4)*exp(-1.0*ahh(2)*(rij/ahh(3)-1.0))*tf*(xj(im)-xi(im))/rij
360
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*fcut
361
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+ahh(5)*exp(-2.0*ahh(1)*(rij/ahh(3)-1.0))*tf*(xj(im)-xi(im))/rij
362
enddo
363
!
364
             endif
365

    
366

    
367
!!**********************************H-C interaction
368
! **********
369
        if(n1==1.and.n3==0.and.n2==1.and.n4==1)then   !H-C
370
            call fctCH(rch,rij,fcut)
371
            call dfcutCH(rch,rij,tf)
372
             eb=eb+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
373
             er=er+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut
374

    
375
!Calculation of FORCE
376
do im=1,3
377
dv(i,1,im)=dv(i,1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut*(-ach(2)/ach(3))*(xi(im)-xj(im))/rij
378
dv(i,2,im)=dv(i,2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
379
dv(i,3,im)=dv(i,3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut*(-2.0*ach(1)/ach(3))*(xi(im)-xj(im))/rij
380
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut*(-ach(2)/ach(3))*(xj(im)-xi(im))/rij
381
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
382
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut*(-2.0*ach(1)/ach(3))*(xj(im)-xi(im))/rij
383

    
384
df(i,1,im)=df(i,1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*tf*(xi(im)-xj(im))/rij
385
df(i,2,im)=df(i,2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
386
df(i,3,im)=df(i,3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*tf*(xi(im)-xj(im))/rij
387
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*tf*(xj(im)-xi(im))/rij
388
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
389
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*tf*(xj(im)-xi(im))/rij
390
enddo
391
!
392
                endif
393
!!**********************************C-Ni interaction
394
! **********
395
        if(n1==1.and.n3==1.and.n2==0.and.n4==0)then   !C-Ni
396
            call fctNiC(rnc,rij,fcut)
397
            call dfcutNiC(rnc,rij,tf)
398
             eb=eb+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
399
             er=er+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut
400

    
401
!Calculation of FORCE
402
do im=1,3
403
dv(i,1,im)=dv(i,1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut*(-anc(2)/anc(3))*(xi(im)-xj(im))/rij
404
dv(i,2,im)=dv(i,2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
405
dv(i,3,im)=dv(i,3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut*(-2.0*anc(1)/anc(3))*(xi(im)-xj(im))/rij
406
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*fcut*(-anc(2)/anc(3))*(xj(im)-xi(im))/rij
407
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
408
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut*(-2.0*anc(1)/anc(3))*(xj(im)-xi(im))/rij
409

    
410
df(i,1,im)=df(i,1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*tf*(xi(im)-xj(im))/rij
411
df(i,2,im)=df(i,2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
412
df(i,3,im)=df(i,3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*tf*(xi(im)-xj(im))/rij
413
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+anc(4)*exp(-1.0*anc(2)*(rij/anc(3)-1.0))*tf*(xj(im)-xi(im))/rij
414
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*fcut
415
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+anc(5)*exp(-2.0*anc(1)*(rij/anc(3)-1.0))*tf*(xj(im)-xi(im))/rij
416
enddo
417
!
418

    
419
               endif
420
!!**********************************C-H interaction
421
! **********
422
       if(n1==1.and.n3==1.and.n2==1.and.n4==0)then   !C-H
423
           call fctCH(rch,rij,fcut)
424
           call dfcutCH(rch,rij,tf)
425
             eb=eb+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
426
             er=er+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut
427

    
428

    
429
   !Calculation of FORCE
430
do im=1,3
431
dv(i,1,im)=dv(i,1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut*(-ach(2)/ach(3))*(xi(im)-xj(im))/rij
432
dv(i,2,im)=dv(i,2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
433
dv(i,3,im)=dv(i,3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut*(-2.0*ach(1)/ach(3))*(xi(im)-xj(im))/rij
434
dv(ka(mf(i+mid,j)),1,im)=dv(ka(mf(i+mid,j)),1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*fcut*(-ach(2)/ach(3))*(xj(im)-xi(im))/rij
435
dv(ka(mf(i+mid,j)),2,im)=dv(ka(mf(i+mid,j)),2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
436
dv(ka(mf(i+mid,j)),3,im)=dv(ka(mf(i+mid,j)),3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut*(-2.0*ach(1)/ach(3))*(xj(im)-xi(im))/rij
437

    
438
df(i,1,im)=df(i,1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*tf*(xi(im)-xj(im))/rij
439
df(i,2,im)=df(i,2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
440
df(i,3,im)=df(i,3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*tf*(xi(im)-xj(im))/rij
441
df(ka(mf(i+mid,j)),1,im)=df(ka(mf(i+mid,j)),1,im)+ach(4)*exp(-1.0*ach(2)*(rij/ach(3)-1.0))*tf*(xj(im)-xi(im))/rij
442
df(ka(mf(i+mid,j)),2,im)=df(ka(mf(i+mid,j)),2,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*fcut
443
df(ka(mf(i+mid,j)),3,im)=df(ka(mf(i+mid,j)),3,im)+ach(5)*exp(-2.0*ach(1)*(rij/ach(3)-1.0))*tf*(xj(im)-xi(im))/rij
444
enddo
445
!
446

    
447
        endif
448
  !!***************************ONE end****************      
449

    
450
enddo
451
!!******** CALCULATION ENERGY
452
!
453
        yf=yf+er-sqrt(eb)
454
!!*********
455
       do im=1,3
456
            dvdr(i,im)=dvdr(i,im)+dv(i,1,im)-0.5/(dv(i,2,im))**0.5*dv(i,3,im)
457
            dvdr(i,im)=dvdr(i,im)+df(i,1,im)-0.5/(df(i,2,im))**0.5*df(i,3,im)
458
         do j=1,nf(i+mid)
459
             jm=ka(mf(i+mid,j))
460
             dvdr(jm,im)=dvdr(jm,im)+dv(jm,1,im)-0.5/(dv(i,2,im))**0.5*dv(jm,3,im)
461
             dvdr(jm,im)=dvdr(jm,im)+df(jm,1,im)-0.5/(df(i,2,im))**0.5*df(jm,3,im)
462
         enddo
463
       enddo
464
!
465
enddo
466
!!*****************************TWO ENDS**************************
467
!***************************************Long-ranged interaction
468
!do i=nq-4,nq
469
!     zi=pz(i+mid) !-0.3*aa*br(3,3)
470
!     call fct2(zshort,zlong,zi,fcut2)
471
 !    call dfcut2(zshort,zlong,zi,tf)
472
 !    yf=yf+fcut2*(a(6)-a(7)/zi**2.0)
473

    
474
 !  dvdr(i,3)=dvdr(i,3)+fcut2*(a(7)*2.0/zi**3.0)+tf*(a(6)-a(7)/zi**2.0)
475

    
476
!enddo
477
!*******************************************************************
478
  v=yf 
479
   do im=1,3
480
      do jm=1,nq
481
          dvdr(jm,im)=dvdr(jm,im)  
482
      enddo
483
  enddo
484

    
485
!PFL: We convert dvdr into Grad
486
      do jm=1,nq
487
          Iat=Jm
488
          if (renum) Iat=order(jm)
489
          Grad(3*Iat-2:3*Iat)=dvdr(jm,1:3)
490
      enddo
491
  
492
 if (debug) WRITE(*,*) "EGRAD_CHAMFRE, E=",V
493
  
494
 if (debug) call Header('Egrad_chamfre OVER')
495

    
496
!********************************************ENDENDENDENDENDENDENDEND
497
return
498
end subroutine egrad_chamfre
499

    
500
!******************************************
501
!**********PARAMETERS**********************
502
subroutine fctNiNi(r2,r,fcut)
503

    
504
   IMPLICIT NONE
505
     integer, parameter :: KINT = kind(1)
506
     integer, parameter :: KREAL = kind(1.0d0)
507

    
508
 REAL(KREAL) :: r2,r,fcut,r1,pi
509
pi=4.0*atan(1.0)
510
r1=r2-0.5
511

    
512
if(r<=r1)then
513
fcut=1.0
514
endif
515
if(r>r1.and.r<=r2)then
516
fcut=(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
517
endif
518
if(r>r2)then
519
fcut=0.0
520
endif
521
return
522
end subroutine fctNiNi
523
!!************
524
subroutine dfcutNiNi(r2,r,df)
525
   IMPLICIT NONE
526
     integer, parameter :: KINT = kind(1)
527
     integer, parameter :: KREAL = kind(1.0d0)
528
  REAL(KREAL) :: r, r2,df,pi,r1
529
pi=4.0*atan(1.0)
530
r1=r2-0.5
531

    
532
if(r<=r1)then
533
df=0.0
534
endif
535
if(r>r1.and.r<=r2)then
536
df=-pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
537
endif
538
if(r>r2)then
539
df=0.0
540
endif
541
return
542
end subroutine dfcutNiNi
543

    
544

    
545
!!************
546
subroutine fctNiH(r2,r,fcut)
547
   IMPLICIT NONE
548
     integer, parameter :: KINT = kind(1)
549
     integer, parameter :: KREAL = kind(1.0d0)
550

    
551
 REAL(KREAL) ::r2,r,fcut
552
REAL(KREAL) ::rshort,rlong,r1,pi
553

    
554
 rshort=2.7
555
 rlong=3.0
556
 pi=4.0*atan(1.0)
557
 r1=rshort
558
 r2=rlong
559
if(r<=r1)then
560
 fcut=1.0
561
endif
562
if(r>r1.and.r<=r2)then
563
 fcut=(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
564
endif
565
if(r>r2)then
566
 fcut=0.0
567
endif
568
return
569
end subroutine fctNiH
570
!!**********
571

    
572
subroutine dfcutNiH(r2,r,df)
573

    
574

    
575
   IMPLICIT NONE
576
     integer, parameter :: KINT = kind(1)
577
     integer, parameter :: KREAL = kind(1.0d0)
578

    
579

    
580
REAL(KREAL) ::r2,r,df
581
REAL(KREAL) ::rshort,rlong,r1,pi
582

    
583
 rshort=2.7
584
 rlong=3.0
585
 pi=4.0*atan(1.0)
586
 r1=rshort
587
 r2=rlong
588
if(r<=r1)then
589
 df=0.0
590
endif
591
if(r>r1.and.r<=r2)then
592
 df=-pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
593
endif
594
if(r>r2)then
595
 df=0.0
596
endif
597
return
598
end subroutine dfcutNiH
599

    
600
!!************
601
subroutine fctNiC(r2,r,fcut)
602

    
603
   IMPLICIT NONE
604
     integer, parameter :: KINT = kind(1)
605
     integer, parameter :: KREAL = kind(1.0d0)
606

    
607

    
608
REAL(KREAL) ::r2,r,fcut
609
REAL(KREAL) ::rshort,rlong,r1,pi
610

    
611
 rshort=3.2
612
 rlong=3.5
613
 pi=4.0*atan(1.0)
614
 r1=rshort
615
 r2=rlong
616
if(r<=r1)then
617
 fcut=1.0
618
endif
619
if(r>r1.and.r<=r2)then
620
 fcut=(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
621
endif
622
if(r>r2)then
623
 fcut=0.0
624
endif
625
return
626
end subroutine fctNiC
627

    
628
!!***********
629
subroutine dfcutNiC(r2,r,df)
630

    
631
   IMPLICIT NONE
632
     integer, parameter :: KINT = kind(1)
633
     integer, parameter :: KREAL = kind(1.0d0)
634

    
635
     
636
REAL(KREAL) ::r2,r,df
637
REAL(KREAL) ::rshort,rlong,r1,pi
638

    
639
 rshort=3.2
640
 rlong=3.5
641
 pi=4.0*atan(1.0)
642
 r1=rshort
643
 r2=rlong
644
if(r<=r1)then
645
 df=0.0
646
endif
647
if(r>r1.and.r<=r2)then
648
 df=-pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
649
endif
650
if(r>r2)then
651
 df=0.0
652
endif
653
return
654
end subroutine dfcutNiC
655

    
656
!!************
657
subroutine fctCH(r2,r,fcut)
658

    
659

    
660
   IMPLICIT NONE
661
     integer, parameter :: KINT = kind(1)
662
     integer, parameter :: KREAL = kind(1.0d0)
663

    
664

    
665
REAL(KREAL) ::r2,r,fcut
666
REAL(KREAL) ::rshort,rlong,r1,pi
667

    
668
 rshort=2.1
669
 rlong=3.2
670
 pi=4.0*atan(1.0)
671
 r1=rshort
672
 r2=rlong
673
if(r<=r1)then
674
 fcut=1.0
675
endif
676
if(r>r1.and.r<=r2)then
677
 fcut=(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
678
endif
679
if(r>r2)then
680
 fcut=0.0
681
endif
682
return
683
end subroutine fctCH
684
!!*****************
685

    
686
subroutine dfcutCH(r2,r,df)
687

    
688

    
689
   IMPLICIT NONE
690
     integer, parameter :: KINT = kind(1)
691
     integer, parameter :: KREAL = kind(1.0d0)
692

    
693
     
694
REAL(KREAL) ::r2,r,df
695
REAL(KREAL) ::rshort,rlong,r1,pi
696

    
697
 rshort=2.1
698
 rlong=3.2
699
 pi=4.0*atan(1.0)
700
 r1=rshort
701
 r2=rlong
702
if(r<=r1)then
703
 df=0.0
704
endif
705
if(r>r1.and.r<=r2)then
706
 df=-pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
707
endif
708
if(r>r2)then
709
 df=0.0
710
endif
711
return
712
end subroutine dfcutCH
713
!!************
714
subroutine fctHH(r2,r,fcut)
715

    
716
   IMPLICIT NONE
717
     integer, parameter :: KINT = kind(1)
718
     integer, parameter :: KREAL = kind(1.0d0)
719

    
720

    
721
REAL(KREAL) ::r2,r,fcut,r1,pi
722
pi=4.0*atan(1.0)
723
r1=r2-1.1
724
if(r<=r1)then
725
 fcut=1.0
726
endif
727
if(r>r1.and.r<=r2)then
728
 fcut=(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
729
endif
730
if(r>r2)then
731
 fcut=0.0
732
endif
733
return
734
end subroutine fctHH
735
!!************
736
subroutine dfcutHH(r2,r,df)
737

    
738

    
739
   IMPLICIT NONE
740
     integer, parameter :: KINT = kind(1)
741
     integer, parameter :: KREAL = kind(1.0d0)
742

    
743

    
744
REAL(KREAL) ::r2,r,df,r1,pi
745
pi=4.0*atan(1.0)
746
r1=r2-1.1
747
if(r<=r1)then
748
 df=0.0
749
endif
750
if(r>r1.and.r<=r2)then
751
 df=-pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
752
endif
753
if(r>r2)then
754
 df=0.0
755
endif
756
return
757
end subroutine dfcutHH
758

    
759
!!*********************LONG INTERACTION
760

    
761
subroutine dfcut2(zshort,zlong,r,df)
762

    
763

    
764
   IMPLICIT NONE
765
     integer, parameter :: KINT = kind(1)
766
     integer, parameter :: KREAL = kind(1.0d0)
767

    
768

    
769
REAL(KREAL) ::zshort,zlong,r,df,pi, r1, r2
770

    
771
pi=4.0*atan(1.0)
772

    
773
r1=zshort
774
r2=zlong
775

    
776
if(r<=r1)then
777
df=0.0
778
endif
779
if(r>r1.and.r<=r2)then
780
df=pi/2.0/(r2-r1)*sin(pi*(r-r1)/(r2-r1))
781
endif
782
if(r>r2)then
783
df=0.0
784
endif
785

    
786
return
787
end subroutine dfcut2
788

    
789
subroutine fct2(zshort,zlong,r,fcut)
790

    
791
   IMPLICIT NONE
792
     integer, parameter :: KINT = kind(1)
793
     integer, parameter :: KREAL = kind(1.0d0)
794

    
795

    
796
REAL(KREAL) ::zshort,zlong,r,fcut,pi,r1,r2
797

    
798
pi=4.0*atan(1.0)
799

    
800
r1=zshort
801
r2=zlong
802

    
803
if(r<=r1)then
804
fcut=0.0
805
endif
806
if(r>r1.and.r<=r2)then
807
fcut=1.0-(1.0+cos(pi*(r-r1)/(r2-r1)))/2.0
808
endif
809
if(r>r2)then
810
fcut=1.0
811
endif
812

    
813
return
814
end subroutine fct2
815