← Back to team overview

yade-dev team mailing list archive

[Branch ~yade-dev/yade/trunk] Rev 2877: Skip empty ids in KinematicEngine

 

------------------------------------------------------------
revno: 2877
committer: Anton Gladky <gladky.anton@xxxxxxxxx>
branch nick: yade
timestamp: Thu 2011-06-16 10:54:59 +0200
message:
  Skip empty ids in KinematicEngine
modified:
  pkg/common/KinematicEngines.cpp


--
lp:yade
https://code.launchpad.net/~yade-dev/yade/trunk

Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-dev/yade/trunk/+edit-subscription
=== modified file 'pkg/common/KinematicEngines.cpp'
--- pkg/common/KinematicEngines.cpp	2011-01-14 09:31:17 +0000
+++ pkg/common/KinematicEngines.cpp	2011-06-16 08:54:59 +0000
@@ -9,24 +9,32 @@
 CREATE_LOGGER(KinematicEngine);
 
 void KinematicEngine::action(){
-	FOREACH(Body::id_t id,ids){
-		assert(id<(Body::id_t)scene->bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(b) b->state->vel=b->state->angVel=Vector3r::Zero();
+	if (ids.size()>0) {
+		FOREACH(Body::id_t id,ids){
+			assert(id<(Body::id_t)scene->bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(b) b->state->vel=b->state->angVel=Vector3r::Zero();
+		}
+		apply(ids);
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
-	apply(ids);
 }
 
 void CombinedKinematicEngine::action(){
-	// reset first
-	FOREACH(Body::id_t id,ids){
-		assert(id<(Body::id_t)scene->bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(b) b->state->vel=b->state->angVel=Vector3r::Zero();
-	}
-	// apply one engine after another
-	FOREACH(const shared_ptr<KinematicEngine>& e, comb){
-		e->scene=scene; e->apply(ids);
+	if (ids.size()>0) {
+		// reset first
+		FOREACH(Body::id_t id,ids){
+			assert(id<(Body::id_t)scene->bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(b) b->state->vel=b->state->angVel=Vector3r::Zero();
+		}
+		// apply one engine after another
+		FOREACH(const shared_ptr<KinematicEngine>& e, comb){
+			e->scene=scene; e->apply(ids);
+		}
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
 }
 
@@ -38,29 +46,37 @@
 
 
 void TranslationEngine::apply(const vector<Body::id_t>& ids){
-	#ifdef YADE_OPENMP
-	const long size=ids.size();
-	#pragma omp parallel for schedule(static)
-	for(long i=0; i<size; i++){
-		const Body::id_t& id=ids[i];
-	#else
-	FOREACH(Body::id_t id,ids){
-	#endif
-		assert(id<(Body::id_t)scene->bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(!b) continue;
-		b->state->vel+=velocity*translationAxis;
+	if (ids.size()>0) {
+		#ifdef YADE_OPENMP
+		const long size=ids.size();
+		#pragma omp parallel for schedule(static)
+		for(long i=0; i<size; i++){
+			const Body::id_t& id=ids[i];
+		#else
+		FOREACH(Body::id_t id,ids){
+		#endif
+			assert(id<(Body::id_t)scene->bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(!b) continue;
+			b->state->vel+=velocity*translationAxis;
+		}
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
 }
 
 void HarmonicMotionEngine::apply(const vector<Body::id_t>& ids){
-	Vector3r w = f*2.0*Mathr::PI; 										 								//Angular frequency
-	Vector3r velocity = ((((w*scene->time + fi).cwise().sin())*(-1.0)).cwise()*A).cwise()*w;	//Linear velocity at current time
-	FOREACH(Body::id_t id,ids){
-		assert(id<(Body::id_t)scene->bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(!b) continue;
-		b->state->vel+=velocity;
+	if (ids.size()>0) {
+		Vector3r w = f*2.0*Mathr::PI; 										 								//Angular frequency
+		Vector3r velocity = ((((w*scene->time + fi).cwise().sin())*(-1.0)).cwise()*A).cwise()*w;	//Linear velocity at current time
+		FOREACH(Body::id_t id,ids){
+			assert(id<(Body::id_t)scene->bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(!b) continue;
+			b->state->vel+=velocity;
+		}
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
 }
 
@@ -73,39 +89,47 @@
 }
 
 void HelixEngine::apply(const vector<Body::id_t>& ids){
-	const Real& dt=scene->dt;
-	angleTurned+=angularVelocity*dt;
-	shared_ptr<BodyContainer> bodies = scene->bodies;
-	FOREACH(Body::id_t id,ids){
-		assert(id<(Body::id_t)bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(!b) continue;
-		b->state->vel+=linearVelocity*rotationAxis;
+	if (ids.size()>0) {
+		const Real& dt=scene->dt;
+		angleTurned+=angularVelocity*dt;
+		shared_ptr<BodyContainer> bodies = scene->bodies;
+		FOREACH(Body::id_t id,ids){
+			assert(id<(Body::id_t)bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(!b) continue;
+			b->state->vel+=linearVelocity*rotationAxis;
+		}
+		rotateAroundZero=true;
+		RotationEngine::apply(ids);
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
-	rotateAroundZero=true;
-	RotationEngine::apply(ids);
 }
 
 
 void RotationEngine::apply(const vector<Body::id_t>& ids){
-	#ifdef YADE_OPENMP
-	const long size=ids.size();
-	#pragma omp parallel for schedule(static)
-	for(long i=0; i<size; i++){
-		const Body::id_t& id=ids[i];
-	#else
-	FOREACH(Body::id_t id,ids){
-	#endif
-		assert(id<(Body::id_t)scene->bodies->size());
-		Body* b=Body::byId(id,scene).get();
-		if(!b) continue;
-		b->state->angVel+=rotationAxis*angularVelocity;
-		if(rotateAroundZero){
-			const Vector3r l=b->state->pos-zeroPoint;
-			Quaternionr q(AngleAxisr(angularVelocity*scene->dt,rotationAxis));
-			Vector3r newPos=q*l+zeroPoint;
-			b->state->vel+=Vector3r(newPos-b->state->pos)/scene->dt;
+	if (ids.size()>0) {
+		#ifdef YADE_OPENMP
+		const long size=ids.size();
+		#pragma omp parallel for schedule(static)
+		for(long i=0; i<size; i++){
+			const Body::id_t& id=ids[i];
+		#else
+		FOREACH(Body::id_t id,ids){
+		#endif
+			assert(id<(Body::id_t)scene->bodies->size());
+			Body* b=Body::byId(id,scene).get();
+			if(!b) continue;
+			b->state->angVel+=rotationAxis*angularVelocity;
+			if(rotateAroundZero){
+				const Vector3r l=b->state->pos-zeroPoint;
+				Quaternionr q(AngleAxisr(angularVelocity*scene->dt,rotationAxis));
+				Vector3r newPos=q*l+zeroPoint;
+				b->state->vel+=Vector3r(newPos-b->state->pos)/scene->dt;
+			}
 		}
+	} else {
+		LOG_WARN("The list of ids is empty! Can't move any body.");
 	}
 }