void init(dynamo::Simulation& Sim, const double density) { RNG.seed(std::random_device()()); Sim.ranGenerator.seed(std::random_device()()); const double elasticity = 1.0; const size_t cells = 7; const double wallkT = 1.0; std::unique_ptr<dynamo::UCell> packptr(new dynamo::CUFCC(std::array<long, 3>{{cells, cells, cells}}, dynamo::Vector(1,1,1), new dynamo::UParticle())); packptr->initialise(); std::vector<dynamo::Vector> latticeSites(packptr->placeObjects(dynamo::Vector(0,0,0))); const size_t N = latticeSites.size(); const double boxL = std::cbrt(N / density); Sim.primaryCellSize = dynamo::Vector(boxL, boxL, boxL); dynamo::shared_ptr<dynamo::ParticleProperty> D(new dynamo::ParticleProperty(N, dynamo::Property::Units::Length(), "D", 1.0)); dynamo::shared_ptr<dynamo::ParticleProperty> M(new dynamo::ParticleProperty(N, dynamo::Property::Units::Mass(), "M", 1.0)); Sim._properties.push(D); Sim._properties.push(M); Sim.dynamics = dynamo::shared_ptr<dynamo::Dynamics>(new dynamo::DynGravity(&Sim, dynamo::Vector(0, -1, 0))); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCNone(&Sim)); Sim.ptrScheduler = dynamo::shared_ptr<dynamo::SNeighbourList>(new dynamo::SNeighbourList(&Sim, new dynamo::FELBoundedPQ<dynamo::PELMinMax<3> >())); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::IHardSphere(&Sim, "D", elasticity, new dynamo::IDPairRangeAll(), "Bulk"))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpPoint(&Sim, new dynamo::IDRangeAll(&Sim), "M", "Bulk", 0))); Sim.locals.push_back(dynamo::shared_ptr<dynamo::Local>(new dynamo::LWall(&Sim, elasticity, "D", dynamo::Vector(1, 0, 0), dynamo::Vector(-0.5 * Sim.primaryCellSize[0] - 1, 0, 0), "XwallLow", new dynamo::IDRangeAll(&Sim)))); Sim.locals.push_back(dynamo::shared_ptr<dynamo::Local>(new dynamo::LWall(&Sim, elasticity, "D", dynamo::Vector(-1, 0, 0), dynamo::Vector(0.5 * Sim.primaryCellSize[0] + 1, 0, 0), "XwallHigh", new dynamo::IDRangeAll(&Sim)))); Sim.locals.push_back(dynamo::shared_ptr<dynamo::Local>(new dynamo::LWall(&Sim, elasticity, "D", dynamo::Vector(0, 0, 1), dynamo::Vector(0, 0, -0.5 * Sim.primaryCellSize[2] - 1), "ZwallLow", new dynamo::IDRangeAll(&Sim)))); Sim.locals.push_back(dynamo::shared_ptr<dynamo::Local>(new dynamo::LWall(&Sim, elasticity, "D", dynamo::Vector(0, 0, -1), dynamo::Vector(0, 0, 0.5 * Sim.primaryCellSize[2] + 1), "ZwallHigh", new dynamo::IDRangeAll(&Sim)))); Sim.locals.push_back(dynamo::shared_ptr<dynamo::Local>(new dynamo::LWall(&Sim, elasticity, "D", dynamo::Vector(0, 1, 0), dynamo::Vector(0, - 0.5 * Sim.primaryCellSize[1] - 1, 0), "GroundPlate", new dynamo::IDRangeAll(&Sim), wallkT))); for (size_t i(0); i < latticeSites.size(); ++i) { Sim.particles.push_back(dynamo::Particle(boxL * latticeSites[i], getRandVelVec(), Sim.particles.size())); D->getProperty(i) = (i < 100) ? 1 : 0.5; M->getProperty(i) = (i < 100) ? 1 : 0.5 * 0.5 * 0.5; } Sim.ensemble = dynamo::Ensemble::loadEnsemble(Sim); dynamo::InputPlugin(&Sim, "Rescaler").zeroMomentum(); dynamo::InputPlugin(&Sim, "Rescaler").rescaleVels(1.0); BOOST_CHECK_EQUAL(Sim.N(), 1372); BOOST_CHECK_CLOSE(Sim.getNumberDensity() * Sim.units.unitVolume(), density, 0.000000001); }
void init(dynamo::Simulation& Sim, const double density) { RNG.seed(std::random_device()()); Sim.ranGenerator.seed(std::random_device()()); Sim.dynamics = dynamo::shared_ptr<dynamo::Dynamics>(new dynamo::DynNewtonian(&Sim)); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCPeriodic(&Sim)); Sim.ptrScheduler = dynamo::shared_ptr<dynamo::SNeighbourList>(new dynamo::SNeighbourList(&Sim, new DefaultSorter())); std::unique_ptr<dynamo::UCell> packptr(new dynamo::CUSC(std::array<long, 3>{{128, 128, 1}}, dynamo::Vector{1,1,1}, new dynamo::UParticle())); packptr->initialise(); std::vector<dynamo::Vector> latticeSites(packptr->placeObjects(dynamo::Vector{0,0,0})); //As we're in 2D we need to take the square root double particleDiam = std::sqrt(density / latticeSites.size()); Sim.units.setUnitLength(particleDiam); Sim.units.setUnitTime(particleDiam); Sim.primaryCellSize = dynamo::Vector{1, 1, 4 * particleDiam}; typedef std::pair<double,double> Step; std::vector<Step> steps; steps.push_back(Step{1.0,0.1}); steps.push_back(Step{0.9,0.2}); steps.push_back(Step{0.8,0.3}); steps.push_back(Step{0.7,0.4}); steps.push_back(Step{0.6,0.5}); steps.push_back(Step{0.5,0.6}); steps.push_back(Step{0.4,0.7}); steps.push_back(Step{0.3,0.8}); steps.push_back(Step{0.2,0.9}); steps.push_back(Step{0.1,1.0}); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::IStepped(&Sim, dynamo::shared_ptr<dynamo::Potential>(new dynamo::PotentialStepped(steps, false)), new dynamo::IDPairRangeAll(), "Bulk", particleDiam, 1.0))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpPoint(&Sim, new dynamo::IDRangeAll(&Sim), 1.0, "Bulk", 0))); unsigned long nParticles = 0; Sim.particles.reserve(latticeSites.size()); for (const dynamo::Vector & position : latticeSites) Sim.particles.push_back(dynamo::Particle(position, getRandVelVec() * Sim.units.unitVelocity(), nParticles++)); for (auto& particle : Sim.particles) particle.getVelocity()[2] = 0; dynamo::InputPlugin(&Sim, "Rescaler").zeroMomentum(); dynamo::InputPlugin(&Sim, "Rescaler").rescaleVels(2.0 / 3.0); Sim.ensemble = dynamo::Ensemble::loadEnsemble(Sim); BOOST_CHECK_EQUAL(Sim.N(), 128 * 128); }
void init(dynamo::Simulation& Sim, const double density) { RNG.seed(std::random_device()()); Sim.ranGenerator.seed(std::random_device()()); double massFrac = 0.001, sizeRatio = 0.5; size_t Na=100; Sim.dynamics = dynamo::shared_ptr<dynamo::Dynamics>(new dynamo::DynNewtonian(&Sim)); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCPeriodic(&Sim)); Sim.ptrScheduler = dynamo::shared_ptr<dynamo::SNeighbourList>(new dynamo::SNeighbourList(&Sim, new DefaultSorter())); std::unique_ptr<dynamo::UCell> packptr(new dynamo::CUFCC(std::array<long, 3>{{10, 10, 10}}, dynamo::Vector(1, 1, 1), new dynamo::UParticle())); packptr->initialise(); std::vector<dynamo::Vector> latticeSites(packptr->placeObjects(dynamo::Vector(0,0,0))); Sim.primaryCellSize = dynamo::Vector(1,1,1); double simVol = 1.0; for (size_t iDim = 0; iDim < NDIM; ++iDim) simVol *= Sim.primaryCellSize[iDim]; double particleDiam = std::cbrt(simVol * density / latticeSites.size()); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::IHardSphere(&Sim, particleDiam, new dynamo::IDPairRangeSingle(new dynamo::IDRangeRange(0, Na - 1)), "AAInt"))); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::IHardSphere(&Sim, ((1.0 + sizeRatio) / 2.0) * particleDiam, new dynamo::IDPairRangePair(new dynamo::IDRangeRange(0, Na - 1), new dynamo::IDRangeRange(Na, latticeSites.size() - 1)), "ABInt"))); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::IHardSphere(&Sim, sizeRatio * particleDiam, new dynamo::IDPairRangeAll(), "BBInt"))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpPoint(&Sim, new dynamo::IDRangeRange(0, Na - 1), 1.0, "A", 0))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpPoint(&Sim, new dynamo::IDRangeRange(Na, latticeSites.size() - 1), massFrac, "B", 0))); Sim.units.setUnitLength(particleDiam); unsigned long nParticles = 0; Sim.particles.reserve(latticeSites.size()); for (const dynamo::Vector & position : latticeSites) Sim.particles.push_back(dynamo::Particle(position, getRandVelVec() * Sim.units.unitVelocity(), nParticles++)); Sim.ensemble = dynamo::Ensemble::loadEnsemble(Sim); dynamo::InputPlugin(&Sim, "Rescaler").zeroMomentum(); dynamo::InputPlugin(&Sim, "Rescaler").rescaleVels(1.0); BOOST_CHECK_EQUAL(Sim.N(), 4000); //BOOST_CHECK_CLOSE(Sim.getNumberDensity() * Sim.units.unitVolume(), density, 0.000000001); //BOOST_CHECK_CLOSE(Sim.getPackingFraction(), Sim.getNumberDensity() * Sim.units.unitVolume() * M_PI / 6.0, 0.000000001); }
void init(dynamo::Simulation& Sim, double density = 0.5) { RNG.seed(std::random_device()()); Sim.ranGenerator.seed(std::random_device()()); const double elasticity = 1.0; const double lambda = 1.5; const double welldepth = 1.0; Sim.dynamics = dynamo::shared_ptr<dynamo::Dynamics>(new dynamo::DynNewtonian(&Sim)); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCPeriodic(&Sim)); Sim.ptrScheduler = dynamo::shared_ptr<dynamo::SNeighbourList>(new dynamo::SNeighbourList(&Sim, new DefaultSorter())); std::unique_ptr<dynamo::UCell> packptr(new dynamo::CUFCC(std::array<long, 3>{{7,7,7}}, dynamo::Vector(1,1,1), new dynamo::UParticle())); packptr->initialise(); std::vector<dynamo::Vector> latticeSites(packptr->placeObjects(dynamo::Vector(0,0,0))); Sim.primaryCellSize = dynamo::Vector(1,1,1); double simVol = 1.0; for (size_t iDim = 0; iDim < NDIM; ++iDim) simVol *= Sim.primaryCellSize[iDim]; double particleDiam = std::cbrt(simVol * density / latticeSites.size()); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::ISquareWell(&Sim, particleDiam, lambda, welldepth, elasticity, new dynamo::IDPairRangeAll(), "Bulk"))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpPoint(&Sim, new dynamo::IDRangeAll(&Sim), 1.0, "Bulk", 0))); Sim.units.setUnitLength(particleDiam); Sim.units.setUnitTime(particleDiam); unsigned long nParticles = 0; Sim.particles.reserve(latticeSites.size()); for (const dynamo::Vector & position : latticeSites) Sim.particles.push_back(dynamo::Particle(position, getRandVelVec() * Sim.units.unitVelocity(), nParticles++)); Sim.ensemble = dynamo::Ensemble::loadEnsemble(Sim); dynamo::InputPlugin(&Sim, "Rescaler").zeroMomentum(); dynamo::InputPlugin(&Sim, "Rescaler").rescaleVels(1.0); BOOST_CHECK_EQUAL(Sim.N(), 1372); BOOST_CHECK_CLOSE(Sim.getNumberDensity() * Sim.units.unitVolume(), density, 0.000000001); BOOST_CHECK_CLOSE(Sim.getPackingFraction(), Sim.getNumberDensity() * Sim.units.unitVolume() * M_PI / 6.0, 0.000000001); }
void init(dynamo::Simulation& Sim, const double density) { RNG.seed(std::random_device()()); Sim.ranGenerator.seed(std::random_device()()); const double elasticity = 1.0; const size_t N = 1000; Sim.dynamics = dynamo::shared_ptr<dynamo::Dynamics>(new dynamo::DynNewtonian(&Sim)); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCPeriodic(&Sim)); Sim.ptrScheduler = dynamo::shared_ptr<dynamo::SNeighbourList>(new dynamo::SNeighbourList(&Sim, new DefaultSorter())); dynamo::CURandom packroutine(N, dynamo::Vector{1,1,1}, new dynamo::UParticle()); packroutine.initialise(); std::vector<dynamo::Vector> latticeSites(packroutine.placeObjects(dynamo::Vector{0,0,0})); Sim.BCs = dynamo::shared_ptr<dynamo::BoundaryCondition>(new dynamo::BCPeriodic(&Sim)); double particleDiam = std::cbrt(density / N); Sim.interactions.push_back(dynamo::shared_ptr<dynamo::Interaction>(new dynamo::ILines(&Sim, particleDiam, elasticity, new dynamo::IDPairRangeAll(), "Bulk"))); Sim.addSpecies(dynamo::shared_ptr<dynamo::Species>(new dynamo::SpSphericalTop(&Sim, new dynamo::IDRangeAll(&Sim), 1.0, "Bulk", 0, particleDiam * particleDiam / 12.0))); Sim.units.setUnitLength(particleDiam); unsigned long nParticles = 0; Sim.particles.reserve(latticeSites.size()); for (const dynamo::Vector & position : latticeSites) Sim.particles.push_back(dynamo::Particle(position, getRandVelVec() * Sim.units.unitVelocity(), nParticles++)); Sim.dynamics->initOrientations(); Sim.ensemble = dynamo::Ensemble::loadEnsemble(Sim); dynamo::InputPlugin(&Sim, "Rescaler").zeroMomentum(); dynamo::InputPlugin(&Sim, "Rescaler").rescaleVels(1.0); BOOST_CHECK_EQUAL(Sim.N(), N); BOOST_CHECK_CLOSE(Sim.getNumberDensity() * Sim.units.unitVolume(), density, 0.000000001); BOOST_CHECK_CLOSE(Sim.getPackingFraction(), 0, 0.000000001); }