| 57 | 
  | 
    return false;   | 
| 58 | 
  | 
} | 
| 59 | 
  | 
 | 
| 60 | 
+ | 
string getPrefix(const string& str ){ | 
| 61 | 
+ | 
  string prefix; | 
| 62 | 
+ | 
  string suffix; | 
| 63 | 
+ | 
  int pos;  | 
| 64 | 
+ | 
 | 
| 65 | 
+ | 
  pos = str.rfind("."); | 
| 66 | 
+ | 
 | 
| 67 | 
+ | 
  if (pos >= 0) { | 
| 68 | 
+ | 
     prefix = str.substr(0, pos); | 
| 69 | 
+ | 
     suffix = str.substr(pos, str.size()); | 
| 70 | 
+ | 
 | 
| 71 | 
+ | 
     // leave .bass there in case we've reverted to old habits  | 
| 72 | 
+ | 
     if (LowerCase(suffix) == ".md" || LowerCase(suffix) == ".bass") | 
| 73 | 
+ | 
       return prefix; | 
| 74 | 
+ | 
     else  | 
| 75 | 
+ | 
       return str; | 
| 76 | 
+ | 
      | 
| 77 | 
+ | 
  } else  | 
| 78 | 
+ | 
    return str; | 
| 79 | 
+ | 
}; | 
| 80 | 
+ | 
 | 
| 81 | 
+ | 
 | 
| 82 | 
  | 
SimSetup::SimSetup(){ | 
| 83 | 
  | 
   | 
| 84 | 
  | 
  initSuspend = false; | 
| 96 | 
  | 
} | 
| 97 | 
  | 
 | 
| 98 | 
  | 
SimSetup::~SimSetup(){ | 
| 99 | 
+ | 
  // clean up the forcefield | 
| 100 | 
+ | 
  the_ff->cleanMe(); | 
| 101 | 
+ | 
 | 
| 102 | 
  | 
  delete stamps; | 
| 103 | 
  | 
  delete globals; | 
| 104 | 
  | 
} | 
| 117 | 
  | 
#endif // is_mpi | 
| 118 | 
  | 
 | 
| 119 | 
  | 
    inFileName = fileName; | 
| 120 | 
+ | 
 | 
| 121 | 
+ | 
    globals->initalize(); | 
| 122 | 
  | 
    set_interface_stamps(stamps, globals); | 
| 123 | 
  | 
 | 
| 124 | 
  | 
#ifdef IS_MPI | 
| 149 | 
  | 
 | 
| 150 | 
  | 
void SimSetup::createSim(void){ | 
| 151 | 
  | 
 | 
| 152 | 
< | 
  // gather all of the information from the Bass file | 
| 152 | 
> | 
  // gather all of the information from the meta-data file | 
| 153 | 
  | 
 | 
| 154 | 
  | 
  gatherInfo(); | 
| 155 | 
  | 
 | 
| 670 | 
  | 
  sprintf(checkPointMsg, "all molecules initialized succesfully"); | 
| 671 | 
  | 
  MPIcheckPoint(); | 
| 672 | 
  | 
#endif // is_mpi | 
| 646 | 
– | 
 | 
| 647 | 
– | 
} | 
| 648 | 
– | 
 | 
