#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);}
}
|