#include #include #include #include /* fract2xyz is a conversion program that takes fractional coordinates input from stdin and converts it to a xmol xyz file on stdout Format of fractional coordinates file : first line : natoms alpha beta gamma a-axis b-axis c-axis second line : title / comment line natoms lines : atomname fract(x) fract(y) fract(z) rest of line ignored atomname = elementname that may have a number concatenated to it i.g. C3 or H34b are valid : become C and H respectively fract(x) fract(y) fract(z) : floating point fractional coordinages to compile on SUN : cc fract2xyz.c -o fract2xyz -O -lm typical use : fract2xyz data.xyz bugs : report to KANTERS@URVAX.URICH.EDU Enjoy, Rene Kanters */ double sqr(x) double x; {return x*x;} main(argc,argv) int argc; char *argv[]; { long n; double a,b,c,t11,t12,t13,t22,t23,t33,al,be,ga; char buf[256],*ch; gets(buf); puts(buf); sscanf(buf,"%ld%lf%lf%lf%lf%lf%lf",&n,&al,&be,&ga,&a,&b,&c); t11=asin(1.00)/90; al*=t11; be*=t11; ga *= t11; /* converted angles from degree to rad */ t22=sin(ga); t12=cos(ga); t13=cos(be); if((fabs(t22) < 0.0001) || (t33=sqr(sin(al))+sqr(sin(be))+sqr(t22)+2*cos(al)*t12*t13-2)<0) { fprintf(stderr,"sorry, something wrong with the angles\n"); exit(0); } t33=c*sqrt(t33)/t22; t23=c*(cos(al)-t12*t13)/t22; t13*=c; t22*=b; t12*=b; t11=a; /* copy the title line */ gets(buf); puts(buf); /* copy the rest behind it too */ while((--n >= 0) && (scanf("%s%lf%lf%lf",buf,&a,&b,&c)==4)) { /* make sure that there aren't any numbers dangling on the atom names */ ch=buf; while(isalpha(*ch)) ch++; *ch=0; printf("%3s %15.6lg %15.6lg %15.6lg\n",buf,t11*a+t12*b+t13*c,t22*b+t23*c,t33*c); gets(buf); /* read remaining possible junk */ } if(n>=0) {fprintf(stderr,"input error reading atom\n"); exit(0);} }