Hi Chiara,

thanks for your comment. I am not after viscous damping either. But I think 
the current implementation does exactly what I want, it's the same as the PFC 
option b_damp(). So I can deactivate the damping coefficient for individual 
bodies.

I can commit the code if anyone is interested , after the diff has been 
approved ;-)

Klaus

On Mon, 23 Jan 2012 08:44:02 PM Chiara wrote:
> On 23/01/12 00:12, Klaus Thoeni wrote:
> > Hi Bruno, hi Anton,
> > 
> > I think density scaling is not what I am looking for since I am
> > interested in real dynamic simulations. I need different damping
> > parameters in NewtonIntegrator for the block and the mesh. I have to
> > consider free flight under gravity so damping=0 (and I am interested in
> > the real flight time). For the mesh I have to consider additional energy
> > absorption which is not considered in my model via damping.
> 
> If you are not after any density scaling, why damping in
> NewtonIntegrator should be acceptable in a realistic dynamic situation?
> Would not be easier/more meaningful for you to implement damping inside
> your contact model? Sorry, just curious.
> Chiara
> 
> > It is similar to b_damp() in PFC which is used to remove damping for
> > certain particle. I implemented it the same way now. The state has a
> > member which is true by default which means that damping is used. It can
> > be set to false and damping=0 will be used for this particle. So
> > basically damping in NewtonIntegrator can be activated and deactivated
> > for individual particles.
> > 
> > @Anton: It has to be checked for all particles.
> > 
> > Here is the diff of my latest implementation, tell me what you think:
> > 
> > === modified file core/State.hpp
> > --- core/State.hpp  2011-02-14 08:05:09 +0000
> > +++ core/State.hpp  2012-01-22 23:56:31 +0000
> > @@ -59,7 +59,8 @@
> > 
> >             ((Vector3r,inertia,Vector3r::Zero(),,"Inertia of associated 
> > body, 
in
> > 
> > local coordinate system."))
> > 
> >             ((Vector3r,refPos,Vector3r::Zero(),,"Reference position"))
> >             ((Quaternionr,refOri,Quaternionr::Identity(),,"Reference
> >             orientation"))
> > 
> > -           ((unsigned,blockedDOFs,,,"[Will be overridden]")),
> > +           ((unsigned,blockedDOFs,,,"[Will be overridden]"))
> > +           ((bool,isDamped,true,,"Damping in :yref:`Newtonintegrator` can 
> > be
> > deactivated for individual particles by setting this variable to FALSE.
> > E.g. damping is inappropriate for particles in free flight under gravity
> > but it might still be applicable to other particles in the same
> > simulation.")),
> > 
> >             /* additional initializers */
> >             
> >                     ((pos,se3.position))
> >                     ((ori,se3.orientation)),
> > 
> > === modified file pkg/dem/NewtonIntegrator.cpp
> > --- pkg/dem/NewtonIntegrator.cpp    2011-11-30 17:39:33 +0000
> > +++ pkg/dem/NewtonIntegrator.cpp    2012-01-22 23:56:31 +0000
> > @@ -11,17 +11,18 @@
> > 
> >   #include<yade/pkg/dem/Clump.hpp>
> >   #include<yade/pkg/common/VelocityBins.hpp>
> >   #include<yade/lib/base/Math.hpp>
> >   
> >   YADE_PLUGIN((NewtonIntegrator));
> >   CREATE_LOGGER(NewtonIntegrator);
> >   
> >   // 1st order numerical damping
> > 
> > -void NewtonIntegrator::cundallDamp1st(Vector3r&  force, const Vector3r& 
> > vel){ -     for(int i=0; i<3; i++)
> > force[i]*=1-damping*Mathr::Sign(force[i]*vel[i]); +void
> > NewtonIntegrator::cundallDamp1st(Vector3r&  force, const Vector3r&  vel,
> > const Real&  dampcoeff){
> > +   for(int i=0; i<3; i++)
> > force[i]*=1-dampcoeff*Mathr::Sign(force[i]*vel[i]);
> > 
> >   }
> >   // 2nd order numerical damping
> > 
> > -void NewtonIntegrator::cundallDamp2nd(const Real&  dt, const Vector3r& 
> > force, const Vector3r&  vel, Vector3r&  accel){
> > -   for(int i=0; i<3; i++) accel[i]*= 1 - damping*Mathr::Sign (
> > force[i]*(vel[i] + 0.5*dt*accel[i]) );
> > +void NewtonIntegrator::cundallDamp2nd(const Real&  dt, const Vector3r& 
> > force, const Vector3r&  vel, Vector3r&  accel, const Real&  dampcoeff){
> > +   for(int i=0; i<3; i++) accel[i]*= 1 - dampcoeff*Mathr::Sign (
> > force[i]*(vel[i] + 0.5*dt*accel[i]) );
> > 
> >   }
> >   
> >   Vector3r NewtonIntegrator::computeAccel(const Vector3r&  force, const
> >   Real&
> > 
> > mass, int blockedDOFs){
> > @@ -39,11 +40,13 @@
> > 
> >   void NewtonIntegrator::updateEnergy(const shared_ptr<Body>&  b, const
> >   State*
> > 
> > state, const Vector3r&  fluctVel, const Vector3r&  f, const Vector3r& 
> > m){
> > 
> >     assert(b->isStandalone() || b->isClump());
> > 
> > -   // always positive dissipation, by-component: |F_i|*|v_i|*damping*dt 
(|
> > T_i|*|ω_i|*damping*dt for rotations)
> > -   if(damping!=0.){
> > -           scene->energy-
> > 
> >> add(fluctVel.cwise().abs().dot(f.cwise().abs())*damping*scene-
> >> dt,"nonviscDamp",nonviscDampIx,/*non-incremental*/false);
> > 
> > +   // check if damping for this body is activated
> > +   Real dampcoeff=(state->isDamped ? damping : 0);
> > +   // always positive dissipation, by-component: |F_i|*|v_i|*dampcoeff*dt
> > (| T_i|*|ω_i|*dampcoeff*dt for rotations)
> > +   if(dampcoeff!=0.){
> > +           scene->energy-
> > 
> >> add(fluctVel.cwise().abs().dot(f.cwise().abs())*dampcoeff*scene-
> >> dt,"nonviscDamp",nonviscDampIx,/*non-incremental*/false);
> >> 
> >             // when the aspherical integrator is used, torque is damped 
instead
> >             of
> > 
> > ang acceleration; this code is only approximate
> > -           scene->energy->add(state-
> > 
> >> angVel.cwise().abs().dot(m.cwise().abs())*damping*scene-
> >> dt,"nonviscDamp",nonviscDampIx,false);
> > 
> > +           scene->energy->add(state-
> > 
> >> angVel.cwise().abs().dot(m.cwise().abs())*dampcoeff*scene-
> >> dt,"nonviscDamp",nonviscDampIx,false);
> >> 
> >     }
> >     // kinetic energy
> >     Real Etrans=.5*state->mass*fluctVel.squaredNorm();
> > 
> > @@ -106,9 +109,13 @@
> > 
> >     YADE_PARALLEL_FOREACH_BODY_BEGIN(const shared_ptr<Body>&  b,
> >     scene->bodies)
> > 
> > {
> > 
> >                     // clump members are handled inside clumps
> >                     if(unlikely(b->isClumpMember())) continue;
> > 
> > -
> > +
> > 
> >                     State* state=b->state.get(); const Body::id_t&  
> > id=b->getId();
> >                     Vector3r f=gravity*state->mass, m=Vector3r::Zero();
> > 
> > +
> > +                   // check if damping for this body is activated
> > +                   Real dampcoeff=(state->isDamped ? damping : 0);
> > +
> > 
> >                     // clumps forces
> >                     if(b->isClump()) {
> >                     
> >                             b->shape-
> >> 
> >> cast<Clump>().addForceTorqueFromMembers(state,scene,f,m);
> > 
> > @@ -146,7 +153,7 @@
> > 
> >                     if (state->blockedDOFs!=State::DOF_ALL) {
> >                     
> >                             // linear acceleration
> >                             Vector3r 
> > linAccel=computeAccel(f,state->mass,state-
>blockedDOFs);
> > 
> > -                           cundallDamp2nd(dt,f,fluctVel,linAccel);
> > +                           
> > cundallDamp2nd(dt,f,fluctVel,linAccel,dampcoeff);
> > 
> >                             //This is the convective term, appearing in the 
> > time 
derivation
> > 
> > of Cundall/Thornton expression (dx/dt=velGrad*pos ->
> > d²x/dt²=dvelGrad/dt*pos+velGrad*vel), negligible in many cases but not
> > for high speed large deformations (gaz or turbulent flow).
> > 
> >                             linAccel+=prevVelGrad*state->vel;
> >                             //finally update velocity
> > 
> > @@ -154,11 +161,11 @@
> > 
> >                             // angular acceleration
> >                             if(!useAspherical){ // uses angular velocity
> >                             
> >                                     Vector3r 
> > angAccel=computeAngAccel(m,state->inertia,state-
> >> 
> >> blockedDOFs);
> > 
> > -                                   
> > cundallDamp2nd(dt,m,state->angVel,angAccel);
> > +                                   
> > cundallDamp2nd(dt,m,state->angVel,angAccel,dampcoeff);
> > 
> >                                     state->angVel+=dt*angAccel;
> >                             
> >                             } else { // uses torque
> >                             
> >                                     for(int i=0; i<3; i++) 
> > if(state->blockedDOFs&
> > 
> > State::axisDOF(i,true)) m[i]=0; // block DOFs here
> > -                                   cundallDamp1st(m,state->angVel);
> > +                                   
> > cundallDamp1st(m,state->angVel,dampcoeff);
> > 
> >                             }
> >                     
> >                     }
> > 
> > === modified file pkg/dem/NewtonIntegrator.hpp
> > --- pkg/dem/NewtonIntegrator.hpp    2011-09-20 10:58:18 +0000
> > +++ pkg/dem/NewtonIntegrator.hpp    2012-01-12 05:26:05 +0000
> > @@ -22,8 +22,8 @@
> > 
> >   class VelocityBins;
> >   
> >   class NewtonIntegrator : public GlobalEngine{
> > 
> > -   inline void cundallDamp1st(Vector3r&  force, const Vector3r&  vel);
> > -   inline void cundallDamp2nd(const Real&  dt, const Vector3r&  force,
> > const Vector3r&  vel, Vector3r&  accel);
> > +   inline void cundallDamp1st(Vector3r&  force, const Vector3r&  vel,
> > const Real&  dampcoeff);
> > +   inline void cundallDamp2nd(const Real&  dt, const Vector3r&  force,
> > const Vector3r&  vel, Vector3r&  accel, const Real&  dampcoeff);
> > 
> >     bool haveBins;
> >     inline void leapfrogTranslate(State*, const Body::id_t&  id, const
> >     Real&
> > 
> > dt); // leap-frog translate
> > 
> >     inline void leapfrogSphericalRotate(State*, const Body::id_t&  id,
> >     const
> > 
> > Real&  dt); // leap-frog rotate of spherical body
> > 
> > On Fri, 20 Jan 2012 02:06:51 AM Bruno Chareyre wrote:
> >> Klaus,
> >> If what you want is to increase the timestep (because your steel-net
> >> induces very small dt, right?), this change will not work. You need to
> >> modify density in the good place in Newton, not damping. It can be done
> >> by adding dscale parameter in the material class (hence no need to check
> >> if it exists), which would be 1 by default, hence no need to check if it
> >> is NaN.
> >> isnan is not in C++ standard, by the way. I know it is used in many
> >> places but we should avoid it if possible. I'm also not sure of the cost
> >> of this function, it may be more expensive than comparing two doubles.
> >> 
> >> Bruno
> >> 
> >> 
> >> _______________________________________________
> >> Mailing list: https://launchpad.net/~yade-dev
> >> Post to     : yade-dev@lists.launchpad.net
> >> Unsubscribe : https://launchpad.net/~yade-dev
> >> More help   : https://help.launchpad.net/ListHelp
> > 
> > _______________________________________________
> > Mailing list: https://launchpad.net/~yade-dev
> > Post to     : yade-dev@lists.launchpad.net
> > Unsubscribe : https://launchpad.net/~yade-dev
> > More help   : https://help.launchpad.net/ListHelp
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~yade-dev
> Post to     : yade-dev@lists.launchpad.net
> Unsubscribe : https://launchpad.net/~yade-dev
> More help   : https://help.launchpad.net/ListHelp

_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : yade-dev@lists.launchpad.net
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to