Author: eudoxos
Date: 2009-02-17 21:47:59 +0100 (Tue, 17 Feb 2009)
New Revision: 1669

Modified:
   trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.cpp
   trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.hpp
   trunk/gui/py/yadeControl.cpp
   trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp
Log:
1. Add possibility to change container types from python (for benchmarks) -- 
code not yet tested!
2. Possible optimization in PhysicalActionVectorVector, now disabled.


Modified: 
trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.cpp
===================================================================
--- trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.cpp   
2009-02-17 09:10:50 UTC (rev 1668)
+++ trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.cpp   
2009-02-17 20:47:59 UTC (rev 1669)
@@ -114,16 +114,23 @@
 // doesn't not delete all, just resets data
 void PhysicalActionVectorVector::reset()
 {
-       vector< vector< shared_ptr<PhysicalAction> > >::iterator vvi    = 
physicalActions.begin();
-       vector< vector< shared_ptr<PhysicalAction> > >::iterator vviEnd = 
physicalActions.end();
-       for( ; vvi != vviEnd ; ++vvi )
-       {
-               vector< shared_ptr<PhysicalAction> >::iterator vi    = 
(*vvi).begin();
-               vector< shared_ptr<PhysicalAction> >::iterator viEnd = 
(*vvi).end();
-               for( ; vi != viEnd ; ++vi)
-               //if(*vi) // FIXME ?? do not check - all fields are NOT empty.
-                       (*vi)->reset();
-       }
+       #if 1
+               vector< vector< shared_ptr<PhysicalAction> > >::iterator vvi    
= physicalActions.begin();
+               vector< vector< shared_ptr<PhysicalAction> > >::iterator vviEnd 
= physicalActions.end();
+               for( ; vvi != vviEnd ; ++vvi )
+               {
+                       vector< shared_ptr<PhysicalAction> >::iterator vi    = 
(*vvi).begin();
+                       vector< shared_ptr<PhysicalAction> >::iterator viEnd = 
(*vvi).end();
+                       for( ; vi != viEnd ; ++vi)
+                       //if(*vi) // FIXME ?? do not check - all fields are NOT 
empty.
+                               (*vi)->reset();
+               }
+       #else
+               FOREACH(int idx, usedBexIndices){
+                       // reset everything
+                       FOREACH(shared_ptr<PhysicalAction>& 
pa,physicalActions[idx]){ pa->reset();}
+               }
+       #endif
 }
 
 
@@ -142,10 +149,13 @@
                maxSize = max(maxSize , actionTypes[i]->getClassIndex() );
        ++maxSize;
        actionTypesResetted.resize(maxSize);
+       usedBexIndices.clear();
        for(unsigned int i = 0 ; i < size ; ++i )
        {
-               actionTypesResetted[actionTypes[i]->getClassIndex()] = 
actionTypes[i]->clone();
-               actionTypesResetted[actionTypes[i]->getClassIndex()] -> reset();
+               int idx=actionTypes[i]->getClassIndex();
+               actionTypesResetted[idx] = actionTypes[i]->clone();
+               actionTypesResetted[idx] -> reset();
+               usedBexIndices.push_back(idx);
        }
 }
 

Modified: 
trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.hpp
===================================================================
--- trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.hpp   
2009-02-17 09:10:50 UTC (rev 1668)
+++ trunk/core/DefaultContainerImplementations/PhysicalActionVectorVector.hpp   
2009-02-17 20:47:59 UTC (rev 1669)
@@ -56,6 +56,7 @@
                        vector< shared_ptr<PhysicalAction> >   
actionTypesResetted;
                vector< bool > usedIds;
                unsigned int current_size;
+               vector<int> usedBexIndices;
        
        public :
                PhysicalActionVectorVector();

Modified: trunk/gui/py/yadeControl.cpp
===================================================================
--- trunk/gui/py/yadeControl.cpp        2009-02-17 09:10:50 UTC (rev 1668)
+++ trunk/gui/py/yadeControl.cpp        2009-02-17 20:47:59 UTC (rev 1669)
@@ -526,6 +526,30 @@
        }
 
        pyTags tags_get(void){assertRootBody(); return 
pyTags(OMEGA.getRootBody());}
+
+       void interactionContainer_set(string clss){
+               MetaBody* rb=OMEGA.getRootBody().get();
+               if(rb->transientInteractions->size()>0) throw 
std::runtime_error("Interaction container not empty, will not change its 
class.");
+               shared_ptr<InteractionContainer> 
ic=dynamic_pointer_cast<InteractionContainer>(ClassFactory::instance().createShared(clss));
+               rb->transientInteractions=ic;
+       }
+       string interactionContainer_get(string clss){ return 
OMEGA.getRootBody()->transientInteractions->getClassName(); }
+
+       void bodyContainer_set(string clss){
+               MetaBody* rb=OMEGA.getRootBody().get();
+               if(rb->bodies->size()>0) throw std::runtime_error("Body 
container not empty, will not change its class.");
+               shared_ptr<BodyContainer> 
bc=dynamic_pointer_cast<BodyContainer>(ClassFactory::instance().createShared(clss));
+               rb->bodies=bc;
+       }
+       string bodyContainer_get(string clss){ return 
OMEGA.getRootBody()->bodies->getClassName(); }
+
+       void physicalActionContainer_set(string clss){
+               MetaBody* rb=OMEGA.getRootBody().get();
+               shared_ptr<PhysicalActionContainer> 
pac=dynamic_pointer_cast<PhysicalActionContainer>(ClassFactory::instance().createShared(clss));
+               rb->physicalActions=pac;
+       }
+       string physicalActionContainer_get(string clss){ return 
OMEGA.getRootBody()->physicalActions->getClassName(); }
+
 };
 BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(omega_run_overloads,run,0,2);
 
@@ -580,6 +604,9 @@
                .add_property("actions",&pyOmega::actions_get)
                .add_property("tags",&pyOmega::tags_get)
                .def("childClasses",&pyOmega::listChildClasses)
+               
.add_property("bodyContainer",&pyOmega::bodyContainer_get,&pyOmega::bodyContainer_set)
+               
.add_property("interactionContainer",&pyOmega::interactionContainer_get,&pyOmega::interactionContainer_set)
+               
.add_property("actionContainer",&pyOmega::physicalActionContainer_get,&pyOmega::physicalActionContainer_set)
                ;
        boost::python::class_<pyTags>("TagsWrapper",python::init<pyTags&>())
                .def("__getitem__",&pyTags::getItem)

Modified: trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp
===================================================================
--- trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp  
2009-02-17 09:10:50 UTC (rev 1668)
+++ trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp  
2009-02-17 20:47:59 UTC (rev 1669)
@@ -191,6 +191,8 @@
        int offset1=3*id1, offset2=3*id2;
        const shared_ptr<Body>& b1(Body::byId(body_id_t(id1),rootBody)), 
b2(Body::byId(body_id_t(id2),rootBody));
        bool overlap =
+               // only collide if at least one of the bodies is not shadow
+               ((!b1->isShadow()) || (!b2->isShadow())) &&
                // only collide if at least one particle is standalone or they 
belong to different clumps
                (b1->isStandalone() || b2->isStandalone() || 
b1->clumpId!=b2->clumpId ) &&
                 // do not collide clumps, since they are just containers, 
never interact
@@ -230,8 +232,6 @@
 }
 
 
-
-
 void 
PersistentSAPCollider::findOverlappingBB(std::vector<shared_ptr<AABBBound> >& 
bounds, int nbElements){
        int i=0,j=0;
        while (i<2*nbElements) {


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to