--- trunk/OOPSE/libmdtools/Atom.cpp 2003/03/26 21:54:49 413 +++ trunk/OOPSE/libmdtools/Atom.cpp 2004/08/23 15:11:36 1452 @@ -1,27 +1,26 @@ +#include + +using namespace std; + +#include "simError.h" #include "Atom.hpp" -double* Atom::pos; // the position array -double* Atom::vel; // the velocity array -double* Atom::frc; // the forc array -double* Atom::trq; // the torque vector ( space fixed ) -double* Atom::Amat; // the rotation matrix -double* Atom::mu; // the array of dipole moments -double* Atom::ul; // the lab frame unit directional vector -int Atom::nElements; +Atom::Atom(int theIndex, SimState* theConfig) { -Atom::Atom(int theIndex) { - c_n_hyd = 0; + objType = OT_ATOM; + myConfig = theConfig; + hasCoords = false; + has_dipole = 0; - is_VDW = 0; - is_LJ = 0; + has_charge = 0; index = theIndex; - offset = 3 * index; + offset = 0; offsetX = offset; offsetY = offset+1; offsetZ = offset+2; - Axx = index*9; + Axx = 0; Axy = Axx+1; Axz = Axx+2; @@ -34,209 +33,171 @@ Atom::Atom(int theIndex) { Azz = Axx+8; } -void Atom::createArrays (int the_nElements) { - int i; - - nElements = the_nElements; - - pos = new double[nElements*3]; - vel = new double[nElements*3]; - frc = new double[nElements*3]; - trq = new double[nElements*3]; - Amat = new double[nElements*9]; - mu = new double[nElements]; - ul = new double[nElements*3]; - - // init directional values to zero - - for( i=0; iisAllocated() ){ + + myConfig->getAtomPointers( index, + &pos, + &vel, + &frc, + &trq, + &Amat, + &mu, + &ul, + &quat); + } + else{ + sprintf( painCave.errMsg, + "Attempted to set Atom %d coordinates with an unallocated " + "SimState object.\n", index ); + painCave.isFatal = 1; + simError(); + } - Axx = index*9; - Axy = Axx+1; - Axz = Axx+2; + hasCoords = true; - Ayx = Axx+3; - Ayy = Axx+4; - Ayz = Axx+5; - - Azx = Axx+6; - Azy = Axx+7; - Azz = Axx+8; } -void Atom::addAtoms(int nAdded, double* Apos, double* Avel, double* Afrc, - double* Atrq, double* AAmat, double* Amu, - double* Aul) { - - int nNew = nElements+nAdded; - - double* new_pos = new double[nNew*3]; - double* new_vel = new double[nNew*3]; - double* new_frc = new double[nNew*3]; - double* new_trq = new double[nNew*3]; - double* new_Amat = new double[nNew*9]; - double* new_mu = new double[nNew]; - double* new_ul = new double[nNew*3]; - int i, j; +void Atom::getPos( double theP[3] ){ - for (i = 0; i < 3*nElements; i++) { - new_pos[i] = pos[i]; - new_vel[i] = vel[i]; - new_frc[i] = frc[i]; - new_trq[i] = trq[i]; - new_ul[i] = ul[i]; + if( hasCoords ){ + theP[0] = pos[offsetX]; + theP[1] = pos[offsetY]; + theP[2] = pos[offsetZ]; } + else{ - for(i = 0; i < 3*nAdded; i++) { - j = i + 3*nElements; - new_pos[j] = Apos[i]; - new_vel[j] = Avel[i]; - new_frc[j] = Afrc[i]; - new_trq[j] = Atrq[i]; - new_ul[j] = Aul[i]; + sprintf( painCave.errMsg, + "Attempt to get Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - for (i = 0; i < 9*nElements; i++) { - new_Amat[i] = Amat[i]; - } +void Atom::setPos( double theP[3] ){ - for(i = 0; i < 9*nAdded; i++) { - j = i + 9*nElements; - new_Amat[j] = AAmat[i]; + if( hasCoords ){ + pos[offsetX] = theP[0]; + pos[offsetY] = theP[1]; + pos[offsetZ] = theP[2]; } + else{ - for (i = 0; i < nElements; i++) { - new_mu[i] = mu[i]; + sprintf( painCave.errMsg, + "Attempt to set Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - for(i = 0; i < nAdded; i++) { - j = i + nElements; - new_mu[j] = Amu[i]; +void Atom::getVel( double theV[3] ){ + + if( hasCoords ){ + theV[0] = vel[offsetX]; + theV[1] = vel[offsetY]; + theV[2] = vel[offsetZ]; } + else{ + + sprintf( painCave.errMsg, + "Attempt to get vel for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; - - pos = new_pos; - vel = new_vel; - frc = new_frc; - trq = new_trq; - ul = new_ul; - Amat = new_Amat; - mu = new_mu; - - nElements = nNew; } -void Atom::deleteAtom(int theIndex) { - deleteRange(theIndex, theIndex); +void Atom::setVel( double theV[3] ){ + + if( hasCoords ){ + vel[offsetX] = theV[0]; + vel[offsetY] = theV[1]; + vel[offsetZ] = theV[2]; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to set vel for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } -void Atom::deleteRange(int startIndex, int stopIndex) { - - int nNew = nElements-(stopIndex-startIndex+1); - - double* new_pos = new double[nNew*3]; - double* new_vel = new double[nNew*3]; - double* new_frc = new double[nNew*3]; - double* new_trq = new double[nNew*3]; - double* new_Amat = new double[nNew*9]; - double* new_mu = new double[nNew]; - double* new_ul = new double[nNew*3]; - int i, j; +void Atom::getFrc( double theF[3] ){ - for (i = 0; i < 3*startIndex; i++) { - new_pos[i] = pos[i]; - new_vel[i] = vel[i]; - new_frc[i] = frc[i]; - new_trq[i] = trq[i]; - new_ul[i] = ul[i]; + if( hasCoords ){ + theF[0] = frc[offsetX]; + theF[1] = frc[offsetY]; + theF[2] = frc[offsetZ]; } - - for(i = 3*(stopIndex + 1); i < 3*nElements; i++) { - j = i - 3*startIndex + 1; - new_pos[j] = pos[i]; - new_vel[j] = vel[i]; - new_frc[j] = frc[i]; - new_trq[j] = trq[i]; - new_ul[j] = ul[i]; + else{ + + sprintf( painCave.errMsg, + "Attempt to get frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - for (i = 0; i < 9*startIndex; i++) { - new_Amat[i] = Amat[i]; +void Atom::setFrc( double theF[3] ){ + + if( hasCoords ){ + frc[offsetX] = theF[0]; + frc[offsetY] = theF[1]; + frc[offsetZ] = theF[2]; } - - for(i = 9*(stopIndex + 1); i < 9*nElements; i++) { - j = i - 9*startIndex + 1; - new_Amat[j] = Amat[i]; + else{ + + sprintf( painCave.errMsg, + "Attempt to set frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - for (i = 0; i < startIndex; i++) { - new_mu[i] = mu[i]; +void Atom::addFrc( double theF[3] ){ + + if( hasCoords ){ + frc[offsetX] += theF[0]; + frc[offsetY] += theF[1]; + frc[offsetZ] += theF[2]; } - - for(i = (stopIndex+1); i < nElements; i++) { - j = i - startIndex + 1; - new_mu[j] = mu[i]; + else{ + + sprintf( painCave.errMsg, + "Attempt to add frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; - pos = new_pos; - vel = new_vel; - frc = new_frc; - trq = new_trq; - ul = new_ul; - Amat = new_Amat; - mu = new_mu; - - nElements = nNew; +void Atom::zeroForces( void ){ + + if( hasCoords ){ + frc[offsetX] = 0.0; + frc[offsetY] = 0.0; + frc[offsetZ] = 0.0; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to zero frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } +