91 lines
2.3 KiB
Raku
Executable File
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;
|
|
}
|