Author: eudoxos
Date: 2009-07-14 23:03:51 +0200 (Tue, 14 Jul 2009)
New Revision: 1865

Added:
   trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.cpp
   trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.hpp
Removed:
   trunk/extra/spherical-dem-simulator/
   trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.cpp
   trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.hpp
Modified:
   trunk/extra/SConscript
   trunk/pkg/dem/ConcretePM.cpp
   trunk/pkg/dem/SConscript
Log:
1. Move NewtonsDampedLaw to StandAloneEngine directory
2. Add omp critical to ConcretePM
3. Remove SphericalDEMSimulator


Modified: trunk/extra/SConscript
===================================================================
--- trunk/extra/SConscript      2009-07-14 15:41:54 UTC (rev 1864)
+++ trunk/extra/SConscript      2009-07-14 21:03:51 UTC (rev 1865)
@@ -4,23 +4,6 @@
 import os.path, os
 
 env.Install('$PREFIX/lib/yade$SUFFIX/extra',[
-       env.SharedLibrary('SphericalDEMSimulator',
-               ['spherical-dem-simulator/PersistentAloneSAPCollider.cpp',
-                       'spherical-dem-simulator/SphericalDEMSimulator.cpp'],
-               LIBS=env['LIBS']+['yade-base',
-                       'MacroMicroElasticRelationships',
-                       'BodyMacroParameters',
-                       'CundallNonViscousDamping',
-                       'CundallNonViscousDamping',
-                       'PhysicalActionDamper',
-                       'InteractionPhysicsMetaEngine',
-                       'GravityEngines',
-                       'Sphere',
-                       'yade-multimethods',
-                       'yade-factory',
-                       'yade-serialization',
-                       'yade-base',
-                       ]),
 
        
env.SharedLibrary('Tetra',['tetra/Tetra.cpp'],LIBS=env['LIBS']+['Tetrahedron',
          'ParticleParameters',

Modified: trunk/pkg/dem/ConcretePM.cpp
===================================================================
--- trunk/pkg/dem/ConcretePM.cpp        2009-07-14 15:41:54 UTC (rev 1864)
+++ trunk/pkg/dem/ConcretePM.cpp        2009-07-14 21:03:51 UTC (rev 1865)
@@ -196,7 +196,9 @@
                if(isCohesive){
                        const shared_ptr<Body>& 
body1=Body::byId(I->getId1(),rootBody), body2=Body::byId(I->getId2(),rootBody); 
assert(body1); assert(body2);
                        const shared_ptr<CpmMat>& 
rbp1=YADE_PTR_CAST<CpmMat>(body1->physicalParameters), 
rbp2=YADE_PTR_CAST<CpmMat>(body2->physicalParameters);
-                       rbp1->numBrokenCohesive+=1; rbp2->numBrokenCohesive+=1; 
rbp1->epsPlBroken+=epsPlSum; rbp2->epsPlBroken+=epsPlSum;
+                       // nice article about openMP::critical vs. scoped 
locks: 
http://www.thinkingparallel.com/2006/08/21/scoped-locking-vs-critical-in-openmp-a-personal-shootout/
+                       #pragma omp critical
+                       { rbp1->numBrokenCohesive+=1; 
rbp2->numBrokenCohesive+=1; rbp1->epsPlBroken+=epsPlSum; 
rbp2->epsPlBroken+=epsPlSum; }
                }
                rootBody->interactions->requestErase(I->getId1(),I->getId2());
                return;

Deleted: trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.cpp
===================================================================
--- trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.cpp     2009-07-14 
15:41:54 UTC (rev 1864)
+++ trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.cpp     2009-07-14 
21:03:51 UTC (rev 1865)
@@ -1,135 +0,0 @@
-/*************************************************************************
- Copyright (C) 2008 by Bruno Chareyre                                   *
-*  [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"NewtonsDampedLaw.hpp"
-#include<yade/core/MetaBody.hpp>
-#include<yade/pkg-common/RigidBodyParameters.hpp>
-#include<yade/pkg-common/VelocityBins.hpp>
-#include<yade/lib-base/yadeWm3Extra.hpp>
-#include<yade/pkg-dem/Clump.hpp>
-
-YADE_PLUGIN("NewtonsDampedLaw");
-
-void NewtonsDampedLaw::cundallDamp(const Real& dt, const Vector3r& f, const 
Vector3r& velocity, Vector3r& acceleration, const Vector3r& m, const Vector3r& 
angularVelocity, Vector3r& angularAcceleration){
-       for(int i=0; i<3; i++){
-               angularAcceleration[i]*= 1 - damping*Mathr::Sign ( 
m[i]*(angularVelocity[i] + (Real) 0.5 *dt*angularAcceleration[i]) );
-               acceleration       [i]*= 1 - damping*Mathr::Sign ( 
f[i]*(velocity       [i] + (Real) 0.5 *dt*acceleration       [i]) );
-       }
-}
-
-void NewtonsDampedLaw::handleClumpMember(MetaBody* ncb, const body_id_t 
memberId, RigidBodyParameters* clumpRBP){
-       const shared_ptr<Body>& b=Body::byId(memberId,ncb);
-       assert(b->isClumpMember());
-       RigidBodyParameters* 
rb=YADE_CAST<RigidBodyParameters*>(b->physicalParameters.get());
-       const Vector3r& m=ncb->bex.getTorque(memberId); const Vector3r& 
f=ncb->bex.getForce(memberId);
-       Vector3r diffClumpAccel=f/clumpRBP->mass;
-       // angular acceleration from: normal torque + torque generated by the 
force WRT particle centroid on the clump centroid
-       Vector3r 
diffClumpAngularAccel=diagDiv(m,clumpRBP->inertia)+diagDiv((rb->se3.position-clumpRBP->se3.position).Cross(f),clumpRBP->inertia);
 
-       // damp increment of accels on the clump, using velocities of the clump 
MEMBER
-       
cundallDamp(ncb->dt,f,rb->velocity,diffClumpAccel,m,rb->angularVelocity,diffClumpAngularAccel);
-       // clumpRBP->{acceleration,angularAcceleration} are reset byt 
Clump::moveMembers, it is ok to just increment here
-       clumpRBP->acceleration+=diffClumpAccel;
-       clumpRBP->angularAcceleration+=diffClumpAngularAccel;
-       if(haveBins) 
velocityBins->binVelSqUse(memberId,VelocityBins::getBodyVelSq(rb));
-       #ifdef YADE_OPENMP
-               Real& thrMaxVSq=threadMaxVelocitySq[omp_get_thread_num()]; 
thrMaxVSq=max(thrMaxVSq,rb->velocity.SquaredLength());
-       #else
-               maxVelocitySq=max(maxVelocitySq,rb->velocity.SquaredLength());
-       #endif
-}
-
-void NewtonsDampedLaw::action(MetaBody * ncb)
-{
-       ncb->bex.sync();
-       Real dt=Omega::instance().getTimeStep();
-       maxVelocitySq=-1;
-       haveBins=(bool)velocityBins;
-       if(haveBins) velocityBins->binVelSqInitialize();
-
-       #ifdef YADE_OPENMP
-               FOREACH(Real& thrMaxVSq, threadMaxVelocitySq) { thrMaxVSq=0; }
-               const BodyContainer& bodies=*(ncb->bodies.get());
-               const long size=(long)bodies.size();
-               #pragma omp parallel for schedule(static)
-               for(long _id=0; _id<size; _id++){
-                       const shared_ptr<Body>& b(bodies[_id]);
-       #else
-               FOREACH(const shared_ptr<Body>& b, *ncb->bodies){
-       #endif
-                       RigidBodyParameters* rb = 
YADE_CAST<RigidBodyParameters*>(b->physicalParameters.get());
-                       const body_id_t& id=b->getId();
-                       // clump members are non-dynamic; we only get their 
velocities here
-                       if (!b->isDynamic || b->isClumpMember()){
-                               // FIXME: duplicated code from below; awaits 
https://bugs.launchpad.net/yade/+bug/398089 to be solved
-                               if(haveBins) 
{velocityBins->binVelSqUse(id,VelocityBins::getBodyVelSq(rb));}
-                               #ifdef YADE_OPENMP
-                                       Real& 
thrMaxVSq=threadMaxVelocitySq[omp_get_thread_num()]; 
thrMaxVSq=max(thrMaxVSq,rb->velocity.SquaredLength());
-                               #else
-                                       
maxVelocitySq=max(maxVelocitySq,rb->velocity.SquaredLength());
-                               #endif
-                               continue;
-                       }
-                       const Vector3r& m=ncb->bex.getTorque(id); const 
Vector3r& f=ncb->bex.getForce(id);
-
-                       if (b->isStandalone()){
-                               rb->acceleration=f/rb->mass;
-                               rb->angularAcceleration=diagDiv(m,rb->inertia);
-                               
cundallDamp(dt,f,rb->velocity,rb->acceleration,m,rb->angularVelocity,rb->angularAcceleration);
-                       }
-                       else if (b->isClump()){
-                               
rb->acceleration=rb->angularAcceleration=Vector3r::ZERO; // to make sure; 
should be reset in Clump::moveMembers
-                               // sum force on clump memebrs, add them to the 
clump itself
-                               FOREACH(Clump::memberMap::value_type mm, 
static_cast<Clump*>(b.get())->members){
-                                       handleClumpMember(ncb,mm.first,rb);
-                               }
-                               // at this point, forces from clump members are 
already summed up, this is just for forces applied to clump proper, if there 
are such
-                               Vector3r dLinAccel=f/rb->mass, 
dAngAccel=diagDiv(m,rb->inertia);
-                               
cundallDamp(dt,f,rb->velocity,dLinAccel,m,rb->angularVelocity,dAngAccel);
-                               rb->acceleration+=dLinAccel;
-                               rb->angularAcceleration+=dAngAccel;
-                       }
-
-                       // blocking DOFs
-                       if(rb->blockedDOFs==0){ /* same as: 
rb->blockedDOFs==PhysicalParameters::DOF_NONE */
-                               
rb->angularVelocity=rb->angularVelocity+dt*rb->angularAcceleration;
-                               rb->velocity=rb->velocity+dt*rb->acceleration;
-                       } else {
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_X)==0) rb->velocity[0]+=dt*rb->acceleration[0];
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_Y)==0) rb->velocity[1]+=dt*rb->acceleration[1];
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_Z)==0) rb->velocity[2]+=dt*rb->acceleration[2];
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_RX)==0) 
rb->angularVelocity[0]+=dt*rb->angularAcceleration[0];
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_RY)==0) 
rb->angularVelocity[1]+=dt*rb->angularAcceleration[1];
-                               if((rb->blockedDOFs & 
PhysicalParameters::DOF_RZ)==0) 
rb->angularVelocity[2]+=dt*rb->angularAcceleration[2];
-                       }
-
-                       // velocities are ready now, save maxima
-                               if(haveBins) 
{velocityBins->binVelSqUse(id,VelocityBins::getBodyVelSq(rb));}
-                               #ifdef YADE_OPENMP
-                                       Real& 
thrMaxVSq=threadMaxVelocitySq[omp_get_thread_num()]; 
thrMaxVSq=max(thrMaxVSq,rb->velocity.SquaredLength());
-                               #else
-                                       
maxVelocitySq=max(maxVelocitySq,rb->velocity.SquaredLength());
-                               #endif
-
-                       Vector3r axis = rb->angularVelocity;
-                       Real angle = axis.Normalize();
-                       Quaternionr q;
-                       q.FromAxisAngle ( axis,angle*dt );
-                       rb->se3.orientation = q*rb->se3.orientation;
-                       if(ncb->bex.getMoveRotUsed() && 
ncb->bex.getRot(id)!=Vector3r::ZERO){ Vector3r r(ncb->bex.getRot(id)); Real 
norm=r.Normalize(); q.FromAxisAngle(r,norm); 
rb->se3.orientation=q*rb->se3.orientation; }
-                       rb->se3.orientation.Normalize();
-
-                       rb->se3.position += rb->velocity*dt + 
ncb->bex.getMove(id);
-
-                       if(b->isClump()) 
static_cast<Clump*>(b.get())->moveMembers();
-       }
-       #ifdef YADE_OPENMP
-               FOREACH(const Real& thrMaxVSq, threadMaxVelocitySq) { 
maxVelocitySq=max(maxVelocitySq,thrMaxVSq); }
-       #endif
-       if(haveBins) velocityBins->binVelSqFinalize();
-}
-

