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

ComputeRestraints.C

Go to the documentation of this file.
00001 
00007 #include "ComputeRestraints.h"
00008 #include "Node.h"
00009 #include "Molecule.h"
00010 #include "SimParameters.h"
00011 #include "Patch.h"
00012 #include "NamdOneTools.h"
00013 
00014 /************************************************************************/
00015 /*                                                                      */
00016 /*                      FUNCTION ComputeRestraints                      */
00017 /*                                                                      */
00018 /************************************************************************/
00019 
00020 ComputeRestraints::ComputeRestraints(ComputeID c, PatchID pid)
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 }
00055 /*                      END OF FUNCTION ComputeRestraints               */
00056 
00057 /************************************************************************/
00058 /*                                                                      */
00059 /*                      FUNCTION ~ComputeRestraints                     */
00060 /*                                                                      */
00061 /*      This is the destructor for the ComputeRestraints force object.  */
00062 /*                                                                      */
00063 /************************************************************************/
00064 
00065 ComputeRestraints::~ComputeRestraints()
00066 
00067 {
00068         delete reduction;
00069 }
00070 /*                      END OF FUNCTION ~ComputeRestraints              */
00071 
00072 /************************************************************************/
00073 /*                                                                      */
00074 /*                              FUNCTION force                          */
00075 /*                                                                      */
00076 /************************************************************************/
00077 void ComputeRestraints::doForce(CompAtom* p, CompAtomExt* pExt, Results* res)
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 }
00184 /*                      END OF FUNCTION force                           */
00185 

Generated on Tue Nov 24 04:07:43 2009 for NAMD by  doxygen 1.3.9.1