--- trunk/OOPSE/libmdtools/Integrator.hpp 2003/08/14 16:16:39 696 +++ trunk/OOPSE/libmdtools/Integrator.hpp 2003/08/15 19:24:13 699 @@ -299,7 +299,49 @@ template class ZConstraint : public T { }; template class ZConstraint : public T { + + public: + class ForceSubstractionPolicy{ + public: + ForceSubstractionPolicy(ZConstraint* integrator) {zconsIntegrator = integrator;} + + virtual void update() = 0; + virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0; + virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0; + virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0; + virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0; + + protected: + ZConstraint* zconsIntegrator;; + }; + + class PolicyByNumber : ForceSubstractionPolicy{ + public: + PolicyByNumber(ZConstraint* integrator) :ForceSubstractionPolicy(integrator) {} + virtual void update(); + virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ; + virtual double getZFOfMovingMols(Atom* atom, double totalForce) ; + virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce); + virtual double getHFOfUnconsMols(Atom* atom, double totalForce); + + private: + int totNumOfMovingAtoms; + }; + class PolicyByMass :ForceSubstractionPolicy{ + public: + PolicyByMass(ZConstraint* integrator) :ForceSubstractionPolicy(integrator) {} + + virtual void update(); + virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ; + virtual double getZFOfMovingMols(Atom* atom, double totalForce) ; + virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce); + virtual double getHFOfUnconsMols(Atom* atom, double totalForce); + + private: + double totMassOfMovingAtoms; + }; + public: ZConstraint( SimInfo *theInfo, ForceFields* the_ff); @@ -343,7 +385,7 @@ template class ZConstraint : public T { int isZConstraintMol(Molecule* mol); - double zconsTime; + double zconsTime; double zconsTol; double zForceConst; @@ -364,6 +406,7 @@ template class ZConstraint : public T { int* indexOfZConsMols; //index of local Z-Constraint Molecules double* fz; + double* curZPos; int totNumOfUnconsAtoms; @@ -374,9 +417,14 @@ template class ZConstraint : public T { string zconsOutput; ZConsWriter* fzOut; + double curZconsTime; + double calcMovingMolsCOMVel(); double calcSysCOMVel(); double calcTotalForce(); + + ForceSubstractionPolicy* forcePolicy; + friend class ForceSubstractionPolicy; };