yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #26572
Re: [Question #699342]: generate two different radius particle in a box
Question #699342 on Yade changed:
https://answers.launchpad.net/yade/+question/699342
Robert Caulk proposed the following answer:
Hello,
No, you cannot use randomDensePack to do this. But you can very easily
replicate randomDensePack action by increasing particle radii yourself
according to the stresses on the walls.
Add a pyrunner to your engines list:
PyRunner(command='addStress()',dead=1,iterPeriod=10,label='loadSample')
Then add the following function to your script:
## Set mn,mx. They should be the values you used to create the aabbWalls. 'walls' should be a list of the ids of your walls.
multiplier = 1.001
def addStress():
global multiplier
preStress = 5e3
maxMultiplier=1.001
growParticles(multiplier)
pressure = 0
for i in walls:
f = O.bodies[i]
a = mn[0]*mn[1]
force = O.forces.f(f.id,sync=True)
pressure = pressure + np.linalg.norm(force)/a
stabCoeff = abs((abs(pressure/len(walls))-preStress)/preStress)
facetStress = abs(pressure/len(walls))
print('unbalanced force:',unbalancedForce(),'avg top pressure ',facetStress ,'stability coeff ',stabCoeff)
multiplier = 1+(preStress-facetStress)/preStress * (maxMultiplier-1.)
if multiplier <= 0.95: multiplier=0.95
print('multiplier adjusted up to ', multiplier)
if stabCoeff<0.001:
print('packing finished, export it to file ;)')
loadSample.dead = 1
O.pause()
I hope it is obvious that this should not be active during any scientific simulation, this is just to achieve a dense packing. Best practice would be to export this packing to file using export.textExt() and then import that packing into whatever you need to do. I leave the export/import up to you as homework ;).
Cheers,
Robert
--
You received this question notification because your team yade-users is
an answer contact for Yade.