← Back to team overview

yade-users team mailing list archive

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.