/* []----------------------------------------[] | Torsion.h | []----------------------------------------[] | | | AUTHOR: MFSomers 2005. | | USE: Bond torsion interaction | | definitions... | | | []----------------------------------------[] */ // Copyright (C) 2005 M.F. Somers, Theoretical Chemistry Department, Leiden University // // This is free software; you can redistribute it and/or modify it under the terms of // the GNU Lesser General Public License as published by the Free Software Foundation. // // http://www.gnu.org/licenses/lgpl.txt #if !defined(__GENERALTORSIONAL_INCLUDED__) #define __GENERALTORSIONAL_INCLUDED__ #include #include "Global.h" #include "Vector.h" #include "Constants.h" #include "ClassicalDynamics.h" /* ----------------------------------------------------------------------- */ /* Definition of a bond torsion interaction */ class TorsionalInteraction; typedef TorsionalInteraction *TorsionalInteractionPointer; class TorsionalInteraction : public Interaction { public: inline TorsionalInteraction( unsigned int TheId = GET_NEW_ID, Vector *UsePeriodicBox = NULL ) : Interaction( TheId, UsePeriodicBox ) { Type = AGeneralTorsionalInteraction; }; inline TorsionalInteraction( TorsionalInteraction& I ) : Interaction( I ) { } virtual TorsionalInteractionPointer Clone() { return( new TorsionalInteraction( (*this) ) ); } virtual TorsionalInteractionPointer Create( unsigned int TheId = GET_NEW_ID, Vector *UsePeriodicBox = NULL ) { return( new TorsionalInteraction( TheId, UsePeriodicBox ) ); } virtual double TorsionalPotential( double cosangle ); virtual double DerivativeOfTorsionalPotential( double cosangle ); virtual double TorsionalPotential( Particle& P1, Particle& P2, Particle& P3, Particle& P4 ); virtual Vector TorsionalForce( Particle& P1, Particle& P2, Particle& P3, Particle& P4, int p ); double TorsionalPotential( unsigned int ID1, unsigned int ID2, unsigned ID3, unsigned ID4 ); Vector TorsionalForce( unsigned int ID1, unsigned int ID2, unsigned ID3, unsigned ID4, int p ); virtual double InteractionPotential( void ); virtual Vector InteractionForce( unsigned int ID ); }; /* --------------------------------------------------------- */ /* Defines a periodic torsional interaction between particles */ class PeriodicTorsionalInteraction; typedef PeriodicTorsionalInteraction *PeriodicTorsionalInteractionPointer; class PeriodicTorsionalInteraction : public TorsionalInteraction { public: inline PeriodicTorsionalInteraction( double TheFactor, double TheAngle, int TheN = 1, unsigned int TheId = GET_NEW_ID, Vector *UsePeriodicBox = NULL ) : TorsionalInteraction( TheId, UsePeriodicBox ) { InteractionFactor = TheFactor; Angle = TheAngle; N = ( TheN >= 1 ? TheN : 1 ); Type = APeriodicTorsionalInteraction; }; inline PeriodicTorsionalInteraction( PeriodicTorsionalInteraction& I ) : TorsionalInteraction( I ) { InteractionFactor = I.InteractionFactor; Angle = I.Angle; N = I.N; } virtual PeriodicTorsionalInteraction& operator=( PeriodicTorsionalInteraction& I ) { if( &I == &(*this) ) return( (*this) ); TorsionalInteraction::operator=( I ); InteractionFactor = I.InteractionFactor; Angle = I.Angle; N = I.N; return( (*this) ); } virtual PeriodicTorsionalInteractionPointer Clone() { return( new PeriodicTorsionalInteraction( (*this) ) ); } virtual PeriodicTorsionalInteractionPointer Create( double TheFactor = 1.0, double TheAngle = 0.0, int TheN = 1, unsigned int TheId = GET_NEW_ID, Vector *UsePeriodicBox = NULL ) { return( new PeriodicTorsionalInteraction( TheFactor, TheAngle, TheN, TheId, UsePeriodicBox ) ); } virtual double TorsionalPotential( double cosangle ); virtual double DerivativeOfTorsionalPotential( double cosangle ); double InteractionFactor, Angle; /* V(cosangle) = factor*[1-cos(N*{acos(cosangle)-Angle})] */ int N; }; /* ----------------------------------------------------------------------- */ #endif