| 649 | 
– | 
void SimSetup::initFromBass(void){ | 
| 650 | 
– | 
  int i, j, k; | 
| 651 | 
– | 
  int n_cells; | 
| 652 | 
– | 
  double cellx, celly, cellz; | 
| 653 | 
– | 
  double temp1, temp2, temp3; | 
| 654 | 
– | 
  int n_per_extra; | 
| 655 | 
– | 
  int n_extra; | 
| 656 | 
– | 
  int have_extra, done; | 
| 657 | 
– | 
 | 
| 658 | 
– | 
  double vel[3]; | 
| 659 | 
– | 
  vel[0] = 0.0; | 
| 660 | 
– | 
  vel[1] = 0.0; | 
| 661 | 
– | 
  vel[2] = 0.0; | 
| 662 | 
– | 
 | 
| 663 | 
– | 
  temp1 = (double) tot_nmol / 4.0; | 
| 664 | 
– | 
  temp2 = pow(temp1, (1.0 / 3.0)); | 
| 665 | 
– | 
  temp3 = ceil(temp2); | 
| 666 | 
– | 
 | 
| 667 | 
– | 
  have_extra = 0; | 
| 668 | 
– | 
  if (temp2 < temp3){ | 
| 669 | 
– | 
    // we have a non-complete lattice | 
| 670 | 
– | 
    have_extra = 1; | 
| 671 | 
– | 
 | 
| 672 | 
– | 
    n_cells = (int) temp3 - 1; | 
| 673 | 
– | 
    cellx = info[0].boxL[0] / temp3; | 
| 674 | 
– | 
    celly = info[0].boxL[1] / temp3; | 
| 675 | 
– | 
    cellz = info[0].boxL[2] / temp3; | 
| 676 | 
– | 
    n_extra = tot_nmol - (4 * n_cells * n_cells * n_cells); | 
| 677 | 
– | 
    temp1 = ((double) n_extra) / (pow(temp3, 3.0) - pow(n_cells, 3.0)); | 
| 678 | 
– | 
    n_per_extra = (int) ceil(temp1); | 
| 679 | 
– | 
 | 
| 680 | 
– | 
    if (n_per_extra > 4){ | 
| 681 | 
– | 
      sprintf(painCave.errMsg, | 
| 682 | 
– | 
              "SimSetup error. There has been an error in constructing" | 
| 683 | 
– | 
              " the non-complete lattice.\n"); | 
| 684 | 
– | 
      painCave.isFatal = 1; | 
| 685 | 
– | 
      simError(); | 
| 686 | 
– | 
    } | 
| 687 | 
– | 
  } | 
| 688 | 
– | 
  else{ | 
| 689 | 
– | 
    n_cells = (int) temp3; | 
| 690 | 
– | 
    cellx = info[0].boxL[0] / temp3; | 
| 691 | 
– | 
    celly = info[0].boxL[1] / temp3; | 
| 692 | 
– | 
    cellz = info[0].boxL[2] / temp3; | 
| 693 | 
– | 
  } | 
| 694 | 
– | 
 | 
| 695 | 
– | 
  current_mol = 0; | 
| 696 | 
– | 
  current_comp_mol = 0; | 
| 697 | 
– | 
  current_comp = 0; | 
| 698 | 
– | 
  current_atom_ndx = 0; | 
| 699 | 
– | 
 | 
| 700 | 
– | 
  for (i = 0; i < n_cells ; i++){ | 
| 701 | 
– | 
    for (j = 0; j < n_cells; j++){ | 
| 702 | 
– | 
      for (k = 0; k < n_cells; k++){ | 
| 703 | 
– | 
        makeElement(i * cellx, j * celly, k * cellz); | 
| 704 | 
– | 
 | 
| 705 | 
– | 
        makeElement(i * cellx + 0.5 * cellx, j * celly + 0.5 * celly, k * cellz); | 
| 706 | 
– | 
 | 
| 707 | 
– | 
        makeElement(i * cellx, j * celly + 0.5 * celly, k * cellz + 0.5 * cellz); | 
| 708 | 
– | 
 | 
| 709 | 
– | 
        makeElement(i * cellx + 0.5 * cellx, j * celly, k * cellz + 0.5 * cellz); | 
| 710 | 
– | 
      } | 
| 711 | 
– | 
    } | 
| 712 | 
– | 
  } | 
| 713 | 
– | 
 | 
| 714 | 
– | 
  if (have_extra){ | 
| 715 | 
– | 
    done = 0; | 
| 716 | 
– | 
 | 
| 717 | 
– | 
    int start_ndx; | 
| 718 | 
– | 
    for (i = 0; i < (n_cells + 1) && !done; i++){ | 
| 719 | 
– | 
      for (j = 0; j < (n_cells + 1) && !done; j++){ | 
| 720 | 
– | 
        if (i < n_cells){ | 
| 721 | 
– | 
          if (j < n_cells){ | 
| 722 | 
– | 
            start_ndx = n_cells; | 
| 723 | 
– | 
          } | 
| 724 | 
– | 
          else | 
| 725 | 
– | 
            start_ndx = 0; | 
| 726 | 
– | 
        } | 
| 727 | 
– | 
        else | 
| 728 | 
– | 
          start_ndx = 0; | 
| 729 | 
– | 
 | 
| 730 | 
– | 
        for (k = start_ndx; k < (n_cells + 1) && !done; k++){ | 
| 731 | 
– | 
          makeElement(i * cellx, j * celly, k * cellz); | 
| 732 | 
– | 
          done = (current_mol >= tot_nmol); | 
| 733 | 
– | 
 | 
| 734 | 
– | 
          if (!done && n_per_extra > 1){ | 
| 735 | 
– | 
            makeElement(i * cellx + 0.5 * cellx, j * celly + 0.5 * celly, | 
| 736 | 
– | 
                        k * cellz); | 
| 737 | 
– | 
            done = (current_mol >= tot_nmol); | 
| 738 | 
– | 
          } | 
| 739 | 
– | 
 | 
| 740 | 
– | 
          if (!done && n_per_extra > 2){ | 
| 741 | 
– | 
            makeElement(i * cellx, j * celly + 0.5 * celly, | 
| 742 | 
– | 
                        k * cellz + 0.5 * cellz); | 
| 743 | 
– | 
            done = (current_mol >= tot_nmol); | 
| 744 | 
– | 
          } | 
| 745 | 
– | 
 | 
| 746 | 
– | 
          if (!done && n_per_extra > 3){ | 
| 747 | 
– | 
            makeElement(i * cellx + 0.5 * cellx, j * celly, | 
| 748 | 
– | 
                        k * cellz + 0.5 * cellz); | 
| 749 | 
– | 
            done = (current_mol >= tot_nmol); | 
| 750 | 
– | 
          } | 
| 751 | 
– | 
        } | 
| 752 | 
– | 
      } | 
| 753 | 
– | 
    } | 
| 754 | 
– | 
  } | 
| 755 | 
– | 
 | 
| 756 | 
– | 
  for (i = 0; i < info[0].n_atoms; i++){ | 
| 757 | 
– | 
    info[0].atoms[i]->setVel(vel); | 
| 758 | 
– | 
  } | 
| 759 | 
– | 
} | 
| 760 | 
– | 
 | 
