OpenAtom  Version1.5a
para_grp_parse.C
1 /** \file para_grp_parse.C
2  *
3  */
4 
5 #include <cstring>
6 #include <cstdlib>
7 #include <cstdio>
8 #include <cmath>
9 #include "charm++.h"
10 #include "ckcomplex.h"
11 
12 #include "para_grp_parse.h"
13 #include "src_piny_physics_v1.0/include/class_defs/piny_constants.h"
14 
15 ///////////////////////////////////////////////////////////////////////////=
16 ///////////////////////////////////////////////////////////////////////////c
17 ///////////////////////////////////////////////////////////////////////////=
18 /// Decompose the lines
19 ///////////////////////////////////////////////////////////////////////////=
20 
21 void ParaGrpParse::get_chareG_line_prms(int nktot, int nchareG,int nline,
22  int *npts,int *istrt_lgrp,int *iend_lgrp,int *npts_lgrp,int *nline_lgrp,
23  bool statespace)
24 
25 ///////////////////////////////////////////////////////////////////////////=
26  {//begin routine
27 ///////////////////////////////////////////////////////////////////////////=
28 /// Find the best load balancing factor
29 
30  PRINT_LINE_STAR;
31  if(statespace){
32  PRINTF("Statically load balancing pts and lines in state G-space : \n");
33  }else{
34  PRINTF("Statically load balancing pts and lines in rho G-space : \n");
35  }//endif
36  PRINTF(" There are %d pts %d lines and %d chunks\n",nktot,nline,nchareG);
37  PRINT_LINE_DASH;printf("\n");
38 
39  if(nchareG>nline){
40  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
41  PRINTF("Dude, too much juice on the chunks. Chill on gExpandFact\n");
42  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
43  EXIT(1);
44  }//endif
45 
46  double dev_min = 0.0;
47  int nbal_min = 0;
48  int ibal_min = 0;
49  int ifirst = 0;
50  int mmm = (nktot/nchareG);
51  for(int ibal=0;ibal<=mmm-1;ibal++){
52  int nbal = ibal;
53 /// for(int ibal=0;ibal<=128;ibal++){
54 /// int nbal = ((ibal*nchareG)/32);
55  int ntarg = (nktot/nchareG);
56  if(ntarg > nbal){ntarg -= nbal;}
57  int nmax = 0;
58  int nmin = nktot;
59  int nnow = 0;
60  int ic = 0;
61  for(int i=0;i<nline;i++){
62  nnow += npts[i];
63  if( (nnow>=ntarg) && (ic<(nchareG-1)) ){
64  ic+=1;
65  nmin = MIN(nmin,nnow);
66  nmax = MAX(nmax,nnow);
67  nnow = 0;
68  }//endif
69  }//endfor
70  nmin = MIN(nmin,nnow);
71  nmax = MAX(nmax,nnow);
72  double dev = 100.0*((double)(nmax-nmin))/((double)MAX(nmin,1));
73  if(ic==nchareG-1){
74  if(dev<dev_min || ifirst==0){
75  ifirst = 1;
76  dev_min = dev;
77  nbal_min = nbal;
78  ibal_min = ibal;
79  }//endif
80  }//endif
81  }//endfor
82 
83  if(ifirst==0){
84  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
85  PRINTF("Dude, too much juice on the chunks. Chill on gExpandFact\n");
86  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
87  EXIT(1);
88  }//endif
89 
90 ///////////////////////////////////////////////////////////////////////////=
91 /// Store the good decomposition
92 
93  int ntarg = (nktot/nchareG);
94  if(ntarg > nbal_min){ntarg = ntarg-nbal_min;}
95 
96  int ic = 0;
97  npts_lgrp[0] = 0;
98  istrt_lgrp[0] = 0;
99  nline_lgrp[0] = 0;
100  for(int i=0;i<nline;i++){
101  npts_lgrp[ic] += npts[i];
102  nline_lgrp[ic]+= 1;
103  if( (npts_lgrp[ic]>=ntarg) && (ic<(nchareG-1)) ){
104  iend_lgrp[ic] = i+1;
105  ic+=1;
106  npts_lgrp[ic] = 0;
107  nline_lgrp[ic] = 0;
108  istrt_lgrp[ic] = i+1;
109  }//endif
110  }//endfor
111  iend_lgrp[(nchareG-1)] = nline;
112 
113 ///////////////////////////////////////////////////////////////////////////=
114 /// Output some statistics
115 
116  int nmax = 0;
117  int nmin = npts_lgrp[0];
118  int nline_max = 0;
119  int nline_min = nline_lgrp[0];
120  for(int i=0;i<nchareG;i++){
121  nmax = MAX(nmax,npts_lgrp[i]);
122  nmin = MIN(nmin,npts_lgrp[i]);
123  nline_max = MAX(nline_lgrp[i],nline_max);
124  nline_min = MIN(nline_lgrp[i],nline_min);
125  }//endfor
126  double dev = 100.0*((double)(nmax-nmin))/((double)MAX(nmin,1));
127  double dev_l = 100.0*((double)(nline_max-nline_min))/((double)MAX(nline_min,1));
128 
129  if(nline_min==0 || nmin==0){
130  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
131  PRINTF("Dude, too much juice on the chunks. Chill on gExpandFact\n");
132  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
133  EXIT(1);
134  }//endif
135 
136  PRINTF(" Load balance statistics (%d %d)\n",ibal_min,nbal_min);
137  PRINTF(" pt_max=%d : pt_min=%d : dev=%g\n",nmax,nmin,dev);
138  PRINTF(" li_max=%d : li_min=%d : dev=%g\n",nline_max,nline_min,dev_l);
139 
140 ///////////////////////////////////////////////////////////////////////////=
141 /// Error check
142 
143  int ierr = 0;
144 
145  int nnn = npts_lgrp[0];
146  int nc = nline_lgrp[0];
147  if(istrt_lgrp[0]!=0) {ierr++;}
148  for(int i=1;i<nchareG;i++){
149  if(iend_lgrp[(i-1)]!=istrt_lgrp[i]){ierr++;CkPrintf("err.1\n");}
150  nc += nline_lgrp[i];
151  nnn += npts_lgrp[i];
152  }//endfor
153  if(iend_lgrp[(nchareG-1)]!=nline){ierr++;CkPrintf("err.2\n");}
154  if(nc!=nline){ierr++;CkPrintf("err.3\n");}
155  if(nnn!=nktot){ierr++;CkPrintf("err.4\n");}
156 
157  if(ierr!=0){
158  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
159  PRINTF("Error in get_chareG_line_params\n");
160  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
161  EXIT(1);
162  }//endif
163 
164  printf("\n");
165  PRINT_LINE_DASH;
166  PRINTF("Static load balancing complete\n");
167  PRINT_LINE_STAR;printf("\n");
168 
169 ///////////////////////////////////////////////////////////////////////////=
170  }
171 ///////////////////////////////////////////////////////////////////////////=
172 
173 
174 ///////////////////////////////////////////////////////////////////////////=
175 ///////////////////////////////////////////////////////////////////////////c
176 ///////////////////////////////////////////////////////////////////////////=
177 
178 void ParaGrpParse::flip_data_set(int nktot, int *n_ret, int *kx, int *ky, int *kz,
179  complex *data,int iopt)
180 
181 ///////////////////////////////////////////////////////////////////////////=
182  {//begin routine
183 ///////////////////////////////////////////////////////////////////////////=
184 /// Count half plane kx=0 of piny data : check piny data
185 
186  int nplane0 = 0;
187  for(int i=0;i<nktot;i++){
188  if(kx[i]==0){nplane0++;}
189  }//endfor
190  int *kxt = (int *)malloc(nplane0*sizeof(int));
191  int *kyt = (int *)malloc(nplane0*sizeof(int));
192  int *kzt = (int *)malloc(nplane0*sizeof(int));
193 
194  complex *datat;
195  if(iopt==1){datat = (complex *)malloc(nplane0*sizeof(complex));}
196 
197  for(int i=0;i<nplane0-1;i++){
198  kxt[i]= kx[i];
199  kyt[i]= ky[i];
200  kzt[i]= kz[i];
201  if(iopt==1){datat[i]= data[i];}
202  if(kx[i]!=0){
203  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
204  PRINTF("Error while flipping piny dblpack data set\n");
205  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
206  EXIT(1);
207  }//endif
208  }//endfor
209  kxt[(nplane0-1)] = kx[(nktot-1)];
210  kyt[(nplane0-1)] = ky[(nktot-1)];
211  kzt[(nplane0-1)] = kz[(nktot-1)];
212  if(iopt==1){datat[(nplane0-1)] = data[(nktot-1)];}
213 
214  if(kx[(nktot-1)]!=0 || ky[(nktot-1)] || kz[(nktot-1)]){
215  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
216  PRINTF("Error while flipping piny dblpack data set\n");
217  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
218  EXIT(1);
219  }//endif
220 
221 ///////////////////////////////////////////////////////////////////////////=
222 /// Expand the data set
223 
224  for(int i=nktot-2;i>=0;i--){
225  kx[(i+nplane0)] = kx[i];
226  ky[(i+nplane0)] = ky[i];
227  kz[(i+nplane0)] = kz[i];
228  if(iopt==1){data[(i+nplane0)] = data[i];}
229  }//endfor
230 
231 ///////////////////////////////////////////////////////////////////////////=
232 /// Create the bottom half of plane zero by symmetry :
233 
234  int i1 = 0;
235  for(int i=0;i<nplane0-1;i++){
236  int ind = nplane0-i-2;
237  kx[i] = kxt[ind];
238  ky[i] = -kyt[ind];
239  kz[i] = -kzt[ind];
240  if(iopt==1){
241  data[i].re = datat[ind].re;
242  data[i].im = -datat[ind].im;
243  }//endif
244  if(kx[i]!=0 || ky[i]<ky[i1]){
245  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
246  PRINTF("Error while flipping piny dblpack data set\n");
247  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
248  EXIT(1);
249  }//endif
250  i1 = i;
251  }//endfor
252  kx[(nplane0-1)] = kxt[(nplane0-1)];
253  ky[(nplane0-1)] = kyt[(nplane0-1)];
254  kz[(nplane0-1)] = kzt[(nplane0-1)];
255  if(iopt==1){data[(nplane0-1)] = datat[(nplane0-1)];}
256 
257  if(nktot>=nplane0+1){
258  if(kx[nplane0]!= 0 || ky[nplane0]!=0 || kz[nplane0]!=1){
259  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
260  PRINTF("Error while flipping piny dblpack data set\n");
261  PRINTF("@@@@@@@@@@@@@@@@@@@@_Error_@@@@@@@@@@@@@@@@@@@@\n");
262  EXIT(1);
263  }//endif
264  }//endfor
265 
266 #ifdef _GLENN_DBG_FLIP
267  int nnn = MIN(nplane0+3,nktot);
268  for(int i=0;i<nnn;i++){
269  PRINTF(" %d : %d %d %d \n",i,kx[i],ky[i],kz[i]);
270  }
271 #endif
272 
273 ///////////////////////////////////////////////////////////////////////////=
274 /// Exit
275 
276  (*n_ret) = (nktot+nplane0-1);
277 
278  free(kxt);
279  free(kyt);
280  free(kzt);
281 
282  if(iopt==1){free(datat);}
283 
284 ///////////////////////////////////////////////////////////////////////////=
285  }//end routine
286 ///////////////////////////////////////////////////////////////////////////=
static void get_chareG_line_prms(int, int, int, int *, int *, int *, int *, int *, bool)
functions
static void flip_data_set(int, int *, int *, int *, int *)