Author: eudoxos Date: 2009-08-11 12:47:18 +0200 (Tue, 11 Aug 2009) New Revision: 1936
Modified: trunk/SConstruct trunk/gui/qt3/GLViewer.cpp trunk/gui/qt3/GLViewer.hpp trunk/gui/qt3/SimulationController.cpp trunk/pkg/dem/DataClass/SpherePack.cpp trunk/pkg/dem/DataClass/SpherePack.hpp trunk/py/_packSpheres.cpp Log: 1. Try to fix locking with boost-1.35, possibly fixes https://bugs.launchpad.net/yade/+bug/411572 (please confirm) 2. Add periodic repetition function to SpherePack Modified: trunk/SConstruct =================================================================== --- trunk/SConstruct 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/SConstruct 2009-08-11 10:47:18 UTC (rev 1936) @@ -295,8 +295,9 @@ # gentoo has threaded flavour named differently and it must have precedence over the non-threaded one def CheckLib_maybeMT(conf,lib,header,lang,func): return conf.CheckLibWithHeader(lib+'-mt',['limits.h',header],'c++',func,autoadd=1) or conf.CheckLibWithHeader(lib,['limits.h',header],lang,func,autoadd=1) + ok&=CheckLib_maybeMT(conf,'boost_system','boost/system/error_code.hpp','c++','boost::system::error_code();') + ok&=CheckLib_maybeMT(conf,'boost_thread','boost/thread/thread.hpp','c++','boost::thread::thread();') ok&=CheckLib_maybeMT(conf,'boost_date_time','boost/date_time/posix_time/posix_time.hpp','c++','boost::posix_time::time_duration::time_duration();') - ok&=CheckLib_maybeMT(conf,'boost_thread','boost/thread/thread.hpp','c++','boost::thread::thread();') ok&=CheckLib_maybeMT(conf,'boost_filesystem','boost/filesystem/path.hpp','c++','boost::filesystem::path();') ok&=CheckLib_maybeMT(conf,'boost_iostreams','boost/iostreams/device/file.hpp','c++','boost::iostreams::file_sink("");') ok&=CheckLib_maybeMT(conf,'boost_regex','boost/regex.hpp','c++','boost::regex("");') Modified: trunk/gui/qt3/GLViewer.cpp =================================================================== --- trunk/gui/qt3/GLViewer.cpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/gui/qt3/GLViewer.cpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -25,37 +25,29 @@ #endif CREATE_LOGGER(GLViewer); -GLLock::GLLock(GLViewer* _glv): -/* - * try: doneCurrent; glFlush; glSwapBuffers after paintGL - */ -#if BOOST_VERSION<103500 - boost::try_mutex::scoped_try_lock(Omega::instance().renderMutex,true), glv(_glv){ - glv->makeCurrent(); - } -#else - boost::try_mutex::scoped_try_lock(Omega::instance().renderMutex), glv(_glv){ - glv->makeCurrent(); - } -#endif -GLLock::~GLLock(){ glv->doneCurrent();} +GLLock::GLLock(GLViewer* _glv): boost::try_mutex::scoped_lock(Omega::instance().renderMutex), glv(_glv){ + glv->makeCurrent(); +} +GLLock::~GLLock(){ glv->doneCurrent(); } + void GLViewer::updateGL(void){/*GLLock lock(this); */QGLViewer::updateGL();} +/* additionally try: doneCurrent; glFlush; glSwapBuffers after paintGL */ void GLViewer::paintGL(void){ /* paintGL encapsulated preDraw, draw and postDraw within QGLViewer. If the mutex cannot be locked, * we just return without repainting */ + boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex); #if BOOST_VERSION<103500 - boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex); - if(lock.locked()){ + if(lock.locked()) #else - boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex,boost::defer_lock); - if(lock.owns_lock()){ + if(lock.owns_lock()) #endif + { this->makeCurrent(); QGLViewer::paintGL(); - } + } this->doneCurrent(); } @@ -344,15 +336,16 @@ * "central" (where most bodies is) part very small or even invisible. */ void GLViewer::centerMedianQuartile(){ - if(Omega::instance().getRootBody()->isPeriodic){ centerPeriodic(); return; } - long nBodies=Omega::instance().getRootBody()->bodies->size(); + MetaBody* rb=Omega::instance().getRootBody().get(); + if(rb->isPeriodic){ centerPeriodic(); return; } + long nBodies=rb->bodies->size(); if(nBodies<4) { LOG_INFO("Less than 4 bodies, median makes no sense; calling centerScene() instead."); return centerScene(); } std::vector<Real> coords[3]; for(int i=0;i<3;i++)coords[i].reserve(nBodies); - FOREACH(const shared_ptr<Body>& b, *Omega::instance().getRootBody()->bodies){ + FOREACH(const shared_ptr<Body>& b, *rb->bodies){ for(int i=0; i<3; i++) coords[i].push_back(b->physicalParameters->se3.position[i]); } Vector3r median,interQuart; @@ -394,7 +387,7 @@ LOG_DEBUG("Got scene box min="<<min<<" and max="<<max); Vector3r center = (max+min)*0.5; Vector3r halfSize = (max-min)*0.5; - float radius=std::max(halfSize[0],std::max(halfSize[1],halfSize[2])); if(radius==0) radius=1; + float radius=std::max(halfSize[0],std::max(halfSize[1],halfSize[2])); if(radius<=0) radius=1; LOG_DEBUG("Scene center="<<center<<", halfSize="<<halfSize<<", radius="<<radius); setSceneCenter(qglviewer::Vec(center[0],center[1],center[2])); setSceneRadius(radius*1.5); Modified: trunk/gui/qt3/GLViewer.hpp =================================================================== --- trunk/gui/qt3/GLViewer.hpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/gui/qt3/GLViewer.hpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -112,7 +112,13 @@ virtual void mousePressEvent(QMouseEvent *e); }; -class GLLock: public boost::try_mutex::scoped_try_lock{ +/*! Get unconditional lock on a GL view. + +Use if you need to manipulate GL context in some way. +The ctor doesn't return until the lock has been acquired +and the lock is released when the GLLock object is desctructed; +*/ +class GLLock: public boost::try_mutex::scoped_lock{ GLViewer* glv; public: GLLock(GLViewer* _glv); Modified: trunk/gui/qt3/SimulationController.cpp =================================================================== --- trunk/gui/qt3/SimulationController.cpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/gui/qt3/SimulationController.cpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -414,7 +414,7 @@ boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex); if(!lock.locked()){ #else - boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex,boost::defer_lock); + boost::try_mutex::scoped_try_lock lock(Omega::instance().renderMutex,boost::try_to_lock); if(!lock.owns_lock()){ #endif deactivateControlsWhenLoading(); Modified: trunk/pkg/dem/DataClass/SpherePack.cpp =================================================================== --- trunk/pkg/dem/DataClass/SpherePack.cpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/pkg/dem/DataClass/SpherePack.cpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -111,3 +111,28 @@ return pack.size(); } +void SpherePack::cellFillVolume(Vector3r vol){ + Vector3<int> count; + for(int i=0; i<3; i++) count[i]=(int)(ceil(vol[i]/cellSize[i])); + cellRepeat(count); +} + +void SpherePack::cellRepeat(Vector3<int> count){ + if(cellSize==Vector3r::ZERO){ throw std::runtime_error("cellRepeat cannot be used on non-periodic packing."); } + if(count[0]<=0 || count[1]<=0 || count[2]<=0){ throw std::invalid_argument("Repeat count components must be positive."); } + size_t origSize=pack.size(); + pack.reserve(origSize*count[0]*count[1]*count[2]); + for(int i=0; i<count[0]; i++){ + for(int j=0; j<count[1]; j++){ + for(int k=0; k<count[2]; j++){ + if((i==0) && (j==0) && (k==0)) continue; // original cell + Vector3r off(cellSize[0]*i,cellSize[1]*j,cellSize[2]*k); + for(size_t l=0; l<origSize; l++){ + const Sph& s=pack[l]; pack.push_back(Sph(s.c+off,s.r)); + } + } + } + } + cellSize=Vector3r(cellSize[0]*count[0],cellSize[1]*count[1],cellSize[2]*count[2]); +} + Modified: trunk/pkg/dem/DataClass/SpherePack.hpp =================================================================== --- trunk/pkg/dem/DataClass/SpherePack.hpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/pkg/dem/DataClass/SpherePack.hpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -58,6 +58,10 @@ // random generation long makeCloud(Vector3r min, Vector3r max, Real rMean, Real rFuzz, size_t num, bool periodic=false); + // periodic repetition + void cellRepeat(Vector3<int> count); + void cellFillVolume(Vector3r volume); + // spatial characteristics Vector3r dim() const {Vector3r mn,mx; aabb(mn,mx); return mx-mn;} #ifdef YADE_PYTHON Modified: trunk/py/_packSpheres.cpp =================================================================== --- trunk/py/_packSpheres.cpp 2009-08-10 17:59:33 UTC (rev 1935) +++ trunk/py/_packSpheres.cpp 2009-08-11 10:47:18 UTC (rev 1936) @@ -16,6 +16,8 @@ .def("dim",&SpherePack::dim,"Return dimensions of the packing in terms of aabb(), as a 3-tuple.") .def("center",&SpherePack::midPt,"Return coordinates of the bounding box center.") .def_readonly("cellSize",&SpherePack::cellSize,"Size of periodic cell; is Vector3(0,0,0) if not periodic.") + .def("cellFillVolume",&SpherePack::cellFillVolume,"Repeat the packing (if periodic) so that the results has dim() >= given size. The packing retains periodicity, but changes cellSize. Raises exception for non-periodic packing.") + .def("cellRepeat",&SpherePack::cellRepeat,"Repeat the packing given number of times in each dimension. Periodicity is retained, cellSize changes. Raises exception for non-periodic packing.") .def("relDensity",&SpherePack::relDensity,"Relative packing density, measured as sum of spheres' volumes / aabb volume.\n(Sphere overlaps are ignored.)") .def("translate",&SpherePack::translate,"Translate all spheres by given vector.") .def("rotate",&SpherePack::rotate,"Rotate all spheres around packing center (in terms of aabb()), given axis and angle of the rotation.") _______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : [email protected] Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp _______________________________________________ yade-dev mailing list [email protected] https://lists.berlios.de/mailman/listinfo/yade-dev