| 761 | 
– | 
void SimSetup::makeElement(double x, double y, double z){ | 
| 762 | 
– | 
  int k; | 
| 763 | 
– | 
  AtomStamp* current_atom; | 
| 764 | 
– | 
  DirectionalAtom* dAtom; | 
| 765 | 
– | 
  double rotMat[3][3]; | 
| 766 | 
– | 
  double pos[3]; | 
| 767 | 
– | 
 | 
| 768 | 
– | 
  for (k = 0; k < comp_stamps[current_comp]->getNAtoms(); k++){ | 
| 769 | 
– | 
    current_atom = comp_stamps[current_comp]->getAtom(k); | 
| 770 | 
– | 
    if (!current_atom->havePosition()){ | 
| 771 | 
– | 
      sprintf(painCave.errMsg, | 
| 772 | 
– | 
              "SimSetup:initFromBass error.\n" | 
| 773 | 
– | 
              "\tComponent %s, atom %s does not have a position specified.\n" | 
| 774 | 
– | 
              "\tThe initialization routine is unable to give a start" | 
| 775 | 
– | 
              " position.\n", | 
| 776 | 
– | 
              comp_stamps[current_comp]->getID(), current_atom->getType()); | 
| 777 | 
– | 
      painCave.isFatal = 1; | 
| 778 | 
– | 
      simError(); | 
| 779 | 
– | 
    } | 
| 780 | 
– | 
 | 
| 781 | 
– | 
    pos[0] = x + current_atom->getPosX(); | 
| 782 | 
– | 
    pos[1] = y + current_atom->getPosY(); | 
| 783 | 
– | 
    pos[2] = z + current_atom->getPosZ(); | 
| 784 | 
– | 
 | 
| 785 | 
– | 
    info[0].atoms[current_atom_ndx]->setPos(pos); | 
| 786 | 
– | 
 | 
| 787 | 
– | 
    if (info[0].atoms[current_atom_ndx]->isDirectional()){ | 
| 788 | 
– | 
      dAtom = (DirectionalAtom *) info[0].atoms[current_atom_ndx]; | 
| 673 | 
  | 
 | 
| 790 | 
– | 
      rotMat[0][0] = 1.0; | 
| 791 | 
– | 
      rotMat[0][1] = 0.0; | 
| 792 | 
– | 
      rotMat[0][2] = 0.0; | 
| 793 | 
– | 
 | 
| 794 | 
– | 
      rotMat[1][0] = 0.0; | 
| 795 | 
– | 
      rotMat[1][1] = 1.0; | 
| 796 | 
– | 
      rotMat[1][2] = 0.0; | 
| 797 | 
– | 
 | 
| 798 | 
– | 
      rotMat[2][0] = 0.0; | 
| 799 | 
– | 
      rotMat[2][1] = 0.0; | 
| 800 | 
– | 
      rotMat[2][2] = 1.0; | 
| 801 | 
– | 
 | 
| 802 | 
– | 
      dAtom->setA(rotMat); | 
| 803 | 
– | 
    } | 
| 804 | 
– | 
 | 
| 805 | 
– | 
    current_atom_ndx++; | 
| 806 | 
– | 
  } | 
| 807 | 
– | 
 | 
| 808 | 
– | 
  current_mol++; | 
| 809 | 
– | 
  current_comp_mol++; | 
| 810 | 
– | 
 | 
| 811 | 
– | 
  if (current_comp_mol >= components_nmol[current_comp]){ | 
| 812 | 
– | 
    current_comp_mol = 0; | 
| 813 | 
– | 
    current_comp++; | 
| 814 | 
– | 
  } | 
| 674 | 
  | 
} | 
| 675 | 
  | 
 | 
| 817 | 
– | 
 | 
| 676 | 
  | 
void SimSetup::gatherInfo(void){ | 
| 677 | 
  | 
  int i; | 
| 678 | 
  | 
 | 
| 861 | 
  | 
                  "\tKeyword useSolidThermInt was set to 'true' but\n" | 
| 862 | 
  | 
                  "\tthermodynamicIntegrationLambda (and/or\n" | 
| 863 | 
  | 
                  "\tthermodynamicIntegrationK) was not specified.\n" | 
| 864 | 
< | 
                  "\tPlease provide a lambda value and k value in your .md file.\n"); | 
| 864 | 
> | 
                  "\tPlease provide a lambda value and k value in your meta-data file.\n"); | 
| 865 | 
  | 
          painCave.isFatal = 1; | 
| 866 | 
  | 
          simError();     | 
| 867 | 
  | 
        } | 
| 870 | 
  | 
        if (globals->getUseSolidThermInt()) { | 
| 871 | 
  | 
          sprintf( painCave.errMsg, | 
| 872 | 
  | 
                   "SimSetup Warning: It appears that you have both solid and\n" | 
| 873 | 
< | 
                   "\tliquid thermodynamic integration activated in your .md\n" | 
| 873 | 
> | 
                   "\tliquid thermodynamic integration activated in your meta-data\n" | 
| 874 | 
  | 
                   "\tfile. To avoid confusion, specify only one technique in\n" | 
| 875 | 
< | 
                   "\tyour .md file. Liquid-state thermodynamic integration\n" | 
| 875 | 
> | 
                   "\tyour meta-data file. Liquid-state thermodynamic integration\n" | 
| 876 | 
  | 
                   "\twill be assumed for the current simulation. If this is not\n" | 
| 877 | 
  | 
                   "\twhat you desire, set useSolidThermInt to 'true' and\n" | 
| 878 | 
< | 
                   "\tuseLiquidThermInt to 'false' in your .md file.\n"); | 
| 878 | 
> | 
                   "\tuseLiquidThermInt to 'false' in your meta-data file.\n"); | 
| 879 | 
  | 
          painCave.isFatal = 0; | 
| 880 | 
  | 
          simError(); | 
| 881 | 
  | 
        } | 
| 890 | 
  | 
                  "\tKeyword useLiquidThermInt was set to 'true' but\n" | 
| 891 | 
  | 
                  "\tthermodynamicIntegrationLambda (and/or\n" | 
| 892 | 
  | 
                  "\tthermodynamicIntegrationK) was not specified.\n" | 
| 893 | 
< | 
                  "\tPlease provide a lambda value and k value in your .md file.\n"); | 
| 893 | 
> | 
                  "\tPlease provide a lambda value and k value in your meta-data file.\n"); | 
| 894 | 
  | 
          painCave.isFatal = 1; | 
| 895 | 
  | 
          simError();     | 
| 896 | 
  | 
        } | 
