/* * Initialize all Angle objects for Molecules of one Species. * * This functions assigns pointers to Atoms and angle types ids within a * contiguous block of Angle objects, and sets a pointer in each Molecule * to the first Angle in the associated block. */ void Simulation::initializeSpeciesAngles(int iSpecies) { if (nAngleType_ <= 0) { UTIL_THROW("nAngleType must be positive"); } Species* speciesPtr = 0; Molecule *moleculePtr = 0; Angle *anglePtr = 0; Atom *firstAtomPtr, *atom0Ptr, *atom1Ptr, *atom2Ptr; int iMol, iAngle, atom0Id, atom1Id, atom2Id, type; int capacity, nAngle; speciesPtr = &species(iSpecies); capacity = speciesPtr->capacity(); nAngle = speciesPtr->nAngle(); // Initialize pointers before loop moleculePtr = &molecules_[firstMoleculeIds_[iSpecies]]; anglePtr = &angles_[firstAngleIds_[iSpecies]]; // Loop over molecules in Species for (iMol = 0; iMol < capacity; ++iMol) { firstAtomPtr = &(moleculePtr->atom(0)); moleculePtr->setFirstAngle(*anglePtr); moleculePtr->setNAngle(nAngle); if (nAngle > 0) { // Create angles for a molecule for (iAngle = 0; iAngle < nAngle; ++iAngle) { // Get pointers to atoms spanning the angle and angle type atom0Id = speciesPtr->speciesAngle(iAngle).atomId(0); atom1Id = speciesPtr->speciesAngle(iAngle).atomId(1); atom2Id = speciesPtr->speciesAngle(iAngle).atomId(2); type = speciesPtr->speciesAngle(iAngle).typeId(); atom0Ptr = firstAtomPtr + atom0Id; atom1Ptr = firstAtomPtr + atom1Id; atom2Ptr = firstAtomPtr + atom2Id; // Set fields of the Angle object anglePtr->setAtom(0, *atom0Ptr); anglePtr->setAtom(1, *atom1Ptr); anglePtr->setAtom(2, *atom2Ptr); anglePtr->setTypeId(type); ++anglePtr; } } ++moleculePtr; } }