# How to reduce average particle velocity of a packing

Hi,

I'd like to ask that how to reduce the average velocity of all the particles at a confined situation without any change in particle connections.

The following MWE shows the way I came up with to reduce the average velocity: Firstly, carry out the compaction process to reach target confining pressure (100 kPa) with periodic boundary. Then switch to a calmdown process to reduce the average velocity of all the particles by increasing damping coefficient.

However, one problem arises with this calmdown process: there are some particle interactions lost during this process. As you may check by running the MWE (it will take less than 1 minute in general): before the calmdown process, there are 30845 interactions, but after the calmdowm process there are 30766 interactions, Which is not I want.

Do you have any idea about how to reduce the average velocity while keeping the packing fabric the same?

Thanks

Leonard

MWE:
###############
from __future__ import print_function
sigmaIso = -100e3
from yade import pack, qt, plot
mn,mx=Vector3(0,0,0),Vector3(0.07,0.14,0.07)
O.periodic = True
O.cell.setBox(.07,.14,.07)
sp = pack.SpherePack()
sp.makeCloud(mn,mx,-1,0.3333,num=6000, periodic=True)
sp.toSimulation()

particleId=[]
for i in O.bodies:
particleId.append(i.id)

newton=NewtonIntegrator(damping=0.2)

O.engines = [
ForceResetter(),
InsertionSortCollider([Bo1_Sphere_Aabb()]),
InteractionLoop([Ig2_Sphere_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()]),
PeriTriaxController(
label='triax',
goal=(sigmaIso, sigmaIso, sigmaIso),
dynCell=True,
maxStrainRate=(10, 10, 10),
maxUnbalanced=.1,
relStressTol=1e-3,
doneHook='compactionFinished()'
),
newton,
]

O.dt = .5 * PWaveTimeStep()
O.trackEnergy = True

def compactionFinished():
print('compaction finished')
print('Number of interactions before calmDown',len(O.interactions))
triax.doneHook = 'calmDown()'
print('average velocity before calmDown',avgVel_norm(particleId))
newton.damping=0.95
print('Now please click run button to start calmdown process')

def avgVel_norm(idList):
vel=0
avg=0
for i in idList:
vel+=O.bodies[i].state.vel.norm()
avg=vel/len(idList)
return avg

def calmDown():
print('avgVel_norm',avgVel_norm(particleId),'syy',triax.stress[1])
O.run(1000,False)
# print("after run")
if avgVel_norm(particleId) <0.0025:
O.pause()
print('Number of interactions after calmDown',len(O.interactions))

O.run()

## Question information

Language:
English Edit question
Status:
Solved
For:
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
Last query:
 Revision history for this message Jan Stránský (honzik) said on 2021-10-18: #1

Hello,

firstly, WHY do you want to reduce average particle velocity?

of course, if you call O.run in calmDown, the model evolves, possibly changing the interactions (as the particle move).

Why not simply
###
for b in O.bodies:
b.state.vel *= someFactor # possibly 0
###
?

Cheers
Jan

 Revision history for this message Leonard (z2521899293) said on 2021-10-18: #2

Hi Jan,

>>Why do you want to reduce average particle velocity?
I want to make an attempt to look at the wave propagation on a sand packing, by modelling bender element test. I.e., a part of particles are treated as the transducer (whose velocity is controlled by the input signal), and a part of particles are treated as receiver (whose velocity are monitored during the process).

As it is generally mentioned, for instance see section 3.2 in [1] and section 2.2 in [2], the input amplitude velocity is a small value (e.g., 1e-3 m/s) which preserves a very small strain regime, reducing average particle velocity allows us investigating the wave propagation with less effect from the original velocity of particles. Thereby, before the wave propagation test,a relaxation stage was conducted to remove kinetic energy of particles and hold the stress state stably.

>>b.state.vel *= someFactor # possibly 0
Yes, if I understand correctly, using this way can fully control the velocity of particles, but the velocity of these particles will not be affected (i.e., the velocity is unchanged), which is not suitable for the case I described above.

Do you have any ideas to remove kinetic energy/ reduce velocity of particles?

Thanks

Leonard

[1]Tang, X., and J. Yang. "Wave propagation in granular material: What is the role of particle shape?." Journal of the Mechanics and Physics of Solids 157 (2021): 104605.

[2]Li, Yang, Masahide Otsubo, and Reiko Kuwano. "DEM analysis on the stress wave response of spherical particle assemblies under triaxial compression." Computers and Geotechnics 133 (2021): 104043.

 Revision history for this message Jan Stránský (honzik) said on 2021-10-18: #3

>>b.state.vel *= someFactor # possibly 0
> Yes, if I understand correctly, using this way can fully control the velocity of particles

yes

> but the velocity of these particles will not be affected (i.e., the velocity is unchanged), which is not suitable for the case I described above.

this I do not understand.
You can set particle velocities to whatever value.
You can also set selectively velocities according to different rules based on different regions/groups of particles.

> Do you have any ideas to remove kinetic energy/ reduce velocity of particles?

you can remove kinetic energy by:
- reducing mass
- reducing velocity

as discussed above, you can set velocities to whatever values.
Since you want to preserve interactions, i.e. you want no running, I see no other option than modifying state.vel

Cheers
Jan

 Revision history for this message Leonard (z2521899293) said on 2021-10-20: #4

Thanks Jan Stránský, that solved my question.