Changeset e2f3fde for util/src/NanoCreator.c
- Timestamp:
- Jun 21, 2008, 8:18:51 PM (17 years ago)
- Children:
- bd3839
- Parents:
- 1b192d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
util/src/NanoCreator.c
r1b192d re2f3fde 5 5 #include <time.h> 6 6 7 #include <gsl/gsl_matrix.h> 8 #include <gsl/gsl_vector.h> 9 #include <gsl/gsl_eigen.h> 10 #include <gsl/gsl_blas.h> 11 7 12 #include "NanoCreator.h" 13 8 14 9 15 // ---------------------------------- F U N C T I O N S ---------------------------------------------- … … 879 885 Tubevector[axis[2]][i] = Vector[axis[2]][i]; 880 886 } 881 // tmp = Norm(Tubevector[axis[1]]); 882 // for (i=0;i<NDIM;i++) 883 // Tubevector[axis[1]][i] *= Norm(Vector[axis[1]])*sqrt(3)*sqrt(chiral[0]*chiral[0]+chiral[1]*chiral[1]+chiral[0]*chiral[1])/(double)ggT/tmp; 884 fprintf(stdout, "Orthogonal Tubevector axis[0->1] %lg\n", Projection(Tubevector[axis[0]], Tubevector[axis[1]])); 885 fprintf(stdout, "Orthogonal Tubevector axis[0->2] %lg\n", Projection(Tubevector[axis[0]], Tubevector[axis[2]])); 886 fprintf(stdout, "Orthogonal Tubevector axis[1->2] %lg\n", Projection(Tubevector[axis[1]], Tubevector[axis[2]])); 887 // here we assume, that Vector[axis[2]] is along z direction! 888 gsl_matrix *M = gsl_matrix_alloc(2,2); 889 gsl_matrix *C = gsl_matrix_alloc(2,2); 890 gsl_matrix *evec = gsl_matrix_alloc(2,2); 891 gsl_vector *eval = gsl_vector_alloc(2); 892 gsl_vector *v = gsl_vector_alloc(2); 893 gsl_vector *u = gsl_vector_alloc(2); 894 gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(2); 895 gsl_matrix_set(C, 0,0, Vector[axis[0]][0]); 896 gsl_matrix_set(C, 1,0, Vector[axis[0]][1]); 897 gsl_matrix_set(C, 0,1, Vector[axis[1]][0]); 898 gsl_matrix_set(C, 1,1, Vector[axis[1]][1]); 899 gsl_blas_dgemm(CblasTrans,CblasNoTrans, 1.0, C, C, 0.0, M); 900 fprintf(stdout, "M: \t%lg\t%lg\n\t%lg\t%lg\n", gsl_matrix_get(M,0,0), gsl_matrix_get(M,0,1), gsl_matrix_get(M,1,0), gsl_matrix_get(M,1,1)); 901 gsl_eigen_symmv(M, eval, evec, w); 902 gsl_eigen_symmv_sort(eval,evec,GSL_EIGEN_SORT_ABS_DESC); 903 fprintf(stdout, "Eigenvalues: %lg\t%lg\n", gsl_vector_get(eval,0), gsl_vector_get(eval,1)); 904 fprintf(stdout, "Eigenvectors: \t%lg\t%lg\n\t\t%lg\t%lg\n", gsl_matrix_get(evec,0,0), gsl_matrix_get(evec,0,1), gsl_matrix_get(evec,1,0), gsl_matrix_get(evec,1,1)); 905 gsl_matrix_set(M, 0,0, 0.); 906 gsl_matrix_set(M, 1,0, 1.); 907 gsl_matrix_set(M, 0,1, -gsl_vector_get(eval,1)/gsl_vector_get(eval,0)); 908 gsl_matrix_set(M, 1,1, 0.); 909 gsl_vector_set(v,0,(double)chiral[0]); 910 gsl_vector_set(v,1,(double)chiral[1]); 911 gsl_blas_dgemm(CblasNoTrans,CblasNoTrans, 1.0, evec, M, 0.0, C); 912 gsl_blas_dgemm(CblasNoTrans,CblasTrans, 1.0, C, evec, 0.0, M); 913 fprintf(stdout, "M: \t%lg\t%lg\n\t%lg\t%lg\n", gsl_matrix_get(M,0,0), gsl_matrix_get(M,0,1), gsl_matrix_get(M,1,0), gsl_matrix_get(M,1,1)); 914 gsl_blas_dgemv(CblasNoTrans, 1.0, M, v, 0.0, u); 915 fprintf(stdout, "Looking for factor to integer...\n"); 916 for(i=1;i<(chiral[0]+chiral[1])*(chiral[0]+chiral[1]);i++) { 917 x1 = gsl_vector_get(u,0)*(double)i; 918 x2 = gsl_vector_get(u,1)*(double)i; 919 x3 = 920 fprintf(stdout, "%d: %d\t%d vs. %lg\t%lg\n",i, ((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)), (x1), (x2)); 921 if (( fabs( ((int)(x1+x1/fabs(x1)*.5)) - (x1) ) < 1e-3) && ( fabs( ((int)(x2+x2/fabs(x2)*.5)) - (x2) ) < 1e-3 )) { 922 gsl_blas_dscal((double)i, u); 923 break; 924 } 925 } 926 fprintf(stdout, "(c,d) = (%lg,%lg)\n",gsl_vector_get(u,0), gsl_vector_get(u,1)); 927 928 // get length 929 double x[NDIM]; 930 for (i=0;i<NDIM;i++) 931 x[i] = gsl_vector_get(u,0) * Vector[axis[0]][i] + gsl_vector_get(u,1) * Vector[axis[1]][i]; 932 angle = Norm(x)/Norm(Tubevector[axis[1]]) ;//ScalarProduct(x,Tubevector[axis[1]])/Norm(Tubevector[axis[1]]); 933 fprintf(stdout, "angle is %lg\n", angle); 934 for (i=0;i<NDIM;i++) { 935 Tubevector[axis[1]][i] = gsl_vector_get(u,0) * Vector[axis[0]][i] + gsl_vector_get(u,1) * Vector[axis[1]][i]; 936 } 937 938 // Probe 939 gsl_matrix_set(M, 0,0, Vector[axis[0]][0]); 940 gsl_matrix_set(M, 1,0, Vector[axis[0]][1]); 941 gsl_matrix_set(M, 0,1, Vector[axis[1]][0]); 942 gsl_matrix_set(M, 1,1, Vector[axis[1]][1]); 943 gsl_vector_set(v,0,(double)chiral[0]); 944 gsl_vector_set(v,1,(double)chiral[1]); 945 gsl_blas_dgemv(CblasNoTrans, 1.0, M, u, 0.0, eval); 946 gsl_blas_dgemv(CblasTrans, 1.0, M, v, 0.0, u); 947 x1=1.; 948 gsl_blas_ddot(u,eval,&x1); 949 fprintf(stdout, "Testing (c,d): (a,b) M^t M (c,d)^t = 0 ? : %lg\n", x1); 950 951 gsl_matrix_free(M); 952 gsl_matrix_free(C); 953 gsl_matrix_free(evec); 954 gsl_vector_free(eval); 955 gsl_vector_free(v); 956 gsl_vector_free(u); 957 gsl_eigen_symmv_free(w); 958 959 angle = Projection(Tubevector[axis[1]], Vector[axis[0]]); 960 fprintf(stdout, "Projection Tubevector1 axis[0] %lg %lg\n", angle, 1./angle); 961 angle = Projection(Tubevector[axis[1]], Vector[axis[1]]); 962 fprintf(stdout, "Projection Tubevector1 axis[1] %lg %lg\n", angle, 1./angle); 887 963 888 964 /* fprintf(stdout, "Vector\n"); … … 988 1064 Tubevector[axis[2]][i] = Vector[axis[2]][i]; 989 1065 } 990 1066 // here we assume, that Vector[axis[2]] is along z direction! 1067 gsl_matrix *M = gsl_matrix_alloc(2,2); 1068 gsl_matrix *C = gsl_matrix_alloc(2,2); 1069 gsl_matrix *evec = gsl_matrix_alloc(2,2); 1070 gsl_vector *eval = gsl_vector_alloc(2); 1071 gsl_vector *v = gsl_vector_alloc(2); 1072 gsl_vector *u = gsl_vector_alloc(2); 1073 gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(2); 1074 gsl_matrix_set(C, 0,0, Vector[axis[0]][0]); 1075 gsl_matrix_set(C, 1,0, Vector[axis[0]][1]); 1076 gsl_matrix_set(C, 0,1, Vector[axis[1]][0]); 1077 gsl_matrix_set(C, 1,1, Vector[axis[1]][1]); 1078 gsl_blas_dgemm(CblasTrans,CblasNoTrans, 1.0, C, C, 0.0, M); 1079 fprintf(stdout, "M: \t%lg\t%lg\n\t%lg\t%lg\n", gsl_matrix_get(M,0,0), gsl_matrix_get(M,0,1), gsl_matrix_get(M,1,0), gsl_matrix_get(M,1,1)); 1080 gsl_eigen_symmv(M, eval, evec, w); 1081 gsl_eigen_symmv_sort(eval,evec,GSL_EIGEN_SORT_ABS_DESC); 1082 fprintf(stdout, "Eigenvalues: %lg\t%lg\n", gsl_vector_get(eval,0), gsl_vector_get(eval,1)); 1083 fprintf(stdout, "Eigenvectors: \t%lg\t%lg\n\t\t%lg\t%lg\n", gsl_matrix_get(evec,0,0), gsl_matrix_get(evec,0,1), gsl_matrix_get(evec,1,0), gsl_matrix_get(evec,1,1)); 1084 gsl_matrix_set(M, 0,0, 0.); 1085 gsl_matrix_set(M, 1,0, 1.); 1086 gsl_matrix_set(M, 0,1, -gsl_vector_get(eval,1)/gsl_vector_get(eval,0)); 1087 gsl_matrix_set(M, 1,1, 0.); 1088 gsl_vector_set(v,0,(double)chiral[0]); 1089 gsl_vector_set(v,1,(double)chiral[1]); 1090 gsl_blas_dgemm(CblasNoTrans,CblasNoTrans, 1.0, evec, M, 0.0, C); 1091 gsl_blas_dgemm(CblasNoTrans,CblasTrans, 1.0, C, evec, 0.0, M); 1092 fprintf(stdout, "M: \t%lg\t%lg\n\t%lg\t%lg\n", gsl_matrix_get(M,0,0), gsl_matrix_get(M,0,1), gsl_matrix_get(M,1,0), gsl_matrix_get(M,1,1)); 1093 gsl_blas_dgemv(CblasNoTrans, 1.0, M, v, 0.0, u); 1094 fprintf(stdout, "Looking for factor to integer...\n"); 1095 for(i=1;i<(chiral[0]+chiral[1])*(chiral[0]+chiral[1]);i++) { 1096 x1 = gsl_vector_get(u,0)*(double)i; 1097 x2 = gsl_vector_get(u,1)*(double)i; 1098 x3 = 1099 fprintf(stdout, "%d: %d\t%d vs. %lg\t%lg\n",i, ((int)(x1+x1/fabs(x1)*.5)), ((int)(x2+x2/fabs(x2)*.5)), (x1), (x2)); 1100 if (( fabs( ((int)(x1+x1/fabs(x1)*.5)) - (x1) ) < 1e-3) && ( fabs( ((int)(x2+x2/fabs(x2)*.5)) - (x2) ) < 1e-3 )) { 1101 gsl_blas_dscal((double)i, u); 1102 break; 1103 } 1104 } 1105 fprintf(stdout, "(c,d) = (%lg,%lg)\n",gsl_vector_get(u,0), gsl_vector_get(u,1)); 1106 1107 // get length 1108 double x[NDIM]; 1109 for (i=0;i<NDIM;i++) 1110 x[i] = gsl_vector_get(u,0) * Vector[axis[0]][i] + gsl_vector_get(u,1) * Vector[axis[1]][i]; 1111 angle = Norm(x)/Norm(Tubevector[axis[1]]) ;//ScalarProduct(x,Tubevector[axis[1]])/Norm(Tubevector[axis[1]]); 1112 fprintf(stdout, "angle is %lg\n", angle); 1113 for (i=0;i<NDIM;i++) { 1114 Tubevector[axis[1]][i] = gsl_vector_get(u,0) * Vector[axis[0]][i] + gsl_vector_get(u,1) * Vector[axis[1]][i]; 1115 } 1116 1117 // Probe 1118 gsl_matrix_set(M, 0,0, Vector[axis[0]][0]); 1119 gsl_matrix_set(M, 1,0, Vector[axis[0]][1]); 1120 gsl_matrix_set(M, 0,1, Vector[axis[1]][0]); 1121 gsl_matrix_set(M, 1,1, Vector[axis[1]][1]); 1122 gsl_vector_set(v,0,(double)chiral[0]); 1123 gsl_vector_set(v,1,(double)chiral[1]); 1124 gsl_blas_dgemv(CblasNoTrans, 1.0, M, u, 0.0, eval); 1125 gsl_blas_dgemv(CblasTrans, 1.0, M, v, 0.0, u); 1126 x1=1.; 1127 gsl_blas_ddot(u,eval,&x1); 1128 fprintf(stdout, "Testing (c,d): (a,b) M^t M (c,d)^t = 0 ? : %lg\n", x1); 1129 1130 gsl_matrix_free(M); 1131 gsl_matrix_free(C); 1132 gsl_matrix_free(evec); 1133 gsl_vector_free(eval); 1134 gsl_vector_free(v); 1135 gsl_vector_free(u); 1136 gsl_eigen_symmv_free(w); 991 1137 992 1138 // retrieve seed ... … … 1151 1297 //PrintVector(stdout, coord); 1152 1298 // project down on major and minor Tubevectors and check for length if out of sheet 1153 tempvector = MatrixTrafoInverse( offset, TubevectorInverse);1154 if (((tempvector[axis[0]] + MYEPSILON) > =0) && ((factors[0] - tempvector[axis[0]]) > MYEPSILON) &&1155 ((tempvector[axis[1]] + MYEPSILON) > =0) && ((factors[1] - tempvector[axis[1]]) > MYEPSILON) &&1156 ((tempvector[axis[2]] + MYEPSILON) > =0) && ((factors[2] - tempvector[axis[2]]) > MYEPSILON)) { // check if within rotated cell numbersheet++;1299 tempvector = MatrixTrafoInverse(coord, TubevectorInverse); 1300 if (((tempvector[axis[0]] + MYEPSILON) > 0) && ((factors[0] - tempvector[axis[0]]) > MYEPSILON) && 1301 ((tempvector[axis[1]] + MYEPSILON) > 0) && ((factors[1] - tempvector[axis[1]]) > MYEPSILON) && 1302 ((tempvector[axis[2]] + MYEPSILON) > 0) && ((factors[2] - tempvector[axis[2]]) > MYEPSILON)) { // check if within rotated cell numbersheet++; 1157 1303 //if (nummer >= 2) strcpy(atombuffer[nr].name, "O"); 1158 1304 //nummer++;
Note:
See TracChangeset
for help on using the changeset viewer.