| 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 |
|
|
| 672 |
|
#endif // is_mpi |
| 673 |
|
|
| 674 |
|
} |
| 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); |
| 675 |
|
|
| 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]; |
| 789 |
– |
|
| 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 |
– |
} |
| 815 |
– |
} |
| 816 |
– |
|
| 817 |
– |
|
| 676 |
|
void SimSetup::gatherInfo(void){ |
| 677 |
|
int i; |
| 678 |
|
|
| 832 |
|
} |
| 833 |
|
} |
| 834 |
|
|
| 977 |
– |
|
| 835 |
|
for (i=0; i < nInfo; i++) { |
| 836 |
|
|
| 837 |
|
// check for the temperature set flag |
| 851 |
|
info[i].thermIntLambda = globals->getThermIntLambda(); |
| 852 |
|
info[i].thermIntK = globals->getThermIntK(); |
| 853 |
|
|
| 854 |
< |
Restraints *myRestraint = new Restraints(tot_nmol, info[i].thermIntLambda, info[i].thermIntK); |
| 854 |
> |
Restraints *myRestraint = new Restraints(info[i].thermIntLambda, info[i].thermIntK); |
| 855 |
|
info[i].restraint = myRestraint; |
| 856 |
|
} |
| 857 |
|
else { |
| 860 |
|
"\tKeyword useSolidThermInt was set to 'true' but\n" |
| 861 |
|
"\tthermodynamicIntegrationLambda (and/or\n" |
| 862 |
|
"\tthermodynamicIntegrationK) was not specified.\n" |
| 863 |
< |
"\tPlease provide a lambda value and k value in your .md file.\n"); |
| 863 |
> |
"\tPlease provide a lambda value and k value in your meta-data file.\n"); |
| 864 |
|
painCave.isFatal = 1; |
| 865 |
|
simError(); |
| 866 |
|
} |
| 869 |
|
if (globals->getUseSolidThermInt()) { |
| 870 |
|
sprintf( painCave.errMsg, |
| 871 |
|
"SimSetup Warning: It appears that you have both solid and\n" |
| 872 |
< |
"\tliquid thermodynamic integration activated in your .md\n" |
| 872 |
> |
"\tliquid thermodynamic integration activated in your meta-data\n" |
| 873 |
|
"\tfile. To avoid confusion, specify only one technique in\n" |
| 874 |
< |
"\tyour .md file. Liquid-state thermodynamic integration\n" |
| 874 |
> |
"\tyour meta-data file. Liquid-state thermodynamic integration\n" |
| 875 |
|
"\twill be assumed for the current simulation. If this is not\n" |
| 876 |
|
"\twhat you desire, set useSolidThermInt to 'true' and\n" |
| 877 |
< |
"\tuseLiquidThermInt to 'false' in your .md file.\n"); |
| 877 |
> |
"\tuseLiquidThermInt to 'false' in your meta-data file.\n"); |
| 878 |
|
painCave.isFatal = 0; |
| 879 |
|
simError(); |
| 880 |
|
} |
| 889 |
|
"\tKeyword useLiquidThermInt was set to 'true' but\n" |
| 890 |
|
"\tthermodynamicIntegrationLambda (and/or\n" |
| 891 |
|
"\tthermodynamicIntegrationK) was not specified.\n" |
| 892 |
< |
"\tPlease provide a lambda value and k value in your .md file.\n"); |
| 892 |
> |
"\tPlease provide a lambda value and k value in your meta-data file.\n"); |
| 893 |
|
painCave.isFatal = 1; |
| 894 |
|
simError(); |
| 895 |
|
} |
| 898 |
|
sprintf(painCave.errMsg, |
| 899 |
|
"SimSetup Warning: If you want to use Thermodynamic\n" |
| 900 |
|
"\tIntegration, set useSolidThermInt or useLiquidThermInt to\n" |
| 901 |
< |
"\t'true' in your .md file. These keywords are set to\n" |
| 901 |
> |
"\t'true' in your meta-data file. These keywords are set to\n" |
| 902 |
|
"\t'false' by default, so your lambda and/or k values are\n" |
| 903 |
|
"\tbeing ignored.\n"); |
| 904 |
|
painCave.isFatal = 0; |
| 993 |
|
} |
| 994 |
|
|
| 995 |
|
#ifdef IS_MPI |
| 996 |
< |
strcpy(checkPointMsg, "Successfully gathered all information from Bass\n"); |
| 996 |
> |
strcpy(checkPointMsg, "Successfully gathered all information from meta-data file\n"); |
| 997 |
|
MPIcheckPoint(); |
| 998 |
|
#endif // is_mpi |
| 999 |
|
} |
| 1130 |
|
MPIcheckPoint(); |
| 1131 |
|
#endif // is_mpi |
| 1132 |
|
|
| 1276 |
– |
// clean up the forcefield |
| 1277 |
– |
the_ff->cleanMe(); |
| 1133 |
|
} |
| 1134 |
|
|
| 1135 |
|
void SimSetup::initSystemCoords(void){ |
| 1185 |
|
if (worldRank == 0){ |
| 1186 |
|
#endif // is_mpi |
| 1187 |
|
|
| 1188 |
< |
if(globals->haveFinalConfig()) |
| 1188 |
> |
if(globals->haveFinalConfig()) |
| 1189 |
|
prefix = getPrefix(globals->getFinalConfig()); |
| 1190 |
|
else |
| 1191 |
< |
prefix = getPrefix(info[k].finalName); |
| 1191 |
> |
prefix = getPrefix(inFileName); |
| 1192 |
|
|
| 1193 |
|
info[k].finalName = prefix + ".eor"; |
| 1194 |
|
info[k].sampleName = prefix + ".dump"; |
| 1620 |
|
else{ |
| 1621 |
|
sprintf(painCave.errMsg, |
| 1622 |
|
"SimSetup error: If you use a constant pressure\n" |
| 1623 |
< |
"\tensemble, you must set targetPressure in the BASS file.\n"); |
| 1623 |
> |
"\tensemble, you must set targetPressure in the meta-data file.\n"); |
| 1624 |
|
painCave.isFatal = 1; |
| 1625 |
|
simError(); |
| 1626 |
|
} |
| 1671 |
|
else{ |
| 1672 |
|
sprintf(painCave.errMsg, |
| 1673 |
|
"SimSetup error: If you use a constant pressure\n" |
| 1674 |
< |
"\tensemble, you must set targetPressure in the BASS file.\n"); |
| 1674 |
> |
"\tensemble, you must set targetPressure in the meta-data file.\n"); |
| 1675 |
|
painCave.isFatal = 1; |
| 1676 |
|
simError(); |
| 1677 |
|
} |
| 1724 |
|
else{ |
| 1725 |
|
sprintf(painCave.errMsg, |
| 1726 |
|
"SimSetup error: If you use a constant pressure\n" |
| 1727 |
< |
"\tensemble, you must set targetPressure in the BASS file.\n"); |
| 1727 |
> |
"\tensemble, you must set targetPressure in the meta-data file.\n"); |
| 1728 |
|
painCave.isFatal = 1; |
| 1729 |
|
simError(); |
| 1730 |
|
} |