--- trunk/OOPSE/libmdtools/Atom.cpp 2003/07/14 21:48:43 599 +++ trunk/OOPSE/libmdtools/Atom.cpp 2003/08/07 21:47:18 670 @@ -2,30 +2,26 @@ using namespace std; 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) { +Atom::Atom(int theIndex, SimState* theConfig) { + + myConfig = theConfig; + hasCoords = false; + c_n_hyd = 0; has_dipole = 0; is_VDW = 0; is_LJ = 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; @@ -38,252 +34,292 @@ void Atom::createArrays (int the_nElements) { Azz = Axx+8; } -void Atom::createArrays (int the_nElements) { - int i; - - nElements = the_nElements; +void Atom::setIndex(int theIndex) { + index = theIndex; +} - 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 ); } -} + else{ + sprintf( painCave.errMsg, + "Attempted to set Atom %d coordinates with an unallocated " + "SimState object.\n" ); + painCave.isFatal = 1; + simError(); + } -void Atom::destroyArrays(void) { - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; -} + hasCoords = true; -void Atom::setIndex(int theIndex) { - index = theIndex; - offset = index*3; - offsetX = offset; - offsetY = offset+1; - offsetZ = offset+2; - - Axx = index*9; - Axy = Axx+1; - Axz = Axx+2; - - 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) { +// void Atom::addAtoms(int nAdded, double* Apos, double* Avel, double* Afrc, +// double* Atrq, double* AAmat, double* Amu, +// double* Aul) { - int nNew = nElements+nAdded; +// 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; +// 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; - 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]; - } +// 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]; +// } - 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]; - } +// 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]; +// } - for (i = 0; i < 9*nElements; i++) { - new_Amat[i] = Amat[i]; - } +// for (i = 0; i < 9*nElements; i++) { +// new_Amat[i] = Amat[i]; +// } - for(i = 0; i < 9*nAdded; i++) { - j = i + 9*nElements; - new_Amat[j] = AAmat[i]; - } +// for(i = 0; i < 9*nAdded; i++) { +// j = i + 9*nElements; +// new_Amat[j] = AAmat[i]; +// } - for (i = 0; i < nElements; i++) { - new_mu[i] = mu[i]; - } +// for (i = 0; i < nElements; i++) { +// new_mu[i] = mu[i]; +// } - for(i = 0; i < nAdded; i++) { - j = i + nElements; - new_mu[j] = Amu[i]; - } +// for(i = 0; i < nAdded; i++) { +// j = i + nElements; +// new_mu[j] = Amu[i]; +// } - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; +// 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; +// pos = new_pos; +// vel = new_vel; +// frc = new_frc; +// trq = new_trq; +// ul = new_ul; +// Amat = new_Amat; +// mu = new_mu; - nElements = nNew; -} +// nElements = nNew; +// } -void Atom::deleteAtom(int theIndex) { - deleteRange(theIndex, theIndex); -} +// void Atom::deleteAtom(int theIndex) { +// deleteRange(theIndex, theIndex); +// } -void Atom::deleteRange(int startIndex, int stopIndex) { +// void Atom::deleteRange(int startIndex, int stopIndex) { - int nNew = nElements-(stopIndex-startIndex+1); +// 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; +// 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; - 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]; - } +// 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]; +// } - 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]; - } +// 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]; +// } - for (i = 0; i < 9*startIndex; i++) { - new_Amat[i] = Amat[i]; - } +// for (i = 0; i < 9*startIndex; i++) { +// new_Amat[i] = Amat[i]; +// } - for(i = 9*(stopIndex + 1); i < 9*nElements; i++) { - j = i - 9*startIndex + 1; - new_Amat[j] = Amat[i]; - } +// for(i = 9*(stopIndex + 1); i < 9*nElements; i++) { +// j = i - 9*startIndex + 1; +// new_Amat[j] = Amat[i]; +// } - for (i = 0; i < startIndex; i++) { - new_mu[i] = mu[i]; - } +// for (i = 0; i < startIndex; i++) { +// new_mu[i] = mu[i]; +// } - for(i = (stopIndex+1); i < nElements; i++) { - j = i - startIndex + 1; - new_mu[j] = mu[i]; - } +// for(i = (stopIndex+1); i < nElements; i++) { +// j = i - startIndex + 1; +// new_mu[j] = mu[i]; +// } - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; +// 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; +// pos = new_pos; +// vel = new_vel; +// frc = new_frc; +// trq = new_trq; +// ul = new_ul; +// Amat = new_Amat; +// mu = new_mu; - nElements = nNew; -} +// nElements = nNew; +// } void Atom::getPos( double theP[3] ){ - theP[0] = pos[offsetX]; - theP[1] = pos[offsetY]; - theP[2] = pos[offsetZ]; + if( hasCoords ){ + theP[0] = pos[offsetX]; + theP[1] = pos[offsetY]; + theP[2] = pos[offsetZ]; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to get Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } void Atom::setPos( double theP[3] ){ - pos[offsetX] = theP[0]; - pos[offsetY] = theP[1]; - pos[offsetZ] = theP[2]; + if( hasCoords ){ + pos[offsetX] = theP[0]; + pos[offsetY] = theP[1]; + pos[offsetZ] = theP[2]; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to set Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } void Atom::getVel( double theV[3] ){ - theV[0] = vel[offsetX]; - theV[1] = vel[offsetY]; - theV[2] = vel[offsetZ]; + 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(); + } + } void Atom::setVel( double theV[3] ){ - vel[offsetX] = theV[0]; - vel[offsetY] = theV[1]; - vel[offsetZ] = theV[2]; + 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::getFrc( double theF[3] ){ - theF[0] = frc[offsetX]; - theF[1] = frc[offsetY]; - theF[2] = frc[offsetZ]; + if( hasCoords ){ + theF[0] = frc[offsetX]; + theF[1] = frc[offsetY]; + theF[2] = frc[offsetZ]; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to get frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } void Atom::addFrc( double theF[3] ){ - frc[offsetX] += theF[0]; - frc[offsetY] += theF[1]; - frc[offsetZ] += theF[2]; + if( hasCoords ){ + frc[offsetX] += theF[0]; + frc[offsetY] += theF[1]; + frc[offsetZ] += theF[2]; + } + else{ + + sprintf( painCave.errMsg, + "Attempt to add frc for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } } + + +void GeneralAtom::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(); + } +}