1 #ifndef SIMP_NUCLEATION_EXTERNAL_H 2 #define SIMP_NUCLEATION_EXTERNAL_H 11 #include <simp/boundary/Boundary.h> 12 #include <util/space/Dimension.h> 13 #include <util/space/Vector.h> 14 #include <util/param/ParamComposite.h> 105 void set(std::string name,
double value);
110 double get(std::string name)
const;
145 static const int MaxAtomType = 3;
151 double externalParameter_;
172 double interfaceWidth_;
175 double nucleationClip_;
198 const Vector cellLengths = boundaryPtr_->lengths();
199 double clipParameter = 1.0/(2.0*M_PI*periodicity_*interfaceWidth_);
205 for (
int i = 0; i < nWaveVectors_; ++i) {
207 q[0] = 2.0*M_PI*periodicity_*waveVectors_[i][0]/cellLengths[0];
208 q[1] = 2.0*M_PI*periodicity_*waveVectors_[i][1]/cellLengths[1];
209 q[2] = 2.0*M_PI*periodicity_*waveVectors_[i][2]/cellLengths[2];
210 double arg = q.
dot(r)+phases_[i];
214 cosine *= clipParameter;
215 e = prefactor_[type]*externalParameter_*tanh(C_+cosine) *
216 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))))+1)/2 *
217 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))))+1)/2 *
218 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))))+1)/2 ;
230 const Vector cellLengths = boundaryPtr_->lengths();
231 double clipParameter = 1.0/(2.0*M_PI*periodicity_*interfaceWidth_);
235 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))))+1)/2 *
236 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))))+1)/2 *
237 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))))+1)/2 ;
244 for (
int i = 0; i < nWaveVectors_; ++i) {
246 q[0] = 2.0*M_PI*periodicity_*waveVectors_[i][0]/cellLengths[0];
247 q[1] = 2.0*M_PI*periodicity_*waveVectors_[i][1]/cellLengths[1];
248 q[2] = 2.0*M_PI*periodicity_*waveVectors_[i][2]/cellLengths[2];
249 double arg = q.
dot(r)+phases_[i];
251 double sine = -1.0*sin(arg);
255 cosine *= clipParameter;
257 deriv *= clipParameter;
258 double tanH = tanh(C_+cosine);
259 double sechSq = (1.0 - tanH*tanH);
260 double f = prefactor_[type]*externalParameter_*sechSq;
263 deriv[0] = deriv[0] + nucleationClip_*(M_PI/cellLengths[0]*sin(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_)))/
264 cosh(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))/
265 cosh(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))*
266 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))))+1)/2*
267 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))))+1)/2;
269 deriv[1] = deriv[1] + nucleationClip_*(M_PI/cellLengths[1]*sin(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_)))/
270 cosh(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))/
271 cosh(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))*
272 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))))+1)/2*
273 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))))+1)/2;
275 deriv[2] = deriv[2] + nucleationClip_*(M_PI/cellLengths[2]*sin(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_)))/
276 cosh(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))/
277 cosh(2.0*M_PI*position[2]/cellLengths[2]+acos(bias_))*
278 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[0]/cellLengths[0]+acos(bias_))))+1)/2*
279 (tanh(nucleationClip_*(-bias_+cos(2.0*M_PI*position[1]/cellLengths[1]+acos(bias_))))+1)/2;
Vector & zero()
Set all elements of a 3D vector to zero.
A Vector is a Cartesian vector.
double dot(const Vector &v) const
Return dot product of this vector and vector v.
void setNAtomType(int nAtomType)
Set nAtomType value.
An orthorhombic periodic unit cell.
NucleationExternal & operator=(const NucleationExternal &other)
Assignment.
File containing preprocessor macros for error handling.
Classes used by all simpatico molecular simulations.
Saving / output archive for binary ostream.
void getForce(const Vector &position, int type, Vector &force) const
Returns force caused by the external potential.
std::string className() const
Return name string "NucleationExternal".
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
void setExternalParameter(double externalParameter)
Sets external parameter.
double energy(const Vector &position, int i) const
Returns external potential energy of a single particle.
Utility classes for scientific computation.
double externalParameter() const
Returns external parameter.
NucleationExternal()
Default constructor.
void readParameters(std::istream &in)
Read potential parameters, and initialize other variables.
Saving archive for binary istream.
An object that can read multiple parameters from file.
void setBoundary(Boundary &boundary)
Set pointer to Boundary.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
A clipped cosine potential that induces ordering along directions specified by waveIntVectors, w_i.