Author: eudoxos
Date: 2008-10-13 09:38:23 +0200 (Mon, 13 Oct 2008)
New Revision: 1543

Modified:
   trunk/extra/Brefcom.cpp
   trunk/extra/Brefcom.hpp
   trunk/gui/py/PeriodicPythonRunner.hpp
   trunk/gui/qt3/QtGUI-python.cpp
   trunk/pkg/common/Engine/StandAloneEngine/PeriodicEngines.hpp
   trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp
   trunk/pkg/dem/Engine/DeusExMachina/TriaxialCompressionEngine.cpp
Log:
1. Fix crasher (under special circumstances) in PersistentSAPCollider (deletion 
invalidating iterator)
2. PeriodicEngine now takes nDo and nDone attributes, limitng number of 
activations
3. Fix minor things is BrefcomDamageColorizer, add normalized damage to 
BrefcomPhysParams
4. Fix some indents in Triaxial


Modified: trunk/extra/Brefcom.cpp
===================================================================
--- trunk/extra/Brefcom.cpp     2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/extra/Brefcom.cpp     2008-10-13 07:38:23 UTC (rev 1543)
@@ -233,7 +233,7 @@
 void BrefcomDamageColorizer::action(MetaBody* rootBody){
        vector<pair<short,Real> > bodyDamage; /* number of cohesive 
interactions per body; cummulative damage of interactions */
        bodyDamage.resize(rootBody->bodies->size(),pair<short,Real>(0,0));
-       FOREACH(shared_ptr<Interaction> I, *rootBody->transientInteractions){
+       FOREACH(const shared_ptr<Interaction>& I, 
*rootBody->transientInteractions){
                shared_ptr<BrefcomContact> 
BC=dynamic_pointer_cast<BrefcomContact>(I->interactionPhysics);
                if(!BC || !BC->isCohesive) continue;
                const body_id_t id1=I->getId1(), id2=I->getId2();
@@ -242,11 +242,14 @@
                maxOmega=max(maxOmega,BC->omega);
        }
        FOREACH(shared_ptr<Body> B, *rootBody->bodies){
+               body_id_t id=B->getId();
                // add damaged contacts that have already been deleted
-               unsigned 
numBrokenCohesive=YADE_PTR_CAST<BrefcomPhysParams>(B->physicalParameters)->numBrokenCohesive;
-               if(bodyDamage[B->getId()].first==0) 
{B->geometricalModel->diffuseColor=Vector3r(0.5,0.5,B->isDynamic?0:1); 
continue; }
-               Real 
normDmg=(bodyDamage[B->getId()].second+numBrokenCohesive)/(bodyDamage[B->getId()].first+numBrokenCohesive);
-               
B->geometricalModel->diffuseColor=Vector3r(normDmg,1-normDmg,B->isDynamic?0:1);
+               shared_ptr<BrefcomPhysParams> 
bpp=YADE_PTR_CAST<BrefcomPhysParams>(B->physicalParameters);
+               //if(bodyDamage[B->getId()].first==0) 
{B->geometricalModel->diffuseColor=Vector3r(0.5,0.5,B->isDynamic?0:1); 
continue; }
+               int 
pastOrPresentContacts=bodyDamage[id].first+bpp->numBrokenCohesive;
+               if(pastOrPresentContacts>0) 
bpp->normDmg=(bodyDamage[id].second+bpp->numBrokenCohesive)/pastOrPresentContacts;
+               else bpp->normDmg=0;
+               
B->geometricalModel->diffuseColor=Vector3r(bpp->normDmg,1-bpp->normDmg,B->isDynamic?0:1);
        }
 }
 

Modified: trunk/extra/Brefcom.hpp
===================================================================
--- trunk/extra/Brefcom.hpp     2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/extra/Brefcom.hpp     2008-10-13 07:38:23 UTC (rev 1543)
@@ -137,8 +137,10 @@
                int numBrokenCohesive;
                //! number of contacts with this body
                int numContacts;
-               BrefcomPhysParams(): epsVolumetric(0.), numBrokenCohesive(0), 
numContacts(0) {createIndex();};
-               virtual void 
registerAttributes(){BodyMacroParameters::registerAttributes(); 
REGISTER_ATTRIBUTE(epsVolumetric); REGISTER_ATTRIBUTE(numBrokenCohesive); 
REGISTER_ATTRIBUTE(numContacts); }
+               //! average damage including already deleted contacts
+               Real normDmg;
+               BrefcomPhysParams(): epsVolumetric(0.), numBrokenCohesive(0), 
numContacts(0), normDmg(0.) {createIndex();};
+               virtual void 
registerAttributes(){BodyMacroParameters::registerAttributes(); 
REGISTER_ATTRIBUTE(epsVolumetric); REGISTER_ATTRIBUTE(numBrokenCohesive); 
REGISTER_ATTRIBUTE(numContacts); REGISTER_ATTRIBUTE(normDmg); }
                REGISTER_CLASS_NAME(BrefcomPhysParams);
                REGISTER_BASE_CLASS_NAME(BodyMacroParameters);
 };

