Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

ComputeRestraints Class Reference

#include <ComputeRestraints.h>

Inheritance diagram for ComputeRestraints:

ComputePatch Compute List of all members.

Public Member Functions

 ComputeRestraints (ComputeID c, PatchID pid)
virtual ~ComputeRestraints ()
virtual void doForce (CompAtom *p, CompAtomExt *pExt, Results *r)

Public Attributes

SubmitReductionreduction

Detailed Description

Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by The Board of Trustees of the University of Illinois. All rights reserved.

Definition at line 13 of file ComputeRestraints.h.


Constructor & Destructor Documentation

ComputeRestraints::ComputeRestraints ComputeID  c,
PatchID  pid
 

Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000 by The Board of Trustees of the University of Illinois. All rights reserved.

Definition at line 20 of file ComputeRestraints.C.

References SimParameters::constraintExp, SimParameters::constrXOn, SimParameters::constrYOn, SimParameters::constrZOn, SimParameters::movingConstraintsOn, SimParameters::movingConsVel, Node::Object(), ReductionMgr::Object(), reduction, REDUCTIONS_BASIC, SimParameters::rotConsAxis, SimParameters::rotConsPivot, SimParameters::rotConstraintsOn, SimParameters::rotConsVel, SimParameters::selectConstraintsOn, Node::simParameters, simParams, and ReductionMgr::willSubmit().

00021   : ComputePatch(c,pid)
00022 {
00023         reduction = ReductionMgr::Object()->willSubmit(REDUCTIONS_BASIC);
00024 
00025         SimParameters *simParams = Node::Object()->simParameters;
00026 
00027         //  Get parameters from the SimParameters object
00028         consExp = simParams->constraintExp;
00029         
00030         //****** BEGIN selective restraints (X,Y,Z) changes 
00031         consSelectOn = simParams->selectConstraintsOn;
00032         if (consSelectOn) {
00033           consSelectX = simParams->constrXOn;
00034           consSelectY = simParams->constrYOn;
00035           consSelectZ = simParams->constrZOn;
00036         }
00037         //****** END selective restraints (X,Y,Z) changes 
00038         
00039         //****** BEGIN moving constraints changes 
00040         consMoveOn = simParams->movingConstraintsOn;
00041         if (consMoveOn) {
00042           moveVel = simParams->movingConsVel;
00043         }
00044         //****** END moving constraints changes 
00045         //****** BEGIN rotating constraints changes 
00046         consRotOn = simParams->rotConstraintsOn;
00047         if (consRotOn) {
00048           rotVel = simParams->rotConsVel;
00049           rotAxis = simParams->rotConsAxis;
00050           rotPivot = simParams->rotConsPivot;
00051         }
00052         //****** END rotating constraints changes 
00053 
00054 }

ComputeRestraints::~ComputeRestraints  )  [virtual]
 

Definition at line 65 of file ComputeRestraints.C.

00067 {
00068         delete reduction;
00069 }


Member Function Documentation

void ComputeRestraints::doForce CompAtom p,
CompAtomExt pExt,
Results r
[virtual]
 

Implements ComputePatch.

Definition at line 77 of file ComputeRestraints.C.

References ADD_TENSOR_OBJECT, ADD_VECTOR_OBJECT, BigReal, SimParameters::constraintScaling, Lattice::delta(), Results::f, Patch::flags, Force, Molecule::get_cons_params(), Molecule::is_atom_constrained(), SubmitReduction::item(), Patch::lattice, Vector::length2(), mat_multiply_vec(), Node::molecule, Node::Object(), outer(), Real, reduction, REDUCTION_BC_ENERGY, REDUCTION_EXT_FORCE_NORMAL, REDUCTION_VIRIAL_NORMAL, Node::simParameters, Flags::step, SubmitReduction::submit(), vec_rotation_matrix(), Vector::x, Vector::y, and Vector::z.

