547 |
|
|
548 |
|
if (hasSelectionB_) { |
549 |
|
selectionB_ = rnemdParams->getSelectionB(); |
550 |
+ |
|
551 |
|
} else { |
552 |
|
if (usePeriodicBoundaryConditions_) { |
553 |
|
Mat3x3d hmat = currentSnap_->getHmat(); |
574 |
|
selectionB_ = selectionBstream.str(); |
575 |
|
} else { |
576 |
|
selectionB_ = "select hull"; |
577 |
+ |
BisHull_ = true; |
578 |
|
hasSelectionB_ = true; |
579 |
|
} |
580 |
|
} |
1731 |
|
Snapshot* snap = info_->getSnapshotManager()->getCurrentSnapshot(); |
1732 |
|
|
1733 |
|
if (hasSelectionA_) { |
1734 |
< |
int isd; |
1735 |
< |
StuntDouble* sd; |
1736 |
< |
vector<StuntDouble*> aSites; |
1737 |
< |
seleManA_.setSelectionSet(evaluatorA_.evaluate()); |
1738 |
< |
for (sd = seleManA_.beginSelected(isd); sd != NULL; |
1739 |
< |
sd = seleManA_.nextSelected(isd)) { |
1740 |
< |
aSites.push_back(sd); |
1741 |
< |
} |
1742 |
< |
#if defined(HAVE_QHULL) |
1743 |
< |
ConvexHull* surfaceMeshA = new ConvexHull(); |
1744 |
< |
surfaceMeshA->computeHull(aSites); |
1745 |
< |
areaA = surfaceMeshA->getArea(); |
1746 |
< |
delete surfaceMeshA; |
1747 |
< |
#else |
1748 |
< |
sprintf( painCave.errMsg, |
1749 |
< |
"RNEMD::getDividingArea : Hull calculation is not possible\n" |
1750 |
< |
"\twithout libqhull. Please rebuild OpenMD with qhull enabled."); |
1751 |
< |
painCave.severity = OPENMD_ERROR; |
1752 |
< |
painCave.isFatal = 1; |
1753 |
< |
simError(); |
1734 |
> |
|
1735 |
> |
if (evaluatorA_.hasSurfaceArea()) |
1736 |
> |
areaA = evaluatorA_.getSurfaceArea(); |
1737 |
> |
else { |
1738 |
> |
|
1739 |
> |
cerr << "selection A did not have surface area, recomputing\n"; |
1740 |
> |
int isd; |
1741 |
> |
StuntDouble* sd; |
1742 |
> |
vector<StuntDouble*> aSites; |
1743 |
> |
seleManA_.setSelectionSet(evaluatorA_.evaluate()); |
1744 |
> |
for (sd = seleManA_.beginSelected(isd); sd != NULL; |
1745 |
> |
sd = seleManA_.nextSelected(isd)) { |
1746 |
> |
aSites.push_back(sd); |
1747 |
> |
} |
1748 |
> |
#if defined(HAVE_QHULL) |
1749 |
> |
ConvexHull* surfaceMeshA = new ConvexHull(); |
1750 |
> |
surfaceMeshA->computeHull(aSites); |
1751 |
> |
areaA = surfaceMeshA->getArea(); |
1752 |
> |
delete surfaceMeshA; |
1753 |
> |
#else |
1754 |
> |
sprintf( painCave.errMsg, |
1755 |
> |
"RNEMD::getDividingArea : Hull calculation is not possible\n" |
1756 |
> |
"\twithout libqhull. Please rebuild OpenMD with qhull enabled."); |
1757 |
> |
painCave.severity = OPENMD_ERROR; |
1758 |
> |
painCave.isFatal = 1; |
1759 |
> |
simError(); |
1760 |
|
#endif |
1761 |
+ |
} |
1762 |
|
|
1763 |
|
} else { |
1764 |
|
if (usePeriodicBoundaryConditions_) { |
1774 |
|
} |
1775 |
|
|
1776 |
|
if (hasSelectionB_) { |
1777 |
< |
int isd; |
1778 |
< |
StuntDouble* sd; |
1779 |
< |
vector<StuntDouble*> bSites; |
1780 |
< |
seleManB_.setSelectionSet(evaluatorB_.evaluate()); |
1772 |
< |
for (sd = seleManB_.beginSelected(isd); sd != NULL; |
1773 |
< |
sd = seleManB_.nextSelected(isd)) { |
1774 |
< |
bSites.push_back(sd); |
1775 |
< |
} |
1777 |
> |
if (evaluatorB_.hasSurfaceArea()) |
1778 |
> |
areaB = evaluatorB_.getSurfaceArea(); |
1779 |
> |
else { |
1780 |
> |
cerr << "selection B did not have surface area, recomputing\n"; |
1781 |
|
|
1782 |
+ |
int isd; |
1783 |
+ |
StuntDouble* sd; |
1784 |
+ |
vector<StuntDouble*> bSites; |
1785 |
+ |
seleManB_.setSelectionSet(evaluatorB_.evaluate()); |
1786 |
+ |
for (sd = seleManB_.beginSelected(isd); sd != NULL; |
1787 |
+ |
sd = seleManB_.nextSelected(isd)) { |
1788 |
+ |
bSites.push_back(sd); |
1789 |
+ |
} |
1790 |
+ |
|
1791 |
|
#if defined(HAVE_QHULL) |
1792 |
< |
ConvexHull* surfaceMeshB = new ConvexHull(); |
1793 |
< |
surfaceMeshB->computeHull(bSites); |
1794 |
< |
areaB = surfaceMeshB->getArea(); |
1795 |
< |
delete surfaceMeshB; |
1792 |
> |
ConvexHull* surfaceMeshB = new ConvexHull(); |
1793 |
> |
surfaceMeshB->computeHull(bSites); |
1794 |
> |
areaB = surfaceMeshB->getArea(); |
1795 |
> |
delete surfaceMeshB; |
1796 |
|
#else |
1797 |
< |
sprintf( painCave.errMsg, |
1798 |
< |
"RNEMD::getDividingArea : Hull calculation is not possible\n" |
1799 |
< |
"\twithout libqhull. Please rebuild OpenMD with qhull enabled."); |
1800 |
< |
painCave.severity = OPENMD_ERROR; |
1801 |
< |
painCave.isFatal = 1; |
1802 |
< |
simError(); |
1797 |
> |
sprintf( painCave.errMsg, |
1798 |
> |
"RNEMD::getDividingArea : Hull calculation is not possible\n" |
1799 |
> |
"\twithout libqhull. Please rebuild OpenMD with qhull enabled."); |
1800 |
> |
painCave.severity = OPENMD_ERROR; |
1801 |
> |
painCave.isFatal = 1; |
1802 |
> |
simError(); |
1803 |
|
#endif |
1804 |
< |
|
1805 |
< |
|
1804 |
> |
} |
1805 |
> |
|
1806 |
|
} else { |
1807 |
|
if (usePeriodicBoundaryConditions_) { |
1808 |
|
// in periodic boundaries, the surface area is twice the x-y |
1814 |
|
areaB = 4.0 * M_PI * pow(sphereBRadius_, 2); |
1815 |
|
} |
1816 |
|
} |
1817 |
< |
|
1817 |
> |
|
1818 |
|
dividingArea_ = min(areaA, areaB); |
1819 |
|
hasDividingArea_ = true; |
1820 |
|
return dividingArea_; |