Modified: trunk/gui/py/PeriodicPythonRunner.hpp
===================================================================
--- trunk/gui/py/PeriodicPythonRunner.hpp       2008-10-11 14:23:53 UTC (rev 
1542)
+++ trunk/gui/py/PeriodicPythonRunner.hpp       2008-10-13 07:38:23 UTC (rev 
1543)
@@ -14,7 +14,7 @@
                string command;
        public :
                PeriodicPythonRunner(): command("pass"){};
-               /* virtual bool isActivated: not overridden, PeriodicEngine 
handles that */
+               /* virtual bool isActivated: not overridden, 
StretchPeriodicEngine handles that */
                virtual void action(MetaBody* b){
                        PyGILState_STATE gstate;
                                gstate = PyGILState_Ensure();

Modified: trunk/gui/qt3/QtGUI-python.cpp
===================================================================
--- trunk/gui/qt3/QtGUI-python.cpp      2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/gui/qt3/QtGUI-python.cpp      2008-10-13 07:38:23 UTC (rev 1543)
@@ -96,7 +96,9 @@
        if(dispParamsNo>=0) { LOG_INFO("Loading view state from state 
#"<<dispParamsNo); glv->useDisplayParameters(dispParamsNo);}
        glv->raise();
        glv->startAnimation();
+       Py_BEGIN_ALLOW_THREADS;
        while(glv->animationIsStarted()) { usleep(2000000); LOG_DEBUG("Last 
msg: "<<*player->messages.rbegin()); }
+       Py_END_ALLOW_THREADS;
        python::list snaps; FOREACH(string s, glv->snapshots){snaps.append(s);}
        return python::make_tuple(snapBase2+"-%.04d.png",snaps);
 }

Modified: trunk/pkg/common/Engine/StandAloneEngine/PeriodicEngines.hpp
===================================================================
--- trunk/pkg/common/Engine/StandAloneEngine/PeriodicEngines.hpp        
2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/pkg/common/Engine/StandAloneEngine/PeriodicEngines.hpp        
2008-10-13 07:38:23 UTC (rev 1543)
@@ -5,21 +5,26 @@
 #include<yade/core/StandAloneEngine.hpp>
 #include<yade/core/Omega.hpp>
 /* run an action with given fixed periodicity (real time, virtual time, 
iteration number), by setting any of 
- * those criteria to a number > 0. */
+ * those criteria to a number > 0.
+ *
+ * The number of times this engine is activated can be limited by setting 
nDo>0. In the contrary case, or if
+ * the number of activations was already reached, no action will be called 
even if any of active period has elapsed.
+ */
 class PeriodicEngine:  public StandAloneEngine {
        protected:
                static Real getClock(){ timeval tp; gettimeofday(&tp,NULL); 
return tp.tv_sec+tp.tv_usec/1e6; }
        public:
-               Real virtPeriod, virtLast, realPeriod, realLast; long 
iterPeriod,iterLast;
-               PeriodicEngine(): 
virtPeriod(0),virtLast(0),realPeriod(0),realLast(0),iterPeriod(0),iterLast(0) { 
realLast=getClock(); }
+               Real virtPeriod, virtLast, realPeriod, realLast; long 
iterPeriod,iterLast,nDo,nDone;
+               PeriodicEngine(): 
virtPeriod(0),virtLast(0),realPeriod(0),realLast(0),iterPeriod(0),iterLast(0),nDo(-1),nDone(0)
 { realLast=getClock(); }
                virtual bool isActivated(){
                        Real virtNow=Omega::instance().getSimulationTime();
                        Real realNow=getClock();
                        long iterNow=Omega::instance().getCurrentIteration();
-                       if((virtPeriod>0 && virtNow-virtLast>=virtPeriod) ||
-                               (realPeriod>0 && realNow-realLast>=realPeriod) 
||
-                               (iterPeriod>0 && iterNow-iterLast>=iterPeriod)){
-                               realLast=realNow; virtLast=virtNow; 
iterLast=iterNow;
+                       if((nDo<0 || nDone<nDo) &&
+                               ((virtPeriod>0 && virtNow-virtLast>=virtPeriod) 
||
+                                (realPeriod>0 && realNow-realLast>=realPeriod) 
||
+                                (iterPeriod>0 && 
iterNow-iterLast>=iterPeriod))){
+                               realLast=realNow; virtLast=virtNow; 
iterLast=iterNow; nDone++;
                                return true;
                        }
                        return false;
@@ -33,12 +38,21 @@
                        REGISTER_ATTRIBUTE(virtLast);
                        REGISTER_ATTRIBUTE(realLast);
                        REGISTER_ATTRIBUTE(iterLast);
+                       REGISTER_ATTRIBUTE(nDo);
+                       REGISTER_ATTRIBUTE(nDone);
                }
        REGISTER_CLASS_NAME(PeriodicEngine);
        REGISTER_BASE_CLASS_NAME(StandAloneEngine);
 };
 REGISTER_SERIALIZABLE(PeriodicEngine,false);
 
+#if 0
+class StridePeriodicEngine: public PeriodicEngine{
+       public:
+               StridePeriodicEngine(): stride, maxStride
+}
+#endif
+
 /* PeriodicEngine but with constraint that may be stretched by a given 
stretchFactor (default 2).
  * Limits for each periodicity criterion may be set and the mayStretch bool 
says whether the period
  * can be stretched (default: doubled) without active criteria getting off 
limits.
@@ -55,7 +69,7 @@
        StretchPeriodicEngine(): PeriodicEngine(), realLim(0.), virtLim(0.), 
iterLim(0), stretchFactor(2.){}
        Real realLim, virtLim; long iterLim;
        Real stretchFactor;
-       int mayStretch;
+       bool mayStretch;
        virtual bool isActivated(){
                assert(stretchFactor>0);
                if(iterLim==0 && iterPeriod!=0){iterLim=iterPeriod;} else 
if(iterLim!=0 && iterPeriod==0){iterPeriod=iterLim;}

Modified: trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp
===================================================================
--- trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp  
2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/pkg/common/Engine/StandAloneEngine/PersistentSAPCollider.cpp  
2008-10-13 07:38:23 UTC (rev 1543)
@@ -71,10 +71,12 @@
                        maxima[offset+0]=pos[0]; maxima[offset+1]=pos[1]; 
maxima[offset+2]=pos[2];
                }
        }
+       typedef pair<body_id_t,body_id_t> bodyIdPair;
+       list<bodyIdPair> toBeDeleted;
        FOREACH(const shared_ptr<Interaction>& I,*ncb->transientInteractions){
                // remove interactions deleted by the constitutive law: thay 
are not new, but nor real either
                // to make sure, do that only with haveDistantTransient
-               if(haveDistantTransient && !I->isNew && !I->isReal) { 
transientInteractions->erase(I->getId1(),I->getId2()); continue; }
+               if(haveDistantTransient && !I->isNew && !I->isReal) { 
toBeDeleted.push_back(bodyIdPair(I->getId1(),I->getId2())); continue; }
                // Once the interaction has been fully created, it is not "new" 
anymore
                if (I->isReal) I->isNew=false;
                // OTOH if is is now real anymore, it falls back to the 
potential state
@@ -85,6 +87,7 @@
                if(!haveDistantTransient) I->isReal=false;
                //if(!I->isReal){LOG_DEBUG("Interaction 
#"<<I->getId1()<<"=#"<<I->getId2()<<" is not real.");}
        }
+       FOREACH(const bodyIdPair& p, toBeDeleted){ 
transientInteractions->erase(p.first,p.second); }
        
        updateIds(bodies->size());
        nbObjects=bodies->size();

Modified: trunk/pkg/dem/Engine/DeusExMachina/TriaxialCompressionEngine.cpp
===================================================================
--- trunk/pkg/dem/Engine/DeusExMachina/TriaxialCompressionEngine.cpp    
2008-10-11 14:23:53 UTC (rev 1542)
+++ trunk/pkg/dem/Engine/DeusExMachina/TriaxialCompressionEngine.cpp    
2008-10-13 07:38:23 UTC (rev 1543)
@@ -269,27 +269,21 @@
        }
                
        InteractionContainer::iterator ii    = 
ncb->transientInteractions->begin();
-        InteractionContainer::iterator iiEnd = 
ncb->transientInteractions->end();
-        
-        for(  ; ii!=iiEnd ; ++ii ) 
-        {
-               if ((*ii)->isReal)
-                {      
-                               const shared_ptr<BodyMacroParameters>& sdec1 = 
YADE_PTR_CAST<BodyMacroParameters>((*bodies)[(body_id_t) 
((*ii)->getId1())]->physicalParameters);
-                       const shared_ptr<BodyMacroParameters>& sdec2 = 
YADE_PTR_CAST<BodyMacroParameters>((*bodies)[(body_id_t) 
((*ii)->getId2())]->physicalParameters);
-                                               
-                       //FIXME - why dynamic_cast fails here?
-                       //const shared_ptr<ElasticContactInteraction>& 
contactPhysics = 
YADE_PTR_CAST<ElasticContactInteraction>((*ii)->interactionPhysics);
-                       const shared_ptr<ElasticContactInteraction>& 
contactPhysics = 
static_pointer_cast<ElasticContactInteraction>((*ii)->interactionPhysics);
-                       
-                       Real fa         = sdec1->frictionAngle;
-                       Real fb         = sdec2->frictionAngle;
+       InteractionContainer::iterator iiEnd = 
ncb->transientInteractions->end(); 
+       for(  ; ii!=iiEnd ; ++ii ) {
+               if (!(*ii)->isReal) continue;
+               const shared_ptr<BodyMacroParameters>& sdec1 = 
YADE_PTR_CAST<BodyMacroParameters>((*bodies)[(body_id_t) 
((*ii)->getId1())]->physicalParameters);
+               const shared_ptr<BodyMacroParameters>& sdec2 = 
YADE_PTR_CAST<BodyMacroParameters>((*bodies)[(body_id_t) 
((*ii)->getId2())]->physicalParameters);                
+               //FIXME - why dynamic_cast fails here?
+               //const shared_ptr<ElasticContactInteraction>& contactPhysics = 
YADE_PTR_CAST<ElasticContactInteraction>((*ii)->interactionPhysics);
+               const shared_ptr<ElasticContactInteraction>& contactPhysics = 
static_pointer_cast<ElasticContactInteraction>((*ii)->interactionPhysics);
 
-                       contactPhysics->frictionAngle                   = 
std::min(fa,fb);
-                       contactPhysics->tangensOfFrictionAngle          = 
std::tan(contactPhysics->frictionAngle); 
-               }
-       }
+               Real fa         = sdec1->frictionAngle;
+               Real fb         = sdec2->frictionAngle;
 
+               contactPhysics->frictionAngle                   = 
std::min(fa,fb);
+               contactPhysics->tangensOfFrictionAngle          = 
std::tan(contactPhysics->frictionAngle); 
+       }
 }
 
 


_______________________________________________
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