# | Line 27 | Line 27 | Integrator::Integrator( SimInfo *theInfo, ForceFields* | |
---|---|---|
27 | ||
28 | nAtoms = info->n_atoms; | |
29 | ||
30 | + | std::cerr << "integ nAtoms = " << nAtoms << "\n"; |
31 | + | |
32 | // check for constraints | |
33 | ||
34 | constrainedA = NULL; | |
# | Line 72 | Line 74 | void Integrator::checkConstraints( void ){ | |
74 | for(int j=0; j<molecules[i].getNBonds(); j++){ | |
75 | ||
76 | constrained = theArray[j]->is_constrained(); | |
77 | + | |
78 | + | std::cerr << "Is the folowing bond constrained \n"; |
79 | + | theArray[j]->printMe(); |
80 | ||
81 | if(constrained){ | |
82 | ||
83 | + | std::cerr << "Yes\n"; |
84 | + | |
85 | dummy_plug = theArray[j]->get_constraint(); | |
86 | temp_con[nConstrained].set_a( dummy_plug->get_a() ); | |
87 | temp_con[nConstrained].set_b( dummy_plug->get_b() ); | |
# | Line 82 | Line 89 | void Integrator::checkConstraints( void ){ | |
89 | ||
90 | nConstrained++; | |
91 | constrained = 0; | |
92 | < | } |
92 | > | } |
93 | > | else std::cerr << "No.\n"; |
94 | } | |
95 | ||
96 | theArray = (SRI**) molecules[i].getMyBends(); | |
# | Line 138 | Line 146 | void Integrator::checkConstraints( void ){ | |
146 | constrainedB[i] = temp_con[i].get_b(); | |
147 | constrainedDsqr[i] = temp_con[i].get_dsqr(); | |
148 | ||
141 | – | cerr << "constraint " << constrainedA[i] << " <-> " << constrainedB[i] |
142 | – | << " => " << constrainedDsqr[i] << "\n"; |
149 | } | |
150 | ||
151 | ||
# | Line 228 | Line 234 | void Integrator::integrate( void ){ | |
234 | calcStress = 1; | |
235 | } | |
236 | ||
237 | + | std::cerr << "calcPot = " << calcPot << "; calcStress = " |
238 | + | << calcStress << "\n"; |
239 | + | |
240 | integrateStep( calcPot, calcStress ); | |
241 | ||
242 | currTime += dt; | |
# | Line 259 | Line 268 | void Integrator::integrate( void ){ | |
268 | ||
269 | } | |
270 | ||
271 | < | dumpOut->writeFinal(); |
271 | > | dumpOut->writeFinal(currTime); |
272 | ||
273 | delete dumpOut; | |
274 | delete statOut; | |
# | Line 295 | Line 304 | void Integrator::moveA( void ){ | |
304 | double Tb[3]; | |
305 | double ji[3]; | |
306 | double angle; | |
307 | + | double A[3][3]; |
308 | ||
309 | + | |
310 | for( i=0; i<nAtoms; i++ ){ | |
311 | atomIndex = i * 3; | |
312 | aMatIndex = i * 9; | |
313 | < | |
313 | > | |
314 | // velocity half step | |
315 | for( j=atomIndex; j<(atomIndex+3); j++ ) | |
316 | vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert; | |
317 | ||
318 | + | std::cerr<< "MoveA vel[" << i << "] = " |
319 | + | << vel[atomIndex] << "\t" |
320 | + | << vel[atomIndex+1]<< "\t" |
321 | + | << vel[atomIndex+2]<< "\n"; |
322 | + | |
323 | // position whole step | |
324 | < | for( j=atomIndex; j<(atomIndex+3); j++ ) |
325 | < | pos[j] += dt * vel[j]; |
324 | > | for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j]; |
325 | > | |
326 | ||
327 | < | |
327 | > | std::cerr<< "MoveA pos[" << i << "] = " |
328 | > | << pos[atomIndex] << "\t" |
329 | > | << pos[atomIndex+1]<< "\t" |
330 | > | << pos[atomIndex+2]<< "\n"; |
331 | > | |
332 | if( atoms[i]->isDirectional() ){ | |
333 | ||
334 | dAtom = (DirectionalAtom *)atoms[i]; | |
# | Line 330 | Line 350 | void Integrator::moveA( void ){ | |
350 | // use the angular velocities to propagate the rotation matrix a | |
351 | // full time step | |
352 | ||
353 | + | // get the atom's rotation matrix |
354 | + | |
355 | + | A[0][0] = dAtom->getAxx(); |
356 | + | A[0][1] = dAtom->getAxy(); |
357 | + | A[0][2] = dAtom->getAxz(); |
358 | + | |
359 | + | A[1][0] = dAtom->getAyx(); |
360 | + | A[1][1] = dAtom->getAyy(); |
361 | + | A[1][2] = dAtom->getAyz(); |
362 | + | |
363 | + | A[2][0] = dAtom->getAzx(); |
364 | + | A[2][1] = dAtom->getAzy(); |
365 | + | A[2][2] = dAtom->getAzz(); |
366 | + | |
367 | // rotate about the x-axis | |
368 | angle = dt2 * ji[0] / dAtom->getIxx(); | |
369 | < | this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] ); |
369 | > | this->rotate( 1, 2, angle, ji, A ); |
370 | ||
371 | // rotate about the y-axis | |
372 | angle = dt2 * ji[1] / dAtom->getIyy(); | |
373 | < | this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] ); |
373 | > | this->rotate( 2, 0, angle, ji, A ); |
374 | ||
375 | // rotate about the z-axis | |
376 | angle = dt * ji[2] / dAtom->getIzz(); | |
377 | < | this->rotate( 0, 1, angle, ji, &Amat[aMatIndex] ); |
377 | > | this->rotate( 0, 1, angle, ji, A ); |
378 | ||
379 | // rotate about the y-axis | |
380 | angle = dt2 * ji[1] / dAtom->getIyy(); | |
381 | < | this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] ); |
381 | > | this->rotate( 2, 0, angle, ji, A ); |
382 | ||
383 | // rotate about the x-axis | |
384 | angle = dt2 * ji[0] / dAtom->getIxx(); | |
385 | < | this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] ); |
385 | > | this->rotate( 1, 2, angle, ji, A ); |
386 | ||
387 | dAtom->setJx( ji[0] ); | |
388 | dAtom->setJy( ji[1] ); | |
# | Line 373 | Line 407 | void Integrator::moveB( void ){ | |
407 | for( j=atomIndex; j<(atomIndex+3); j++ ) | |
408 | vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert; | |
409 | ||
410 | + | std::cerr<< "MoveB vel[" << i << "] = " |
411 | + | << vel[atomIndex] << "\t" |
412 | + | << vel[atomIndex+1]<< "\t" |
413 | + | << vel[atomIndex+2]<< "\n"; |
414 | + | |
415 | + | |
416 | if( atoms[i]->isDirectional() ){ | |
417 | ||
418 | dAtom = (DirectionalAtom *)atoms[i]; | |
# | Line 413 | Line 453 | void Integrator::constrainA(){ | |
453 | ||
454 | int i,j,k; | |
455 | int done; | |
456 | < | double pxab, pyab, pzab; |
457 | < | double rxab, ryab, rzab; |
456 | > | double pab[3]; |
457 | > | double rab[3]; |
458 | int a, b, ax, ay, az, bx, by, bz; | |
459 | double rma, rmb; | |
460 | double dx, dy, dz; | |
# | Line 424 | Line 464 | void Integrator::constrainA(){ | |
464 | double gab; | |
465 | int iteration; | |
466 | ||
427 | – | |
428 | – | |
467 | for( i=0; i<nAtoms; i++){ | |
468 | ||
469 | moving[i] = 0; | |
470 | moved[i] = 1; | |
471 | } | |
472 | < | |
435 | < | |
472 | > | |
473 | iteration = 0; | |
474 | done = 0; | |
475 | while( !done && (iteration < maxIteration )){ | |
# | Line 451 | Line 488 | void Integrator::constrainA(){ | |
488 | by = (b*3) + 1; | |
489 | bz = (b*3) + 2; | |
490 | ||
454 | – | |
491 | if( moved[a] || moved[b] ){ | |
492 | ||
493 | < | pxab = pos[ax] - pos[bx]; |
494 | < | pyab = pos[ay] - pos[by]; |
495 | < | pzab = pos[az] - pos[bz]; |
493 | > | pab[0] = pos[ax] - pos[bx]; |
494 | > | pab[1] = pos[ay] - pos[by]; |
495 | > | pab[2] = pos[az] - pos[bz]; |
496 | ||
497 | < | //periodic boundary condition |
498 | < | pxab = pxab - info->box_x * copysign(1, pxab) |
499 | < | * (int)( fabs(pxab / info->box_x) + 0.5); |
500 | < | pyab = pyab - info->box_y * copysign(1, pyab) |
501 | < | * (int)( fabs(pyab / info->box_y) + 0.5); |
502 | < | pzab = pzab - info->box_z * copysign(1, pzab) |
467 | < | * (int)( fabs(pzab / info->box_z) + 0.5); |
468 | < | |
469 | < | pabsq = pxab * pxab + pyab * pyab + pzab * pzab; |
497 | > | //periodic boundary condition |
498 | > | |
499 | > | info->wrapVector( pab ); |
500 | > | |
501 | > | pabsq = pab[0] * pab[0] + pab[1] * pab[1] + pab[2] * pab[2]; |
502 | > | |
503 | rabsq = constrainedDsqr[i]; | |
504 | < | diffsq = pabsq - rabsq; |
504 | > | diffsq = rabsq - pabsq; |
505 | ||
506 | // the original rattle code from alan tidesley | |
507 | if (fabs(diffsq) > (tol*rabsq*2)) { | |
508 | < | rxab = oldPos[ax] - oldPos[bx]; |
509 | < | ryab = oldPos[ay] - oldPos[by]; |
510 | < | rzab = oldPos[az] - oldPos[bz]; |
478 | < | |
479 | < | rxab = rxab - info->box_x * copysign(1, rxab) |
480 | < | * (int)( fabs(rxab / info->box_x) + 0.5); |
481 | < | ryab = ryab - info->box_y * copysign(1, ryab) |
482 | < | * (int)( fabs(ryab / info->box_y) + 0.5); |
483 | < | rzab = rzab - info->box_z * copysign(1, rzab) |
484 | < | * (int)( fabs(rzab / info->box_z) + 0.5); |
508 | > | rab[0] = oldPos[ax] - oldPos[bx]; |
509 | > | rab[1] = oldPos[ay] - oldPos[by]; |
510 | > | rab[2] = oldPos[az] - oldPos[bz]; |
511 | ||
512 | < | rpab = rxab * pxab + ryab * pyab + rzab * pzab; |
512 | > | info->wrapVector( rab ); |
513 | > | |
514 | > | rpab = rab[0] * pab[0] + rab[1] * pab[1] + rab[2] * pab[2]; |
515 | > | |
516 | rpabsq = rpab * rpab; | |
517 | ||
518 | ||
519 | if (rpabsq < (rabsq * -diffsq)){ | |
520 | ||
492 | – | cerr << "rpabsq = " << rpabsq << ", rabsq = " << rabsq |
493 | – | << ", -diffsq = " << -diffsq << "\n"; |
494 | – | |
521 | #ifdef IS_MPI | |
522 | a = atoms[a]->getGlobalIndex(); | |
523 | b = atoms[b]->getGlobalIndex(); | |
# | Line 505 | Line 531 | void Integrator::constrainA(){ | |
531 | ||
532 | rma = 1.0 / atoms[a]->getMass(); | |
533 | rmb = 1.0 / atoms[b]->getMass(); | |
534 | < | |
534 | > | |
535 | gab = diffsq / ( 2.0 * ( rma + rmb ) * rpab ); | |
510 | – | dx = rxab * gab; |
511 | – | dy = ryab * gab; |
512 | – | dz = rzab * gab; |
536 | ||
537 | + | dx = rab[0] * gab; |
538 | + | dy = rab[1] * gab; |
539 | + | dz = rab[2] * gab; |
540 | + | |
541 | pos[ax] += rma * dx; | |
542 | pos[ay] += rma * dy; | |
543 | pos[az] += rma * dz; | |
# | Line 545 | Line 572 | void Integrator::constrainA(){ | |
572 | } | |
573 | ||
574 | iteration++; | |
548 | – | cerr << "iterainA = " << iteration << "\n"; |
575 | } | |
576 | ||
577 | if( !done ){ | |
# | Line 564 | Line 590 | void Integrator::constrainB( void ){ | |
590 | int i,j,k; | |
591 | int done; | |
592 | double vxab, vyab, vzab; | |
593 | < | double rxab, ryab, rzab; |
593 | > | double rab[3]; |
594 | int a, b, ax, ay, az, bx, by, bz; | |
595 | double rma, rmb; | |
596 | double dx, dy, dz; | |
# | Line 582 | Line 608 | void Integrator::constrainB( void ){ | |
608 | iteration = 0; | |
609 | while( !done && (iteration < maxIteration ) ){ | |
610 | ||
611 | + | done = 1; |
612 | + | |
613 | for(i=0; i<nConstrained; i++){ | |
614 | ||
615 | a = constrainedA[i]; | |
616 | b = constrainedB[i]; | |
617 | ||
618 | < | ax = 3*a +0; |
619 | < | ay = 3*a +1; |
620 | < | az = 3*a +2; |
618 | > | ax = (a*3) + 0; |
619 | > | ay = (a*3) + 1; |
620 | > | az = (a*3) + 2; |
621 | ||
622 | < | bx = 3*b +0; |
623 | < | by = 3*b +1; |
624 | < | bz = 3*b +2; |
622 | > | bx = (b*3) + 0; |
623 | > | by = (b*3) + 1; |
624 | > | bz = (b*3) + 2; |
625 | ||
626 | if( moved[a] || moved[b] ){ | |
627 | ||
# | Line 601 | Line 629 | void Integrator::constrainB( void ){ | |
629 | vyab = vel[ay] - vel[by]; | |
630 | vzab = vel[az] - vel[bz]; | |
631 | ||
632 | < | rxab = pos[ax] - pos[bx]; |
633 | < | ryab = pos[ay] - pos[by]; |
634 | < | rzab = pos[az] - pos[bz]; |
632 | > | rab[0] = pos[ax] - pos[bx]; |
633 | > | rab[1] = pos[ay] - pos[by]; |
634 | > | rab[2] = pos[az] - pos[bz]; |
635 | ||
636 | < | rxab = rxab - info->box_x * copysign(1, rxab) |
637 | < | * (int)( fabs(rxab / info->box_x) + 0.5); |
610 | < | ryab = ryab - info->box_y * copysign(1, ryab) |
611 | < | * (int)( fabs(ryab / info->box_y) + 0.5); |
612 | < | rzab = rzab - info->box_z * copysign(1, rzab) |
613 | < | * (int)( fabs(rzab / info->box_z) + 0.5); |
614 | < | |
636 | > | info->wrapVector( rab ); |
637 | > | |
638 | rma = 1.0 / atoms[a]->getMass(); | |
639 | rmb = 1.0 / atoms[b]->getMass(); | |
640 | ||
641 | < | rvab = rxab * vxab + ryab * vyab + rzab * vzab; |
641 | > | rvab = rab[0] * vxab + rab[1] * vyab + rab[2] * vzab; |
642 | ||
643 | gab = -rvab / ( ( rma + rmb ) * constrainedDsqr[i] ); | |
644 | ||
645 | if (fabs(gab) > tol) { | |
646 | ||
647 | < | dx = rxab * gab; |
648 | < | dy = ryab * gab; |
649 | < | dz = rzab * gab; |
647 | > | dx = rab[0] * gab; |
648 | > | dy = rab[1] * gab; |
649 | > | dz = rab[2] * gab; |
650 | ||
651 | vel[ax] += rma * dx; | |
652 | vel[ay] += rma * dy; | |
# | Line 667 | Line 690 | void Integrator::rotate( int axes1, int axes2, double | |
690 | ||
691 | ||
692 | void Integrator::rotate( int axes1, int axes2, double angle, double ji[3], | |
693 | < | double A[9] ){ |
693 | > | double A[3][3] ){ |
694 | ||
695 | int i,j,k; | |
696 | double sinAngle; | |
# | Line 683 | Line 706 | void Integrator::rotate( int axes1, int axes2, double | |
706 | ||
707 | for(i=0; i<3; i++){ | |
708 | for(j=0; j<3; j++){ | |
709 | < | tempA[j][i] = A[3*i + j]; |
709 | > | tempA[j][i] = A[i][j]; |
710 | } | |
711 | } | |
712 | ||
# | Line 740 | Line 763 | void Integrator::rotate( int axes1, int axes2, double | |
763 | ||
764 | for(i=0; i<3; i++){ | |
765 | for(j=0; j<3; j++){ | |
766 | < | A[3*j + i] = 0.0; |
766 | > | A[j][i] = 0.0; |
767 | for(k=0; k<3; k++){ | |
768 | < | A[3*j + i] += tempA[i][k] * rot[j][k]; |
768 | > | A[j][i] += tempA[i][k] * rot[j][k]; |
769 | } | |
770 | } | |
771 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |