| 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): |