← Back to team overview

yade-dev team mailing list archive

[svn] r1879 - in trunk: pkg/common/DataClass scripts scripts/test

 

Author: eudoxos
Date: 2009-07-19 22:24:24 +0200 (Sun, 19 Jul 2009)
New Revision: 1879

Added:
   trunk/scripts/test/collider-sweep-simple.py
Modified:
   trunk/pkg/common/DataClass/VelocityBins.cpp
   trunk/pkg/common/DataClass/VelocityBins.hpp
   trunk/scripts/linkdeps.py
   trunk/scripts/test/gts-horse.py
Log:
1. Fix mathematical error with VelocityBins, verified by new script scripts/test/collider-sweep-simple.py to be correct
2. Add py/ directory to skipped dirs for linkdeps.py so that it works on current trunk


Modified: trunk/pkg/common/DataClass/VelocityBins.cpp
===================================================================
--- trunk/pkg/common/DataClass/VelocityBins.cpp	2009-07-18 21:07:49 UTC (rev 1878)
+++ trunk/pkg/common/DataClass/VelocityBins.cpp	2009-07-19 20:24:24 UTC (rev 1879)
@@ -11,11 +11,14 @@
 CREATE_LOGGER(VelocityBins);
 
 bool VelocityBins::incrementDists_shouldCollide(Real dt){
+	// const shared_ptr<Body>& b=Body::byId(0); LOG_INFO("Body #0: z off "<<b->physicalParameters->se3.position[2]-b->physicalParameters->refSe3.position[2]<<", velocity "<<static_pointer_cast<RigidBodyParameters>(b->physicalParameters)->velocity[2]);
 	int i=0;
 	FOREACH(Bin& bin, bins){
-		bin.currDistSq+=dt*dt*bin.currMaxVelSq; i++;
-		if(bin.currDistSq>pow(bin.maxDist,2)){
-			LOG_TRACE("Collide: bin"<<i<<": max dist "<<bin.maxDist<<", current "<<sqrt(bin.currDistSq));
+		// NOTE: this mimics the integration scheme of NewtonsDampedLaw
+		// if you use different integration method, it must be changed (or the infrastructure somehow modified to allow for that)
+		bin.currDist+=dt*sqrt(bin.currMaxVelSq); i++;
+		if(bin.currDist>bin.maxDist){
+			LOG_TRACE("Collide: bin"<<i<<": max dist "<<bin.maxDist<<", current "<<bin.currDist);
 			return true;
 		}
 	}
@@ -38,7 +41,8 @@
 		if(refMaxVelSq<0){ refMaxVelSq=currMaxVelSq; /* first time */}
 		else {
 			// there should be some maximum speed change parameter, so that bins do not change their limits (and therefore bodies, also!) too often, depending on 1 particle going crazy
-			refMaxVelSq=min(max(refMaxVelSq/pow(1+maxRefRelStep,2),currMaxVelSq),refMaxVelSq*pow(1+maxRefRelStep,2));
+			if(maxRefRelStep>0) refMaxVelSq=min(max(refMaxVelSq/pow(1+maxRefRelStep,2),currMaxVelSq),refMaxVelSq*pow(1+maxRefRelStep,2));
+			else refMaxVelSq=currMaxVelSq;
 			if(refMaxVelSq==0) refMaxVelSq=currMaxVelSq;
 		}
 		LOG_TRACE("new refMaxVel: "<<sqrt(refMaxVelSq));
@@ -52,7 +56,7 @@
 				(refMaxVelSq==0 ? 0: refSweepLength) :
 				refSweepLength/pow(binCoeff,(int)i)
 			);
-			bin.currDistSq=0; bin.currMaxVelSq=0; bin.nBodies=0;
+			bin.currDist=0; bin.currMaxVelSq=0; bin.nBodies=0;
 		}
 	long moveFaster=0, moveSlower=0;
 	FOREACH(const shared_ptr<Body>& b, *rootBody->bodies){

Modified: trunk/pkg/common/DataClass/VelocityBins.hpp
===================================================================
--- trunk/pkg/common/DataClass/VelocityBins.hpp	2009-07-18 21:07:49 UTC (rev 1878)
+++ trunk/pkg/common/DataClass/VelocityBins.hpp	2009-07-19 20:24:24 UTC (rev 1879)
@@ -17,10 +17,10 @@
 */
 class VelocityBins{
 	public:
-	VelocityBins(int _nBins, Real _refMaxVelSq, Real _binCoeff=10, Real _binOverlap=0.8): refMaxVelSq(_refMaxVelSq), binCoeff(_binCoeff), binOverlap(_binOverlap), maxRefRelStep(100), nBins(_nBins), histInterval(200), histLast(-1){}
+	VelocityBins(int _nBins, Real _refMaxVelSq, Real _binCoeff=10, Real _binOverlap=0.8): refMaxVelSq(_refMaxVelSq), binCoeff(_binCoeff), binOverlap(_binOverlap), maxRefRelStep(-1), nBins(_nBins), histInterval(200), histLast(-1){}
 	typedef signed char binNo_t;
 	struct Bin{
-		Bin(): binMinVelSq(-1), binMaxVelSq(-1), maxDist(0), currDistSq(0), currMaxVelSq(0), nBodies(0){
+		Bin(): binMinVelSq(-1), binMaxVelSq(-1), maxDist(0), currDist(0), currMaxVelSq(0), nBodies(0){
 			#ifdef YADE_OPENMP
 				threadMaxVelSq.resize(omp_get_max_threads());
 			#endif
@@ -30,7 +30,7 @@
 		// maximum distance that body in this bin can travel before it goes out of its swept bbox
 		Real maxDist;
 		// distance so far traveled by the fastest body in this bin (since last setBins)
-		Real currDistSq;
+		Real currDist;
 		// maximum velSq over all bodies in this bin
 		Real currMaxVelSq;
 		// number of bodies in this bin (for informational purposes only)
@@ -49,7 +49,7 @@
 	Real binCoeff;
 	// relative overlap beween bins; body will not be moved from faster bin until its velocity is min*binOverlap; must be <=1
 	Real binOverlap;
-	// maximum relative change of reference max velocity per invocation
+	// maximum relative change of reference max velocity per invocation (if <0, disabled; this is the default)
 	Real maxRefRelStep;
 	// number of bins; must be >=1 and <=100 (artificial upper limit)
 	size_t nBins;

Modified: trunk/scripts/linkdeps.py
===================================================================
--- trunk/scripts/linkdeps.py	2009-07-18 21:07:49 UTC (rev 1878)
+++ trunk/scripts/linkdeps.py	2009-07-19 20:24:24 UTC (rev 1879)
@@ -17,7 +17,7 @@
 def walkSourceFiles():
 	ret=[]
 	for root, dirs, files in os.walk(srcRoot,topdown=True):
-		for d in ('.svn','mgpost','SpherePadder','QGLViewer','triangulation','sqlite3x','miniWm3'):
+		for d in ('.svn','mgpost','SpherePadder','QGLViewer','triangulation','sqlite3x','miniWm3','py'):
 			try: dirs.remove(d)
 			except ValueError: pass
 		for f in files:

Added: trunk/scripts/test/collider-sweep-simple.py
===================================================================
--- trunk/scripts/test/collider-sweep-simple.py	2009-07-18 21:07:49 UTC (rev 1878)
+++ trunk/scripts/test/collider-sweep-simple.py	2009-07-19 20:24:24 UTC (rev 1879)
@@ -0,0 +1,26 @@
+O.bodies.append(utils.sphere([0,0,10],.5))
+#O.bodies.append(utils.sphere([0,0,0],.5,dynamic=False))
+
+O.engines=[
+	BexResetter(),
+	BoundingVolumeMetaEngine([InteractingSphere2AABB(),InteractingFacet2AABB(),MetaInteractingGeometry2AABB()]),
+	InsertionSortCollider(label='collider'),
+	InteractionDispatchers(
+		[ef2_Sphere_Sphere_Dem3DofGeom(),ef2_Facet_Sphere_Dem3DofGeom()],
+		[SimpleElasticRelationships()],
+		[Law2_Dem3Dof_Elastic_Elastic()],
+	),
+	GravityEngine(gravity=[0,0,-1e4]),
+	NewtonsDampedLaw(damping=.1)
+]
+collider['sweepLength'],collider['nBins'],collider['binCoeff']=.5,2,2
+O.dt=8e-2*utils.PWaveTimeStep()
+O.saveTmp()
+from yade import timing
+O.timingEnabled=True
+from yade import qt
+r=qt.Renderer()
+r['Body_bounding_volume']=True
+v=qt.View(); qt.Controller()
+v.ortho=True; #v.viewDir=O.bodies[0].phys.pos; v.lookAt=O.bodies[0].phys.pos;  v.upVector=(0,0,1); 
+O.run(2,True)

Modified: trunk/scripts/test/gts-horse.py
===================================================================
--- trunk/scripts/test/gts-horse.py	2009-07-18 21:07:49 UTC (rev 1878)
+++ trunk/scripts/test/gts-horse.py	2009-07-19 20:24:24 UTC (rev 1879)
@@ -42,9 +42,7 @@
 	GravityEngine(gravity=[0,0,-1e4]),
 	NewtonsDampedLaw(damping=.1)
 ]
-#collider['sweepLength']=.2*dim0/30.
-#collider['nBins']=10
-#collider['binCoeff']=2
+collider['sweepLength'],collider['nBins'],collider['binCoeff']=.1*dim0/30.5,10,2
 O.dt=1.5*utils.PWaveTimeStep()
 O.saveTmp()
 O.timingEnabled=True