mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Using site lists in force calculation.
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/lagrangian/molecularDynamics/molecule/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/molecularDynamics/potential/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/molecularDynamics/molecularMeasurements/lnInclude \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude
|
||||
@ -11,6 +10,4 @@ EXE_LIBS = \
|
||||
-lfiniteVolume \
|
||||
-llagrangian \
|
||||
-lmolecule \
|
||||
-lpotential \
|
||||
-lmolecularMeasurements
|
||||
|
||||
-lpotential
|
||||
|
||||
@ -156,13 +156,15 @@ bool Foam::polyatomic::move(polyatomic::trackingData& td, const scalar trackTime
|
||||
|
||||
tau_ = vector::zero;
|
||||
|
||||
forAll(siteForces_, s)
|
||||
forAll(siteForces_, sI)
|
||||
{
|
||||
const vector& f = siteForces_[s];
|
||||
const vector& f = siteForces_[sI];
|
||||
|
||||
a_ += f/m;
|
||||
|
||||
tau_ += (constProps.siteReferencePositions()[s] ^ (Q_.T() & f));
|
||||
tau_ +=
|
||||
constProps.sites()[sI].siteReferencePosition()
|
||||
^ (Q_.T() & f);
|
||||
}
|
||||
|
||||
v_ += 0.5*trackTime*a_;
|
||||
@ -231,7 +233,12 @@ void Foam::polyatomic::transformProperties(const vector& separation)
|
||||
|
||||
void Foam::polyatomic::setSitePositions(const constantProperties& constProps)
|
||||
{
|
||||
sitePositions_ = position_ + (Q_ & constProps.siteReferencePositions());
|
||||
forAll(constProps.sites(), sI)
|
||||
{
|
||||
sitePositions_[sI] =
|
||||
position_
|
||||
+ (Q_ & constProps.sites()[sI].siteReferencePosition());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -41,6 +41,7 @@ SourceFiles
|
||||
#include "IOstream.H"
|
||||
#include "autoPtr.H"
|
||||
#include "diagTensor.H"
|
||||
#include "constPropSite.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -78,18 +79,16 @@ public:
|
||||
{
|
||||
// Private data
|
||||
|
||||
Field<vector> siteReferencePositions_;
|
||||
//- Sites of mass, charge or interaction
|
||||
List<constPropSite> sites_;
|
||||
|
||||
List<scalar> siteMasses_;
|
||||
//- Which sites require electrostatic interactions
|
||||
List<label> electrostaticSites_;
|
||||
|
||||
List<scalar> siteCharges_;
|
||||
|
||||
List<label> siteIds_;
|
||||
|
||||
List<bool> pairPotentialSites_;
|
||||
|
||||
List<bool> electrostaticSites_;
|
||||
//- Which sites require pair interactions
|
||||
List<label> pairPotSites_;
|
||||
|
||||
//- Moment of intertia (in principal axis configiration)
|
||||
diagTensor momentOfInertia_;
|
||||
|
||||
scalar mass_;
|
||||
@ -97,8 +96,6 @@ public:
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
void checkSiteListSizes() const;
|
||||
|
||||
void setInteracionSiteBools
|
||||
(
|
||||
const List<word>& siteIds,
|
||||
@ -113,27 +110,19 @@ public:
|
||||
inline constantProperties();
|
||||
|
||||
//- Construct from dictionary
|
||||
inline constantProperties(const dictionary& dict);
|
||||
inline constantProperties
|
||||
(
|
||||
const dictionary& dict,
|
||||
const labelList& siteIds
|
||||
);
|
||||
|
||||
// Member functions
|
||||
|
||||
inline const Field<vector>& siteReferencePositions() const;
|
||||
inline const List<constPropSite>& sites() const;
|
||||
|
||||
inline const List<scalar>& siteMasses() const;
|
||||
inline const List<label>& pairPotSites() const;
|
||||
|
||||
inline const List<scalar>& siteCharges() const;
|
||||
|
||||
inline const List<label>& siteIds() const;
|
||||
|
||||
inline List<label>& siteIds();
|
||||
|
||||
inline const List<bool>& pairPotentialSites() const;
|
||||
|
||||
inline bool pairPotentialSite(label sId) const;
|
||||
|
||||
inline const List<bool>& electrostaticSites() const;
|
||||
|
||||
inline bool electrostaticSite(label sId) const;
|
||||
inline const List<label>& electrostaticSites() const;
|
||||
|
||||
inline const diagTensor& momentOfInertia() const;
|
||||
|
||||
@ -181,14 +170,22 @@ private:
|
||||
|
||||
// Private data
|
||||
|
||||
//- Orientation, stored as the rotation tensor to transform
|
||||
// from the polyatomic to the global reference frame, i.e.:
|
||||
// globalVector = Q_ & bodyLocalVector
|
||||
// bodyLocalVector = Q_.T() & globalVector
|
||||
tensor Q_;
|
||||
|
||||
// Linear velocity of polyatomic
|
||||
vector v_;
|
||||
|
||||
// Total linear acceleration of polyatomic
|
||||
vector a_;
|
||||
|
||||
//- Angular momentum of polyatomic, in body local reference frame
|
||||
vector pi_;
|
||||
|
||||
//- Total torque on polyatomic, in body local reference frame
|
||||
vector tau_;
|
||||
|
||||
vector specialPosition_;
|
||||
@ -198,6 +195,9 @@ private:
|
||||
// - r_ij f_ij, stress dyad
|
||||
tensor rf_;
|
||||
|
||||
// // - r_ij outer product f_ij: virial contribution
|
||||
// tensor rDotf_;
|
||||
|
||||
label special_;
|
||||
|
||||
label id_;
|
||||
|
||||
@ -27,12 +27,9 @@ License
|
||||
|
||||
inline Foam::polyatomic::constantProperties::constantProperties()
|
||||
:
|
||||
siteReferencePositions_(Field<vector>(0)),
|
||||
siteMasses_(List<scalar>(0)),
|
||||
siteCharges_(List<scalar>(0)),
|
||||
siteIds_(List<label>(0)),
|
||||
pairPotentialSites_(List<bool>(false)),
|
||||
electrostaticSites_(List<bool>(false)),
|
||||
sites_(),
|
||||
electrostaticSites_(),
|
||||
pairPotSites_(),
|
||||
momentOfInertia_(diagTensor(0, 0, 0)),
|
||||
mass_(0)
|
||||
{}
|
||||
@ -40,47 +37,117 @@ inline Foam::polyatomic::constantProperties::constantProperties()
|
||||
|
||||
inline Foam::polyatomic::constantProperties::constantProperties
|
||||
(
|
||||
const dictionary& dict
|
||||
const dictionary& dict,
|
||||
const labelList& siteIds
|
||||
)
|
||||
:
|
||||
siteReferencePositions_(dict.lookup("siteReferencePositions")),
|
||||
siteMasses_(dict.lookup("siteMasses")),
|
||||
siteCharges_(dict.lookup("siteCharges")),
|
||||
siteIds_(List<word>(dict.lookup("siteIds")).size(), -1),
|
||||
pairPotentialSites_(),
|
||||
sites_(),
|
||||
electrostaticSites_(),
|
||||
pairPotSites_(),
|
||||
momentOfInertia_(),
|
||||
mass_()
|
||||
mass_(0)
|
||||
{
|
||||
checkSiteListSizes();
|
||||
List<word> siteIdNames = dict.lookup("siteIds");
|
||||
|
||||
setInteracionSiteBools
|
||||
List<vector> siteReferencePositions(dict.lookup("siteReferencePositions"));
|
||||
|
||||
List<scalar> siteMasses(dict.lookup("siteMasses"));
|
||||
|
||||
List<scalar> siteCharges(dict.lookup("siteCharges"));
|
||||
|
||||
List<word> pairPotentialIds(dict.lookup("pairPotentialSiteIds"));
|
||||
|
||||
if
|
||||
(
|
||||
List<word>(dict.lookup("siteIds")),
|
||||
List<word>(dict.lookup("pairPotentialSiteIds"))
|
||||
( siteIdNames.size() != sites_.size() )
|
||||
|| ( siteReferencePositions.size() != sites_.size() )
|
||||
|| ( siteCharges.size() != sites_.size() )
|
||||
)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"Foam::polyatomic::constantProperties::constantProperties"
|
||||
"("
|
||||
"const dictionary& dict"
|
||||
")"
|
||||
)
|
||||
<< "Sizes of site id, charge and "
|
||||
<< "referencePositions are not the same: " << sites_.size()
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
|
||||
sites_.setSize(siteIdNames.size());
|
||||
|
||||
electrostaticSites_.setSize(sites_.size(), -1);
|
||||
pairPotSites_.setSize(sites_.size(), -1);
|
||||
|
||||
label pairI = 0;
|
||||
label electrostaticI = 0;
|
||||
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI] = constPropSite
|
||||
(
|
||||
siteReferencePositions[sI],
|
||||
siteMasses[sI],
|
||||
siteCharges[sI],
|
||||
siteIds[sI],
|
||||
siteIdNames[sI],
|
||||
(findIndex(pairPotentialIds, siteIdNames[sI]) != -1), // pair
|
||||
(mag(siteCharges[sI]) > VSMALL) // charge
|
||||
);
|
||||
|
||||
mass_ = sum(siteMasses_);
|
||||
if (sites_[sI].pairPotentialSite())
|
||||
{
|
||||
pairPotSites_[pairI++] = sI;
|
||||
}
|
||||
|
||||
vector centreOfMass(vector::zero);
|
||||
if (sites_[sI].electrostaticSite())
|
||||
{
|
||||
electrostaticSites_[electrostaticI++] = sI;
|
||||
}
|
||||
|
||||
if (sites_[sI].pairPotentialSite() && !sites_[sI].electrostaticSite())
|
||||
{
|
||||
WarningIn
|
||||
(
|
||||
"Foam::polyatomic::constantProperties::constantProperties"
|
||||
"("
|
||||
"const dictionary& dict"
|
||||
")"
|
||||
)
|
||||
<< siteIdNames[sI] << " is a non-interacting site." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
pairPotSites_.setSize(pairI);
|
||||
electrostaticSites_.setSize(electrostaticI);
|
||||
|
||||
// Calculate the centre of mass of the body and subtract it from each
|
||||
// position
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
vector centreOfMass(vector::zero);
|
||||
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
centreOfMass += siteReferencePositions_[i]*siteMasses_[i];
|
||||
mass_ += sites_[sI].siteMass();
|
||||
|
||||
centreOfMass +=
|
||||
sites_[sI].siteReferencePosition()*sites_[sI].siteMass();
|
||||
}
|
||||
|
||||
centreOfMass /= mass_;
|
||||
|
||||
siteReferencePositions_ -= centreOfMass;
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI].siteReferencePosition() -= centreOfMass;
|
||||
}
|
||||
|
||||
if (siteIds_.size() == 1)
|
||||
if (sites_.size() == 1)
|
||||
{
|
||||
// Single site polyatomic - no rotational motion.
|
||||
|
||||
siteReferencePositions_[0] = vector::zero;
|
||||
sites_[0].siteReferencePosition() = vector::zero;
|
||||
|
||||
momentOfInertia_ = diagTensor(-1, -1, -1);
|
||||
}
|
||||
@ -90,36 +157,46 @@ inline Foam::polyatomic::constantProperties::constantProperties
|
||||
|
||||
Info<< nl << "Linear polyatomic." << endl;
|
||||
|
||||
vector dir = siteReferencePositions_[1] - siteReferencePositions_[0];
|
||||
vector dir =
|
||||
sites_[1].siteReferencePosition()
|
||||
- sites_[0].siteReferencePosition();
|
||||
|
||||
dir /= mag(dir);
|
||||
|
||||
tensor Q = rotationTensor(dir, vector(1,0,0));
|
||||
|
||||
siteReferencePositions_ = (Q & siteReferencePositions_);
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI].siteReferencePosition() =
|
||||
(Q & sites_[sI].siteReferencePosition());
|
||||
}
|
||||
|
||||
// The rotation was around the centre of mass but remove any
|
||||
// components that have crept in due to floating point errors
|
||||
|
||||
centreOfMass = vector::zero;
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
centreOfMass += siteReferencePositions_[i]*siteMasses_[i];
|
||||
centreOfMass +=
|
||||
sites_[sI].siteReferencePosition()*sites_[sI].siteMass();
|
||||
}
|
||||
|
||||
centreOfMass /= mass_;
|
||||
|
||||
siteReferencePositions_ -= centreOfMass;
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI].siteReferencePosition() -= centreOfMass;
|
||||
}
|
||||
|
||||
diagTensor momOfInertia = diagTensor::zero;
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
const vector& p(siteReferencePositions_[i]);
|
||||
const vector& p(sites_[sI].siteReferencePosition());
|
||||
|
||||
momOfInertia +=
|
||||
siteMasses_[i]*diagTensor(0, p.x()*p.x(), p.x()*p.x());
|
||||
sites_[sI].siteMass()*diagTensor(0, p.x()*p.x(), p.x()*p.x());
|
||||
}
|
||||
|
||||
momentOfInertia_ = diagTensor
|
||||
@ -137,11 +214,11 @@ inline Foam::polyatomic::constantProperties::constantProperties
|
||||
|
||||
tensor momOfInertia(tensor::zero);
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
const vector& p(siteReferencePositions_[i]);
|
||||
const vector& p(sites_[sI].siteReferencePosition());
|
||||
|
||||
momOfInertia += siteMasses_[i]*tensor
|
||||
momOfInertia += sites_[sI].siteMass()*tensor
|
||||
(
|
||||
p.y()*p.y() + p.z()*p.z(), -p.x()*p.y(), -p.x()*p.z(),
|
||||
-p.y()*p.x(), p.x()*p.x() + p.z()*p.z(), -p.y()*p.z(),
|
||||
@ -152,8 +229,8 @@ inline Foam::polyatomic::constantProperties::constantProperties
|
||||
if (eigenValues(momOfInertia).x() < VSMALL)
|
||||
{
|
||||
FatalErrorIn("polyatomic::constantProperties::constantProperties")
|
||||
<< "An eigenvalue of the inertia tensor is zero, the polyatomic "
|
||||
<< dict.name() << " is not a valid 6DOF shape."
|
||||
<< "An eigenvalue of the inertia tensor is zero, the "
|
||||
<< "polyatomic " << dict.name() << " is not a valid 6DOF shape."
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
|
||||
@ -172,7 +249,11 @@ inline Foam::polyatomic::constantProperties::constantProperties
|
||||
|
||||
// Transform the site positions
|
||||
|
||||
siteReferencePositions_ = (Q & siteReferencePositions_);
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI].siteReferencePosition() =
|
||||
(Q & sites_[sI].siteReferencePosition());
|
||||
}
|
||||
|
||||
// Recalculating the moment of inertia with the new site positions
|
||||
|
||||
@ -181,25 +262,29 @@ inline Foam::polyatomic::constantProperties::constantProperties
|
||||
|
||||
centreOfMass = vector::zero;
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
centreOfMass += siteReferencePositions_[i]*siteMasses_[i];
|
||||
centreOfMass +=
|
||||
sites_[sI].siteReferencePosition()*sites_[sI].siteMass();
|
||||
}
|
||||
|
||||
centreOfMass /= mass_;
|
||||
|
||||
siteReferencePositions_ -= centreOfMass;
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
sites_[sI].siteReferencePosition() -= centreOfMass;
|
||||
}
|
||||
|
||||
// Calculate the moment of inertia in the principle component
|
||||
// reference frame
|
||||
|
||||
momOfInertia = tensor::zero;
|
||||
|
||||
forAll(siteReferencePositions_, i)
|
||||
forAll(sites_, sI)
|
||||
{
|
||||
const vector& p(siteReferencePositions_[i]);
|
||||
const vector& p(sites_[sI].siteReferencePosition());
|
||||
|
||||
momOfInertia += siteMasses_[i]*tensor
|
||||
momOfInertia += sites_[sI].siteMass()*tensor
|
||||
(
|
||||
p.y()*p.y() + p.z()*p.z(), -p.x()*p.y(), -p.x()*p.z(),
|
||||
-p.y()*p.x(), p.x()*p.x() + p.z()*p.z(), -p.y()*p.z(),
|
||||
@ -256,62 +341,29 @@ inline Foam::polyatomic::polyatomic
|
||||
|
||||
// * * * * * * * constantProperties Private Member Functions * * * * * * * * //
|
||||
|
||||
inline void Foam::polyatomic::constantProperties::checkSiteListSizes() const
|
||||
{
|
||||
if
|
||||
(
|
||||
siteIds_.size() != siteReferencePositions_.size()
|
||||
|| siteIds_.size() != siteCharges_.size()
|
||||
)
|
||||
{
|
||||
FatalErrorIn("polyatomic::constantProperties::checkSiteListSizes")
|
||||
<< "Sizes of site id, charge and "
|
||||
<< "referencePositions are not the same. "
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void Foam::polyatomic::constantProperties::setInteracionSiteBools
|
||||
(
|
||||
const List<word>& siteIds,
|
||||
const List<word>& pairPotSiteIds
|
||||
)
|
||||
{
|
||||
pairPotentialSites_.setSize(siteIds_.size());
|
||||
|
||||
electrostaticSites_.setSize(siteIds_.size());
|
||||
|
||||
forAll(siteIds_, i)
|
||||
{
|
||||
const word& id(siteIds[i]);
|
||||
|
||||
pairPotentialSites_[i] = (findIndex(pairPotSiteIds, id) > -1);
|
||||
|
||||
electrostaticSites_[i] = (mag(siteCharges_[i]) > VSMALL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline bool Foam::polyatomic::constantProperties::linearMoleculeTest() const
|
||||
{
|
||||
if (siteIds_.size() == 2)
|
||||
if (sites_.size() == 2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
vector refDir = siteReferencePositions_[1] - siteReferencePositions_[0];
|
||||
vector refDir =
|
||||
sites_[1].siteReferencePosition()
|
||||
- sites_[0].siteReferencePosition();
|
||||
|
||||
refDir /= mag(refDir);
|
||||
|
||||
for
|
||||
(
|
||||
label i = 2;
|
||||
i < siteReferencePositions_.size();
|
||||
i < sites_.size();
|
||||
i++
|
||||
)
|
||||
{
|
||||
vector dir = siteReferencePositions_[i] - siteReferencePositions_[i-1];
|
||||
vector dir =
|
||||
sites_[i].siteReferencePosition()
|
||||
- sites_[i - 1].siteReferencePosition();
|
||||
|
||||
dir /= mag(dir);
|
||||
|
||||
@ -327,93 +379,27 @@ inline bool Foam::polyatomic::constantProperties::linearMoleculeTest() const
|
||||
|
||||
// * * * * * * * constantProperties Member Functions * * * * * * * * * * * * //
|
||||
|
||||
inline const Foam::Field<Foam::vector>&
|
||||
Foam::polyatomic::constantProperties::siteReferencePositions() const
|
||||
inline const Foam::List<Foam::constPropSite>&
|
||||
Foam::polyatomic::constantProperties::sites() const
|
||||
{
|
||||
return siteReferencePositions_;
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::List<Foam::scalar>&
|
||||
Foam::polyatomic::constantProperties::siteMasses() const
|
||||
{
|
||||
return siteMasses_;
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::List<Foam::scalar>&
|
||||
Foam::polyatomic::constantProperties::siteCharges() const
|
||||
{
|
||||
return siteCharges_;
|
||||
return sites_;
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::List<Foam::label>&
|
||||
Foam::polyatomic::constantProperties::siteIds() const
|
||||
Foam::polyatomic::constantProperties::pairPotSites() const
|
||||
{
|
||||
return siteIds_;
|
||||
return pairPotSites_;
|
||||
}
|
||||
|
||||
|
||||
inline Foam::List<Foam::label>&
|
||||
Foam::polyatomic::constantProperties::siteIds()
|
||||
{
|
||||
return siteIds_;
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::List<bool>&
|
||||
Foam::polyatomic::constantProperties::pairPotentialSites() const
|
||||
{
|
||||
return pairPotentialSites_;
|
||||
}
|
||||
|
||||
|
||||
inline bool Foam::polyatomic::constantProperties::pairPotentialSite
|
||||
(
|
||||
label sId
|
||||
) const
|
||||
{
|
||||
label s = findIndex(siteIds_, sId);
|
||||
|
||||
if (s == -1)
|
||||
{
|
||||
FatalErrorIn("polyatomicI.H") << nl
|
||||
<< sId << " site not found."
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
|
||||
return pairPotentialSites_[s];
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::List<bool>&
|
||||
inline const Foam::List<Foam::label>&
|
||||
Foam::polyatomic::constantProperties::electrostaticSites() const
|
||||
{
|
||||
return electrostaticSites_;
|
||||
}
|
||||
|
||||
|
||||
inline bool Foam::polyatomic::constantProperties::electrostaticSite
|
||||
(
|
||||
label sId
|
||||
) const
|
||||
{
|
||||
label s = findIndex(siteIds_, sId);
|
||||
|
||||
if (s == -1)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"polyatomic::constantProperties::electrostaticSite(label)"
|
||||
) << sId << " site not found."
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
|
||||
return electrostaticSites_[s];
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::diagTensor&
|
||||
Foam::polyatomic::constantProperties::momentOfInertia() const
|
||||
{
|
||||
@ -433,7 +419,8 @@ inline bool Foam::polyatomic::constantProperties::pointMolecule() const
|
||||
}
|
||||
|
||||
|
||||
inline Foam::label Foam::polyatomic::constantProperties::degreesOfFreedom() const
|
||||
inline Foam::label
|
||||
Foam::polyatomic::constantProperties::degreesOfFreedom() const
|
||||
{
|
||||
if (linearMolecule())
|
||||
{
|
||||
@ -458,8 +445,7 @@ inline Foam::scalar Foam::polyatomic::constantProperties::mass() const
|
||||
|
||||
inline Foam::label Foam::polyatomic::constantProperties::nSites() const
|
||||
{
|
||||
return siteIds_.size();
|
||||
|
||||
return sites_.size();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -64,7 +64,8 @@ void Foam::polyatomicCloud::buildConstProps()
|
||||
forAll(idList, i)
|
||||
{
|
||||
const word& id = idList[i];
|
||||
const dictionary& molDict = polyatomicPropertiesDict.subDict(id);
|
||||
|
||||
const dictionary& molDict(polyatomicPropertiesDict.subDict(id));
|
||||
|
||||
List<word> siteIdNames = molDict.lookup("siteIds");
|
||||
|
||||
@ -78,17 +79,23 @@ void Foam::polyatomicCloud::buildConstProps()
|
||||
|
||||
if (siteIds[sI] == -1)
|
||||
{
|
||||
FatalErrorIn("polyatomicCloud::buildConstProps()")
|
||||
FatalErrorIn
|
||||
(
|
||||
"Foam::polyatomic::constantProperties::constantProperties"
|
||||
"("
|
||||
"const dictionary& dict"
|
||||
")"
|
||||
)
|
||||
<< siteId << " site not found."
|
||||
<< nl << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
polyatomic::constantProperties& constProp = constPropList_[i];
|
||||
|
||||
constProp = polyatomic::constantProperties(molDict);
|
||||
|
||||
constProp.siteIds() = siteIds;
|
||||
constPropList_[i] = polyatomic::constantProperties
|
||||
(
|
||||
molDict,
|
||||
siteIds
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1237,7 +1244,7 @@ void Foam::polyatomicCloud::writeXYZ(const fileName& fName) const
|
||||
{
|
||||
const point& sP = mol().sitePositions()[i];
|
||||
|
||||
os << pot_.siteIdList()[cP.siteIds()[i]]
|
||||
os << pot_.siteIdList()[cP.sites()[i].siteId()]
|
||||
<< ' ' << sP.x()*1e10
|
||||
<< ' ' << sP.y()*1e10
|
||||
<< ' ' << sP.z()*1e10
|
||||
|
||||
@ -47,28 +47,18 @@ inline void Foam::polyatomicCloud::evaluatePair
|
||||
|
||||
const polyatomic::constantProperties& constPropJ(constProps(idJ));
|
||||
|
||||
List<label> siteIdsI = constPropI.siteIds();
|
||||
|
||||
List<label> siteIdsJ = constPropJ.siteIds();
|
||||
|
||||
List<bool> pairPotentialSitesI = constPropI.pairPotentialSites();
|
||||
|
||||
List<bool> electrostaticSitesI = constPropI.electrostaticSites();
|
||||
|
||||
List<bool> pairPotentialSitesJ = constPropJ.pairPotentialSites();
|
||||
|
||||
List<bool> electrostaticSitesJ = constPropJ.electrostaticSites();
|
||||
|
||||
forAll(siteIdsI, sI)
|
||||
forAll(constPropI.pairPotSites(), pI)
|
||||
{
|
||||
label idsI(siteIdsI[sI]);
|
||||
label sI = constPropI.pairPotSites()[pI];
|
||||
|
||||
forAll(siteIdsJ, sJ)
|
||||
{
|
||||
label idsJ(siteIdsJ[sJ]);
|
||||
label idsI = constPropI.sites()[sI].siteId();
|
||||
|
||||
if (pairPotentialSitesI[sI] && pairPotentialSitesJ[sJ])
|
||||
forAll(constPropJ.pairPotSites(), pJ)
|
||||
{
|
||||
label sJ = constPropJ.pairPotSites()[pJ];
|
||||
|
||||
label idsJ = constPropJ.sites()[sJ].siteId();
|
||||
|
||||
vector rsIsJ =
|
||||
molI.sitePositions()[sI] - molJ.sitePositions()[sJ];
|
||||
|
||||
@ -105,9 +95,17 @@ inline void Foam::polyatomicCloud::evaluatePair
|
||||
molJ.rf() += virialContribution;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (electrostaticSitesI[sI] && electrostaticSitesJ[sJ])
|
||||
|
||||
forAll(constPropI.electrostaticSites(), pI)
|
||||
{
|
||||
label sI = constPropI.electrostaticSites()[pI];
|
||||
|
||||
forAll(constPropJ.electrostaticSites(), pJ)
|
||||
{
|
||||
label sJ = constPropJ.electrostaticSites()[pJ];
|
||||
|
||||
vector rsIsJ =
|
||||
molI.sitePositions()[sI] - molJ.sitePositions()[sJ];
|
||||
|
||||
@ -117,9 +115,9 @@ inline void Foam::polyatomicCloud::evaluatePair
|
||||
{
|
||||
scalar rsIsJMag = mag(rsIsJ);
|
||||
|
||||
scalar chargeI = constPropI.siteCharges()[sI];
|
||||
scalar chargeI = constPropI.sites()[sI].siteCharge();
|
||||
|
||||
scalar chargeJ = constPropJ.siteCharges()[sJ];
|
||||
scalar chargeJ = constPropJ.sites()[sJ].siteCharge();
|
||||
|
||||
vector fsIsJ =
|
||||
(rsIsJ/rsIsJMag)
|
||||
@ -148,7 +146,6 @@ inline void Foam::polyatomicCloud::evaluatePair
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -170,28 +167,18 @@ inline bool Foam::polyatomicCloud::evaluatePotentialLimit
|
||||
|
||||
const polyatomic::constantProperties& constPropJ(constProps(idJ));
|
||||
|
||||
List<label> siteIdsI = constPropI.siteIds();
|
||||
|
||||
List<label> siteIdsJ = constPropJ.siteIds();
|
||||
|
||||
List<bool> pairPotentialSitesI = constPropI.pairPotentialSites();
|
||||
|
||||
List<bool> electrostaticSitesI = constPropI.electrostaticSites();
|
||||
|
||||
List<bool> pairPotentialSitesJ = constPropJ.pairPotentialSites();
|
||||
|
||||
List<bool> electrostaticSitesJ = constPropJ.electrostaticSites();
|
||||
|
||||
forAll(siteIdsI, sI)
|
||||
forAll(constPropI.pairPotSites(), pI)
|
||||
{
|
||||
label idsI(siteIdsI[sI]);
|
||||
label sI = constPropI.pairPotSites()[pI];
|
||||
|
||||
forAll(siteIdsJ, sJ)
|
||||
{
|
||||
label idsJ(siteIdsJ[sJ]);
|
||||
label idsI = constPropI.sites()[sI].siteId();
|
||||
|
||||
if (pairPotentialSitesI[sI] && pairPotentialSitesJ[sJ])
|
||||
forAll(constPropJ.pairPotSites(), pJ)
|
||||
{
|
||||
label sJ = constPropJ.pairPotSites()[pJ];
|
||||
|
||||
label idsJ = constPropJ.sites()[sJ].siteId();
|
||||
|
||||
vector rsIsJ =
|
||||
molI.sitePositions()[sI] - molJ.sitePositions()[sJ];
|
||||
|
||||
@ -238,9 +225,16 @@ inline bool Foam::polyatomicCloud::evaluatePotentialLimit
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (electrostaticSitesI[sI] && electrostaticSitesJ[sJ])
|
||||
forAll(constPropI.electrostaticSites(), pI)
|
||||
{
|
||||
label sI = constPropI.electrostaticSites()[pI];
|
||||
|
||||
forAll(constPropJ.electrostaticSites(), pJ)
|
||||
{
|
||||
label sJ = constPropJ.electrostaticSites()[pJ];
|
||||
|
||||
vector rsIsJ =
|
||||
molI.sitePositions()[sI] - molJ.sitePositions()[sJ];
|
||||
|
||||
@ -274,9 +268,9 @@ inline bool Foam::polyatomicCloud::evaluatePotentialLimit
|
||||
return true;
|
||||
}
|
||||
|
||||
scalar chargeI = constPropI.siteCharges()[sI];
|
||||
scalar chargeI = constPropI.sites()[sI].siteCharge();
|
||||
|
||||
scalar chargeJ = constPropJ.siteCharges()[sJ];
|
||||
scalar chargeJ = constPropJ.sites()[sJ].siteCharge();
|
||||
|
||||
if
|
||||
(
|
||||
@ -289,7 +283,6 @@ inline bool Foam::polyatomicCloud::evaluatePotentialLimit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user