/* This program computes the possible circumferences of bucky tubes. */
#include <math.h>
#include <stdio.h>
/* given carbon atoms C1, C2, and C3, with C1 bonded to
C2 and C2 bonded to C3 in a sheet of graphite, CCC
is the distance between C1 and C3 in nanometers.
This is approximately 0.2465
*/
#define CCC 0.2451
#define PI 3.141592653589793
main (argc,argv)
int argc;
char *argv [];
{
double circumference, x, y, xycircumference;
int i,j,limit;
printf("1 This program enumerates all possible circumferences of bucky tubes\n");
printf("2 that are shorter than the circumference entered on the command line.\n");
printf("3 It is often convenient to sort the output of this program by,\n");
printf("4 for example, piping the output to the unix 'sort' command.\n");
printf("5 This lists the possible circumferences in ascending order.\n");
if(argc !=2) { printf(
"One argument required: the maximum circumference in nanometers\n");
exit(0);
};
if ( (sscanf(argv[1],"%lf",&circumference)!=1) || (circumference<=0.0) ){
printf("Bad argument: %s\n",argv[1]);
printf(
"One argument required: the maximum circumference in nanometers\n");
exit(0);
};
printf("6 The circumference entered on the command line was %7.3lf.\n",circumference);
printf("7 \n");
printf(
"8 Computed circumference (nanometers), radius (nanometers) and (i,j) indices:\n");
limit=circumference/CCC+1.1;
for(i=0;i<limit;i++){
for(j=0;j<=i;j++){
/* scan over the unit cells with indices i and j, and
compute the distance of each unit cell from the origin.
Because of symmetry, only consider unit cells which have
angular position phi such that 0 <= phi <= 30 degrees.
"limit" is too large too insure we don't miss a tube
with a circumference in the desired range. This means
we have to throw out a lot of tubes that we find that
have a circumference larger than desired.
One interpretation of the indices i and j is that i
scans along the x axis, while j scans along a line 60
degrees above the x axis. The unit cell indicated by
(i,j) is found by first moving along the x axis in a
positive direction for i cells, and then moving along
a line inclined upwards from the x axis by 60 degrees
for j cells.
*/
x=i*CCC + j*CCC/2.0; /* x offset of unit cell */
y=j*CCC*sqrt(3.0)/2.0; /* y offset of unit cell */
xycircumference= sqrt(x*x+y*y); /* distance from origin to (x,y) */
if (xycircumference <= circumference)
printf(
"Circumference =%8.4lf, radius =%8.4lf, index = (%d,%d)\n",
xycircumference,xycircumference/(2*PI),i,j);
};
};
}