Author: eudoxos
Date: 2008-11-24 13:18:47 +0100 (Mon, 24 Nov 2008)
New Revision: 1581

Added:
   trunk/pkg/common/Engine/DeusExMachina/LinearInterpolate.hpp
Modified:
   trunk/extra/usct/UniaxialStrainControlledTest.cpp
   trunk/extra/usct/UniaxialStrainControlledTest.hpp
   trunk/gui/qt3/QtGUI.cpp
   trunk/pkg/common/Engine/DeusExMachina/RotationEngine.cpp
   trunk/pkg/common/Engine/DeusExMachina/RotationEngine.hpp
Log:
1. Add linear templated interpolation function working on 2 lists, t and values
2. Add InterpolatingRotationEngine that changes rotation speed as given by 
value table
3. Lower info about starting python thread to debug message only.



Modified: trunk/extra/usct/UniaxialStrainControlledTest.cpp
===================================================================
--- trunk/extra/usct/UniaxialStrainControlledTest.cpp   2008-11-22 22:54:46 UTC 
(rev 1580)
+++ trunk/extra/usct/UniaxialStrainControlledTest.cpp   2008-11-24 12:18:47 UTC 
(rev 1581)
@@ -102,6 +102,9 @@
        // reverse if we're over the limit strain
        if(notYetReversed && limitStrain!=0 && ((currentStrainRate>0 && 
strain>limitStrain) || (currentStrainRate<0 && strain<limitStrain))) { 
currentStrainRate*=-1; notYetReversed=false; LOG_INFO("Reversed strain rate to 
"<<currentStrainRate); }
 
+       // if(strain==stopAtStrain){LOG_INFO("Prescibed strain 
"<<stopAtStrain<<" reached, pausing."); }
+       if(!isnan(stopAtStrain) && ((strain*stopAtStrain>0) && 
abs(strain)>abs(stopAtStrain))) { strain=stopAtStrain;   
rootBody->stopAtIteration=Omega::instance().getCurrentIteration()+2; 
LOG_INFO("Prescribed strain "<<stopAtStrain<<" reached, will stop in 2 
iterations"); }
+
        if(Omega::instance().getCurrentIteration()%10==0 ) {
                computeAxialForce(rootBody);
                #if 0

Modified: trunk/extra/usct/UniaxialStrainControlledTest.hpp
===================================================================
--- trunk/extra/usct/UniaxialStrainControlledTest.hpp   2008-11-22 22:54:46 UTC 
(rev 1580)
+++ trunk/extra/usct/UniaxialStrainControlledTest.hpp   2008-11-24 12:18:47 UTC 
(rev 1581)
@@ -15,7 +15,7 @@
        private:
                void createEngines();
        public:
-               USCTGen(){ axis=1; limitStrain=0; 
damping=0.2;cohesiveThresholdIter=200; };
+               USCTGen(){ axis=1; limitStrain=0; 
damping=0.2;cohesiveThresholdIter=200;};
                ~USCTGen (){};
                bool generate();
                string spheresFile;
@@ -81,6 +81,8 @@
                void init();
        public:
                Real strainRate,currentStrainRate;
+               //! strain at which we will pause simulation; inactive (nan) by 
default; must be reached from below (in absolute value)
+               Real stopAtStrain;
                //! distance of reference bodies in the direction of axis 
before straining started
                Real originalLength;
                vector<Real> originalWidths;
@@ -124,11 +126,12 @@
                Real strain, avgStress;
 
                virtual void applyCondition(MetaBody* rootBody);
-               UniaxialStrainer(){axis=2; asymmetry=0; currentStrainRate=0; 
originalLength=-1; limitStrain=0; notYetReversed=true; crossSectionArea=-1; 
needsInit=true; /* sensorsPusher=shared_ptr<UniaxialStrainSensorPusher>(); */ 
recordFile="/tmp/usct.data"; strain=avgStress=/*avgTransStrain=*/0; 
blockRotations=false; blockDisplacements=false;};
+               UniaxialStrainer(){axis=2; asymmetry=0; currentStrainRate=0; 
originalLength=-1; limitStrain=0; notYetReversed=true; crossSectionArea=-1; 
needsInit=true; /* sensorsPusher=shared_ptr<UniaxialStrainSensorPusher>(); */ 
recordFile="/tmp/usct.data"; strain=avgStress=/*avgTransStrain=*/0; 
blockRotations=false; blockDisplacements=false;  
stopAtStrain=numeric_limits<Real>::quiet_NaN();};
                virtual ~UniaxialStrainer(){};
                void registerAttributes(){
                        DeusExMachina::registerAttributes();
                        REGISTER_ATTRIBUTE(strainRate);
+                       REGISTER_ATTRIBUTE(stopAtStrain);
                        REGISTER_ATTRIBUTE(currentStrainRate);
                        REGISTER_ATTRIBUTE(axis);
                        REGISTER_ATTRIBUTE(asymmetry);

Modified: trunk/gui/qt3/QtGUI.cpp
===================================================================
--- trunk/gui/qt3/QtGUI.cpp     2008-11-22 22:54:46 UTC (rev 1580)
+++ trunk/gui/qt3/QtGUI.cpp     2008-11-24 12:18:47 UTC (rev 1581)
@@ -62,7 +62,7 @@
        mainWindow->show();
        app.setMainWidget(mainWindow);
        #ifdef EMBED_PYTHON
-               LOG_INFO("Launching Python thread now...");
+               LOG_DEBUG("Launching Python thread now...");
                //PyEval_InitThreads();
                boost::thread 
pyThread(boost::function0<void>(&PythonUI::pythonSession));
        #endif

Added: trunk/pkg/common/Engine/DeusExMachina/LinearInterpolate.hpp
===================================================================
--- trunk/pkg/common/Engine/DeusExMachina/LinearInterpolate.hpp 2008-11-22 
22:54:46 UTC (rev 1580)
+++ trunk/pkg/common/Engine/DeusExMachina/LinearInterpolate.hpp 2008-11-24 
12:18:47 UTC (rev 1581)
@@ -0,0 +1,47 @@
+// 2008 © Václav Šmilauer <[EMAIL PROTECTED]>
+
+#include<vector>
+#include<iostream>
+#include<cassert>
+
+/* Linear interpolation function suitable only for sequential interpolation.
+ *
+ * Template parameter T must support: addition, subtraction, scalar 
multiplication.
+ *
+ * @param t "time" at which the interpolated variable should be evaluated.
+ * @param tt "time" points at which values are given; must be increasing.
+ * @param values values at "time" points specified by tt
+ * @param pos holds lookup state
+ *
+ * @return value at "time" t; out of range: t<t0 → value(t0), t>t_last → 
value(t_last)
+ */
+template<typename T>
+T linearInterpolate(const Real t, const std::vector<Real>& tt, const 
std::vector<T>& values, size_t& pos){
+       assert(tt.size()==values.size());
+       if(t<=tt[0]){ pos=0; return values[0];}
+       if(t>=*tt.rbegin()){ pos=tt.size()-2; return *values.rbegin();}
+       pos=std::min(pos,tt.size()-2);
+       while((tt[pos]>t) || (tt[pos+1]<t)){
+               assert(tt[pos]<tt[pos+1]);
+               if(tt[pos]>t) pos--;
+               else pos++;
+       }
+       const Real& t0=tt[pos], t1=tt[pos+1]; const T& v0=values[pos], 
v1=values[pos+1];
+       return v0+(v1-v0)*((t-t0)/(t1-t0));
+}
+
+#if 0
+       // test program
+       int main(void){
+               Real t,v;
+               std::vector<Real> tt,vv;
+               while(std::cin){
+                       std::cin>>t>>v;
+                       tt.push_back(t); vv.push_back(v);       
+               }
+               size_t pos;
+               for(Real t=0; t<10; t+=0.1){
+                       std::cout<<t<<" 
"<<linearInterpolate<Real>(t,tt,vv,pos)<<std::endl;
+               }
+       }
+#endif 

Modified: trunk/pkg/common/Engine/DeusExMachina/RotationEngine.cpp
===================================================================
--- trunk/pkg/common/Engine/DeusExMachina/RotationEngine.cpp    2008-11-22 
22:54:46 UTC (rev 1580)
+++ trunk/pkg/common/Engine/DeusExMachina/RotationEngine.cpp    2008-11-24 
12:18:47 UTC (rev 1581)
@@ -9,12 +9,20 @@
 *************************************************************************/
 
 
-#include "RotationEngine.hpp"
+#include"RotationEngine.hpp"
 #include<yade/pkg-common/RigidBodyParameters.hpp>
 #include<yade/core/MetaBody.hpp>
 #include<yade/lib-base/yadeWm3Extra.hpp>
 
+#include<yade/pkg-common/LinearInterpolate.hpp>
 
+YADE_PLUGIN("RotationEngine","InterpolatingRotationEngine");
+
+void InterpolatingRotationEngine::applyCondition(MetaBody* rb){
+       
angularVelocity=linearInterpolate<Real>(rb->simulationTime,times,velocities,pos);
+       RotationEngine::applyCondition(rb);
+}
+
 RotationEngine::RotationEngine()
 {
        rotateAroundZero = false;
@@ -73,4 +81,3 @@
 
 }
 
-YADE_PLUGIN();

Modified: trunk/pkg/common/Engine/DeusExMachina/RotationEngine.hpp
===================================================================
--- trunk/pkg/common/Engine/DeusExMachina/RotationEngine.hpp    2008-11-22 
22:54:46 UTC (rev 1580)
+++ trunk/pkg/common/Engine/DeusExMachina/RotationEngine.hpp    2008-11-24 
12:18:47 UTC (rev 1581)
@@ -1,18 +1,14 @@
-/*************************************************************************
-*  Copyright (C) 2004 by Olivier Galizzi                                 *
-*  [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. *
-*************************************************************************/
+// © 2004 Olivier Galizzi <[EMAIL PROTECTED]>
+// © 2008 Václav Šmilauer <[EMAIL PROTECTED]>
+#pragma once
 
-#ifndef ROTATIONENGINE_HPP
-#define ROTATIONENGINE_HPP
-
 #include<yade/core/DeusExMachina.hpp>
-#include <Wm3Vector3.h>
+#include<Wm3Vector3.h>
 #include<yade/lib-base/yadeWm3.hpp>
 
+/*! Engine applying rotation (by setting angular velocity) to subscribed 
bodies.
+ * If rotateAroundZero is set, then each body is also displaced around 
zeroPoint.
+ */
 class RotationEngine : public DeusExMachina
 {
        public :
@@ -31,8 +27,23 @@
        REGISTER_CLASS_NAME(RotationEngine);
        REGISTER_BASE_CLASS_NAME(DeusExMachina);
 };
-
 REGISTER_SERIALIZABLE(RotationEngine,false);
 
-#endif // ROTATIONENGINE_HPP
+/*! Engine applying rotation, finding current angular velocity by 
interpolating in times and velocities */
+class InterpolatingRotationEngine: public RotationEngine{
+       public:
+               //! list of times at which velocities are given; must be 
increasing
+               vector<Real> times;
+               //! list of angular velocities
+               vector<Real> velocities;
+               //! holder of interpolation state, should not be touched by the 
user.
+               size_t pos;
+               InterpolatingRotationEngine(){pos=0;}
+               void registerAttributes(){ 
RotationEngine::registerAttributes(); REGISTER_ATTRIBUTE(times); 
REGISTER_ATTRIBUTE(velocities); REGISTER_ATTRIBUTE(pos); }
+               void applyCondition(MetaBody* rb);
+       REGISTER_CLASS_NAME(InterpolatingRotationEngine);
+       REGISTER_BASE_CLASS_NAME(RotationEngine);
+};
+REGISTER_SERIALIZABLE(InterpolatingRotationEngine,false);
 
+


_______________________________________________
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