Deleted: trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.hpp
===================================================================
--- trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.hpp     2009-07-14 
15:41:54 UTC (rev 1864)
+++ trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.hpp     2009-07-14 
21:03:51 UTC (rev 1865)
@@ -1,65 +0,0 @@
-/*************************************************************************
- Copyright (C) 2008 by Bruno Chareyre                                   *
-*  [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/StandAloneEngine.hpp>
-#include<Wm3Vector3.h>
-#ifdef YADE_OPENMP
-       #include<omp.h>
-#endif
-
-/*! An engine that can replace the usual series of engines used for 
integrating the laws of motion.
-
-This engine is faster because it uses less loops and less dispatching 
-
-The result is almost the same as with :
--NewtonsForceLaw
--NewtonsMomentumLaw
--LeapFrogPositionIntegrator
--LeapFrogOrientationIntegrator
--CundallNonViscousForceDamping
--CundallNonViscousMomentumDamping
-
-...but the implementation of damping is slightly different compared to 
CundallNonViscousForceDamping+CundallNonViscousMomentumDamping. Here, damping 
is dependent on predicted (undamped) velocity at t+dt/2, while the other 
engines use velocity at time t.
- 
-Requirements :
--All dynamic bodies must have physical parameters of type (or inheriting from) 
BodyMacroParameters
--Physical actions must include forces and moments
- 
-NOTE: Cundall damping affected dynamic simulation! See 
examples/dynamic_simulation_tests
- 
- */
-class RigidBodyParameters;
-class VelocityBins;
-
-class NewtonsDampedLaw : public StandAloneEngine{
-       inline void cundallDamp(const Real& dt, const Vector3r& f, const 
Vector3r& velocity, Vector3r& acceleration, const Vector3r& m, const Vector3r& 
angularVelocity, Vector3r& angularAcceleration);
-       void handleClumpMember(MetaBody* ncb, const body_id_t memberId, 
RigidBodyParameters* clumpRBP);
-       bool haveBins;
-       public:
-               ///damping coefficient for Cundall's non viscous damping
-               Real damping;
-               /// store square of max. velocity, for informative purposes; 
computed again at every step
-               Real maxVelocitySq;
-               #ifdef YADE_OPENMP
-                       vector<Real> threadMaxVelocitySq;
-               #endif
-               /// velocity bins (not used if not created)
-               shared_ptr<VelocityBins> velocityBins;
-               virtual void action(MetaBody *);                
-               NewtonsDampedLaw(): damping(0.2), maxVelocitySq(-1){
-                       #ifdef YADE_OPENMP
-                               
threadMaxVelocitySq.resize(omp_get_max_threads());
-                       #endif
-               }
-
-       REGISTER_ATTRIBUTES(StandAloneEngine,(damping)(maxVelocitySq));
-       REGISTER_CLASS_AND_BASE(NewtonsDampedLaw,StandAloneEngine);
-};
-REGISTER_SERIALIZABLE(NewtonsDampedLaw);
-

Copied: trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.cpp (from rev 
1863, trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.cpp)


Property changes on: trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.cpp
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.hpp (from rev 
1863, trunk/pkg/dem/Engine/DeusExMachina/NewtonsDampedLaw.hpp)


Property changes on: trunk/pkg/dem/Engine/StandAloneEngine/NewtonsDampedLaw.hpp
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: trunk/pkg/dem/SConscript
===================================================================
--- trunk/pkg/dem/SConscript    2009-07-14 15:41:54 UTC (rev 1864)
+++ trunk/pkg/dem/SConscript    2009-07-14 21:03:51 UTC (rev 1865)
@@ -950,7 +950,7 @@
 
 
 env.SharedLibrary('NewtonsDampedLaw',
-               ['Engine/DeusExMachina/NewtonsDampedLaw.cpp'],
+               ['Engine/StandAloneEngine/NewtonsDampedLaw.cpp'],
                LIBS=env['LIBS']+['yade-serialization',
                        'yade-base',            
                        'yade-multimethods',


_______________________________________________
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