git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@3084 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2009-08-18 17:02:09 +00:00
parent 826e513fd7
commit 8a6024b3ea
7 changed files with 300 additions and 99 deletions

View File

@ -34,6 +34,7 @@ c rc_meam = cutoff distance for meam
c delr_meam = cutoff region for meam
c ebound_meam = factor giving maximum boundary of sceen fcn ellipse
c augt1 = flag for whether t1 coefficient should be augmented
c ialloy = flag for newer alloy formulation (as in dynamo code)
c gsmooth_factor = factor determining length of G smoothing region
c vind[23]D = Voight notation index maps for 2 and 3D
c v2D,v3D = array of factors to apply for Voight notation
@ -65,7 +66,7 @@ c nrar,rdrar = spline coeff array parameters
real*8 Cmin_meam(maxelt,maxelt,maxelt)
real*8 Cmax_meam(maxelt,maxelt,maxelt)
real*8 rc_meam,delr_meam,ebound_meam(maxelt,maxelt)
integer augt1
integer augt1, ialloy
real*8 gsmooth_factor
integer vind2D(3,3),vind3D(3,3,3)
integer v2D(6),v3D(10)

View File

@ -4,21 +4,21 @@ c void meam_dens_final_(int *, int *, int *, int *, int *, double *, double *,
c int *, int *, int *,
c double *, double *, double *, double *, double *, double *,
c double *, double *, double *, double *, double *, double *,
c double *, double *, double *, double *, int *);
c double *, double *, double *, double *, double *, int *);
c
c Call from pair_meam.cpp has the form:
c
c meam_dens_final_(&nlocal,&nmax,&eflag_either,&eflag_global,&eflag_atom,
c &eng_vdwl,eatom,ntype,type,fmap,
c &arho1[0][0],&arho2[0][0],arho2b,&arho3[0][0],
c &arho3b[0][0],&t_ave[0][0],gamma,dgamma1,
c &arho3b[0][0],&t_ave[0][0],&tsq_ave[0][0],gamma,dgamma1,
c dgamma2,dgamma3,rho,rho0,rho1,rho2,rho3,frhop,&errorflag);
c
subroutine meam_dens_final(nlocal, nmax,
$ eflag_either, eflag_global, eflag_atom, eng_vdwl, eatom,
$ ntype, type, fmap,
$ Arho1, Arho2, Arho2b, Arho3, Arho3b, t_ave,
$ Arho1, Arho2, Arho2b, Arho3, Arho3b, t_ave, tsq_ave,
$ Gamma, dGamma1, dGamma2, dGamma3,
$ rho, rho0, rho1, rho2, rho3, fp, errorflag)
@ -29,7 +29,7 @@ c
integer ntype, type, fmap
real*8 eng_vdwl, eatom, Arho1, Arho2
real*8 Arho2b, Arho3, Arho3b
real*8 t_ave
real*8 t_ave, tsq_ave
real*8 Gamma, dGamma1, dGamma2, dGamma3
real*8 rho, rho0, rho1, rho2, rho3
real*8 fp
@ -39,6 +39,7 @@ c
dimension type(nmax), fmap(ntype)
dimension Arho1(3,nmax), Arho2(6,nmax), Arho2b(nmax)
dimension Arho3(10,nmax), Arho3b(3,nmax), t_ave(3,nmax)
dimension tsq_ave(3,nmax)
dimension Gamma(nmax), dGamma1(nmax), dGamma2(nmax)
dimension dGamma3(nmax), rho(nmax), rho0(nmax)
dimension rho1(nmax), rho2(nmax), rho3(nmax)
@ -70,9 +71,15 @@ c Complete the calculation of density
enddo
if( rho0(i) .gt. 0.0 ) then
t_ave(1,i) = t_ave(1,i)/rho0(i)
t_ave(2,i) = t_ave(2,i)/rho0(i)
t_ave(3,i) = t_ave(3,i)/rho0(i)
if (ialloy.eq.1) then
t_ave(1,i) = t_ave(1,i)/tsq_ave(1,i)
t_ave(2,i) = t_ave(2,i)/tsq_ave(2,i)
t_ave(3,i) = t_ave(3,i)/tsq_ave(3,i)
else
t_ave(1,i) = t_ave(1,i)/rho0(i)
t_ave(2,i) = t_ave(2,i)/rho0(i)
t_ave(3,i) = t_ave(3,i)/rho0(i)
endif
endif
Gamma(i) = t_ave(1,i)*rho1(i)

