| 224 |  | pos  = Atom::getPosArray(); | 
| 225 |  | vel  = Atom::getVelArray(); | 
| 226 |  | frc  = Atom::getFrcArray(); | 
| 227 | – | trq  = Atom::getTrqArray(); | 
| 228 | – | Amat = Atom::getAmatArray(); | 
| 227 |  |  | 
| 228 |  | while( currTime < runTime ){ | 
| 229 |  |  | 
| 232 |  | calcStress = 1; | 
| 233 |  | } | 
| 234 |  |  | 
| 235 | < | std::cerr << "calcPot = " << calcPot << "; calcStress = " | 
| 238 | < | << calcStress << "\n"; | 
| 235 | > | std::cerr << currTime << "\n"; | 
| 236 |  |  | 
| 237 |  | integrateStep( calcPot, calcStress ); | 
| 238 |  |  | 
| 279 |  |  | 
| 280 |  | preMove(); | 
| 281 |  | moveA(); | 
| 282 | < | if( nConstrained ) constrainA(); | 
| 282 | > | //if( nConstrained ) constrainA(); | 
| 283 |  |  | 
| 284 |  | // calc forces | 
| 285 |  |  | 
| 301 |  | double Tb[3]; | 
| 302 |  | double ji[3]; | 
| 303 |  | double angle; | 
| 304 | < | double A[3][3]; | 
| 304 | > | double A[3][3], At[3][3]; | 
| 305 |  |  | 
| 306 |  |  | 
| 307 |  | for( i=0; i<nAtoms; i++ ){ | 
| 312 |  | for( j=atomIndex; j<(atomIndex+3); j++ ) | 
| 313 |  | vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert; | 
| 314 |  |  | 
| 318 | – | std::cerr<< "MoveA vel[" << i << "] = " | 
| 319 | – | << vel[atomIndex] << "\t" | 
| 320 | – | << vel[atomIndex+1]<< "\t" | 
| 321 | – | << vel[atomIndex+2]<< "\n"; | 
| 315 |  |  | 
| 316 |  | // position whole step | 
| 317 |  | for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j]; | 
| 318 |  |  | 
| 319 |  |  | 
| 327 | – | std::cerr<< "MoveA pos[" << i << "] = " | 
| 328 | – | << pos[atomIndex] << "\t" | 
| 329 | – | << pos[atomIndex+1]<< "\t" | 
| 330 | – | << pos[atomIndex+2]<< "\n"; | 
| 331 | – |  | 
| 320 |  | if( atoms[i]->isDirectional() ){ | 
| 321 |  |  | 
| 322 |  | dAtom = (DirectionalAtom *)atoms[i]; | 
| 326 |  | Tb[0] = dAtom->getTx(); | 
| 327 |  | Tb[1] = dAtom->getTy(); | 
| 328 |  | Tb[2] = dAtom->getTz(); | 
| 329 | < |  | 
| 329 | > |  | 
| 330 |  | dAtom->lab2Body( Tb ); | 
| 331 | < |  | 
| 331 | > |  | 
| 332 |  | // get the angular momentum, and propagate a half step | 
| 333 |  |  | 
| 334 |  | ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert; | 
| 337 |  |  | 
| 338 |  | // use the angular velocities to propagate the rotation matrix a | 
| 339 |  | // 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(); | 
| 340 |  |  | 
| 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 | – |  | 
| 341 |  | // rotate about the x-axis | 
| 342 |  | angle = dt2 * ji[0] / dAtom->getIxx(); | 
| 343 | < | this->rotate( 1, 2, angle, ji, A ); | 
| 344 | < |  | 
| 343 | > | this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] ); | 
| 344 | > |  | 
| 345 |  | // rotate about the y-axis | 
| 346 |  | angle = dt2 * ji[1] / dAtom->getIyy(); | 
| 347 | < | this->rotate( 2, 0, angle, ji, A ); | 
| 347 | > | this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] ); | 
| 348 |  |  | 
| 349 |  | // rotate about the z-axis | 
| 350 |  | angle = dt * ji[2] / dAtom->getIzz(); | 
| 351 | < | this->rotate( 0, 1, angle, ji, A ); | 
| 351 | > | this->rotate( 0, 1, angle, ji, &Amat[aMatIndex] ); | 
| 352 |  |  | 
| 353 |  | // rotate about the y-axis | 
| 354 |  | angle = dt2 * ji[1] / dAtom->getIyy(); | 
| 355 | < | this->rotate( 2, 0, angle, ji, A ); | 
| 355 | > | this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] ); | 
| 356 |  |  | 
| 357 |  | // rotate about the x-axis | 
| 358 |  | angle = dt2 * ji[0] / dAtom->getIxx(); | 
| 359 | < | this->rotate( 1, 2, angle, ji, A ); | 
| 359 | > | this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] ); | 
| 360 |  |  | 
| 361 |  | dAtom->setJx( ji[0] ); | 
| 362 |  | dAtom->setJy( ji[1] ); | 
| 363 |  | dAtom->setJz( ji[2] ); | 
| 364 | + |  | 
| 365 | + | std::cerr << "Amat[" << i << "]\n"; | 
| 366 | + | info->printMat9( &Amat[aMatIndex] ); | 
| 367 | + |  | 
| 368 | + | std::cerr << "ji[" << i << "]\t" | 
| 369 | + | << ji[0] << "\t" | 
| 370 | + | << ji[1] << "\t" | 
| 371 | + | << ji[2] << "\n"; | 
| 372 | + |  | 
| 373 |  | } | 
| 374 |  |  | 
| 375 |  | } | 
| 378 |  |  | 
| 379 |  | void Integrator::moveB( void ){ | 
| 380 |  | int i,j,k; | 
| 381 | < | int atomIndex; | 
| 381 | > | int atomIndex, aMatIndex; | 
| 382 |  | DirectionalAtom* dAtom; | 
| 383 |  | double Tb[3]; | 
| 384 |  | double ji[3]; | 
| 385 |  |  | 
| 386 |  | for( i=0; i<nAtoms; i++ ){ | 
| 387 |  | atomIndex = i * 3; | 
| 388 | + | aMatIndex = i * 9; | 
| 389 |  |  | 
| 390 |  | // velocity half step | 
| 391 |  | for( j=atomIndex; j<(atomIndex+3); j++ ) | 
| 392 |  | vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert; | 
| 393 |  |  | 
| 394 | < | std::cerr<< "MoveB vel[" << i << "] = " | 
| 411 | < | << vel[atomIndex] << "\t" | 
| 412 | < | << vel[atomIndex+1]<< "\t" | 
| 413 | < | << vel[atomIndex+2]<< "\n"; | 
| 414 | < |  | 
| 415 | < |  | 
| 394 | > |  | 
| 395 |  | if( atoms[i]->isDirectional() ){ | 
| 396 |  |  | 
| 397 |  | dAtom = (DirectionalAtom *)atoms[i]; | 
| 402 |  | Tb[1] = dAtom->getTy(); | 
| 403 |  | Tb[2] = dAtom->getTz(); | 
| 404 |  |  | 
| 405 | + | std::cerr << "TrqB[" << i << "]\t" | 
| 406 | + | << Tb[0] << "\t" | 
| 407 | + | << Tb[1] << "\t" | 
| 408 | + | << Tb[2] << "\n"; | 
| 409 | + |  | 
| 410 |  | dAtom->lab2Body( Tb ); | 
| 411 |  |  | 
| 412 |  | // get the angular momentum, and complete the angular momentum | 
| 419 |  | dAtom->setJx( ji[0] ); | 
| 420 |  | dAtom->setJy( ji[1] ); | 
| 421 |  | dAtom->setJz( ji[2] ); | 
| 422 | + |  | 
| 423 | + |  | 
| 424 | + | std::cerr << "Amat[" << i << "]\n"; | 
| 425 | + | info->printMat9( &Amat[aMatIndex] ); | 
| 426 | + |  | 
| 427 | + | std::cerr << "ji[" << i << "]\t" | 
| 428 | + | << ji[0] << "\t" | 
| 429 | + | << ji[1] << "\t" | 
| 430 | + | << ji[2] << "\n"; | 
| 431 |  | } | 
| 432 |  | } | 
| 433 |  |  | 
| 683 |  |  | 
| 684 |  |  | 
| 685 |  | void Integrator::rotate( int axes1, int axes2, double angle, double ji[3], | 
| 686 | < | double A[3][3] ){ | 
| 686 | > | double A[9] ){ | 
| 687 |  |  | 
| 688 |  | int i,j,k; | 
| 689 |  | double sinAngle; | 
| 695 |  | double tempA[3][3]; | 
| 696 |  | double tempJ[3]; | 
| 697 |  |  | 
| 698 | + |  | 
| 699 |  | // initialize the tempA | 
| 700 |  |  | 
| 701 |  | for(i=0; i<3; i++){ | 
| 702 |  | for(j=0; j<3; j++){ | 
| 703 | < | tempA[j][i] = A[i][j]; | 
| 703 | > | tempA[j][i] = A[3*i+j]; | 
| 704 |  | } | 
| 705 |  | } | 
| 706 |  |  | 
| 757 |  |  | 
| 758 |  | for(i=0; i<3; i++){ | 
| 759 |  | for(j=0; j<3; j++){ | 
| 760 | < | A[j][i] = 0.0; | 
| 760 | > | A[3*j+i] = 0.0; | 
| 761 |  | for(k=0; k<3; k++){ | 
| 762 | < | A[j][i] += tempA[i][k] * rot[j][k]; | 
| 762 | > | A[3*j+i] += tempA[i][k] * rot[j][k]; | 
| 763 |  | } | 
| 764 |  | } | 
| 765 |  | } |