forked from lijiext/lammps
120 lines
3.0 KiB
Raku
Executable File
120 lines
3.0 KiB
Raku
Executable File
#!/usr/bin/perl
|
|
|
|
# Usage: diamond <nx> <ny> <nz> > data.diamond
|
|
#
|
|
# Generates diamond A4 structure.
|
|
|
|
$nx = shift(@ARGV);
|
|
$ny = shift(@ARGV);
|
|
$nz = shift(@ARGV);
|
|
#$scale = shift(@ARGV);
|
|
|
|
$scale = 1.045;
|
|
$L = 7.33461; # eFF optimized (6.740 expt)
|
|
$re_core = 0.328; # core electron
|
|
$re_sigma = 1.559; # sigma electrons
|
|
|
|
#$r_threshold = $scale * 1.6 / 0.529; # threshold for sigma bond length
|
|
$r_threshold = $scale * 1.6 / 0.5 ; # threshold for sigma bond length
|
|
|
|
@xunit = (0, 0, 0.5, 0.5, 0.25, 0.75, 0.25, 0.75);
|
|
@yunit = (0, 0.5, 0, 0.5, 0.25, 0.75, 0.75, 0.25);
|
|
@zunit = (0, 0.5, 0.5, 0, 0.25, 0.25, 0.75, 0.75);
|
|
|
|
$idx = 0;
|
|
for ($x = 0; $x < $nx; $x++)
|
|
{
|
|
for ($y = 0; $y < $ny; $y++)
|
|
{
|
|
for ($z = 0; $z < $nz; $z++)
|
|
{
|
|
for ($i = 0; $i <= $#xunit; $i++)
|
|
{
|
|
$xnuc[$idx] = $x * $L + $xunit[$i] * $L;
|
|
$ynuc[$idx] = $y * $L + $yunit[$i] * $L;
|
|
$znuc[$idx] = $z * $L + $zunit[$i] * $L;
|
|
$idx++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$numnuc = $idx;
|
|
$xx = $L * $nx;
|
|
$yy = $L * $ny;
|
|
$zz = $L * $nz;
|
|
|
|
# Print length of supercell
|
|
|
|
printf("Created with Diamond.pl\n\n");
|
|
printf("%d atoms\n",$numnuc*7);
|
|
printf("2 atom types\n\n");
|
|
printf("%f %f xlo xhi\n", 0, $L * $nx);
|
|
printf("%f %f ylo yhi\n", 0, $L * $ny);
|
|
printf("%f %f zlo zhi\n\n", 0, $L * $nz);
|
|
printf("Masses\n\n");
|
|
printf("1 12.01070\n");
|
|
printf("2 1.000000\n\n");
|
|
printf("Atoms\n\n");
|
|
|
|
# Print out the nuclei and the core electrons
|
|
for ($i = 0; $i < $numnuc; $i++)
|
|
{
|
|
printf("%i %i %f %i %f %f %f %f\n", $j+=1, 1, 6.0, 0.0, 0.0, $xnuc[$i], $ynuc[$i], $znuc[$i]);
|
|
}
|
|
|
|
for ($i = 0; $i < $numnuc; $i++)
|
|
{
|
|
printf("%i %i %f %i %f %f %f %f\n", $j+=1, 2, 0.0, 1, $re_core,$xnuc[$i], $ynuc[$i], $znuc[$i]);
|
|
printf("%i %i %f %i %f %f %f %f\n", $j+=1, 2, 0.0,-1, $re_core,$xnuc[$i], $ynuc[$i], $znuc[$i]);
|
|
}
|
|
|
|
# Print out sigma electrons
|
|
|
|
$LLx = $L * $nx;
|
|
$LLy = $L * $ny;
|
|
$LLz = $L * $nz;
|
|
|
|
$k=$j;
|
|
for ($i = 0; $i < $numnuc; $i++)
|
|
{
|
|
for ($j = 0; $j < $i; $j++)
|
|
{
|
|
$x = $xnuc[$j] - $xnuc[$i];
|
|
$y = $ynuc[$j] - $ynuc[$i];
|
|
$z = $znuc[$j] - $znuc[$i];
|
|
|
|
# Minimum image convention
|
|
|
|
if ($x > $LLx/2) {$x -= $LLx;}
|
|
if ($y > $LLy/2) {$y -= $LLy;}
|
|
if ($z > $LLz/2) {$z -= $LLz;}
|
|
|
|
if ($x < -$LLx/2) {$x += $LLx;}
|
|
if ($y < -$LLy/2) {$y += $LLy;}
|
|
if ($z < -$LLz/2) {$z += $LLz;}
|
|
|
|
$r = sqrt($x * $x + $y * $y + $z * $z);
|
|
if ($r < $r_threshold)
|
|
{
|
|
$bond_x = $xnuc[$i] + $x / 2;
|
|
$bond_y = $ynuc[$i] + $y / 2;
|
|
$bond_z = $znuc[$i] + $z / 2;
|
|
|
|
# Minimum image convention
|
|
|
|
if ($bond_x > $LLx) {$bond_x -= $LLx};
|
|
if ($bond_y > $LLy) {$bond_y -= $LLy};
|
|
if ($bond_z > $LLz) {$bond_z -= $LLz};
|
|
|
|
if ($bond_x < 0) {$bond_x += $LLx};
|
|
if ($bond_y < 0) {$bond_y += $LLy};
|
|
if ($bond_z < 0) {$bond_z += $LLz};
|
|
|
|
printf("%i %i %f %i %f %f %f %f\n", $k+=1, 2, 0.0, 1, $re_sigma,$bond_x, $bond_y, $bond_z);
|
|
printf("%i %i %f %i %f %f %f %f\n", $k+=1, 2, 0.0,-1, $re_sigma,$bond_x, $bond_y, $bond_z);
|
|
}
|
|
}
|
|
}
|
|
|