Changeset 961e9c for util


Ignore:
Timestamp:
Jan 31, 2010, 5:43:36 PM (16 years ago)
Author:
Frederik Heber <heber@…>
Children:
4737be
Parents:
09ed91
Message:

FIX: NanoCreator - GCD() failed on zero arguments, fixed length of tubes.

  • BUGFIX: GCD() did not check for its arguments being zero before division.
  • FIX: The length of the constructed tubes did not match theoretical values (from printout of www.atomistix.com table)
    • The problem was that the found (c,d) values were not divided by their GCD values. Hence, NTs became too long.
  • Nanotubes (12,m) now are all confirmed with respect to radius, length and atom count against the atomistix.com table
Location:
util/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • util/src/NanoCreator.c

    r09ed91 r961e9c  
    520520{
    521521  int c;
     522  if ((a == 0) && (b == 0))
     523    return 1;
     524  else if (a == 0)
     525    return b;
     526  else if (b == 0)
     527    return a;
    522528  do {
    523529    c = a % b;        /* Rest of integer divison */
     
    677683  char *CellBuffer = NULL, *SheetBuffer = NULL, *TubeBuffer = NULL, *bufptr = NULL;
    678684  double *randomness = NULL, percentage; // array with percentages for presence in sheet and beyond
    679   int i,j, ggT;
     685  int i,j, ggT, ggTsmall;
    680686  int length;
    681687
     
    876882
    877883    do {
    878       fprintf(stdout, "\nNow specify the two natural numbers (m n) defining the chiral angle, \nif the result is crap, try flipping to (m,n): ");
     884      fprintf(stdout, "\nNow specify the two natural numbers (n m) defining the chiral angle, \nif the result is crap, try flipping to (n,m): ");
    879885      fscanf(stdin, "%d %d", &chiral[0], &chiral[1]);
    880       ggT = GCD(2*chiral[1]+chiral[0],2*chiral[0]+chiral[1]);
     886      ggTsmall = GCD(chiral[0],chiral[1]);
     887      ggT = GCD(2*chiral[0]+chiral[1],2*chiral[1]+chiral[0]);
     888      fprintf(stdout, "Greatest Common Denominator of (n, m) is %d\n", ggTsmall);
    881889      fprintf(stdout, "Greatest Common Denominator of (2n+m, 2m+n) is %d\n", ggT);
    882890      fprintf(stdout, "chiral0: %d\tchiral1: %d\n", chiral[0], chiral[1]);
    883891      for (i=0;i<NDIM;i++) {
    884         Tubevector[axis[0]][i] = (double)chiral[0] * Vector[axis[0]][i] + (double)chiral[1] * Vector[axis[1]][i];
    885         //Tubevector[axis[0]][i] = chiral[0] * Vector[axis[0]][i] + chiral[1] * Vector[axis[1]][i];
     892//        Tubevector[axis[0]][i] = (double)chiral[0] * Vector[axis[0]][i] + (double)chiral[1] * Vector[axis[1]][i];
     893        Tubevector[axis[0]][i] = chiral[0] * Vector[axis[0]][i] + chiral[1] * Vector[axis[1]][i];
    886894        //Tubevector[axis[0]][i] = (2.*chiral[0]+chiral[1])/(double)ggT * Vector[axis[0]][i] + (-chiral[0]-2.*chiral[1])/(double)ggT * Vector[axis[1]][i];
    887895        //Tubevector[axis[1]][i] = -chiral[1] * Vector[axis[0]][i] + chiral[0] * Vector[axis[1]][i];
    888         Tubevector[axis[1]][i] = (double)chiral[0] * OrthoVector[axis[0]][i] - (double)chiral[1] * OrthoVector[axis[1]][i];
     896//        Tubevector[axis[1]][i] = (double)chiral[0] * OrthoVector[axis[0]][i] - (double)chiral[1] * OrthoVector[axis[1]][i];
     897        Tubevector[axis[1]][i] = (2.*chiral[0]+chiral[1])/(double)ggT * Vector[axis[0]][i] + (-chiral[0]-2.*chiral[1])/(double)ggT * Vector[axis[1]][i];
    889898        //Tubevector[axis[1]][i] = (-chiral[0]-2.*chiral[1])/(double)ggT * Vector[axis[0]][i] + (2.*chiral[0]+chiral[1])/(double)ggT * Vector[axis[1]][i];
    890899//        fprintf(stderr, "Tubevector[axis[0]][i] = (double)chiral[0] * Vector[axis[0]][i] + (double)chiral[1] * Vector[axis[1]][i]\n = %lg * %lg + %lg * %lg = %lg + %lg = %lg\n\n",
     
    926935        x1 = gsl_vector_get(u,0)*(double)i;
    927936        x2 = gsl_vector_get(u,1)*(double)i;
    928         x3 =
    929937        fprintf(stdout, "%d: %d\t%d vs. %lg\t%lg\n",i, ((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)), (x1), (x2));
    930938        if (( fabs( ((int)(x1+x1/fabs(x1)*.5)) - (x1) ) < 1e-6) && ( fabs( ((int)(x2+x2/fabs(x2)*.5)) - (x2) ) < 1e-6 )) {
     
    933941        }
    934942      }
    935       fprintf(stdout, "(c,d) = (%lg,%lg)\n",gsl_vector_get(u,0), gsl_vector_get(u,1));
    936 
    937       // get length
     943      x1 = fabs(gsl_vector_get(u,0));
     944      x2 = fabs(gsl_vector_get(u,1));
     945      fprintf(stdout, "(c,d) = (%lg,%lg)\n",((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)));
     946      j = GCD(((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)));
     947      fprintf(stdout, "GCD(%d,%d) = %i", ((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)), j);
     948      for (i=0;i<2;i++)
     949        gsl_vector_set(u,i, gsl_vector_get(u,i)/(double)j);
     950        // get length
    938951      double x[NDIM];
    939952      for (i=0;i<NDIM;i++)
     
    13251338              fprintf(SheetFile, "%s\t%5.5lg\t%5.5lg\t%5.5lg\n", atombuffer[nr].name, coord[0], coord[1], coord[2]);
    13261339              // rotate to align the sheet in xy plane
    1327               x1 = coord[0]*cos(-angle) + coord[1] * sin(-angle);
    1328               x2 = coord[0]*(-sin(-angle)) + coord[1] * cos(-angle);
     1340              x1 = coord[0]*cos(angle) + coord[1] * sin(angle);
     1341              x2 = coord[0]*(-sin(angle)) + coord[1] * cos(angle);
    13291342              x3 = coord[2];
    13301343              fprintf(SheetFileAligned, "%s\t%5.5lg\t%5.5lg\t%5.5lg\n", atombuffer[nr].name, x1, x2, x3);
  • util/src/NanoCreator.h

    r09ed91 r961e9c  
    22#define NANOCREATOR_H_
    33
    4 #define MYEPSILON 1e-13
     4#define MYEPSILON 1e-1
    55
    66struct Atoms
Note: See TracChangeset for help on using the changeset viewer.