/************************************************/ /* C2P Mar 19 1999 */ /* Convert configuration file of Ju Li' format */ /* to .pdb file which can be viewed by Rasmol. */ /* cc -o c2p c2p.c; c2p -f config.amorphous.864 */ /************************************************/ #include #define MAX_STRLEN 128 #define TP_STRLEN 2 #define MAX_TP 65536 #define STATS_FILE_HEADER "stats.c2p" struct ATOMTYPE { int occurrence; /* number of atoms of such type */ char name[TP_STRLEN+1]; /* type name */ double mass; /* atomic mass */ }; /* see if a file exists, and if so ask */ /* the user whether to overwrite it. */ int freetowrite (char filename[]) { FILE *file; char c; file = fopen (filename, "r"); if (file != NULL) { fclose (file); printf ("file \"%s\" exists, overwrite (y/n)? ", filename); c = getc(stdin); if (c!='\n') while(getc(stdin)!='\n'); if (!((c=='y')||(c=='Y'))) return(0); } return(1); } /* end freetowrite() */ double matinv(double A[3][3], double B[3][3]) { double D11,D22,D33,D12,D21,D13,D31,D32,D23,determinant; D11=A[1][1]*A[2][2]-A[1][2]*A[2][1]; D22=A[2][2]*A[0][0]-A[2][0]*A[0][2]; D33=A[0][0]*A[1][1]-A[0][1]*A[1][0]; D12=A[1][2]*A[2][0]-A[1][0]*A[2][2]; D23=A[2][0]*A[0][1]-A[2][1]*A[0][0]; D31=A[0][1]*A[1][2]-A[0][2]*A[1][1]; D13=A[1][0]*A[2][1]-A[2][0]*A[1][1]; D21=A[2][1]*A[0][2]-A[0][1]*A[2][2]; D32=A[0][2]*A[1][0]-A[1][2]*A[0][0]; determinant=A[0][0]*D11+A[0][1]*D12+A[0][2]*D13; B[0][0]=D11/determinant; B[1][1]=D22/determinant; B[2][2]=D33/determinant; B[0][1]=D21/determinant; B[1][2]=D32/determinant; B[2][0]=D13/determinant; B[1][0]=D12/determinant; B[2][1]=D23/determinant; B[0][2]=D31/determinant; return (determinant); } /* end matinv() */ #define max(x,y) ((x)>(y)?(x):(y)) int main (int argc, char *argv[]) { int i, j, k, np, nc[3], ntp, to_stdout = 0, force_write = 0, save_stats = 0; char buf[MAX_STRLEN], read[MAX_STRLEN], write[2*MAX_STRLEN], tp[TP_STRLEN+1], tps[MAX_TP][TP_STRLEN+1], *r, *p, *q; struct ATOMTYPE at[MAX_TP]; double H[3][3], HI[3][3], mass, s[3], x[3]; FILE *in, *out, *stats; for (k=1; k=r; p--) if (*p=='/') break; sprintf (buf, "%s.%s", STATS_FILE_HEADER, p+1); stats = fopen (buf, "w"); } else stats = stdout; if ( (!to_stdout) || save_stats ) { fprintf (stats, "\nIn \"%s\", we found\n", r); fprintf (stats, "--------------------------------------\n"); fprintf (stats, " Occurrences Type Mass\n"); for (j=0; j