00078 {
00079         Molecule *molecule = Node::Object()->molecule;
00080         Real k;                 //  Force constant
00081         BigReal scaling = Node::Object()->simParameters->constraintScaling;
00082         Vector refPos;          //  Reference position
00083         BigReal r, r2;  //  r=distance between atom position and the
00084                         //  reference position, r2 = r^2
00085         Vector Rij;     //  vector between current position and reference pos
00086         BigReal value;  //  Current calculated value
00087 
00088         // aliases to work with old code
00089         Force *f = res->f[Results::normal];
00090         BigReal energy = 0;
00091         BigReal m[9];
00092         Tensor virial;
00093         Vector netForce = 0;
00094 
00095         // BEGIN moving and rotating constraint changes ******
00096 
00097         // This version only allows one atom to be moved 
00098         // and only ALL ref positions to be rotated
00099 
00100         int currentTime = patch->flags.step;
00101         if (consRotOn) {
00102           vec_rotation_matrix(rotVel * currentTime, rotAxis, m);
00103         }
00104 
00105         // END moving and rotating constraint changes ******
00106 
00107           
00108         if (scaling != 0.) for (int localID=0; localID<numAtoms; ++localID)
00109         {
00110           if (molecule->is_atom_constrained(pExt[localID].id))
00111           {
00112             molecule->get_cons_params(k, refPos, pExt[localID].id);
00113 
00114             k *= scaling;
00115 
00116             // BEGIN moving and rotating constraint changes ******
00117             
00118             if (consMoveOn) {
00119               refPos += currentTime * moveVel;
00120             }
00121             else if(consRotOn) {
00122               refPos = mat_multiply_vec(refPos - rotPivot, m) + rotPivot;
00123             }
00124 
00125             // END moving and rotating constraint changes *******
00126 
00127             Rij = patch->lattice.delta(refPos,p[localID].position);
00128             Vector vpos = refPos - Rij;
00129 
00130             //****** BEGIN selective restraints (X,Y,Z) changes 
00131             if (consSelectOn) { // check which components we want to restrain:
00132               if (!consSelectX) {Rij.x=0.0;}  // by setting the appropriate
00133               if (!consSelectY) {Rij.y=0.0;}  // Cartesian component to zero
00134               if (!consSelectZ) {Rij.z=0.0;}  // we will avoid a restoring force
00135             }                                 // along that component, and the
00136                                               // energy will also be correct
00137             //****** END selective restraints (X,Y,Z) changes 
00138 
00139             
00140             //  Calculate the distance and the distance squared
00141             r2 = Rij.length2();
00142             r = sqrt(r2);
00143 
00144             //  Only calculate the energy and the force if the distance is
00145             //  non-zero.   Otherwise, you could end up dividing by 0, which
00146             //  is bad
00147             if (r>0.0)
00148             {
00149               value=k;
00150       
00151               //  Loop through and multiple k by r consExp times.
00152               //  i.e.  calculate kr^e
00153               //  I know, I could use pow(), but I don't trust it.
00154               for (int k=0; k<consExp; ++k)
00155               {
00156                 value *= r;
00157               }
00158 
00159               //  Add to the energy total
00160               energy += value;
00161       
00162               //  Now calculate the force, which is ekr^(e-1).  Also, divide
00163               //  by another factor of r to normalize the vector before we
00164               //  multiple it by the magnitude
00165               value *= consExp;
00166               value /= r2;
00167       
00168               Rij *= value;
00169               //iout << iINFO << "restraining force" << Rij        << "\n"; 
00170 
00171               f[localID] += Rij;
00172               netForce += Rij;
00173               virial += outer(Rij,vpos);
00174             }
00175           }
00176         }
00177 
00178         reduction->item(REDUCTION_BC_ENERGY) += energy;
00179         ADD_TENSOR_OBJECT(reduction,REDUCTION_VIRIAL_NORMAL,virial);
00180         ADD_VECTOR_OBJECT(reduction,REDUCTION_EXT_FORCE_NORMAL,netForce);
00181         reduction->submit();
00182 
00183 }


Member Data Documentation

SubmitReduction* ComputeRestraints::reduction
 

Definition at line 39 of file ComputeRestraints.h.

Referenced by ComputeRestraints(), and doForce().


The documentation for this class was generated from the following files:
Generated on Tue Nov 24 04:07:49 2009 for NAMD by  doxygen 1.3.9.1