OpenAtom  Version1.5a
convert_State2KPTState.C
1 #include <cstring>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cmath>
5 #include <ctime>
6 
7 typedef struct complex{
8  double re;
9  double im;
10 };
11 
12 #define PRINTF printf
13 #define EXIT(N) {exit(N);}
14 
15 void flip_data_set(int , int *, int *, int *,complex *);
16 int main();
17 
18 ///////////////////////////////////////////////////////////////////////////=
19 ///////////////////////////////////////////////////////////////////////////c
20 ///////////////////////////////////////////////////////////////////////////=
21 
22 int main(){
23  int nstate = 128;
24  int nktot,nktot2,n1,n2,n3;
25  int *kx,*ky,*kz;
26  complex *data;
27  char fname[1024];
28  FILE *fp,*fp_out;
29 
30  fp = fopen("STATES/state1.out","r");
31  fscanf(fp,"%d %d %d %d",&nktot,&n1,&n2,&n3);
32  fclose(fp);
33 
34  nktot2 = 2*nktot-1;
35  data = (complex *)malloc(nktot2*sizeof(complex));
36  kx = (int *)malloc(nktot2*sizeof(int));
37  ky = (int *)malloc(nktot2*sizeof(int));
38  kz = (int *)malloc(nktot2*sizeof(int));
39 
40  for(int is=0;is<nstate;is++){
41  sprintf(fname, "STATES/state%d.out",is + 1);
42  fp = fopen(fname,"r");
43  fscanf(fp,"%d %d %d %d",&nktot,&n1,&n2,&n3);
44  for(int i =0;i<nktot;i++){
45  fscanf(fp,"%lf %lf %d %d %d",&data[i].re,&data[i].im,&kx[i],&ky[i],&kz[i]);
46  }//endfor
47  fclose(fp);
48 
49  flip_data_set(nktot,kx,ky,kz,data);
50 
51  sprintf(fname, "STATES_KPT/state%d.out",is + 1);
52  fp_out = fopen(fname,"w");
53  fprintf(fp_out,"%d %d %d %d\n",nktot2,n1,n2,n3);
54  for(int i =0;i<nktot2;i++){
55  fprintf(fp_out,"%lf %lf %d %d %d\n",data[i].re,data[i].im,kx[i],ky[i],kz[i]);
56  }//endfor
57  fclose(fp_out);
58 
59  }//endfor
60  free(kx);
61  free(ky);
62  free(kz);
63 
64  return 1;
65 
66 ///////////////////////////////////////////////////////////////////////////=
67  }//end main
68 ///////////////////////////////////////////////////////////////////////////=
69 
70 
71 
72 ///////////////////////////////////////////////////////////////////////////=
73 /// Take the funny piny output and reorder it to full complex beast
74 /// kx,ky,kz had better be malloced nktot*2 - 1 but contain nktot data
75 /// at input
76 ///////////////////////////////////////////////////////////////////////////=
77 ///////////////////////////////////////////////////////////////////////////c
78 ///////////////////////////////////////////////////////////////////////////=
79 
80 void flip_data_set(int nktot, int *kx, int *ky, int *kz,complex *data)
81 
82 ///////////////////////////////////////////////////////////////////////////=
83  {//begin routine
84 ///////////////////////////////////////////////////////////////////////////=
85 /// Count half plane kx=0 of piny data : check piny data
86 
87  int nplane0 = 0;
88  for(int i=0;i<nktot;i++){
89  if(kx[i]==0){nplane0++;}
90  }//endfor
91  int *kxt = (int *)malloc(nplane0*sizeof(int));
92  int *kyt = (int *)malloc(nplane0*sizeof(int));
93  int *kzt = (int *)malloc(nplane0*sizeof(int));
94 
95  complex *datat;
96  datat = (complex *)malloc(nplane0*sizeof(complex));
97 
98  for(int i=0;i<nplane0-1;i++){
99  kxt[i]= kx[i];
100  kyt[i]= ky[i];
101  kzt[i]= kz[i];
102  datat[i]= data[i];
103  if(kx[i]!=0){
104  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
105  PRINTF("Error.1 while flipping piny dblpack data set\n");
106  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
107  EXIT(1);
108  }//endif
109  }//endfor
110  kxt[(nplane0-1)] = kx[(nktot-1)];
111  kyt[(nplane0-1)] = ky[(nktot-1)];
112  kzt[(nplane0-1)] = kz[(nktot-1)];
113  datat[(nplane0-1)] = data[(nktot-1)];
114 
115  if(kx[(nktot-1)]!=0 || ky[(nktot-1)] || kz[(nktot-1)]){
116  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
117  PRINTF("Error.2 while flipping piny dblpack data set\n");
118  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
119  EXIT(1);
120  }//endif
121 
122 ///////////////////////////////////////////////////////////////////////////=
123 /// Expand the data set
124 
125  for(int i=nktot-2;i>=0;i--){
126  kx[(i+nplane0)] = kx[i];
127  ky[(i+nplane0)] = ky[i];
128  kz[(i+nplane0)] = kz[i];
129  data[(i+nplane0)] = data[i];
130  }//endfor
131 
132 ///////////////////////////////////////////////////////////////////////////=
133 /// Create the bottom half of plane zero by symmetry :
134 
135  int i1 = 0;
136  for(int i=0;i<nplane0-1;i++){
137  int ind = nplane0-i-2;
138  kx[i] = kxt[ind];
139  ky[i] = -kyt[ind];
140  kz[i] = -kzt[ind];
141  data[i].re = datat[ind].re;
142  data[i].im = -datat[ind].im;
143  if(kx[i]!=0 || ky[i]<ky[i1]){
144  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
145  PRINTF("Error.3 while flipping piny dblpack data set %d %d %d %d %d\n",kx[i],ky[i],kz[i],i,ind);
146  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
147  EXIT(1);
148  }//endif
149  i1 = i;
150  }//endfor
151  kx[(nplane0-1)] = kxt[(nplane0-1)];
152  ky[(nplane0-1)] = kyt[(nplane0-1)];
153  kz[(nplane0-1)] = kzt[(nplane0-1)];
154  data[(nplane0-1)] = datat[(nplane0-1)];
155 
156  if(nktot>=nplane0+1){
157  if(kx[nplane0]!= 0 || ky[nplane0]!=0 || kz[nplane0]!=1){
158  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
159  PRINTF("Error.4 while flipping piny dblpack data set\n");
160  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
161  EXIT(1);
162  }//endif
163  }//endfor
164 
165 #ifdef _GLENN_DBG_FLIP
166  int nnn = MIN(nplane0+3,nktot);
167  for(int i=0;i<nnn;i++){
168  PRINTF(" %d : %d %d %d \n",i,kx[i],ky[i],kz[i]);
169  }
170 #endif
171 
172 ///////////////////////////////////////////////////////////////////////////=
173 /// Exit
174 
175  free(kxt);
176  free(kyt);
177  free(kzt);
178  free(datat);
179 
180 ///////////////////////////////////////////////////////////////////////////=
181 /// Now we have full planes in the upper half space. We can flip them over
182 
183  int nnow = nktot + nplane0 - 1;
184  int nktot2 = 2*nktot - 1;
185 
186  datat = (complex *)malloc(nnow*sizeof(complex));
187  kxt = (int *)malloc(nnow*sizeof(int));
188  kyt = (int *)malloc(nnow*sizeof(int));
189  kzt = (int *)malloc(nnow*sizeof(int));
190  for(int i=0;i<nnow;i++){
191  kxt[i] = kx[i];
192  kyt[i] = ky[i];
193  kzt[i] = kz[i];
194  datat[i] = data[i];
195  }//endfor
196 
197  // The top half + plane0 is now in place!!!
198  int ioff = nktot2 - nnow;
199  for(int i=0,j=ioff;i<nnow;i++,j++){
200  kx[j] = kxt[i];
201  ky[j] = kyt[i];
202  kz[j] = kzt[i];
203  data[j] = datat[i];
204  }
205 
206  // Get the bottom half using hermitian conjg sym!
207  for(int i=0,j=nktot2-1;i<nnow-2*nplane0+1;i++,j--){
208  kx[i] = -kx[j];
209  ky[i] = -ky[j];
210  kz[i] = -kz[j];
211  data[i].re = data[j].re;
212  data[i].im = -data[j].im;
213  }
214  free(kx);
215  free(ky);
216  free(kz);
217  free(kxt);
218  free(kyt);
219  free(kzt);
220  free(datat);
221 ///////////////////////////////////////////////////////////////////////////=
222  }//end routine
223 ///////////////////////////////////////////////////////////////////////////=
int main()