| 27 | 
  | 
 | 
| 28 | 
  | 
namespace oopse { | 
| 29 | 
  | 
 | 
| 30 | 
< | 
RigidBody::RigidBody() : objType_(otRigidBody), storage_(&Snapshot::rigidbodyData){ | 
| 30 | 
> | 
RigidBody::RigidBody() : StuntDouble(otRigidBody, &Snapshot::rigidbodyData){ | 
| 31 | 
  | 
 | 
| 32 | 
  | 
} | 
| 33 | 
  | 
 | 
| 34 | 
  | 
void RigidBody::setPrevA(const RotMat3x3d& a) { | 
| 35 | 
< | 
    (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_] = a; | 
| 36 | 
< | 
    (snapshotMan_->getPrevSnapshot())->storage_->unitVector[localIndex_] = a.inverse() * sU_.getColum(2); | 
| 35 | 
> | 
    ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = a; | 
| 36 | 
> | 
    ((snapshotMan_->getPrevSnapshot())->*storage_).unitVector[localIndex_] = a.inverse() * sU_.getColum(2); | 
| 37 | 
  | 
 | 
| 38 | 
  | 
    std::vector<Atom*>::iterator i; | 
| 39 | 
  | 
    for (i = atoms_.begin(); i != atoms_.end(); ++i) { | 
| 46 | 
  | 
 | 
| 47 | 
  | 
       | 
| 48 | 
  | 
void RigidBody::setA(const RotMat3x3d& a) { | 
| 49 | 
< | 
    (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_] = a; | 
| 50 | 
< | 
    (snapshotMan_->getCurrentSnapshot())->storage_->unitVector[localIndex_] = a.inverse() * sU_.getColum(2); | 
| 49 | 
> | 
    ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a; | 
| 50 | 
> | 
    ((snapshotMan_->getCurrentSnapshot())->*storage_).unitVector[localIndex_] = a.inverse() * sU_.getColum(2); | 
| 51 | 
  | 
 | 
| 52 | 
  | 
    std::vector<Atom*>::iterator i; | 
| 53 | 
  | 
    for (i = atoms_.begin(); i != atoms_.end(); ++i) { | 
| 58 | 
  | 
}     | 
| 59 | 
  | 
     | 
| 60 | 
  | 
void RigidBody::setA(const RotMat3x3d& a, int snapshotNo) { | 
| 61 | 
< | 
    (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[localIndex_] = a; | 
| 62 | 
< | 
    (snapshotMan_->getSnapshot(snapshotNo))->storage_->unitVector[localIndex_] = a.inverse() * sU_.getColum(2);     | 
| 61 | 
> | 
    ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = a; | 
| 62 | 
> | 
    ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).unitVector[localIndex_] = a.inverse() * sU_.getColum(2);     | 
| 63 | 
  | 
 | 
| 64 | 
  | 
    std::vector<Atom*>::iterator i; | 
| 65 | 
  | 
    for (i = atoms_.begin(); i != atoms_.end(); ++i) { | 
| 78 | 
  | 
    return inertiaTensor_; | 
| 79 | 
  | 
}     | 
| 80 | 
  | 
 | 
| 81 | 
– | 
void RigidBody::setI(Mat3x3d& I) { | 
| 82 | 
– | 
    inertiaTensor_ = I; | 
| 83 | 
– | 
}     | 
| 84 | 
– | 
 | 
| 81 | 
  | 
std::vector<double> RigidBody::getGrad() { | 
| 82 | 
  | 
    vector<double> grad(6, 0.0); | 
| 83 | 
  | 
    Vector3d force; | 
| 322 | 
  | 
 | 
| 323 | 
  | 
 | 
| 324 | 
  | 
bool RigidBody::getAtomPos(Vector3d& pos, unsigned int index) { | 
| 325 | 
< | 
    if (index < atoms_.size() { | 
| 325 | 
> | 
    if (index < atoms_.size()) { | 
| 326 | 
  | 
 | 
| 327 | 
  | 
        Vector3d ref = body2Lab(refCoords_[index]); | 
| 328 | 
  | 
        pos = getPos() + ref; | 
| 329 | 
< | 
        return true | 
| 329 | 
> | 
        return true; | 
| 330 | 
  | 
    } else { | 
| 331 | 
  | 
        std::cerr << index << " is an invalid index, current rigid body contains "  | 
| 332 | 
  | 
                      << atoms_.size() << "atoms" << std::endl; | 
| 345 | 
  | 
    } else { | 
| 346 | 
  | 
        std::cerr << "Atom " << atom->getGlobalIndex()  | 
| 347 | 
  | 
                      <<" does not belong to Rigid body "<< getGlobalIndex() << std::endl;  | 
| 348 | 
+ | 
        return false; | 
| 349 | 
  | 
    } | 
| 350 | 
  | 
} | 
| 351 | 
  | 
bool RigidBody::getAtomVel(Vector3d& vel, unsigned int index) { | 
| 352 | 
  | 
 | 
| 353 | 
  | 
    //velRot = $(A\cdot skew(I^{-1}j))^{T}refCoor$ | 
| 354 | 
  | 
 | 
| 355 | 
< | 
    if (index < atoms_.size() { | 
| 355 | 
> | 
    if (index < atoms_.size()) { | 
| 356 | 
  | 
 | 
| 360 | 
– | 
        Vector3d ref; | 
| 357 | 
  | 
        Vector3d velRot; | 
| 358 | 
  | 
        Mat3x3d skewMat;; | 
| 359 | 
  | 
        Vector3d ref = refCoords_[index]; | 
| 375 | 
  | 
        velRot = (getA() * skewMat).transpose() * ref; | 
| 376 | 
  | 
 | 
| 377 | 
  | 
        vel =getVel() + velRot; | 
| 378 | 
+ | 
        return true; | 
| 379 | 
  | 
         | 
| 380 | 
  | 
    } else { | 
| 381 | 
< | 
        std::cerr << "Atom " << atom->getGlobalIndex()  | 
| 382 | 
< | 
                      <<" does not belong to Rigid body "<< getGlobalIndex() << std::endl;  | 
| 381 | 
> | 
        std::cerr << index << " is an invalid index, current rigid body contains "  | 
| 382 | 
> | 
                      << atoms_.size() << "atoms" << std::endl; | 
| 383 | 
  | 
        return false; | 
| 384 | 
  | 
    } | 
| 385 | 
  | 
} | 
| 398 | 
  | 
} | 
| 399 | 
  | 
 | 
| 400 | 
  | 
bool RigidBody::getAtomRefCoor(Vector3d& coor, unsigned int index) { | 
| 401 | 
< | 
    if (index < atoms_.size() { | 
| 401 | 
> | 
    if (index < atoms_.size()) { | 
| 402 | 
  | 
 | 
| 403 | 
  | 
        coor = refCoords_[index]; | 
| 404 | 
< | 
        return true | 
| 404 | 
> | 
        return true; | 
| 405 | 
  | 
    } else { | 
| 406 | 
  | 
        std::cerr << index << " is an invalid index, current rigid body contains "  | 
| 407 | 
  | 
                      << atoms_.size() << "atoms" << std::endl; |