Files
lammps/examples/PACKAGES/interlayer/lebedeva/LebDer.pl
2021-07-07 15:52:53 -04:00

91 lines
2.3 KiB
Raku
Executable File

#!/usr/bin/perl
# Computes potential energy of atom as a function of distance from another atom
# and computes numerical derivates of potential.
# The script was used to check if results from LAMMPS (using 2particles.in)
# are the same as these computed b this script.
# Prints results to STDOUT.
# Hence, use it like this:
# ./LebDer.pl > PerlResult.dat
# After that use lebedeva00.plot
#
# Author: Zbigniew Koziol, National Center for Nuclear Research, Poland
# Email: softquake@gmail.com
# Parameters used by ZJK for Lebedeva
my $LEB_A = -14.558;
my $LEB_B = 21.204;
my $LEB_alpha = 4.16;
my $LEB_C = 1.8;
my $LEB_D1 = -0.862;
my $LEB_D2 = 0.10049; # has very strong influence on position of minimum
my $LEB_lambda1 = 0.6; # has influance on splitting of AB-AA.
my $LEB_lambda2 = 0.4; # has strong influence on position of minimum
my $LEB_z0 = 3.198;
my $LEBSCALE =1.0;
$Z0=3.35;
$CX0 = 10;
$CY0 = 10;
for (my $t=0; $t<400; $t++) {
my $X0 = 0.001 + 0.05*$t;
my $Y0 = 0.001 + 0.05*$t;
my $Z = $Z0;
print $X0, "\t", $Y0, "\t", $Z, "\t",&LEB($X0, $Y0, $Z), "\t", &DLEBX($X0, $Y0, $Z),"\t",&DLEBY($X0, $Y0, $Z), "\t", &DLEBZ($X0, $Y0, $Z),"\n";
}
###############################################################################################
sub LEB {
my $x = shift;
my $y = shift;
my $z = shift;
my $rho2 = ($x-$CX0)*($x-$CX0) + ($y-$CY0)*($y-$CY0);
my $r = sqrt($rho2 + ($Z0)*($Z0));
my $zr = ($LEB_z0/$r)*($LEB_z0/$r);
my $zr6 = $zr*$zr*$zr;
my $ONE = $LEB_C*(1+$LEB_D1*$rho2+$LEB_D2*$rho2*$rho2);
my $TWO = exp(-$LEB_lambda1*$rho2)*exp(-$LEB_lambda2*($z*$z-$LEB_z0*$LEB_z0));
my $U = $LEB_A*$zr6 +$LEB_B*exp(-$LEB_alpha*($r-$LEB_z0)) + $ONE*$TWO;
return $U;
}
sub DLEBX { # finding derivative at $x
my $x = shift;
my $y = shift;
my $z = shift;
my $h = 0.0001;
my $D = (&LEB($x+$h, $y, $z)-&LEB($x-$h, $y, $z))/(2*$h);
return $D;
}
sub DLEBY { # finding derivative at $y
my $x = shift;
my $y = shift;
my $z = shift;
my $h = 0.0001;
my $D = (&LEB($x, $y+$h, $z)-&LEB($x, $y-$h, $z))/(2*$h);
return $D;
}
sub DLEBZ { # finding derivative at $z
my $x = shift;
my $y = shift;
my $z = shift;
my $h = 0.0001;
my $D = (&LEB($x, $y, $z+$h)-&LEB($x, $y, $z-$h))/(2*$h);
return $D;
}