| 28 |  | if(worldRank == 0 ){ | 
| 29 |  | #endif // is_mpi | 
| 30 |  |  | 
| 31 | – |  | 
| 31 |  | dumpFile.open(entry_plug->sampleName, ios::out | ios::trunc ); | 
| 32 |  |  | 
| 33 |  | if( !dumpFile ){ | 
| 91 |  |  | 
| 92 |  | indexArray.clear(); | 
| 93 |  |  | 
| 94 | < | for(int i = 0; i < mpiSim->getMyNlocal();i++) | 
| 94 | > | for(int i = 0; i < mpiSim->getMyNlocal();i++) | 
| 95 |  | indexArray.push_back(make_pair(i, atoms[i]->getGlobalIndex())); | 
| 96 |  |  | 
| 97 |  | sort(indexArray.begin(), indexArray.end(), indexSortingCriterion); | 
| 98 | + |  | 
| 99 | + | //for (int i = 0; i < mpiSim->getMyNlocal(); i++) { | 
| 100 | + | //  printf("node %d has global %d at local %d\n", worldRank, indexArray[i].second, indexArray[i].first); | 
| 101 | + | //} | 
| 102 | + |  | 
| 103 |  | } | 
| 104 | + |  | 
| 105 |  | #endif | 
| 106 |  |  | 
| 107 |  | void DumpWriter::writeDump(double currentTime){ | 
| 110 |  | vector<ofstream*> fileStreams; | 
| 111 |  |  | 
| 112 |  | #ifdef IS_MPI | 
| 113 | + | printf("Hello from node %d\n", worldRank); | 
| 114 | + | sortByGlobalIndex(); | 
| 115 |  | if(worldRank == 0 ){ | 
| 116 |  |  | 
| 117 |  | finalOut.open( entry_plug->finalName, ios::out | ios::trunc ); | 
| 392 |  | } else { | 
| 393 |  |  | 
| 394 |  | haveError = 0; | 
| 395 | < | which_atom = i; | 
| 395 | > | which_atom = i; | 
| 396 |  |  | 
| 397 | < | local_index = indexArray[currentIndex].first; | 
| 391 | < |  | 
| 392 | < | if (which_atom == indexArray[currentIndex].second) { | 
| 393 | < |  | 
| 394 | < | atomTypeString = atoms[local_index]->getType(); | 
| 397 | > | //local_index = -1; | 
| 398 |  |  | 
| 399 | < | atoms[local_index]->getPos(pos); | 
| 400 | < | atoms[local_index]->getVel(vel); | 
| 401 | < |  | 
| 399 | > | //for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) { | 
| 400 | > | //  if (atoms[j]->getGlobalIndex() == which_atom) local_index = j; | 
| 401 | > | //} | 
| 402 | > |  | 
| 403 | > | //if (local_index != -1) { | 
| 404 | > |  | 
| 405 | > | local_index = indexArray[currentIndex].first; | 
| 406 | > |  | 
| 407 | > | if (which_atom == indexArray[currentIndex].second) { | 
| 408 | > |  | 
| 409 | > | atomTypeString = atoms[local_index]->getType(); | 
| 410 | > |  | 
| 411 | > | atoms[local_index]->getPos(pos); | 
| 412 | > | atoms[local_index]->getVel(vel); | 
| 413 | > |  | 
| 414 |  | atomData6[0] = pos[0]; | 
| 415 |  | atomData6[1] = pos[1]; | 
| 416 |  | atomData6[2] = pos[2]; | 
| 442 |  | } | 
| 443 |  |  | 
| 444 |  | } else { | 
| 445 | < | sprintf(painCave.errMsg, | 
| 446 | < | "Atom %d not found on processor %d\n", | 
| 447 | < | i, worldRank ); | 
| 448 | < | haveError= 1; | 
| 449 | < | simError(); | 
| 450 | < | } | 
| 445 | > | sprintf(painCave.errMsg, | 
| 446 | > | "Atom %d not found on processor %d, currentIndex = %d, local_index = %d\n", | 
| 447 | > | which_atom, worldRank, currentIndex, local_index ); | 
| 448 | > | haveError= 1; | 
| 449 | > | simError(); | 
| 450 | > | } | 
| 451 |  |  | 
| 452 |  | if(haveError) DieDieDie(); | 
| 453 |  |  | 
| 454 | < | currentIndex ++; | 
| 454 | > | currentIndex++; | 
| 455 |  | } | 
| 456 |  | // If we've survived to here, format the line: | 
| 457 |  |  | 
| 458 |  | if (!isDirectional) { | 
| 459 |  |  | 
| 460 |  | sprintf( writeLine, | 
| 461 | < | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t", | 
| 462 | < | atomTypeString, | 
| 463 | < | atomData6[0], | 
| 464 | < | atomData6[1], | 
| 465 | < | atomData6[2], | 
| 466 | < | atomData6[3], | 
| 467 | < | atomData6[4], | 
| 468 | < | atomData6[5]); | 
| 454 | < |  | 
| 455 | < | strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" ); | 
| 461 | > | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t", | 
| 462 | > | atomTypeString, | 
| 463 | > | atomData6[0], | 
| 464 | > | atomData6[1], | 
| 465 | > | atomData6[2], | 
| 466 | > | atomData6[3], | 
| 467 | > | atomData6[4], | 
| 468 | > | atomData6[5]); | 
| 469 |  |  | 
| 470 | + | strcat( writeLine, "0.0\t0.0\t0.0\t0.0\t0.0\t0.0\t0.0\n" ); | 
| 471 | + |  | 
| 472 |  | } else { | 
| 473 |  |  | 
| 474 | < | sprintf( writeLine, | 
| 475 | < | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", | 
| 476 | < | atomTypeString, | 
| 477 | < | atomData13[0], | 
| 478 | < | atomData13[1], | 
| 479 | < | atomData13[2], | 
| 480 | < | atomData13[3], | 
| 481 | < | atomData13[4], | 
| 482 | < | atomData13[5], | 
| 483 | < | atomData13[6], | 
| 484 | < | atomData13[7], | 
| 485 | < | atomData13[8], | 
| 486 | < | atomData13[9], | 
| 487 | < | atomData13[10], | 
| 488 | < | atomData13[11], | 
| 489 | < | atomData13[12]); | 
| 474 | > | sprintf( writeLine, | 
| 475 | > | "%s\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n", | 
| 476 | > | atomTypeString, | 
| 477 | > | atomData13[0], | 
| 478 | > | atomData13[1], | 
| 479 | > | atomData13[2], | 
| 480 | > | atomData13[3], | 
| 481 | > | atomData13[4], | 
| 482 | > | atomData13[5], | 
| 483 | > | atomData13[6], | 
| 484 | > | atomData13[7], | 
| 485 | > | atomData13[8], | 
| 486 | > | atomData13[9], | 
| 487 | > | atomData13[10], | 
| 488 | > | atomData13[11], | 
| 489 | > | atomData13[12]); | 
| 490 |  |  | 
| 491 |  | } | 
| 492 |  |  | 
| 499 |  |  | 
| 500 |  | sprintf( checkPointMsg, | 
| 501 |  | "Sucessfully took a dump.\n"); | 
| 502 | < |  | 
| 502 | > |  | 
| 503 |  | MPIcheckPoint(); | 
| 504 | < |  | 
| 504 | > |  | 
| 505 |  | delete[] potatoes; | 
| 506 | < |  | 
| 506 | > |  | 
| 507 |  | } else { | 
| 508 |  |  | 
| 509 |  | // worldRank != 0, so I'm a remote node. | 
| 520 |  | if (AtomToProcMap[i] == worldRank) { | 
| 521 |  |  | 
| 522 |  | if (myPotato + 3 >= MAXTAG) { | 
| 523 | < |  | 
| 523 | > |  | 
| 524 |  | // The potato was going to exceed the maximum value, | 
| 525 |  | // so wrap this processor potato back to 0 (and block until | 
| 526 |  | // node 0 says we can go: | 
| 527 | < |  | 
| 527 | > |  | 
| 528 |  | MPI_Recv(&myPotato, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &istatus); | 
| 529 |  |  | 
| 530 |  | } | 
| 531 |  | which_atom = i; | 
| 532 | < | local_index = indexArray[currentIndex].first; | 
| 532 | > |  | 
| 533 | > | //local_index = -1; | 
| 534 | > |  | 
| 535 | > | //for (j=0; (j<mpiSim->getMyNlocal()) && (local_index < 0); j++) { | 
| 536 | > | // if (atoms[j]->getGlobalIndex() == which_atom) local_index = j; | 
| 537 | > | //} | 
| 538 | > |  | 
| 539 | > | //if (local_index != -1) { | 
| 540 | > |  | 
| 541 | > | local_index = indexArray[currentIndex].first; | 
| 542 |  |  | 
| 543 | < | if (which_atom == indexArray[currentIndex].second) { | 
| 543 | > | if (which_atom == indexArray[currentIndex].second) { | 
| 544 |  |  | 
| 545 |  | atomTypeString = atoms[local_index]->getType(); | 
| 546 | < |  | 
| 547 | < | atoms[local_index]->getPos(pos); | 
| 548 | < | atoms[local_index]->getVel(vel); | 
| 549 | < |  | 
| 546 | > |  | 
| 547 | > | atoms[local_index]->getPos(pos); | 
| 548 | > | atoms[local_index]->getVel(vel); | 
| 549 | > |  | 
| 550 |  | atomData6[0] = pos[0]; | 
| 551 |  | atomData6[1] = pos[1]; | 
| 552 |  | atomData6[2] = pos[2]; | 
| 578 |  | } | 
| 579 |  |  | 
| 580 |  | } else { | 
| 581 | < | sprintf(painCave.errMsg, | 
| 582 | < | "Atom %d not found on processor %d\n", | 
| 583 | < | i, worldRank ); | 
| 584 | < | haveError= 1; | 
| 585 | < | simError(); | 
| 586 | < | } | 
| 587 | < |  | 
| 581 | > | sprintf(painCave.errMsg, | 
| 582 | > | "Atom %d not found on processor %d, currentIndex = %d, local_index = %d\n", | 
| 583 | > | which_atom, worldRank, currentIndex, local_index ); | 
| 584 | > | haveError= 1; | 
| 585 | > | simError(); | 
| 586 | > | } | 
| 587 | > |  | 
| 588 |  | strncpy(MPIatomTypeString, atomTypeString, MINIBUFFERSIZE); | 
| 589 |  |  | 
| 590 |  | // null terminate the string before sending (just in case): |