| 299 |  | }; | 
| 300 |  |  | 
| 301 |  | template<typename T> class ZConstraint : public T { | 
| 302 | + |  | 
| 303 | + | public: | 
| 304 | + | class ForceSubstractionPolicy{ | 
| 305 | + | public: | 
| 306 | + | ForceSubstractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;} | 
| 307 | + |  | 
| 308 | + | virtual void update() = 0; | 
| 309 | + | virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0; | 
| 310 | + | virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0; | 
| 311 | + | virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0; | 
| 312 | + | virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0; | 
| 313 | + |  | 
| 314 | + | protected: | 
| 315 | + | ZConstraint<T>* zconsIntegrator;; | 
| 316 | + | }; | 
| 317 | + |  | 
| 318 | + | class PolicyByNumber : ForceSubstractionPolicy{ | 
| 319 | + | public: | 
| 320 | + | PolicyByNumber(ZConstraint<T>* integrator) :ForceSubstractionPolicy(integrator) {} | 
| 321 | + | virtual void update(); | 
| 322 | + | virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ; | 
| 323 | + | virtual double getZFOfMovingMols(Atom* atom, double totalForce) ; | 
| 324 | + | virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce); | 
| 325 | + | virtual double getHFOfUnconsMols(Atom* atom, double totalForce); | 
| 326 | + |  | 
| 327 | + | private: | 
| 328 | + | int totNumOfMovingAtoms; | 
| 329 | + | }; | 
| 330 |  |  | 
| 331 | + | class PolicyByMass :ForceSubstractionPolicy{ | 
| 332 | + | public: | 
| 333 | + | PolicyByMass(ZConstraint<T>* integrator) :ForceSubstractionPolicy(integrator) {} | 
| 334 | + |  | 
| 335 | + | virtual void update(); | 
| 336 | + | virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ; | 
| 337 | + | virtual double getZFOfMovingMols(Atom* atom, double totalForce) ; | 
| 338 | + | virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce); | 
| 339 | + | virtual double getHFOfUnconsMols(Atom* atom, double totalForce); | 
| 340 | + |  | 
| 341 | + | private: | 
| 342 | + | double totMassOfMovingAtoms; | 
| 343 | + | }; | 
| 344 | + |  | 
| 345 |  | public: | 
| 346 |  |  | 
| 347 |  | ZConstraint( SimInfo *theInfo, ForceFields* the_ff); | 
| 385 |  | int isZConstraintMol(Molecule* mol); | 
| 386 |  |  | 
| 387 |  |  | 
| 388 | < | double zconsTime; | 
| 388 | > | double zconsTime; | 
| 389 |  | double zconsTol; | 
| 390 |  | double zForceConst; | 
| 391 |  |  | 
| 406 |  |  | 
| 407 |  | int* indexOfZConsMols;                   //index of local Z-Constraint Molecules | 
| 408 |  | double* fz; | 
| 409 | + | double* curZPos; | 
| 410 |  |  | 
| 411 |  | int totNumOfUnconsAtoms; | 
| 412 |  |  | 
| 417 |  | string zconsOutput; | 
| 418 |  | ZConsWriter* fzOut; | 
| 419 |  |  | 
| 420 | + | double curZconsTime; | 
| 421 | + |  | 
| 422 |  | double calcMovingMolsCOMVel(); | 
| 423 |  | double calcSysCOMVel(); | 
| 424 |  | double calcTotalForce(); | 
| 425 | + |  | 
| 426 | + | ForceSubstractionPolicy* forcePolicy; | 
| 427 | + | friend class ForceSubstractionPolicy; | 
| 428 |  |  | 
| 429 |  | }; | 
| 430 |  |  |