View File

@ -3,7 +3,7 @@ c
c void meam_dens_init_(int *, int *, int *, double *, int *, int *, int *, double *,
c int *, int *, int *, int *,
c double *, double *, double *, double *, double *, double *,
c double *, double *, double *, double *, int *);
c double *, double *, double *, double *, double *, int *);
c
c
c Call from pair_meam.cpp has the form:
@ -12,7 +12,7 @@ c meam_dens_init_(&i,&nmax,ntype,type,fmap,&x[0][0],
c &numneigh[i],firstneigh[i],&numneigh_full[i],firstneigh_full[i],
c &scrfcn[offset],&dscrfcn[offset],&fcpair[offset],
c rho0,&arho1[0][0],&arho2[0][0],arho2b,
c &arho3[0][0],&arho3b[0][0],&t_ave[0][0],&errorflag);
c &arho3[0][0],&arho3b[0][0],&t_ave[0][0],&tsq_ave[0][0],&errorflag);
c
subroutine meam_dens_init(i, nmax,
@ -20,7 +20,7 @@ c
$ numneigh, firstneigh,
$ numneigh_full, firstneigh_full,
$ scrfcn, dscrfcn, fcpair, rho0, arho1, arho2, arho2b,
$ arho3, arho3b, t_ave, errorflag)
$ arho3, arho3b, t_ave, tsq_ave, errorflag)
use meam_data
implicit none
@ -30,7 +30,7 @@ c
integer numneigh, firstneigh, numneigh_full, firstneigh_full
real*8 scrfcn, dscrfcn, fcpair
real*8 rho0, arho1, arho2
real*8 arho2b, arho3, arho3b, t_ave
real*8 arho2b, arho3, arho3b, t_ave, tsq_ave
integer errorflag
integer j,jn
@ -40,7 +40,7 @@ c
dimension scrfcn(numneigh), dscrfcn(numneigh), fcpair(numneigh)
dimension rho0(nmax), arho1(3,nmax), arho2(6,nmax)
dimension arho2b(nmax), arho3(10,nmax), arho3b(3,nmax)
dimension t_ave(3,nmax)
dimension t_ave(3,nmax), tsq_ave(3,nmax)
errorflag = 0
@ -54,7 +54,7 @@ c Calculate intermediate density terms to be communicated
call calc_rho1(i, nmax, ntype, type, fmap, x,
$ numneigh, firstneigh,
$ scrfcn, fcpair, rho0, arho1, arho2, arho2b,
$ arho3, arho3b, t_ave)
$ arho3, arho3b, t_ave, tsq_ave)
return
end
@ -194,7 +194,7 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
subroutine calc_rho1(i, nmax, ntype, type, fmap, x,
$ numneigh, firstneigh,
$ scrfcn, fcpair, rho0, arho1, arho2, arho2b,
$ arho3, arho3b, t_ave)
$ arho3, arho3b, t_ave, tsq_ave)
use meam_data
implicit none
@ -203,14 +203,14 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
real*8 x
integer numneigh, firstneigh
real*8 scrfcn, fcpair, rho0, arho1, arho2
real*8 arho2b, arho3, arho3b, t_ave
real*8 arho2b, arho3, arho3b, t_ave, tsq_ave
dimension type(nmax), fmap(ntype), x(3,nmax)
dimension firstneigh(numneigh)
dimension scrfcn(numneigh), fcpair(numneigh)
dimension rho0(nmax), arho1(3,nmax), arho2(6,nmax)
dimension arho2b(nmax), arho3(10,nmax), arho3b(3,nmax)
dimension t_ave(3,nmax)
dimension t_ave(3,nmax), tsq_ave(3,nmax)
integer jn,j,m,n,p,elti,eltj
integer nv2,nv3
@ -248,6 +248,14 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
rhoa1i = ro0i*exp(-beta1_meam(elti)*ai)*sij
rhoa2i = ro0i*exp(-beta2_meam(elti)*ai)*sij
rhoa3i = ro0i*exp(-beta3_meam(elti)*ai)*sij
if (ialloy.eq.1) then
rhoa1j = rhoa1j * t1_meam(eltj)
rhoa2j = rhoa2j * t2_meam(eltj)
rhoa3j = rhoa3j * t3_meam(eltj)
rhoa1i = rhoa1i * t1_meam(elti)
rhoa2i = rhoa2i * t2_meam(elti)
rhoa3i = rhoa3i * t3_meam(elti)
endif
rho0(i) = rho0(i) + rhoa0j
rho0(j) = rho0(j) + rhoa0i
t_ave(1,i) = t_ave(1,i) + t1_meam(eltj)*rhoa0j
@ -256,6 +264,20 @@ cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
t_ave(1,j) = t_ave(1,j) + t1_meam(elti)*rhoa0i
t_ave(2,j) = t_ave(2,j) + t2_meam(elti)*rhoa0i
t_ave(3,j) = t_ave(3,j) + t3_meam(elti)*rhoa0i
if (ialloy.eq.1) then
tsq_ave(1,i) = tsq_ave(1,i) +
$ t1_meam(eltj)*t1_meam(eltj)*rhoa0j
tsq_ave(2,i) = tsq_ave(2,i) +
$ t2_meam(eltj)*t2_meam(eltj)*rhoa0j
tsq_ave(3,i) = tsq_ave(3,i) +
$ t3_meam(eltj)*t3_meam(eltj)*rhoa0j
tsq_ave(1,j) = tsq_ave(1,j) +
$ t1_meam(elti)*t1_meam(elti)*rhoa0i
tsq_ave(2,j) = tsq_ave(2,j) +
$ t2_meam(elti)*t2_meam(elti)*rhoa0i
tsq_ave(3,j) = tsq_ave(3,j) +
$ t3_meam(elti)*t3_meam(elti)*rhoa0i
endif
Arho2b(i) = Arho2b(i) + rhoa2j
Arho2b(j) = Arho2b(j) + rhoa2i

