X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fposic.git;a=blobdiff_plain;f=vasp_tools%2Fcreate_lattice.c;fp=vasp_tools%2Fcreate_lattice.c;h=658fdb4c064e8179e82d85ad2721636184b27624;hp=0000000000000000000000000000000000000000;hb=6e6d7126ea9a845f11637d8e1b8eb2b570ac4dc9;hpb=97dc63eb6a519b8e1f4fbfaa9760dd94539436b0 diff --git a/vasp_tools/create_lattice.c b/vasp_tools/create_lattice.c new file mode 100644 index 0000000..658fdb4 --- /dev/null +++ b/vasp_tools/create_lattice.c @@ -0,0 +1,243 @@ +/* + * create lattice (for usage in vasp POSCAR file) + * + * author: Frank Zirkelbach + * + */ + +#include +#include +#include +#include +#include "../math/math.h" + +/* + * lattice types: + * + * there is fcc/diamond/zincblende only! + * + * basis: + * + * 0: <0.5 0.5 0> <0 0.5 0.5> <0.5 0 0.5> contains 2 atoms + * 1: <0.5 -0.5 0> <0.5 0.5 0> <0 0 1> contains 4 atoms + * 2: <1 0 0> <0 1 0> <0 0 1> contains 8 atoms + * + * atoms: + * + * - type 0: + * 1st fcc: <0 0 0> + * 2nd fcc: <0.25 0.25 0.25> + * -> diag: <0.25 0.25 0.25> + * + * - type 1: + * 1st fcc: <0 0 0> <0.5 0.5 0.5> + * 2nd fcc: <0.5 0 0.25> <1.0 or 0.0 0.5 0.75> + -> diag: <0.5 0 0.25> + * + * - type 2: + * 1st fcc: <0 0 0> <0.5 0.5 0> <0.5 0 0.5> <0 0.5 0.5> + * 2nd fcc: <0.25 0.25 0.25> <0.75 0.75 0.25> <0.75 0.25 0.75> + * <0.25 0.75 0.75> + * -> diag: <0.25 0.25 0.25> + * + */ + +int main(int argc,char **argv) { + + 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,foa,fixstr[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; + } + + type=argv[1][0]; + fccdia=argv[2][0]; + + x=atoi(argv[3]); + 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.0; + dia.y=0.5; + dia.z=0.25; + } + + memset(basis,0,3*sizeof(t_3dvec)); + memset(o,0,3*sizeof(t_3dvec)); + + if(type=='0') { + basis[0].x=0.5; + basis[0].y=0.5; + basis[1].y=0.5; + basis[1].z=0.5; + basis[2].x=0.5; + basis[2].z=0.5; + } + + if(type=='1') { + basis[0].x=0.5; + basis[0].y=-0.5; + basis[1].x=0.5; + basis[1].y=0.5; + basis[2].z=1.0; + o[0].x=0.5; + o[0].y=0.5; + o[0].z=0.5; + } + + if(type=='2') { + basis[0].x=1.0; + basis[1].y=1.0; + basis[2].z=1.0; + o[0].x=0.5; + o[0].y=0.5; + o[1].x=0.5; + o[1].z=0.5; + o[2].y=0.5; + o[2].z=0.5; + } + + 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