/* * Generate random molecules */ bool Generator::generate(int nMolecule, const DArray<double>& diameters, CellList& cellList) { // Preconditions UTIL_CHECK(nMolecule <= species().capacity()); UTIL_CHECK(cellList.atomCapacity() == simulation().atomCapacity()); // Attempt to place all molecules in Species int speciesId = species().id(); int maxAttempt = 200; int iAttempt; bool success; bool isMutable; Species* speciesPtr; for (int iMol = 0; iMol < nMolecule; ++iMol) { Molecule &newMolecule= simulation().getMolecule(speciesId); system().addMolecule(newMolecule); speciesPtr = &system().simulation().species(speciesId); isMutable = speciesPtr->isMutable(); if (isMutable) { speciesPtr->mutator().setMoleculeState(newMolecule, 0); } success = false; iAttempt = 0; while (!success && iAttempt < maxAttempt) { success = attemptPlaceMolecule(newMolecule, diameters, cellList); ++iAttempt; } if (!success) { system().removeMolecule(newMolecule); Log::file() << "Failed to insert Linear molecule " << iMol << "\n"; return false; } } return true; }
/* * Write the configuration file. */ void McMdConfigIo::write(std::ostream &out) { using std::endl; // Write Boundary dimensions out << "BOUNDARY" << endl << endl; out << boundary() << endl; // Write atomic positions System::ConstMoleculeIterator molIter; Molecule::ConstAtomIterator atomIter; Species* speciesPtr; int iSpecies, iMolecule; out << endl << "MOLECULES" << endl; for (iSpecies = 0; iSpecies < simulation().nSpecies(); ++iSpecies) { out << endl; out << "species " << iSpecies << endl; out << "nMolecule " << system().nMolecule(iSpecies) << endl; speciesPtr = &simulation().species(iSpecies); iMolecule = 0; system().begin(iSpecies, molIter); for ( ; molIter.notEnd(); ++molIter) { out << endl; out << "molecule " << iMolecule << endl; if (speciesPtr->isMutable()) { speciesPtr->mutator().writeMoleculeState(out, *molIter); } for (molIter->begin(atomIter); atomIter.notEnd(); ++atomIter) { //out << atomIter->position() << endl; writeAtom(out, *atomIter); } ++iMolecule; } } #ifdef INTER_TETHER { // Scope for local variables // Write Tethers Tether* tetherPtr; Atom* atomPtr; Molecule* molPtr; int iTether, nTether, iAtom; out << std::endl; out << "TETHERS" << endl << endl; nTether = system().tetherMaster().nTether(); out << Label("nTether") << nTether << std::endl; for (iTether = 0; iTether < nTether; ++iTether) { tetherPtr = &(system().tetherMaster().tether(iTether)); atomPtr = &tetherPtr->atom(); molPtr = &atomPtr->molecule(); iAtom = atomPtr->indexInMolecule(); iMolecule = system().moleculeId(*molPtr); iSpecies = molPtr->species().id(); out << Int(iSpecies,5) << Int(iMolecule,9) << Int(iAtom,6) << tetherPtr->anchor() << std::endl; } } #endif #ifdef MCMD_LINK { // Scope for local variables // Write Links Link* linkPtr; Atom* atomPtr; Molecule* molPtr; int iLink, nLink, iAtom; out << std::endl; out << "LINKS" << endl << endl; nLink = system().linkMaster().nLink(); out << Label("nLink") << nLink << std::endl; for (iLink = 0; iLink < nLink; ++iLink) { linkPtr = &(system().linkMaster().link(iLink)); // Output species, molecule, atom ids for atom 0 atomPtr = &(linkPtr->atom0()); molPtr = &atomPtr->molecule(); iAtom = atomPtr->indexInMolecule(); iMolecule = system().moleculeId(*molPtr); iSpecies = molPtr->species().id(); out << Int(iSpecies,8) << Int(iMolecule,8) << Int(iAtom,8); out << " "; // Output species, molecule, atom ids for atom 1 atomPtr = &(linkPtr->atom1()); molPtr = &atomPtr->molecule(); iAtom = atomPtr->indexInMolecule(); iMolecule = system().moleculeId(*molPtr); iSpecies = molPtr->species().id(); out << Int(iSpecies,8) << Int(iMolecule,8) << Int(iAtom,8); out << " "; out << Int(linkPtr->typeId(),8) << std::endl; } } #endif }