| 56 |
|
else |
| 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; |
| 667 |
|
#endif // is_mpi |
| 668 |
|
|
| 669 |
|
} |
| 648 |
– |
|
| 649 |
– |
void SimSetup::initFromMetaDataFile(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; |
| 670 |
|
|
| 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:initFromMetaData 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 |
– |
|
| 671 |
|
void SimSetup::gatherInfo(void){ |
| 672 |
|
int i; |
| 673 |
|
|
| 1183 |
|
if (worldRank == 0){ |
| 1184 |
|
#endif // is_mpi |
| 1185 |
|
|
| 1186 |
< |
if(globals->haveFinalConfig()) |
| 1186 |
> |
if(globals->haveFinalConfig()) |
| 1187 |
|
prefix = getPrefix(globals->getFinalConfig()); |
| 1188 |
|
else |
| 1189 |
< |
prefix = getPrefix(info[k].finalName); |
| 1189 |
> |
prefix = getPrefix(inFileName); |
| 1190 |
|
|
| 1191 |
|
info[k].finalName = prefix + ".eor"; |
| 1192 |
|
info[k].sampleName = prefix + ".dump"; |