------------------------------------------------------------ revno: 2877 committer: Anton Gladky <gladky.an...@gmail.com> 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."); } }
_______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : yade-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp