/* 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);
    };
   };
}