| 38 |
|
* [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). |
| 39 |
|
* [4] Vardeman & Gezelter, in progress (2009). |
| 40 |
|
*/ |
| 41 |
+ |
#ifdef IS_MPI |
| 42 |
+ |
#include <mpi.h> |
| 43 |
+ |
#endif |
| 44 |
|
|
| 45 |
|
#include <cmath> |
| 46 |
|
#include <sstream> |
| 57 |
|
#include "utils/Tuple.hpp" |
| 58 |
|
#include "brains/Thermo.hpp" |
| 59 |
|
#include "math/ConvexHull.hpp" |
| 57 |
– |
#ifdef IS_MPI |
| 58 |
– |
#include <mpi.h> |
| 59 |
– |
#endif |
| 60 |
|
|
| 61 |
|
#ifdef _MSC_VER |
| 62 |
|
#define isnan(x) _isnan((x)) |
| 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_; |