OpenAtom  Version1.5a
LINE_EQUAL_DECOMP_V.2/para_grp_parse.C
1 #include <cstring>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cmath>
5 
6 #include "para_grp_parse.h"
7 
8 ///////////////////////////////////////////////////////////////////////////=
9 ///////////////////////////////////////////////////////////////////////////c
10 ///////////////////////////////////////////////////////////////////////////=
11 /// Decompose the lines
12 ///////////////////////////////////////////////////////////////////////////=
13 
14 void ParaGrpParse::get_plane_line_prms(int nktot, int nplane,int nline,int *npts,
15  int *kx_line, int *ky_line,
16  int *istrt_lgrp,int *iend_lgrp,int *npts_lgrp,
17  int *nline_lgrp,
18  int *kx_str_lgrp,int *kx_end_lgrp,
19  int *ky_str_lgrp,int *ky_end_lgrp)
20 
21 ///////////////////////////////////////////////////////////////////////////=
22  {
23 ///////////////////////////////////////////////////////////////////////////=
24 /// Find the best load balancing factor
25 
26  double dev_min = 0.0;
27  int nbal_min = 0;
28  int ibal_min = 0;
29  for(int ibal=1;ibal<=32;ibal++){
30  int nbal = ((ibal*nplane)/32);
31  int ntarg = (nktot/nplane);
32  if(ntarg > nbal){ntarg -= nbal;}
33  int nmax = 0;
34  int nmin = nktot;
35  int nnow = 0;
36  int ic = 0;
37  for(int i=0;i<nline;i++){
38  nnow += npts[i];
39  if( (nnow>=ntarg) && (ic<(nplane-1)) ){
40  ic+=1;
41  nmin = MIN(nmin,nnow);
42  nmax = MAX(nmax,nnow);
43  nnow = 0;
44  }//endif
45  }//endfor
46  nmin = MIN(nmin,nnow);
47  nmax = MAX(nmax,nnow);
48  double dev = 100.0*((double)(nmax-nmin))/((double)MAX(nmin,1));
49  if(ic==nplane-1){
50  if(dev<dev_min || ibal==1){
51  dev_min = dev;
52  nbal_min = nbal;
53  ibal_min = ibal;
54  }//endif
55  }//endif
56  }//endfor
57 
58 ///////////////////////////////////////////////////////////////////////////=
59 /// Store the good decomposition
60 
61  int ntarg = (nktot/nplane);
62  if(ntarg > nbal_min){ntarg = ntarg-nbal_min;}
63 
64  int ic = 0;
65  npts_lgrp[0] = 0;
66  istrt_lgrp[0] = 0;
67  nline_lgrp[0] = 0;
68  for(int i=0;i<nline;i++){
69  npts_lgrp[ic] += npts[i];
70  nline_lgrp[ic]+= 1;
71  if( (npts_lgrp[ic]>=ntarg) && (ic<(nplane-1)) ){
72  iend_lgrp[ic] = i+1;
73  ic+=1;
74  npts_lgrp[ic] = 0;
75  nline_lgrp[ic] = 0;
76  istrt_lgrp[ic] = i+1;
77  }//endif
78  }//endfor
79  iend_lgrp[(nplane-1)] = nline;
80 
81  for(int i=0;i<nplane;i++){
82  kx_str_lgrp[i] = kx_line[istrt_lgrp[i]];
83  kx_end_lgrp[i] = kx_line[(iend_lgrp[i]-1)];
84  ky_str_lgrp[i] = ky_line[istrt_lgrp[i]];
85  ky_end_lgrp[i] = ky_line[(iend_lgrp[i]-1)];
86  }//endfor
87 
88 ///////////////////////////////////////////////////////////////////////////=
89 /// Output some statistics
90 
91  int nmax = 0;
92  int nmin = npts_lgrp[0];
93  int nline_max = 0;
94  for(int i=0;i<nplane;i++){
95  nmax = MAX(nmax,npts_lgrp[i]);
96  nmin = MIN(nmin,npts_lgrp[i]);
97  nline_max = MAX(nline_lgrp[i],nline_max);
98  }//endfor
99  double dev = 100.0*((double)(nmax-nmin))/((double)MAX(nmin,1));
100  printf("max=%d : min=%d : dev=%g : %d %d\n",nmax,nmin,dev,nbal_min,ibal_min);
101 
102 ///////////////////////////////////////////////////////////////////////////=
103 /// Error check
104 
105  int ierr = 0;
106 
107  int nnn = npts_lgrp[0];
108  int nc = nline_lgrp[0];
109  if(istrt_lgrp[0]!=0) {ierr++;}
110  for(int i=1;i<nplane;i++){
111  if(iend_lgrp[(i-1)]!=istrt_lgrp[i]){ierr++;}
112  nc += nline_lgrp[i];
113  nnn += npts_lgrp[i];
114  }//endfor
115  if(iend_lgrp[(nplane-1)]!=nline){ierr++;}
116  if(nc!=nline){ierr++;}
117  if(nnn!=nktot){ierr++;}
118 
119  if(ierr!=0){
120  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
121  PRINTF("Error in get_plane_line_params\n");
122  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
123  EXIT(1);
124  }//endif
125 
126 ///////////////////////////////////////////////////////////////////////////=
127  }
128 ///////////////////////////////////////////////////////////////////////////=
129 
130 
131 ///////////////////////////////////////////////////////////////////////////=
132 ///////////////////////////////////////////////////////////////////////////c
133 ///////////////////////////////////////////////////////////////////////////=
134 
135 void ParaGrpParse::flip_data_set(int nktot, int *n_ret, int *kx, int *ky, int *kz
136  // ,complex *data
137  )
138 
139 ///////////////////////////////////////////////////////////////////////////=
140  {//begin routine
141 ///////////////////////////////////////////////////////////////////////////=
142 /// Count half plane kx=0 of piny data : check piny data
143 
144  PRINTF("Flip the Complex data!!\n");
145 
146  int nplane0 = 0;
147  for(int i=0;i<nktot;i++){
148  if(kx[i]==0){nplane0++;}
149  }//endfor
150  int *kxt = (int *)malloc(nplane0*sizeof(int));
151  int *kyt = (int *)malloc(nplane0*sizeof(int));
152  int *kzt = (int *)malloc(nplane0*sizeof(int));
153 /// complex *datat = (complex *)malloc(nplane0*sizeof(complex));
154 
155  for(int i=0;i<nplane0-1;i++){
156  kxt[i]= kx[i];
157  kyt[i]= ky[i];
158  kzt[i]= kz[i];
159 /// datat[i]= data[i];
160  if(kx[i]!=0){
161  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
162  PRINTF("Error while flipping piny dblpack data set\n");
163  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
164  EXIT(1);
165  }//endif
166  }//endfor
167  kxt[(nplane0-1)] = kx[(nktot-1)];
168  kyt[(nplane0-1)] = ky[(nktot-1)];
169  kzt[(nplane0-1)] = kz[(nktot-1)];
170 /// datat[(nplane0-1)]= data[(nktot-1)];
171  if(kx[(nktot-1)]!=0 || ky[(nktot-1)] || kz[(nktot-1)]){
172  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
173  PRINTF("Error while flipping piny dblpack data set\n");
174  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
175  EXIT(1);
176  }//endif
177 
178 ///////////////////////////////////////////////////////////////////////////=
179 /// Expand the data set
180 
181  for(int i=nktot-2;i>=0;i--){
182  kx[(i+nplane0)] = kx[i];
183  ky[(i+nplane0)] = ky[i];
184  kz[(i+nplane0)] = kz[i];
185  //data[(i+nplane0)] = data[i];
186  }//endfor
187 
188 ///////////////////////////////////////////////////////////////////////////=
189 /// Create the bottom half of plane zero by symmetry :
190 
191  int i1 = 0;
192  for(int i=0;i<nplane0-1;i++){
193  kx[i] = kxt[nplane0-i-2];
194  ky[i] = -kyt[nplane0-i-2];
195  kz[i] = -kzt[nplane0-i-2];
196 /// data[i].re = datat[i].re;
197 /// data[i].im = -datat[i].im;
198  if(kx[i]!=0 || ky[i]<ky[i1]){
199  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
200  PRINTF("Error while flipping piny dblpack data set\n");
201  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
202  EXIT(1);
203  }//endif
204  i1 = i;
205  }//endfor
206  kx[(nplane0-1)] = kxt[(nplane0-1)];
207  ky[(nplane0-1)] = kyt[(nplane0-1)];
208  kz[(nplane0-1)] = kzt[(nplane0-1)];
209  if(nktot>=nplane0+1){
210  if(kx[nplane0]!= 0 || ky[nplane0]!=0 || kz[nplane0]!=1){
211  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
212  PRINTF("Error while flipping piny dblpack data set\n");
213  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
214  EXIT(1);
215  }//endif
216  }//endfor
217 
218 #ifdef _GLENN_DBG_FLIP
219  int nnn = MIN(nplane0+3,nktot);
220  for(int i=0;i<nnn;i++){
221  PRINTF(" %d : %d %d %d \n",i,kx[i],ky[i],kz[i]);
222  }
223 #endif
224 
225 ///////////////////////////////////////////////////////////////////////////=
226 /// Exit
227 
228  (*n_ret) = (nktot+nplane0-1);
229  free(kxt);
230  free(kyt);
231  free(kzt);
232 
233 ///////////////////////////////////////////////////////////////////////////=
234  }//end routine
235 ///////////////////////////////////////////////////////////////////////////=
static void get_plane_line_prms(int, int, int, int *, int *, int *, int *, int *, int *, int *, int *, int *, int *, int *)
functions
static void flip_data_set(int, int *, int *, int *, int *)