int main(int argc,char **argv) {
- int i,j,k,l,cnt;
+ int i,j,k,l,cnt,estimated;
int x,y,z;
t_3dvec basis[3];
t_3dvec o[3];
t_3dvec dia;
t_3dvec r,h;
- char type,fccdia;
+ char type,fccdia,foa,fixstr[6];
- if(argc!=6) {
+ if(argc<6) {
printf("usage: %s type fcc/dia lx ly lz\n",argv[0]);
printf(" basis types: 0, 1, 2 (see code)\n");
printf(" fcc/dia: 0=fcc, 1=dia\n");
+ printf(" optional: foa (fix outer atoms)\n");
return -1;
}
y=atoi(argv[4]);
z=atoi(argv[5]);
+ foa=0;
+ if(argc==7)
+ foa=1;
+
dia.x=0.25;
dia.y=0.25;
dia.z=0.25;
if(type=='1') {
- dia.x=0.5;
- dia.y=0.0;
+ dia.x=0.0;
+ dia.y=0.5;
dia.z=0.25;
}
cnt=0;
+ estimated=1;
+ if(fccdia=='1') estimated*=2;
+ if(type=='1') estimated*=2;
+ if(type=='2') estimated*=4;
+ estimated*=x*y*z;
+
+ // print POSCAR 'header'
+
+ printf("cubic diamond\n");
+ printf(" 5.429\n");
+
+ v3_scale(&h,&basis[0],x);
+ printf(" %.5f %.5f %.5f\n",h.x,h.y,h.z);
+ v3_scale(&h,&basis[1],y);
+ printf(" %.5f %.5f %.5f\n",h.x,h.y,h.z);
+ v3_scale(&h,&basis[2],z);
+ printf(" %.5f %.5f %.5f\n",h.x,h.y,h.z);
+
+ printf(" %d\n",estimated);
+ printf("selective dynamics\n");
+ printf("direct\n");
+
+ // now print the coordinates
+
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
for(k=0;k<z;k++) {
// first atom (all types)
- v3_scale(&r,&basis[0],i);
- v3_scale(&h,&basis[1],j);
- v3_add(&r,&r,&h);
- v3_scale(&h,&basis[2],k);
- v3_add(&r,&r,&h);
-
- printf(" %.5f %.5f %.5f T T T\n",r.x/x,r.y/y,r.z/z);
+ r.x=i;
+ r.y=j;
+ r.z=k;
+
+ strcpy(fixstr,"T T T");
+ if(((r.x==0)||(r.y==0)||(r.z==0))&foa)
+ strcpy(fixstr,"F F F");
+ printf(" %.5f %.5f %.5f %s\n",r.x/x,r.y/y,r.z/z,fixstr);
cnt+=1;
// second atom (type 1)
if(type=='1') {
v3_add(&h,&r,&(o[0]));
+ strcpy(fixstr,"T T T");
+ if(((h.x==0)||(h.y==0)||(h.z==0))&foa)
+ strcpy(fixstr,"F F F");
printf(" %.5f %.5f %.5f T T T\n",h.x/x,h.y/y,h.z/z);
cnt+=1;
}
if(type=='2') {
for(l=0;l<3;l++) {
v3_add(&h,&r,&(o[l]));
+ strcpy(fixstr,"T T T");
+ if(((h.x==0)||(h.y==0)||(h.z==0))&foa)
+ strcpy(fixstr,"F F F");
printf(" %.5f %.5f %.5f T T T\n",h.x/x,h.y/y,h.z/z);
cnt+=1;
}
for(k=0;k<z;k++) {
// first atom (all types)
- v3_scale(&r,&basis[0],i);
- v3_scale(&h,&basis[1],j);
- v3_add(&r,&r,&h);
- v3_scale(&h,&basis[2],k);
- v3_add(&r,&r,&h);
+ r.x=i;
+ r.y=j;
+ r.z=k;
// add the diagonal
v3_add(&r,&r,&dia);
+ strcpy(fixstr,"T T T");
+ if(((r.x==0)||(r.y==0)||(r.z==0))&foa)
+ strcpy(fixstr,"F F F");
printf(" %.5f %.5f %.5f T T T\n",r.x/x,r.y/y,r.z/z);
cnt+=1;
// second atom (type 1)
if(type=='1') {
v3_add(&h,&r,&(o[0]));
+ strcpy(fixstr,"T T T");
+ if(((h.x==0)||(h.y==0)||(h.z==0))&foa)
+ strcpy(fixstr,"F F F");
printf(" %.5f %.5f %.5f T T T\n",h.x/x,h.y/y,h.z/z);
cnt+=1;
}
if(type=='2') {
for(l=0;l<3;l++) {
v3_add(&h,&r,&(o[l]));
+ strcpy(fixstr,"T T T");
+ if(((h.x==0)||(h.y==0)||(h.z==0))&foa)
+ strcpy(fixstr,"F F F");
printf(" %.5f %.5f %.5f T T T\n",h.x/x,h.y/y,h.z/z);
cnt+=1;
}
}
- printf("\ntotal: %d ions\n\n",cnt);
+ if(estimated!=cnt) {
+ printf("\nWARNING! counted %d ions and estimated %d ions\n\n",
+ cnt,estimated);
+ }
return 0;
}