#include #include #include "type_sg.h" #include "pgrp_dat.h" #include "pgrp_op.h" #include "math_sg.h" /* For point group determine Bravais lattice and redefine ELEMENTARY * translation vectors. * int chk_cubic() - check a point group to belong to cubic family * int chk_tetragonal() - check a point group to belong to tetragonal family * .......... * column number (i) of Tnew is decomposition of (i) new vector */ int chk_cubic(int lat, int nop, int *ind, int *lat_new, double Tnew[3][3]) { int i,j=0; if( nop!= nop_pgrp[NT] && nop!= nop_pgrp[NTh] && nop!= nop_pgrp[NO] && nop!= nop_pgrp[NTd] && nop!= nop_pgrp[NOh] ) return(0); /* find 3 axis 3 */ for(i=0; i*/ *lat_new=MONOCLINIC_A; /* check C2100h */ if( ind[1]==C2100h || ind[1]==Mx2xzh ) { Tnew[0][0]= 0.; Tnew[0][1]= 1./3; Tnew[0][2]= 1.; Tnew[1][0]= 0.; Tnew[1][1]= 2./3; Tnew[1][2]= 0.; Tnew[2][0]=-1.; Tnew[2][1]= 2./3; Tnew[2][2]= 0.; return(1); } /* check C2110h */ if( ind[1]==C2110h || ind[1]==Mx_xzh ) { Tnew[0][0]= 0.; Tnew[0][1]= 1./3; Tnew[0][2]= 1.; Tnew[1][0]= 0.; Tnew[1][1]=-1./3; Tnew[1][2]= 1.; Tnew[2][0]= 1.; Tnew[2][1]= 2./3; Tnew[2][2]= 0.; return(1); } /* check C2010h */ if( ind[1]==C2010h || ind[1]==M2xxzh ) { Tnew[0][0]= 0.; Tnew[0][1]=-2./3; Tnew[0][2]= 0.; Tnew[1][0]= 0.; Tnew[1][1]=-1./3; Tnew[1][2]= 1.; Tnew[2][0]=-1.; Tnew[2][1]= 2./3; Tnew[2][2]= 0.; return(1); } } /* if( lat==RHOMBOHEDRAL ) */ /* check C2001 */ if( ind[1]==C2001 || ind[1]==Mxy0 ) { if( lat==CUBIC_P || lat==TETRAGONAL_P || lat==ORTHOROMBIC_P || lat==MONOCLINIC_P ) { *lat_new=MONOCLINIC_P; Tnew[0][0]= 1.; Tnew[0][1]= 0.; Tnew[0][2]= 0.; Tnew[1][0]= 0.; Tnew[1][1]= 1.; Tnew[1][2]= 0.; Tnew[2][0]= 0.; Tnew[2][1]= 0.; Tnew[2][2]= 1.; return(1); } else if( lat==CUBIC_I || lat==TETRAGONAL_I || lat==ORTHOROMBIC_I) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.; Tnew[0][1]=-1.; Tnew[0][2]= 0.; Tnew[1][0]= 0.; Tnew[1][1]= 1.; Tnew[1][2]= 0.; Tnew[2][0]= 0.; Tnew[2][1]= 0.; Tnew[2][2]= 1.; return(1); } else if( lat==CUBIC_F || lat==ORTHOROMBIC_F) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.5; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]= 0.0; Tnew[2][2]= 1.0; return(1); } else if( lat==ORTHOROMBIC_C ) { *lat_new=MONOCLINIC_P; Tnew[0][0]= 0.5; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]= 0.0; Tnew[2][2]= 1.0; return(1); } if( lat==ORTHOROMBIC_A || lat==MONOCLINIC_A ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.; Tnew[0][1]= 0.; Tnew[0][2]= 0.; Tnew[1][0]= 0.; Tnew[1][1]= 1.; Tnew[1][2]= 0.; Tnew[2][0]= 0.; Tnew[2][1]= 0.; Tnew[2][2]= 1.; return(1); } } /* check C2010; in this case lat != MONOCLINIC */ if( ind[1]==C2010 || ind[1]==Mx0z ) { if( lat==CUBIC_P || lat==TETRAGONAL_P || lat==ORTHOROMBIC_P ) { *lat_new=MONOCLINIC_P; Tnew[0][0]= 1.0; Tnew[0][1]= 0.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_I || lat==TETRAGONAL_I || lat==ORTHOROMBIC_I) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_F || lat==ORTHOROMBIC_F) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.5; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]=-0.5; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } else if( lat==ORTHOROMBIC_C ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 1.0; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } if( lat==ORTHOROMBIC_A ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]= 0.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]= 0.0; return(1); } } /* check C2100; in this case lat != MONOCLINIC */ if( ind[1]==C2100 || ind[1]==M0yz ) { if( lat==CUBIC_P || lat==TETRAGONAL_P || lat==ORTHOROMBIC_P ) { *lat_new=MONOCLINIC_P; Tnew[0][0]= 0.0; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.0; Tnew[1][1]= 1.0; Tnew[1][2]= 0.0; Tnew[2][0]=-1.0; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_I || lat==TETRAGONAL_I || lat==ORTHOROMBIC_I) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.0; Tnew[1][1]= 1.0; Tnew[1][2]= 0.0; Tnew[2][0]=-1.0; Tnew[2][1]= 1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_F || lat==ORTHOROMBIC_F) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]=-0.5; Tnew[2][1]= 1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==ORTHOROMBIC_C ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.0; Tnew[1][1]= 1.0; Tnew[1][2]= 0.0; Tnew[2][0]=-1.0; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } if( lat==ORTHOROMBIC_A ) { *lat_new=MONOCLINIC_P; Tnew[0][0]= 0.0; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]=-0.5; Tnew[2][1]= 1.0; Tnew[2][2]= 0.0; return(1); } } /* check C2110; in this case lat != MONOCLINIC != ORTHOROMBIC */ if( ind[1]==C2110 || ind[1]==Mx_xz ) { if( lat==CUBIC_P || lat==TETRAGONAL_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 1.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.0; Tnew[1][1]=-1.0; Tnew[1][2]= 1.0; Tnew[2][0]= 1.0; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_I || lat==TETRAGONAL_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]=-0.5; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]=-0.5; Tnew[2][1]= 1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]= 0.5; Tnew[0][2]= 0.5; Tnew[1][0]= 0.0; Tnew[1][1]=-0.5; Tnew[1][2]= 0.5; Tnew[2][0]= 1.0; Tnew[2][1]=-1.0; Tnew[2][2]= 0.0; return(1); } } /* check C21_10; in this case lat != MONOCLINIC != ORTHOROMBIC */ /* mul. C2110 on C4_001; x'=y y'=-x z'=z */ if( ind[1]==C21_10 || ind[1]==Mxxz ) { if( lat==CUBIC_P || lat==TETRAGONAL_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-1.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.0; Tnew[1][1]=-1.0; Tnew[1][2]=-1.0; Tnew[2][0]= 1.0; Tnew[2][1]= 0.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_I || lat==TETRAGONAL_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.5; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]=-1.0; Tnew[2][0]=-0.5; Tnew[2][1]= 1.0; Tnew[2][2]= 0.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-0.5; Tnew[0][2]= 0.5; Tnew[1][0]= 0.0; Tnew[1][1]=-0.5; Tnew[1][2]=-0.5; Tnew[2][0]= 1.0; Tnew[2][1]=-1.0; Tnew[2][2]= 0.0; return(1); } } /* check C2101; in this case lat != MONOCLINIC != ORTHOROMBIC != TETRAGONAL */ /* from C2110 mul. C3-x,x,x; x'=y y'=z z'=x */ if( ind[1]==C2101 || ind[1]==M_xyx ) { if( lat==CUBIC_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-1.0; Tnew[0][2]= 1.0; Tnew[1][0]= 1.0; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]= 1.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.5; Tnew[0][1]= 0.0; Tnew[0][2]= 1.0; Tnew[1][0]=-0.5; Tnew[1][1]= 1.0; Tnew[1][2]= 0.0; Tnew[2][0]=-0.5; Tnew[2][1]= 0.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-0.5; Tnew[0][2]= 0.5; Tnew[1][0]= 1.0; Tnew[1][1]=-1.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]= 0.5; Tnew[2][2]= 0.5; return(1); } } /* check C2_101; in this case lat != MONOCLINIC != ORTHOROMBIC != TETRAGONAL */ /* 4-0y0; x'=-z y'=y z'=x */ if( ind[1]==C2_101 || ind[1]==Mxyx ) { if( lat==CUBIC_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-1.0; Tnew[0][2]=-1.0; Tnew[1][0]= 1.0; Tnew[1][1]= 0.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.5; Tnew[0][1]= 0.0; Tnew[0][2]=-1.0; Tnew[1][0]=-0.5; Tnew[1][1]= 1.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.5; Tnew[2][1]= 0.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 0.0; Tnew[0][1]=-0.5; Tnew[0][2]=-0.5; Tnew[1][0]= 1.0; Tnew[1][1]=-1.0; Tnew[1][2]= 0.0; Tnew[2][0]= 0.0; Tnew[2][1]=-0.5; Tnew[2][2]= 0.5; return(1); } } /* check C2011; in this case lat != MONOCLINIC != ORTHOROMBIC != TETRAGONAL */ /* from C2110 mul. C3+x,x,x; x'=z y'=x z'=y */ if( ind[1]==C2011 || ind[1]==Mxy_y ) { if( lat==CUBIC_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]= 0.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 1.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]=-0.5; Tnew[0][1]= 1.0; Tnew[0][2]= 0.0; Tnew[1][0]=-0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.5; Tnew[2][1]= 0.0; Tnew[2][2]= 1.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]= 0.5; Tnew[1][2]= 0.5; Tnew[2][0]= 0.0; Tnew[2][1]=-0.5; Tnew[2][2]= 0.5; return(1); } } /* check C201_1; in this case lat != MONOCLINIC != ORTHOROMBIC != TETRAGONAL * mul. C4_100; x,y,z -> x,z,-y; x'=x y'=z z'=-y */ if( ind[1]==C201_1 || ind[1]==Mxyy ) { if( lat==CUBIC_P ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]= 0.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]=-1.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.0; Tnew[2][1]=-1.0; Tnew[2][2]=-1.0; return(1); } else if( lat==CUBIC_I ) { *lat_new=MONOCLINIC_A; Tnew[0][0]=-0.5; Tnew[0][1]= 1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.5; Tnew[1][1]= 0.0; Tnew[1][2]= 1.0; Tnew[2][0]= 0.5; Tnew[2][1]= 0.0; Tnew[2][2]=-1.0; return(1); } else if( lat==CUBIC_F ) { *lat_new=MONOCLINIC_A; Tnew[0][0]= 1.0; Tnew[0][1]=-1.0; Tnew[0][2]= 0.0; Tnew[1][0]= 0.0; Tnew[1][1]=-0.5; Tnew[1][2]= 0.5; Tnew[2][0]= 0.0; Tnew[2][1]=-0.5; Tnew[2][2]=-0.5; return(1); } } return(0); } int chk_triclinic(int lat, int nop, int *ind, double Ttrcl[3][3], int *lat_new, double Tnew[3][3]) { if( nop!= nop_pgrp[NC1] && nop!= nop_pgrp[NCi] ) return(0); *lat_new=TRICLINIC; asgn_n(Tnew[0],Ttrcl[0],9); return(1); } int new_transl(int lat, int nop, int *ind, double Ttrcl[3][3], int *lat_new, double Tnew[3][3]) { sorti(ind,nop); if( lat==CUBIC_P || lat==CUBIC_I || lat==CUBIC_F ) { if( chk_cubic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_trigonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_tetragonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_orthorombic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; printf("Error lat==CUBIC in det_pgrp()\n"); return 1; } if( lat==HEXAGONAL ) { if( chk_hexagonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_trigonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_orthorombic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==HEXAGONAL in det_pgrp()\n"); return 1; } if( lat==RHOMBOHEDRAL ) { if( chk_trigonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==RHOMBOHEDRAL in det_pgrp()\n"); return 1; } if( lat==TETRAGONAL_P || lat==TETRAGONAL_I) { if( chk_tetragonal(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_orthorombic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==TETRAGONAL in det_pgrp()\n"); return 1; } /* ORTHOROMBIC_A only for find_atom_pgroup() */ if( lat==ORTHOROMBIC_P || lat==ORTHOROMBIC_I || lat==ORTHOROMBIC_A || lat==ORTHOROMBIC_C || lat==ORTHOROMBIC_F ) { if( chk_orthorombic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==ORTHOROMBIC in det_pgrp()\n"); return 1; } if( lat==MONOCLINIC_P || lat==MONOCLINIC_A ) { if( chk_monoclinic(lat,nop,ind,lat_new,Tnew) ) return 0; else if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==MONOCLINIC in det_pgrp()\n"); return 1; } if( lat==TRICLINIC ) { if( chk_triclinic(lat,nop,ind,Ttrcl,lat_new,Tnew) ) return 0; fprintf(stderr,"Error lat==MONOCLINIC in det_pgrp()\n"); return 1; } return 0; } int is_pgrp_eq(int nop_sym, double sym_op[][4][3], int nop, double pgrp[][3][3]) { int i,j; double r[48][3]; if( nop_sym != nop ) return(0); for(i=0; i