OpenAtom  Version1.5a
PIBeadAtoms_dbg.C
1 //////////////////////////////////////////////////////////////////////////////
2 //////////////////////////////////////////////////////////////////////////////
3 //////////////////////////////////////////////////////////////////////////////
4 #include <cstring>
5 #include <cstdlib>
6 #include <cstdio>
7 #include <cmath>
8 //////////////////////////////////////////////////////////////////////////////
9 
10 
11 //////////////////////////////////////////////////////////////////////////////
12 //////////////////////////////////////////////////////////////////////////////
13 //////////////////////////////////////////////////////////////////////////////
14 class PIBeadAtoms{
15  public:
16  ~PIBeadAtoms(){}
17  PIBeadAtoms(int );
18 
19  int numBeads;
20  void compute_PIMD_Fu();
21  void compute_PIMD_u();
22  void compute_PIMD_x();
23  void output_PIMD_u();
24  void output_PIMD_x();
25  void zero_PIMD_u();
26  void zero_PIMD_x();
27  void zero_PIMD_fu();
28  void energy_PIMD_u();
29  void energy_PIMD_x();
30  void modelpot_PIMD_x(double *);
31  void checkUforce();
32 
33  double *x,*y,*z;
34  double *xu,*yu,*zu;
35  double *fx,*fy,*fz;
36  double *fxu,*fyu,*fzu;
37  double *rat1,*rat2,*veig;
38 };
39 //////////////////////////////////////////////////////////////////////////////
40 
41 
42 //////////////////////////////////////////////////////////////////////////////
43 //////////////////////////////////////////////////////////////////////////////
44 //////////////////////////////////////////////////////////////////////////////
45 int main()
46 //////////////////////////////////////////////////////////////////////////////
47  {//begin routine
48 //////////////////////////////////////////////////////////////////////////////
49 
50  int numBeads = 10;
51  PIBeadAtoms pibeads(numBeads);
52 
53 //////////////////////////////////////////////////////////////////////////////
54 /// Check x to u and u to x
55 
56  pibeads.output_PIMD_x();
57  pibeads.energy_PIMD_x();
58 
59  // pibeads.zero_PIMD_u(); // not necessary but useful for debugging
60  pibeads.compute_PIMD_u();
61  pibeads.output_PIMD_u();
62  pibeads.energy_PIMD_u();
63 
64  // pibeads.zero_PIMD_x(); // not necessary but useful for debugging
65  pibeads.compute_PIMD_x();
66  pibeads.output_PIMD_x();
67  pibeads.energy_PIMD_x();
68 
69 //////////////////////////////////////////////////////////////////////////////
70 /// Check the u forces
71 
72 /// pibeads.zero_PIMD_fu(); // not necessary but useful for debugging
73  pibeads.compute_PIMD_Fu();
74  pibeads.checkUforce();
75 
76 //////////////////////////////////////////////////////////////////////////////
77 
78  return 1;
79  exit(0);
80 
81 //////////////////////////////////////////////////////////////////////////////
82  }//end routine
83 //////////////////////////////////////////////////////////////////////////////
84 
85 
86 //////////////////////////////////////////////////////////////////////////////
87 //////////////////////////////////////////////////////////////////////////////
88 //////////////////////////////////////////////////////////////////////////////
89 PIBeadAtoms::PIBeadAtoms(int numBeads_dum)
90 //////////////////////////////////////////////////////////////////////////////
91  {// begin routine
92 //////////////////////////////////////////////////////////////////////////////
93 /// printf("{%d}[%d] PIBeadAtoms::PIBeadAtoms numbeads %d\n",thisInstance.proxyOffset,thisIndex, numBeads);
94 
95  numBeads = numBeads_dum;
96 
97  x= new double[numBeads];
98  y= new double[numBeads];
99  z= new double[numBeads];
100  xu= new double[numBeads];
101  yu= new double[numBeads];
102  zu= new double[numBeads];
103  fx= new double[numBeads];
104  fy= new double[numBeads];
105  fz= new double[numBeads];
106  fxu= new double[numBeads];
107  fyu= new double[numBeads];
108  fzu= new double[numBeads];
109 
110  rat1 = new double[numBeads];
111  rat2 = new double[numBeads];
112  veig = new double[numBeads];
113 
114 //////////////////////////////////////////////////////////////////////////////
115 /// Initialize magic ratios
116 
117  for(int ip=2;ip<=numBeads;ip++){
118  int ip1 = ip-1;
119  rat1[ip1] = ((double)(ip1))/((double)(ip));
120  rat2[ip1] = 1.0/((double)(ip));
121  veig[ip1] = ((double)(ip))/((double)(ip1));
122  }//endfor
123 
124 //////////////////////////////////////////////////////////////////////////////
125 
126  long int seedval = 91435715;
127  srand48(seedval);
128  for(int i =0;i<numBeads;i++){
129  x[i] = drand48() - 0.5;
130  y[i] = drand48() - 0.5;
131  z[i] = drand48() - 0.5;
132  xu[i] = 0.0;
133  yu[i] = 0.0;
134  zu[i] = 0.0;
135  fx[i] = -x[i];
136  fy[i] = -y[i];
137  fz[i] = -z[i];
138  }//endfor
139 
140 //////////////////////////////////////////////////////////////////////////////
141  }//end routine
142 //////////////////////////////////////////////////////////////////////////////
143 
144 
145 
146 //////////////////////////////////////////////////////////////////////////////
147 //////////////////////////////////////////////////////////////////////////////
148 //////////////////////////////////////////////////////////////////////////////
149 void PIBeadAtoms::compute_PIMD_Fu()
150 //////////////////////////////////////////////////////////////////////////////
151  {// begin routine
152 //////////////////////////////////////////////////////////////////////////////
153 
154  if(numBeads<=0){
155  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
156  printf("The number of beads must be >=0\n");
157  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
158  exit(0);
159  }//endif
160 
161 //////////////////////////////////////////////////////////////////////////////
162 
163  if(numBeads>1){
164  fxu[0] = 0.0; fyu[0] = 0.0; fzu[0] = 0.0;
165  for(int ip=0;ip<numBeads;ip++){
166  fxu[0] += fx[ip]; fyu[0] += fy[ip]; fzu[0] += fz[ip];
167  }/*endfor*/
168  fxu[1] = fx[1]; fyu[1] = fy[1]; fzu[1] = fz[1];
169  for(int ip=1;ip<numBeads-1;ip++){
170  int ip1 = ip+1;
171  fxu[ip1] = fx[ip1] + rat1[ip]*fxu[ip];
172  fyu[ip1] = fy[ip1] + rat1[ip]*fyu[ip];
173  fzu[ip1] = fz[ip1] + rat1[ip]*fzu[ip];
174  }/*endfor*/
175  }else{
176  fxu[0] = fx[0]; fyu[0] = fy[0]; fzu[0] = fz[0];
177  }/*endif*/
178 
179 //////////////////////////////////////////////////////////////////////////////
180  }//end routine
181 //////////////////////////////////////////////////////////////////////////////
182 
183 
184 
185 
186 //////////////////////////////////////////////////////////////////////////////
187 //////////////////////////////////////////////////////////////////////////////
188 //////////////////////////////////////////////////////////////////////////////
189 void PIBeadAtoms::compute_PIMD_u()
190 //////////////////////////////////////////////////////////////////////////////
191  {// begin routine
192 //////////////////////////////////////////////////////////////////////////////
193 
194  if(numBeads<=0){
195  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
196  printf("The number of beads must be >=0\n");
197  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
198  exit(0);
199  }//endif
200 
201 //////////////////////////////////////////////////////////////////////////////
202 
203  if(numBeads>1){
204  xu[0] = x[0]; yu[0] = y[0]; zu[0] = z[0];
205  for(int ip=1;ip<numBeads-1;ip++){
206  int ip1 = ip+1;
207  double xstar = rat1[ip]*x[ip1] + rat2[ip]*x[0];
208  double ystar = rat1[ip]*y[ip1] + rat2[ip]*y[0];
209  double zstar = rat1[ip]*z[ip1] + rat2[ip]*z[0];
210  xu[ip] = x[ip] - xstar;
211  yu[ip] = y[ip] - ystar;
212  zu[ip] = z[ip] - zstar;
213  }/*endfor:ip*/
214  int ip = numBeads-1;
215  xu[ip] = x[ip] - x[0];
216  yu[ip] = y[ip] - y[0];
217  zu[ip] = z[ip] - z[0];
218  }else{
219  xu[0] = x[0]; yu[0] = y[0]; zu[0] = z[0];
220  }//endif
221 
222 //////////////////////////////////////////////////////////////////////////////
223  }//end routine
224 //////////////////////////////////////////////////////////////////////////////
225 
226 
227 
228 
229 //////////////////////////////////////////////////////////////////////////////
230 //////////////////////////////////////////////////////////////////////////////
231 //////////////////////////////////////////////////////////////////////////////
232 void PIBeadAtoms::compute_PIMD_x()
233 //////////////////////////////////////////////////////////////////////////////
234  {// begin routine
235 //////////////////////////////////////////////////////////////////////////////
236 
237  if(numBeads<=0){
238  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
239  printf("The number of beads must be >=0\n");
240  printf("@@@@@@@@@@@@@@@@@@@@_error_@@@@@@@@@@@@@@@@@@@@@@\n");
241  exit(0);
242  }//endif
243 
244 //////////////////////////////////////////////////////////////////////////////
245 
246 
247  if(numBeads>1){
248  x[0] = xu[0]; y[0] = yu[0]; z[0] = zu[0];
249  int ip = numBeads-1;
250  x[ip] = xu[ip] + x[0]; y[ip] = yu[ip] + y[0]; z[ip] = zu[ip] + z[0];
251  for(int ip=numBeads-2;ip>=1;ip--){
252  int ip1 = ip+1;
253  double xadd = rat1[ip]*x[ip1]+xu[0]*rat2[ip];
254  double yadd = rat1[ip]*y[ip1]+yu[0]*rat2[ip];
255  double zadd = rat1[ip]*z[ip1]+zu[0]*rat2[ip];
256  x[ip] = xu[ip] + xadd;
257  y[ip] = yu[ip] + yadd;
258  z[ip] = zu[ip] + zadd;
259  }/*endfor*/
260  }else{
261  x[0] = xu[0]; y[0] = yu[0]; z[0] = zu[0];
262  }//endif
263 
264 //////////////////////////////////////////////////////////////////////////////
265  }//end routine
266 //////////////////////////////////////////////////////////////////////////////
267 
268 
269 //////////////////////////////////////////////////////////////////////////////
270 //////////////////////////////////////////////////////////////////////////////
271 //////////////////////////////////////////////////////////////////////////////
273 //////////////////////////////////////////////////////////////////////////////
274  {// begin routine
275 //////////////////////////////////////////////////////////////////////////////
276 
277  printf("\n/////////////////////////////////\n");
278  for(int i =0;i<numBeads;i++){
279  printf("x[%d]: %g %g %g\n",i,x[i],y[i],z[i]);
280  }//endfor
281  printf("/////////////////////////////////\n");
282 
283 //////////////////////////////////////////////////////////////////////////////
284  }//end routine
285 //////////////////////////////////////////////////////////////////////////////
286 
287 
288 //////////////////////////////////////////////////////////////////////////////
289 //////////////////////////////////////////////////////////////////////////////
290 //////////////////////////////////////////////////////////////////////////////
292 //////////////////////////////////////////////////////////////////////////////
293  {// begin routine
294 //////////////////////////////////////////////////////////////////////////////
295 
296  printf("\n/////////////////////////////////\n");
297  for(int i =0;i<numBeads;i++){
298  printf("u[%d]: %g %g %g\n",i,xu[i],yu[i],zu[i]);
299  }//endfor
300  printf("/////////////////////////////////\n");
301 
302 //////////////////////////////////////////////////////////////////////////////
303  }//end routine
304 //////////////////////////////////////////////////////////////////////////////
305 
306 
307 //////////////////////////////////////////////////////////////////////////////
308 //////////////////////////////////////////////////////////////////////////////
309 //////////////////////////////////////////////////////////////////////////////
311 //////////////////////////////////////////////////////////////////////////////
312  {// begin routine
313 //////////////////////////////////////////////////////////////////////////////
314 
315  for(int i =0;i<numBeads;i++){
316  xu[i] = 0.0; yu[i] = 0.0; zu[i] = 0.0;;
317  }//endfor
318 
319 //////////////////////////////////////////////////////////////////////////////
320  }//end routine
321 //////////////////////////////////////////////////////////////////////////////
322 
323 
324 //////////////////////////////////////////////////////////////////////////////
325 //////////////////////////////////////////////////////////////////////////////
326 //////////////////////////////////////////////////////////////////////////////
328 //////////////////////////////////////////////////////////////////////////////
329  {// begin routine
330 //////////////////////////////////////////////////////////////////////////////
331 
332  for(int i =0;i<numBeads;i++){
333  fxu[i] = 0.0; fyu[i] = 0.0; fzu[i] = 0.0;;
334  }//endfor
335 
336 //////////////////////////////////////////////////////////////////////////////
337  }//end routine
338 //////////////////////////////////////////////////////////////////////////////
339 
340 
341 //////////////////////////////////////////////////////////////////////////////
342 //////////////////////////////////////////////////////////////////////////////
343 //////////////////////////////////////////////////////////////////////////////
345 //////////////////////////////////////////////////////////////////////////////
346  {// begin routine
347 //////////////////////////////////////////////////////////////////////////////
348 
349  for(int i =0;i<numBeads;i++){
350  x[i] = 0.0; y[i] = 0.0; z[i] = 0.0;;
351  }//endfor
352 
353 //////////////////////////////////////////////////////////////////////////////
354  }//end routine
355 //////////////////////////////////////////////////////////////////////////////
356 
357 
358 
359 //////////////////////////////////////////////////////////////////////////////
360 //////////////////////////////////////////////////////////////////////////////
361 //////////////////////////////////////////////////////////////////////////////
363 //////////////////////////////////////////////////////////////////////////////
364  {// begin routine
365 //////////////////////////////////////////////////////////////////////////////
366  double ep;
367 
368  int ip = 0;
369  int ip1 = numBeads-1;
370  ep = ( (x[ip]-x[ip1])*(x[ip]-x[ip1])
371  +(y[ip]-y[ip1])*(y[ip]-y[ip1])
372  +(z[ip]-z[ip1])*(z[ip]-z[ip1])
373  );
374  for(int ip=1;ip<numBeads;ip++){
375  int ip1 = ip-1;
376  ep += ( (x[ip]-x[ip1])*(x[ip]-x[ip1])
377  +(y[ip]-y[ip1])*(y[ip]-y[ip1])
378  +(z[ip]-z[ip1])*(z[ip]-z[ip1])
379  );
380  }//endfor
381  printf("\n/////////////////////////////////\n");
382  printf("x energy %.10g\n",ep);
383  printf("/////////////////////////////////\n");
384 
385 //////////////////////////////////////////////////////////////////////////////
386  }//end routine
387 //////////////////////////////////////////////////////////////////////////////
388 
389 
390 //////////////////////////////////////////////////////////////////////////////
391 //////////////////////////////////////////////////////////////////////////////
392 //////////////////////////////////////////////////////////////////////////////
394 //////////////////////////////////////////////////////////////////////////////
395  {// begin routine
396 //////////////////////////////////////////////////////////////////////////////
397 
398  double ep = 0.0;
399  for(int ip =1;ip<numBeads;ip++){
400  double fk = veig[ip];
401  ep += fk*(xu[ip]*xu[ip]
402  +yu[ip]*yu[ip]
403  +zu[ip]*zu[ip]
404  );
405  }//endfor
406  printf("\n/////////////////////////////////\n");
407  printf("u energy %.10g\n",ep);
408  printf("/////////////////////////////////\n");
409 
410 //////////////////////////////////////////////////////////////////////////////
411  }//end routine
412 //////////////////////////////////////////////////////////////////////////////
413 
414 
415 //////////////////////////////////////////////////////////////////////////////
416 //////////////////////////////////////////////////////////////////////////////
417 //////////////////////////////////////////////////////////////////////////////
419 //////////////////////////////////////////////////////////////////////////////
420  {// begin routine
421 //////////////////////////////////////////////////////////////////////////////
422 
423  printf("\n/////////////////////////////////\n");
424 
425  double potpx,potmx;
426  double potpy,potmy;
427  double potpz,potmz;
428  double delta = 1.e-05;
429  for(int ip =0;ip<numBeads;ip++){
430 
431  xu[ip] += delta;
432  compute_PIMD_x();
433  modelpot_PIMD_x(&potpx);
434  xu[ip] -= 2.0*delta;
435  compute_PIMD_x();
436  modelpot_PIMD_x(&potmx);
437  xu[ip] += delta;
438 
439  yu[ip] += delta;
440  compute_PIMD_x();
441  modelpot_PIMD_x(&potpy);
442  yu[ip] -= 2.0*delta;
443  compute_PIMD_x();
444  modelpot_PIMD_x(&potmy);
445  yu[ip] += delta;
446 
447  zu[ip] += delta;
448  compute_PIMD_x();
449  modelpot_PIMD_x(&potpz);
450  zu[ip] -= 2.0*delta;
451  compute_PIMD_x();
452  modelpot_PIMD_x(&potmz);
453  zu[ip] += delta;
454  printf("fu[%d]: %.10g %.10g : %.10g %.10g : %.10g %.10g\n",
455  ip,fxu[ip],0.5*(potmx-potpx)/delta,
456  fyu[ip],0.5*(potmy-potpy)/delta,
457  fzu[ip],0.5*(potmz-potpz)/delta);
458  }//endfor
459 
460  printf("/////////////////////////////////\n");
461 
462 //////////////////////////////////////////////////////////////////////////////
463  }//end routine
464 //////////////////////////////////////////////////////////////////////////////
465 
466 
467 //////////////////////////////////////////////////////////////////////////////
468 //////////////////////////////////////////////////////////////////////////////
469 //////////////////////////////////////////////////////////////////////////////
470 void PIBeadAtoms::modelpot_PIMD_x(double *pot_out)
471 //////////////////////////////////////////////////////////////////////////////
472  {// begin routine
473 //////////////////////////////////////////////////////////////////////////////
474 
475  double pot = 0.0;
476  double fk = 0.5;
477  for(int ip =0;ip<numBeads;ip++){
478  pot += fk*(x[ip]*x[ip]
479  +y[ip]*y[ip]
480  +z[ip]*z[ip]
481  );
482  }//endfor
483 
484  pot_out[0] = pot;
485 
486 //////////////////////////////////////////////////////////////////////////////
487  }//end routine
488 //////////////////////////////////////////////////////////////////////////////
int main()
void output_PIMD_x()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:343
void zero_PIMD_u()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:385
void zero_PIMD_x()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:422
void output_PIMD_u()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:364
void energy_PIMD_x()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:441
void energy_PIMD_u()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:474
void checkUforce()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:502
void zero_PIMD_fu()
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:403
void modelpot_PIMD_x(double *)
useful for debugging /////////////////////////////////////////////////////////////////////////// ////...
Definition: PIBeadAtoms.C:556