| 113 |  | simError(); | 
| 114 |  | } | 
| 115 |  |  | 
| 116 | < | MemoryUtils::deleteVectorOfPointer(framePos_); | 
| 116 | > | MemoryUtils::deletePointers(framePos_); | 
| 117 |  |  | 
| 118 |  | #ifdef IS_MPI | 
| 119 |  |  | 
| 219 |  | } | 
| 220 |  |  | 
| 221 |  | void DumpReader::readFrame(int whichFrame) { | 
| 222 | + | int storageLayout = info_->getSnapshotManager()->getStorageLayout(); | 
| 223 | + |  | 
| 224 | + | if (storageLayout & DataStorage::dslPosition) { | 
| 225 | + | needPos_ = true; | 
| 226 | + | } else { | 
| 227 | + | needPos_ = false; | 
| 228 | + | } | 
| 229 | + |  | 
| 230 | + | if (storageLayout & DataStorage::dslVelocity) { | 
| 231 | + | needVel_ = true; | 
| 232 | + | } else { | 
| 233 | + | needVel_ = false; | 
| 234 | + | } | 
| 235 | + |  | 
| 236 | + | if (storageLayout & DataStorage::dslAmat || storageLayout & DataStorage::dslElectroFrame) { | 
| 237 | + | needQuaternion_ = true; | 
| 238 | + | } else { | 
| 239 | + | needQuaternion_ = false; | 
| 240 | + | } | 
| 241 | + |  | 
| 242 | + | if (storageLayout & DataStorage::dslAngularMomentum) { | 
| 243 | + | needAngMom_ = true; | 
| 244 | + | } else { | 
| 245 | + | needAngMom_ = false; | 
| 246 | + | } | 
| 247 | + |  | 
| 248 |  | readSet(whichFrame); | 
| 249 |  | } | 
| 250 |  |  | 
| 511 |  |  | 
| 512 |  | if (nTokens < 14) { | 
| 513 |  | sprintf(painCave.errMsg, | 
| 514 | < | "DumpReader Error: Not enough Tokens.\n"); | 
| 514 | > | "DumpReader Error: Not enough Tokens.\n%s\n", line); | 
| 515 |  | painCave.isFatal = 1; | 
| 516 |  | simError(); | 
| 517 |  | } | 
| 530 |  | pos[0] = tokenizer.nextTokenAsDouble(); | 
| 531 |  | pos[1] = tokenizer.nextTokenAsDouble(); | 
| 532 |  | pos[2] = tokenizer.nextTokenAsDouble(); | 
| 533 | < | integrableObject->setPos(pos); | 
| 533 | > | if (needPos_) { | 
| 534 | > | integrableObject->setPos(pos); | 
| 535 | > | } | 
| 536 |  |  | 
| 537 |  | vel[0] = tokenizer.nextTokenAsDouble(); | 
| 538 |  | vel[1] = tokenizer.nextTokenAsDouble(); | 
| 539 |  | vel[2] = tokenizer.nextTokenAsDouble(); | 
| 540 | < | integrableObject->setVel(vel); | 
| 541 | < |  | 
| 540 | > | if (needVel_) { | 
| 541 | > | integrableObject->setVel(vel); | 
| 542 | > | } | 
| 543 | > |  | 
| 544 |  | if (integrableObject->isDirectional()) { | 
| 545 |  |  | 
| 546 |  | q[0] = tokenizer.nextTokenAsDouble(); | 
| 559 |  | } | 
| 560 |  |  | 
| 561 |  | q.normalize(); | 
| 562 | < |  | 
| 563 | < | integrableObject->setQ(q); | 
| 564 | < |  | 
| 562 | > | if (needQuaternion_) { | 
| 563 | > | integrableObject->setQ(q); | 
| 564 | > | } | 
| 565 | > |  | 
| 566 |  | ji[0] = tokenizer.nextTokenAsDouble(); | 
| 567 |  | ji[1] = tokenizer.nextTokenAsDouble(); | 
| 568 |  | ji[2] = tokenizer.nextTokenAsDouble(); | 
| 569 | < | integrableObject->setJ(ji); | 
| 569 | > | if (needAngMom_) { | 
| 570 | > | integrableObject->setJ(ji); | 
| 571 | > | } | 
| 572 |  | } | 
| 573 |  |  | 
| 574 |  | } | 
| 610 |  | hmat(2, 2) = tokenizer.nextTokenAsDouble(); | 
| 611 |  | s->setHmat(hmat); | 
| 612 |  |  | 
| 613 | < | //read chi and integrablOfChidt, they should apprear in pair | 
| 613 | > | //read chi and integralOfChidt, they should apprear in pair | 
| 614 |  | if (tokenizer.countTokens() >= 2) { | 
| 615 |  | chi = tokenizer.nextTokenAsDouble(); | 
| 616 |  | integralOfChiDt = tokenizer.nextTokenAsDouble(); |