--- trunk/OOPSE/libmdtools/Atom.cpp 2003/03/26 21:54:49 413 +++ trunk/OOPSE/libmdtools/Atom.cpp 2003/08/20 19:42:31 707 @@ -1,27 +1,27 @@ +#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) { + + myConfig = theConfig; + hasCoords = false; -Atom::Atom(int theIndex) { 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; @@ -34,209 +34,293 @@ 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() ){ - 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*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]; + myConfig->getAtomPointers( index, + &pos, + &vel, + &frc, + &trq, + &Amat, + &mu, + &ul ); } - - for (i = 0; i < 9*nElements; i++) { - new_Amat[i] = Amat[i]; + else{ + sprintf( painCave.errMsg, + "Attempted to set Atom %d coordinates with an unallocated " + "SimState object.\n" ); + painCave.isFatal = 1; + simError(); } - for(i = 0; i < 9*nAdded; i++) { - j = i + 9*nElements; - new_Amat[j] = AAmat[i]; - } + hasCoords = true; - 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]; - } - - 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::addAtoms(int nAdded, double* Apos, double* Avel, double* Afrc, +// double* Atrq, double* AAmat, double* Amu, +// double* Aul) { -void Atom::deleteRange(int startIndex, int stopIndex) { - - int nNew = nElements-(stopIndex-startIndex+1); +// 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*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*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 = 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 < 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*startIndex; i++) { - new_Amat[i] = Amat[i]; - } +// for (i = 0; i < 9*nElements; 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 = 0; i < 9*nAdded; i++) { +// j = i + 9*nElements; +// new_Amat[j] = AAmat[i]; +// } - for (i = 0; i < startIndex; 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]; +// } + +// 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::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; + +// 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 = 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 = 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]; +// } + +// 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::getPos( double theP[3] ){ + + if( hasCoords ){ + theP[0] = pos[offsetX]; + theP[1] = pos[offsetY]; + theP[2] = pos[offsetZ]; } + else{ - for(i = (stopIndex+1); i < nElements; i++) { - j = i - startIndex + 1; - new_mu[j] = mu[i]; + sprintf( painCave.errMsg, + "Attempt to get Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); } +} - delete[] pos; - delete[] vel; - delete[] frc; - delete[] trq; - delete[] Amat; - delete[] mu; +void Atom::setPos( double theP[3] ){ + + if( hasCoords ){ + pos[offsetX] = theP[0]; + pos[offsetY] = theP[1]; + pos[offsetZ] = theP[2]; + } + else{ - pos = new_pos; - vel = new_vel; - frc = new_frc; - trq = new_trq; - ul = new_ul; - Amat = new_Amat; - mu = new_mu; + sprintf( painCave.errMsg, + "Attempt to set Pos for atom %d before coords set.\n", + index ); + painCave.isFatal = 1; + simError(); + } +} - nElements = nNew; +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(); + } + } + +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::getFrc( double theF[3] ){ + + 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] ){ + + 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(); + } +}