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

ComputeBonds.C

Go to the documentation of this file.
00001 
00007 #include "InfoStream.h"
00008 #include "ComputeBonds.h"
00009 #include "Molecule.h"
00010 #include "Parameters.h"
00011 #include "Node.h"
00012 #include "ReductionMgr.h"
00013 #include "Lattice.h"
00014 #include "PressureProfile.h"
00015 #include "Debug.h"
00016 
00017 #if 0
00018 void BondElem::loadTuplesForAtom
00019   (void *voidlist, AtomID atomID, Molecule *molecule)
00020 {
00021       DebugM(1, "::loadTuplesForAtom - atomID " << atomID << std::endl );
00022       UniqueSet<BondElem> &bondList =
00023                   *( (UniqueSet<BondElem>*) voidlist );
00024 
00025       DebugM(1, "::loadTuplesForAtom - current list size " << bondList.size() << std::endl );
00026 
00027       /* get list of all bonds for the atom */
00028       int *bonds = molecule->get_bonds_for_atom(atomID);
00029       DebugM(1, "::loadTuplesForAtom - atomID " << atomID << std::endl );
00030 
00031       /* cycle through each bond */
00032       int bondNum = *bonds;
00033       while(bondNum != -1)
00034       {
00035         /* store bond in the list */
00036         DebugM(1, "::loadTuplesForAtom - loading bond " << bondNum << std::endl );
00037         bondList.add(BondElem(molecule->get_bond(bondNum)));
00038         bondNum = *(++bonds);
00039       }
00040 }
00041 #endif
00042 
00043 // static initialization
00044 int BondElem::pressureProfileSlabs = 0;
00045 int BondElem::pressureProfileAtomTypes = 1;
00046 BigReal BondElem::pressureProfileThickness = 0;
00047 BigReal BondElem::pressureProfileMin = 0;
00048 
00049 void BondElem::getMoleculePointers
00050     (Molecule* mol, int* count, int32*** byatom, Bond** structarray)
00051 {
00052 #ifdef MEM_OPT_VERSION
00053   NAMD_die("Should not be called in BondElem::getMoleculePointers in memory optimized version!");
00054 #else
00055   *count = mol->numBonds;
00056   *byatom = mol->bondsByAtom;
00057   *structarray = mol->bonds;
00058 #endif
00059 }
00060 
00061 void BondElem::getParameterPointers(Parameters *p, const BondValue **v) {
00062   *v = p->bond_array;
00063 }
00064 
00065 void BondElem::computeForce(BigReal *reduction, 
00066                             BigReal *pressureProfileData)
00067 {
00068   DebugM(1, "::computeForce() localIndex = " << localIndex[0] << " "
00069                << localIndex[1] << std::endl);
00070 
00071   BigReal r;            // Distance between atoms
00072   BigReal scal;         // force scaling
00073   BigReal diff;         // difference between theta and theta0
00074   BigReal energy;       // energy from the bond
00075 
00076   //DebugM(3, "::computeForce() -- starting with bond type " << bondType << std::endl);
00077 
00078   // get the bond information
00079   Real k = value->k * scale;
00080   Real x0 = value->x0;
00081 
00082   // compute vectors between atoms and their distances
00083   const Lattice & lattice = p[0]->p->lattice;
00084   const Vector r12 = lattice.delta(p[0]->x[localIndex[0]].position,
00085                                         p[1]->x[localIndex[1]].position);
00086 
00087   if (0. == x0) {  // for Drude bonds
00088     scal = -2.0*k;
00089     energy = k * r12.length2();
00090   }
00091   else {
00092     r = r12.length();
00093 
00094     //  Compare it to the rest bond
00095     diff = r - x0;
00096 
00097     //  Add the energy from this bond to the total energy
00098     energy = k*diff*diff;
00099 
00100     //  Determine the magnitude of the force
00101     diff *= -2.0*k;
00102 
00103     //  Scale the force vector accordingly
00104     scal = (diff/r);
00105   }
00106   const Force f12 = scal * r12;
00107 
00108 
00109   //  Now add the forces to each force vector
00110   p[0]->f[localIndex[0]] += f12;
00111   p[1]->f[localIndex[1]] -= f12;
00112 
00113   DebugM(3, "::computeForce() -- ending with delta energy " << energy << std::endl);
00114   reduction[bondEnergyIndex] += energy;
00115   reduction[virialIndex_XX] += f12.x * r12.x;
00116   reduction[virialIndex_XY] += f12.x * r12.y;
00117   reduction[virialIndex_XZ] += f12.x * r12.z;
00118   reduction[virialIndex_YX] += f12.y * r12.x;
00119   reduction[virialIndex_YY] += f12.y * r12.y;
00120   reduction[virialIndex_YZ] += f12.y * r12.z;
00121   reduction[virialIndex_ZX] += f12.z * r12.x;
00122   reduction[virialIndex_ZY] += f12.z * r12.y;
00123   reduction[virialIndex_ZZ] += f12.z * r12.z;
00124 
00125   if (pressureProfileData) {
00126     BigReal z1 = p[0]->x[localIndex[0]].position.z;
00127     BigReal z2 = p[1]->x[localIndex[1]].position.z;
00128     int n1 = (int)floor((z1-pressureProfileMin)/pressureProfileThickness);
00129     int n2 = (int)floor((z2-pressureProfileMin)/pressureProfileThickness);
00130     pp_clamp(n1, pressureProfileSlabs);
00131     pp_clamp(n2, pressureProfileSlabs);
00132     int p1 = p[0]->x[localIndex[0]].partition;
00133     int p2 = p[1]->x[localIndex[1]].partition;
00134     int pn = pressureProfileAtomTypes;
00135     pp_reduction(pressureProfileSlabs,
00136                 n1, n2, 
00137                 p1, p2, pn, 
00138                 f12.x * r12.x, f12.y * r12.y, f12.z * r12.z,
00139                 pressureProfileData);
00140   } 
00141 }
00142 
00143 void BondElem::submitReductionData(BigReal *data, SubmitReduction *reduction)
00144 {
00145   reduction->item(REDUCTION_BOND_ENERGY) += data[bondEnergyIndex];
00146   ADD_TENSOR(reduction,REDUCTION_VIRIAL_NORMAL,data,virialIndex);
00147 }
00148 

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