Author: richefeu
Date: 2009-06-15 15:43:29 +0200 (Mon, 15 Jun 2009)
New Revision: 1797

Added:
   trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.cpp
   trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.hpp
Modified:
   trunk/pkg/dem/Engine/StandAloneEngine/MGPRecorder.cpp
   trunk/pkg/dem/SConscript
Log:
- Add 'HistoryRecorder' to save the sample and network state with a given 
time-step interval.
- Correct a small bug due to the fact that a Clump cannot be casted into a 
GeometricalModel (and I don't know why!)


Added: trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.cpp
===================================================================
--- trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.cpp   2009-06-13 
21:47:20 UTC (rev 1796)
+++ trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.cpp   2009-06-15 
13:43:29 UTC (rev 1797)
@@ -0,0 +1,149 @@
+/*************************************************************************
+*  Copyright (C) 2009 by Vincent Richefeu                                *
+*  [email protected]                                          *
+*                                                                        *
+*  This program is free software; it is licensed under the terms of the  *
+*  GNU General Public License v2 or later. See file LICENSE for details. *
+*************************************************************************/
+
+#include "HistoryRecorder.hpp"
+#include<yade/pkg-common/RigidBodyParameters.hpp>
+#include<yade/core/Omega.hpp>
+#include<yade/core/MetaBody.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <yade/pkg-common/Sphere.hpp>
+#include <yade/pkg-common/Box.hpp>
+
+#include <yade/pkg-dem/SpheresContactGeometry.hpp>
+#include <yade/pkg-common/NormalShearInteractions.hpp>
+
+HistoryRecorder::HistoryRecorder () : DataRecorder()
+{
+  outputBase = "spl_nwk_";
+  interval   = 50;
+  stateId    = 0;
+}
+
+
+HistoryRecorder::~HistoryRecorder ()
+{
+
+}
+
+
+void HistoryRecorder::postProcessAttributes(bool deserializing)
+{
+       if(deserializing)
+       {
+               
+       }
+}
+
+
+void HistoryRecorder::registerAttributes()
+{
+       DataRecorder::registerAttributes();
+       REGISTER_ATTRIBUTE(outputBase);
+       REGISTER_ATTRIBUTE(interval);
+       REGISTER_ATTRIBUTE(stateId);
+}
+
+bool HistoryRecorder::isActivated()
+{
+       return ((Omega::instance().getCurrentIteration() % interval == 0));
+}
+
+
+
+void HistoryRecorder::action(MetaBody * ncb)
+{
+  shared_ptr<BodyContainer>& bodies = ncb->bodies;
+
+  std::string outputFile = outputBase + lexical_cast<string>(stateId++) + 
".his";
+  std::ofstream ofs(outputFile.c_str());
+  cout << "Saving " << outputFile << "..." << endl;
+   ofs << "Sample{" << endl;
+
+   BodyContainer::iterator bi    = bodies->begin();
+   BodyContainer::iterator biEnd = bodies->end();
+   for( ; bi != biEnd ; ++bi)
+   {
+     const shared_ptr<Body>& b = *bi;
+        if (b->isClump()) continue;
+        
+     const RigidBodyParameters* p = 
YADE_CAST<RigidBodyParameters*>(b->physicalParameters.get());
+        const GeometricalModel* gm   = 
YADE_CAST<GeometricalModel*>(b->geometricalModel.get());
+
+       if ( typeid(*gm) == typeid(Sphere) )
+     {
+               ofs << "sphere " << b->groupMask << " " << 
YADE_CAST<Sphere*>(b->geometricalModel.get())->radius
+               << " " << p->se3.position[0] << " " << p->se3.position[1] << " 
" << p->se3.position[2]
+               << " 0 0 0" 
+               << " " << p->velocity[0] << " " << p->velocity[1] << " " << 
p->velocity[2]
+               << " " << p->angularVelocity[0] << " " << p->angularVelocity[1] 
<< " " << p->angularVelocity[2]
+               << endl << flush;
+        }
+
+       if ( typeid(*gm) == typeid(Box) )
+       {
+         ofs << "box " << b->groupMask << " " << 
YADE_CAST<Box*>(b->geometricalModel.get())->extents
+         << " " << p->se3.position[0] << " " << p->se3.position[1] << " " << 
p->se3.position[2]
+         << " 0 0 0"
+         << " " << p->velocity[0] << " " << p->velocity[1] << " " << 
p->velocity[2]
+         << " " << p->angularVelocity[0] << " " << p->angularVelocity[1] << " 
" << p->angularVelocity[2]
+         << endl << flush;
+       }
+
+   } 
+   ofs << "}" << endl << endl;
+   
+   ofs << "Network{" << endl;
+   
+   InteractionContainer::iterator ii    = ncb->transientInteractions->begin();
+   InteractionContainer::iterator iiEnd = ncb->transientInteractions->end();
+   
+   for( ;ii!=iiEnd;++ii)
+   {
+        if ((*ii)->isReal()) // to be claryfied...
+        {
+          const shared_ptr<Interaction>& contact = *ii;
+
+          const InteractionGeometry* ig = 
YADE_CAST<InteractionGeometry*>(contact->interactionGeometry.get());
+          
+          body_id_t id1 = contact->getId1();
+          body_id_t id2 = contact->getId2();
+          
+          shared_ptr<Body> b1=(*bodies)[id1];
+          shared_ptr<Body> b2=(*bodies)[id2];
+
+          if( typeid(*ig) == typeid(SpheresContactGeometry) )
+          {
+                
+                if (typeid(*(b1->geometricalModel.get())) == typeid(Sphere)
+                 && typeid(*(b2->geometricalModel.get())) == typeid(Sphere))
+                {
+                  const NormalShearInteraction* nsi = 
YADE_CAST<NormalShearInteraction*>(contact->interactionPhysics.get());
+                  Vector3r n = nsi->normalForce;
+                  Real fn = n.Length();
+
+                  Vector3r t = nsi->shearForce;
+                  Real ft = t.Length();
+                  
+                  // remark: This is not exactly the format used in gdm-tk
+                  ofs << "spsp " << id1 << " " << id2 << " " << n << " " << t 
<< " "
+                          << fn << " " << ft << " 0 0 0 0"
+                      << endl;
+                }
+
+          }
+        }
+   }
+
+  ofs << "}" << endl << endl;
+   
+}
+
+
+
+

Added: trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.hpp
===================================================================
--- trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.hpp   2009-06-13 
21:47:20 UTC (rev 1796)
+++ trunk/pkg/dem/Engine/StandAloneEngine/HistoryRecorder.hpp   2009-06-15 
13:43:29 UTC (rev 1797)
@@ -0,0 +1,38 @@
+/*************************************************************************
+*  Copyright (C) 2009 by Vincent Richefeu                                *
+*  [email protected]                                          *
+*                                                                        *
+*  This program is free software; it is licensed under the terms of the  *
+*  GNU General Public License v2 or later. See file LICENSE for details. *
+*************************************************************************/
+
+#pragma once
+
+#include<yade/core/DataRecorder.hpp>
+#include <string>
+#include <fstream>
+
+class HistoryRecorder : public DataRecorder
+{
+public :
+       
+       string outputBase; 
+    int interval;
+    int stateId;
+       
+       HistoryRecorder ();
+       ~HistoryRecorder ();
+       virtual void action(MetaBody*);
+       virtual bool isActivated();
+
+protected :
+
+       virtual void postProcessAttributes(bool deserializing);
+       virtual void registerAttributes();
+       REGISTER_CLASS_NAME(HistoryRecorder);
+       REGISTER_BASE_CLASS_NAME(DataRecorder);
+};
+
+REGISTER_SERIALIZABLE(HistoryRecorder);
+
+

Modified: trunk/pkg/dem/Engine/StandAloneEngine/MGPRecorder.cpp
===================================================================
--- trunk/pkg/dem/Engine/StandAloneEngine/MGPRecorder.cpp       2009-06-13 
21:47:20 UTC (rev 1796)
+++ trunk/pkg/dem/Engine/StandAloneEngine/MGPRecorder.cpp       2009-06-15 
13:43:29 UTC (rev 1797)
@@ -67,6 +67,8 @@
    for(; bi != biEnd ; ++bi)
    {
      const shared_ptr<Body>& b = *bi;
+        if (b->isClump()) continue;
+        
      const RigidBodyParameters* p = 
YADE_CAST<RigidBodyParameters*>(b->physicalParameters.get());
      const GeometricalModel* gm   = 
YADE_CAST<GeometricalModel*>(b->geometricalModel.get());
 

Modified: trunk/pkg/dem/SConscript
===================================================================
--- trunk/pkg/dem/SConscript    2009-06-13 21:47:20 UTC (rev 1796)
+++ trunk/pkg/dem/SConscript    2009-06-15 13:43:29 UTC (rev 1797)
@@ -982,6 +982,14 @@
        ,['Engine/StandAloneEngine/RigidBodyRecorder.cpp']
        ,LIBS=env['LIBS']+['RigidBodyParameters'])
 
+       ,env.SharedLibrary('MGPRecorder'
+       ,['Engine/StandAloneEngine/MGPRecorder.cpp']
+       ,LIBS=env['LIBS']+['RigidBodyParameters','Sphere'])
+
+       ,env.SharedLibrary('HistoryRecorder'
+       ,['Engine/StandAloneEngine/HistoryRecorder.cpp']
+       
,LIBS=env['LIBS']+['RigidBodyParameters','Sphere','Box','SpheresContactGeometry','NormalShearInteractions'])
+
        ,env.SharedLibrary('TestSimpleViscoelastic'
                ,['PreProcessor/TestSimpleViscoelastic.cpp']
                ,LIBS=env['LIBS']+['AABB'


_______________________________________________
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