View File

@ -4,7 +4,7 @@ c void meam_force_(int *, int *, int *, double *, int *, int *, int *, double *
c int *, int *, int *, int *, double *, double *,
c double *, double *, double *, double *, double *, double *,
c double *, double *, double *, double *, double *, double *,
c double *, double *, double *, double *, double *, int *);
c double *, double *, double *, double *, double *, double *, int *);
c
c Call from pair_meam.cpp has the form:
c
@ -14,7 +14,7 @@ c &numneigh[i],firstneigh[i],&numneigh_full[i],firstneigh_full[i],
c &scrfcn[offset],&dscrfcn[offset],&fcpair[offset],
c dgamma1,dgamma2,dgamma3,rho0,rho1,rho2,rho3,frhop,
c &arho1[0][0],&arho2[0][0],arho2b,&arho3[0][0],&arho3b[0][0],
c &t_ave[0][0],&f[0][0],&vatom[0][0],&errorflag);
c &t_ave[0][0],&tsq_ave[0][0],&f[0][0],&vatom[0][0],&errorflag);
c
subroutine meam_force(i, nmax,
@ -23,8 +23,8 @@ c
$ numneigh, firstneigh, numneigh_full, firstneigh_full,
$ scrfcn, dscrfcn, fcpair,
$ dGamma1, dGamma2, dGamma3, rho0, rho1, rho2, rho3, fp,
$ Arho1, Arho2, Arho2b, Arho3, Arho3b, t_ave, f, vatom,
$ errorflag)
$ Arho1, Arho2, Arho2b, Arho3, Arho3b, t_ave, tsq_ave, f,
$ vatom, errorflag)
use meam_data
implicit none
@ -38,7 +38,7 @@ c
real*8 rho0, rho1, rho2, rho3, fp
real*8 Arho1, Arho2, Arho2b
real*8 Arho3, Arho3b
real*8 t_ave, f, vatom
real*8 t_ave, tsq_ave, f, vatom
integer errorflag
dimension eatom(nmax)
@ -50,7 +50,7 @@ c
dimension rho0(nmax), rho1(nmax), rho2(nmax), rho3(nmax), fp(nmax)
dimension Arho1(3,nmax), Arho2(6,nmax), Arho2b(nmax)
dimension Arho3(10,nmax), Arho3b(3,nmax)
dimension t_ave(3,nmax), f(3,nmax), vatom(6,nmax)
dimension t_ave(3,nmax), tsq_ave(3,nmax), f(3,nmax), vatom(6,nmax)
integer i,j,jn,k,kn,kk,m,n,p,q
integer nv2,nv3,elti,eltj,eltk,ind
@ -176,6 +176,21 @@ c Compute pair densities and derivatives
drhoa3j = drhoa3i
endif
if (ialloy.eq.1) then
rhoa1j = rhoa1j * t1_meam(eltj)
rhoa2j = rhoa2j * t2_meam(eltj)
rhoa3j = rhoa3j * t3_meam(eltj)
rhoa1i = rhoa1i * t1_meam(elti)
rhoa2i = rhoa2i * t2_meam(elti)
rhoa3i = rhoa3i * t3_meam(elti)
drhoa1j = drhoa1j * t1_meam(eltj)
drhoa2j = drhoa2j * t2_meam(eltj)
drhoa3j = drhoa3j * t3_meam(eltj)
drhoa1i = drhoa1i * t1_meam(elti)
drhoa2i = drhoa2i * t2_meam(elti)
drhoa3i = drhoa3i * t3_meam(elti)
endif
nv2 = 1
nv3 = 1
arg1i1 = 0.d0
@ -277,21 +292,59 @@ c Compute derivatives of weighting functions t wrt rij
t2j = t_ave(2,j)
t3j = t_ave(3,j)
ai = 0.d0
if( rho0(i) .ne. 0.d0 ) then
ai = drhoa0j*sij/rho0(i)
end if
aj = 0.d0
if( rho0(j) .ne. 0.d0 ) then
aj = drhoa0i*sij/rho0(j)
end if
if (ialloy.eq.1) then
dt1dr1 = ai*(t1_meam(eltj)-t1i)
dt1dr2 = aj*(t1_meam(elti)-t1j)
dt2dr1 = ai*(t2_meam(eltj)-t2i)
dt2dr2 = aj*(t2_meam(elti)-t2j)
dt3dr1 = ai*(t3_meam(eltj)-t3i)
dt3dr2 = aj*(t3_meam(elti)-t3j)
a1i = 0.d0
a1j = 0.d0
a2i = 0.d0
a2j = 0.d0
a3i = 0.d0
a3j = 0.d0
if ( tsq_ave(1,i) .ne. 0.d0 ) then
a1i = drhoa0j*sij/tsq_ave(1,i)
endif
if ( tsq_ave(1,j) .ne. 0.d0 ) then
a1j = drhoa0i*sij/tsq_ave(1,j)
endif
if ( tsq_ave(2,i) .ne. 0.d0 ) then
a2i = drhoa0j*sij/tsq_ave(2,i)
endif
if ( tsq_ave(2,j) .ne. 0.d0 ) then
a2j = drhoa0i*sij/tsq_ave(2,j)
endif
if ( tsq_ave(3,i) .ne. 0.d0 ) then
a3i = drhoa0j*sij/tsq_ave(3,i)
endif
if ( tsq_ave(3,j) .ne. 0.d0 ) then
a3j = drhoa0i*sij/tsq_ave(3,j)
endif
dt1dr1 = a1i*(t1_meam(eltj)-t1i*t1_meam(eltj)**2)
dt1dr2 = a1j*(t1_meam(elti)-t1j*t1_meam(elti)**2)
dt2dr1 = a2i*(t2_meam(eltj)-t2i*t2_meam(eltj)**2)
dt2dr2 = a2j*(t2_meam(elti)-t2j*t2_meam(elti)**2)
dt3dr1 = a3i*(t3_meam(eltj)-t3i*t3_meam(eltj)**2)
dt3dr2 = a3j*(t3_meam(elti)-t3j*t3_meam(elti)**2)
else
ai = 0.d0
if( rho0(i) .ne. 0.d0 ) then
ai = drhoa0j*sij/rho0(i)
end if
aj = 0.d0
if( rho0(j) .ne. 0.d0 ) then
aj = drhoa0i*sij/rho0(j)
end if
dt1dr1 = ai*(t1_meam(eltj)-t1i)
dt1dr2 = aj*(t1_meam(elti)-t1j)
dt2dr1 = ai*(t2_meam(eltj)-t2i)
dt2dr2 = aj*(t2_meam(elti)-t2j)
dt3dr1 = ai*(t3_meam(eltj)-t3i)
dt3dr2 = aj*(t3_meam(elti)-t3j)
endif
c Compute derivatives of total density wrt rij, sij and rij(3)
call get_shpfcn(shpi,lattce_meam(elti,elti))
@ -340,21 +393,60 @@ c Compute derivatives wrt sij, but only if necessary
drho3ds1 = a3*rhoa3j*arg1i3 - a3a*rhoa3j*arg3i3
drho3ds2 = a3*rhoa3i*arg1j3 - a3a*rhoa3i*arg3j3
ai = 0.d0
if( rho0(i) .ne. 0.d0 ) then
ai = rhoa0j/rho0(i)
end if
aj = 0.d0
if( rho0(j) .ne. 0.d0 ) then
aj = rhoa0i/rho0(j)
end if
if (ialloy.eq.1) then
a1i = 0.d0
a1j = 0.d0
a2i = 0.d0
a2j = 0.d0
a3i = 0.d0
a3j = 0.d0
if ( tsq_ave(1,i) .ne. 0.d0 ) then
a1i = rhoa0j/tsq_ave(1,i)
endif
if ( tsq_ave(1,j) .ne. 0.d0 ) then
a1j = rhoa0i/tsq_ave(1,j)
endif
if ( tsq_ave(2,i) .ne. 0.d0 ) then
a2i = rhoa0j/tsq_ave(2,i)
endif
if ( tsq_ave(2,j) .ne. 0.d0 ) then
a2j = rhoa0i/tsq_ave(2,j)
endif
if ( tsq_ave(3,i) .ne. 0.d0 ) then
a3i = rhoa0j/tsq_ave(3,i)
endif
if ( tsq_ave(3,j) .ne. 0.d0 ) then
a3j = rhoa0i/tsq_ave(3,j)
endif
dt1ds1 = a1i*(t1_meam(eltj)-t1i*t1_meam(eltj)**2)
dt1ds2 = a1j*(t1_meam(elti)-t1j*t1_meam(elti)**2)
dt2ds1 = a2i*(t2_meam(eltj)-t2i*t2_meam(eltj)**2)
dt2ds2 = a2j*(t2_meam(elti)-t2j*t2_meam(elti)**2)
dt3ds1 = a3i*(t3_meam(eltj)-t3i*t3_meam(eltj)**2)
dt3ds2 = a3j*(t3_meam(elti)-t3j*t3_meam(elti)**2)
else
ai = 0.d0
if( rho0(i) .ne. 0.d0 ) then
ai = rhoa0j/rho0(i)
end if
aj = 0.d0
if( rho0(j) .ne. 0.d0 ) then
aj = rhoa0i/rho0(j)
end if
dt1ds1 = ai*(t1_meam(eltj)-t1i)
dt1ds2 = aj*(t1_meam(elti)-t1j)
dt2ds1 = ai*(t2_meam(eltj)-t2i)
dt2ds2 = aj*(t2_meam(elti)-t2j)
dt3ds1 = ai*(t3_meam(eltj)-t3i)
dt3ds2 = aj*(t3_meam(elti)-t3j)
endif
dt1ds1 = ai*(t1_meam(eltj)-t1i)
dt1ds2 = aj*(t1_meam(elti)-t1j)
dt2ds1 = ai*(t2_meam(eltj)-t2i)
dt2ds2 = aj*(t2_meam(elti)-t2j)
dt3ds1 = ai*(t3_meam(eltj)-t3i)
dt3ds2 = aj*(t3_meam(elti)-t3j)
drhods1 = dGamma1(i)*drho0ds1
$ + dGamma2(i)*
$ (dt1ds1*rho1(i)+t1i*drho1ds1

View File

@ -158,11 +158,12 @@ c
integer j,a,b,nv2
real*8 astar,frac,phizbl
integer n,nmax,Z1,Z2
real*8 arat,scrn
real*8 arat,scrn,scrn2
real*8 phitmp
real*8, external :: phi_meam
real*8, external :: zbl
real*8, external :: compute_phi
c allocate memory for array that defines the potential
@ -178,6 +179,10 @@ c allocate coeff memory
allocate(phirar5(nr,(neltypes*(neltypes+1))/2))
allocate(phirar6(nr,(neltypes*(neltypes+1))/2))
c HACK for debug: compute phi_meam for Ni3Si equilibrium spacing
r = 2.47770216
phitmp = phi_meam(r,1,2)
c loop over pairs of element types
nv2 = 0
do a = 1,neltypes
@ -194,20 +199,29 @@ c loop over r values and compute
c if using second-nearest neighbor, solve recursive problem
c (see Lee and Baskes, PRB 62(13):8564 eqn.(21))
if (nn2_meam(a,b).eq.1) then
if (a.ne.b) then
write(6,*) 'Second-neighbor currently only valid '
write(6,*) 'if element types are the same.'
c if (a.ne.b) then
c write(6,*) 'Second-neighbor currently only valid '
c write(6,*) 'if element types are the same.'
c call error(' ')
endif
c endif
call get_Zij(Z1,lattce_meam(a,b))
call get_Zij2(Z2,arat,scrn,lattce_meam(a,b),
$ Cmin_meam(a,a,b),Cmax_meam(a,a,b))
nmax = 10
do n = 1,nmax
phir(j,nv2) = phir(j,nv2) +
$ (-Z2*scrn/Z1)**n * phi_meam(r*arat**n,a,b)
enddo
if (lattce_meam(a,b).eq.'b1') then
phir(j,nv2) = phir(j,nv2) -
$ Z2*scrn/(2*Z1) * phi_meam(r*arat,a,a)
call get_Zij2(Z2,arat,scrn2,lattce_meam(a,b),
$ Cmin_meam(b,b,a),Cmax_meam(b,b,a))
phir(j,nv2) = phir(j,nv2) -
$ Z2*scrn2/(2*Z1) * phi_meam(r*arat,b,b)
else
nmax = 10
do n = 1,nmax
phir(j,nv2) = phir(j,nv2) +
$ (-Z2*scrn/Z1)**n * phi_meam(r*arat**n,a,b)
enddo
endif
endif
@ -258,7 +272,7 @@ c
real*8 rho02,rho12,rho22,rho32
real*8 scalfac,phiaa,phibb
real*8 Eu
integer Z12
integer Z12, errorflag
character*3 latta,lattb
real*8, external :: erose
@ -285,8 +299,9 @@ c calculate average weighting factors for the reference structure
else
c average weighting factors for the reference structure, eqn. I.8
call get_tavref(t11av,t21av,t31av,t12av,t22av,t32av,
$ t1_meam(a),t2_meam(a),t3_meam(a),
$ t1_meam(b),t2_meam(b),t3_meam(b),lattce_meam(a,b))
$ t1_meam(a),t2_meam(a),t3_meam(a),
$ t1_meam(b),t2_meam(b),t3_meam(b),
$ r,a,b,lattce_meam(a,b))
endif
c for c11b structure, calculate background electron densities
@ -316,6 +331,12 @@ c composition-dependent scaling, equation I.7
c -- note: The shape factors for the individual elements are used, since
c this function should cancel the F(rho) terms when the atoms are
c in the reference structure.
c -- GJW (6/12/09): I suspect there may be a problem here... since we should be
c using the pure element reference structure, we should also
c be using the element "t" values (not the averages compute
c above). It doesn't matter for reference structures with
c s(1)=s(2)=s(3)=0, but might cause diffs otherwise. For now
c what's here is consistent with what's done in meam_dens_final.
Z1 = Z_meam(a)
Z2 = Z_meam(b)
if (ibar_meam(a).le.0) then
@ -323,14 +344,14 @@ c in the reference structure.
else
call get_shpfcn(s1,lattce_meam(a,a))
Gam1 = (s1(1)*t11av+s1(2)*t21av+s1(3)*t31av)/(Z1*Z1)
call G_gam(Gam1,ibar_meam(a),gsmooth_factor,G1)
call G_gam(Gam1,ibar_meam(a),gsmooth_factor,G1,errorflag)
endif
if (ibar_meam(b).le.0) then
G2 = 1.d0
else
call get_shpfcn(s2,lattce_meam(b,b))
Gam2 = (s2(1)*t12av+s2(2)*t22av+s2(3)*t32av)/(Z2*Z2)
call G_gam(Gam2,ibar_meam(b),gsmooth_factor,G2)
call G_gam(Gam2,ibar_meam(b),gsmooth_factor,G2,errorflag)
endif
rho0_1 = rho0_meam(a)*Z1*G1
rho0_2 = rho0_meam(b)*Z2*G2
@ -347,8 +368,8 @@ c compute total background density, eqn I.6
Gam1 = Gam1/(rho01*rho01)
Gam2 = (t12av*rho12+t22av*rho22+t32av*rho32)
Gam2 = Gam2/(rho02*rho02)
call G_gam(Gam1,ibar_meam(a),gsmooth_factor,G1)
call G_gam(Gam2,ibar_meam(b),gsmooth_factor,G2)
call G_gam(Gam1,ibar_meam(a),gsmooth_factor,G1,errorflag)
call G_gam(Gam2,ibar_meam(b),gsmooth_factor,G2,errorflag)
rhobar1 = rho01/rho0_1*G1
rhobar2 = rho02/rho0_2*G2
endif
@ -370,17 +391,20 @@ c compute Rose function, I.16
c calculate the pair energy
if (lattce_meam(a,b).eq.'c11') then
latta = lattce_meam(a,a)
if (latta.eq.'dia') then
phiaa = phi_meam(r,a,a)
phi_m = (3*Eu - F2 - 2*F1 - 5*phiaa)/Z12
else
phibb = phi_meam(r,b,b)
phi_m = (3*Eu - F1 - 2*F2 - 5*phibb)/Z12
endif
c phi_m = 0.d0
latta = lattce_meam(a,a)
if (latta.eq.'dia') then
phiaa = phi_meam(r,a,a)
phi_m = (3*Eu - F2 - 2*F1 - 5*phiaa)/Z12
else
phibb = phi_meam(r,b,b)
phi_m = (3*Eu - F1 - 2*F2 - 5*phibb)/Z12
endif
c phi_m = 0.d0
else if (lattce_meam(a,b).eq.'l12') then
phiaa = phi_meam(r,a,a)
phi_m = Eu/3. - F1/4. - F2/12. - phiaa
else
c
c
c potential is computed from Rose function and embedding energy
phi_m = (2*Eu - F1 - F2)/Z12
c
@ -426,11 +450,15 @@ c call error('Lattice not defined in get_shpfcn.')
c------------------------------------------------------------------------------c
c Average weighting factors for the reference structure
subroutine get_tavref(t11av,t21av,t31av,t12av,t22av,t32av,
$ t11,t21,t31,t12,t22,t32,latt)
$ t11,t21,t31,t12,t22,t32,
$ r,a,b,latt)
use meam_data
implicit none
real*8 t11av,t21av,t31av,t12av,t22av,t32av
real*8 t11,t21,t31,t12,t22,t32
real*8 t11,t21,t31,t12,t22,t32,r
integer a,b
character*3 latt
real*8 rhoa01,rhoa02,a1,a2,rho01,rho02
if (latt.eq.'fcc'.or.latt.eq.'bcc'.or.latt.eq.'dia'
$ .or.latt.eq.'hcp'.or.latt.eq.'b1'
$ .or.latt.eq.'dim') then
@ -442,7 +470,21 @@ c all neighbors are of the opposite type
t22av = t21
t32av = t31
else
c call error('Lattice not defined in get_tavref.')
a1 = r/re_meam(a,a) - 1.d0
a2 = r/re_meam(b,b) - 1.d0
rhoa01 = rho0_meam(a)*exp(-beta0_meam(a)*a1)
rhoa02 = rho0_meam(b)*exp(-beta0_meam(b)*a2)
if (latt.eq.'l12') then
rho01 = 8*rhoa01 + 4*rhoa02
t11av = (8*t11*rhoa01 + 4*t12*rhoa02)/rho01
t12av = t11
t21av = (8*t21*rhoa01 + 4*t22*rhoa02)/rho01
t22av = t21
t31av = (8*t31*rhoa01 + 4*t32*rhoa02)/rho01
t32av = t31
else
c call error('Lattice not defined in get_tavref.')
endif
endif
return
end
@ -466,6 +508,8 @@ c Number of neighbors for the reference structure
Zij = 1
else if (latt.eq.'c11') then
Zij = 10
else if (latt.eq.'l12') then
Zij = 12
else
c call error('Lattice not defined in get_Zij.')
endif
@ -504,9 +548,9 @@ c call error('can not do 2NN MEAM for dia')
a = sqrt(2.d0)
numscr = 4
else if (latt.eq.'b1') then
Zij2 = 6
Zij2 = 12
a = sqrt(2.d0)
numscr = 4
numscr = 2
else
c call error('Lattice not defined in get_Zij2.')
endif
@ -535,7 +579,7 @@ c Calculate density functions, assuming reference configuration
integer a,b
integer Zij1nn,Zij2nn
real*8 rhoa01nn,rhoa02nn
real*8 arat,scrn
real*8 arat,scrn,denom
a1 = r/re_meam(a,a) - 1.d0
a2 = r/re_meam(b,b) - 1.d0
@ -567,17 +611,6 @@ c Calculate density functions, assuming reference configuration
rho01 = 8.d0*rhoa02
rho02 = 8.d0*rhoa01
else if (lat.eq.'b1') then
c Warning: this assumes that atoms of element 1 are not completely
c screened from each other, but that atoms of element 2 are. So
c Cmin_meam(1,1,2) can be less than 1.0, but Cmin_meam(2,2,1) cannot.
c This should be made more general in the future.
c Cmin = Cmin_meam(1,1,2)
c Cmax = Cmax_meam(1,1,2)
c C = (1.0-Cmin)/(Cmax-Cmin)
c call fcut(C,fc)
c a1 = sqrt(2.0)*r/re_meam(1,1) - 1.d0
c rho01 = 6*rhoa02 + 12*fc*fc*rho0_meam(1)*exp(-beta0_meam(1)*a1)
c rho02 = 6*rhoa01
rho01 = 6*rhoa02
rho02 = 6*rhoa01
else if (lat.eq.'dia') then
@ -609,6 +642,18 @@ c rho02 = 6*rhoa01
rho22 = rhoa22
rho31 = rhoa31
rho32 = rhoa32
else if (lat.eq.'l12') then
rho01 = 8*rhoa01 + 4*rhoa02
rho02 = 12*rhoa01
if (ialloy.eq.0) then
rho21 = 8./3.*(rhoa21-rhoa22)*(rhoa21-rhoa22)
else
rho21 = 8./3.*(rhoa21*t2_meam(a)-rhoa22*t2_meam(b))**2
denom = 8*rhoa01*t2_meam(a)**2 + 4*rhoa02*t2_meam(b)**2
if (denom.gt.0.) then
rho21 = rho21/denom * rho01
endif
endif
else
c call error('Lattice not defined in get_densref.')
endif
@ -617,9 +662,9 @@ c call error('Lattice not defined in get_densref.')
c Assume that second neighbor is of same type, first neighbor
c may be of different type
if (lat.ne.'bcc') then
c if (lat.ne.'bcc') then
c call error('Second-neighbor not defined for this lattice')
endif
c endif
call get_Zij2(Zij2nn,arat,scrn,lat,
$ Cmin_meam(a,a,b),Cmax_meam(a,a,b))
@ -630,8 +675,12 @@ c call error('Second-neighbor not defined for this lattice')
rhoa01nn = rho0_meam(a)*exp(-beta0_meam(a)*a1)
rhoa02nn = rho0_meam(b)*exp(-beta0_meam(b)*a2)
rho01 = rho01 + Zij2nn*scrn*rhoa02nn
rho02 = rho02 + Zij2nn*scrn*rhoa01nn
rho01 = rho01 + Zij2nn*scrn*rhoa01nn
c Assume Zij2nn and arat don't depend on order, but scrn might
call get_Zij2(Zij2nn,arat,scrn,lat,
$ Cmin_meam(b,b,a),Cmax_meam(b,b,a))
rho02 = rho02 + Zij2nn*scrn*rhoa02nn
endif
@ -731,3 +780,25 @@ c phir interp
enddo
end
c---------------------------------------------------------------------
c Compute Rose energy function, I.16
c
real*8 function compute_phi(rij, elti, eltj)
use meam_data
implicit none
real*8 rij, pp
integer elti, eltj, ind, kk
ind = eltind(elti, eltj)
pp = rij*rdrar + 1.0D0
kk = pp
kk = min(kk,nrar-1)
pp = pp - kk
pp = min(pp,1.0D0)
compute_phi = ((phirar3(kk,ind)*pp + phirar2(kk,ind))*pp
$ + phirar1(kk,ind))*pp + phirar(kk,ind)
return
end

View File

@ -98,6 +98,7 @@ c Set some defaults
nn2_meam(:,:) = 0
gsmooth_factor = 99.0
augt1 = 1
ialloy = 0
return
end

View File

@ -27,6 +27,7 @@ c 11 = delr_meam
c 12 = augt1
c 13 = gsmooth_factor
c 14 = re_meam
c 15 = ialloy
subroutine meam_setup_param(which, value, nindex,
$ index, errorflag)
@ -71,6 +72,8 @@ c 4 = lattce_meam
lattce_meam(index(1),index(2)) = 'b1'
else if (value.eq.6) then
lattce_meam(index(1),index(2)) = 'c11'
else if (value.eq.7) then
lattce_meam(index(1),index(2)) = 'l12'
endif
c 5 = attrac_meam
@ -113,6 +116,10 @@ c 14 = re_meam
else if (which.eq.14) then
re_meam(index(1),index(2)) = value
c 15 = ialloy
else if (which.eq.15) then
ialloy = value
else
errorflag = 1
endif