| 899 | 
  | 
        sprintf(painCave.errMsg, | 
| 900 | 
  | 
                "SimSetup Warning: If you want to use Thermodynamic\n" | 
| 901 | 
  | 
                "\tIntegration, set useSolidThermInt or useLiquidThermInt to\n" | 
| 902 | 
< | 
                "\t'true' in your .md file.  These keywords are set to\n" | 
| 902 | 
> | 
                "\t'true' in your meta-data file.  These keywords are set to\n" | 
| 903 | 
  | 
                "\t'false' by default, so your lambda and/or k values are\n" | 
| 904 | 
  | 
                "\tbeing ignored.\n"); | 
| 905 | 
  | 
        painCave.isFatal = 0; | 
| 994 | 
  | 
  } | 
| 995 | 
  | 
   | 
| 996 | 
  | 
#ifdef IS_MPI | 
| 997 | 
< | 
  strcpy(checkPointMsg, "Successfully gathered all information from Bass\n"); | 
| 997 | 
> | 
  strcpy(checkPointMsg, "Successfully gathered all information from meta-data file\n"); | 
| 998 | 
  | 
  MPIcheckPoint(); | 
| 999 | 
  | 
#endif // is_mpi | 
| 1000 | 
  | 
} | 
| 1131 | 
  | 
  MPIcheckPoint(); | 
| 1132 | 
  | 
#endif // is_mpi | 
| 1133 | 
  | 
 | 
| 1276 | 
– | 
  // clean up the forcefield | 
| 1277 | 
– | 
  the_ff->cleanMe(); | 
| 1134 | 
  | 
} | 
| 1135 | 
  | 
   | 
| 1136 | 
  | 
void SimSetup::initSystemCoords(void){ | 
| 1186 | 
  | 
    if (worldRank == 0){ | 
| 1187 | 
  | 
#endif // is_mpi | 
| 1188 | 
  | 
       | 
| 1189 | 
< | 
      if(globals->haveFinalConfig()) | 
| 1189 | 
> | 
      if(globals->haveFinalConfig())  | 
| 1190 | 
  | 
        prefix = getPrefix(globals->getFinalConfig());    | 
| 1191 | 
  | 
      else | 
| 1192 | 
< | 
        prefix = getPrefix(info[k].finalName); | 
| 1192 | 
> | 
        prefix = getPrefix(inFileName); | 
| 1193 | 
  | 
 | 
| 1194 | 
  | 
      info[k].finalName = prefix + ".eor";       | 
| 1195 | 
  | 
      info[k].sampleName = prefix + ".dump"; | 
| 1621 | 
  | 
        else{ | 
| 1622 | 
  | 
          sprintf(painCave.errMsg, | 
| 1623 | 
  | 
                  "SimSetup error: If you use a constant pressure\n" | 
| 1624 | 
< | 
                  "\tensemble, you must set targetPressure in the BASS file.\n"); | 
| 1624 | 
> | 
                  "\tensemble, you must set targetPressure in the meta-data file.\n"); | 
| 1625 | 
  | 
          painCave.isFatal = 1; | 
| 1626 | 
  | 
          simError(); | 
| 1627 | 
  | 
        } | 
| 1672 | 
  | 
        else{ | 
| 1673 | 
  | 
          sprintf(painCave.errMsg, | 
| 1674 | 
  | 
                  "SimSetup error: If you use a constant pressure\n" | 
| 1675 | 
< | 
                  "\tensemble, you must set targetPressure in the BASS file.\n"); | 
| 1675 | 
> | 
                  "\tensemble, you must set targetPressure in the meta-data file.\n"); | 
| 1676 | 
  | 
          painCave.isFatal = 1; | 
| 1677 | 
  | 
          simError(); | 
| 1678 | 
  | 
        }     | 
| 1725 | 
  | 
        else{ | 
| 1726 | 
  | 
          sprintf(painCave.errMsg, | 
| 1727 | 
  | 
                  "SimSetup error: If you use a constant pressure\n" | 
| 1728 | 
< | 
                  "\tensemble, you must set targetPressure in the BASS file.\n"); | 
| 1728 | 
> | 
                  "\tensemble, you must set targetPressure in the meta-data file.\n"); | 
| 1729 | 
  | 
          painCave.isFatal = 1; | 
| 1730 | 
  | 
          simError(); | 
| 1731 | 
  | 
        }     |