problems in uniax.py
Hello:
I have some problems in the example uniax.py.
1. I found the number (by the command 'print len(O.bodies)') in the cell isn't the same as the value appointed by sphereInCell. When I change the shape of the packing (i.e. the values in pack.inHyperbol
2. How to prepare a 2D packing using pack.randomDens
Any kind of help is appreciated. Thanks.
Here is the scripts and error:
scripts:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
from yade import plot,pack,timing
import time, sys, os, copy
readParamsFromT
young=24e9,
poisson=.2,
sigmaT=3.5e6,
frictionAngle=
epsCrackOnset=
relDuctility=30,
intRadius=1.5,
dtSafety=.8,
damping=0.4,
strainRateTens
strainRateComp
setSpeeds=True,
# 1=tension, 2=compression (ANDed; 3=both)
doModes=3,
specimenLength
sphereRadius=
# isotropic confinement (should be negative)
isoPrestress=0,
)
from yade.params.table import *
if 'description' in O.tags.keys(): O.tags[
# make geom; the dimensions are hard-coded here; could be in param table if desired
# z-oriented hyperboloid, length 20cm, diameter 10cm, skirt 8cm
# using spheres 7mm of diameter
concreteId=
sps=SpherePack()
sp=pack.
#sp=pack.
sp.toSimulation
bb=uniaxialTest
negIds,
O.dt=dtSafety*
print 'Timestep',O.dt
mm,mx=[pt[axis] for pt in aabbExtrema()]
coord_25,
area_25,
O.engines=[
ForceResetter(),
InsertionSortC
InteractionLoop(
[Ig2_
[Ip2_
[Law2_
),
NewtonIntegrat
CpmStateUpdate
UniaxialStrain
PyRunner(
PyRunner(
]
#O.miscParams=
# plot stresses in ¼, ½ and ¾ if desired as well; too crowded in the graph that includes confinement, though
plot.plots=
O.saveTmp(
O.timingEnabled
global mode
mode='tension' if doModes & 1 else 'compression'
def initTest():
global mode
print "init"
if O.iter>0:
O.wait();
O.loadTmp(
print "Reversing plot data"; plot.reverseData()
else: plot.plot(
strainer.
try:
from yade import qt
renderer=
renderer.
except ImportError: pass
print "init done, will now run."
O.step(); # to create initial contacts
# now reset the interaction radius and go ahead
ss2sc.
is2aabb.
O.run()
def stopIfDamaged():
global mode
if O.iter<2 or not plot.data.
sigma,
extremum=
minMaxRatio=0.5 if mode=='tension' else 0.5
if extremum==0: return
import sys; sys.stdout.flush()
if abs(sigma[
if mode=='tension' and doModes & 2: # only if compression is enabled
mode=
O.save(
print "Saved /tmp/uniax-
print "Damaged, switching to compression... "; O.pause()
# important! initTest must be launched in a separate thread;
# otherwise O.load would wait for the iteration to finish,
# but it would wait for initTest to return and deadlock would result
import thread; thread.
return
else:
print "Damaged, stopping."
ft,fc=
print 'Strengths fc=%g, ft=%g, |fc/ft|
title=
print 'gnuplot'
print 'Bye.'
O.pause()
#sys.exit(0) # results in some threading exception
def addPlotData():
yade.plot.
'sigma.
'sigma.
'sigma.
})
plot.plot(
#O.run()
initTest()
waitIfBatch()
error:
Welcome to Yade 2018.02b
TCP python prompt on localhost:9000, auth cookie `uaekcd'
XMLRPC info provider on http://
Running script uniax.py
Traceback (most recent call last):
File "/usr/bin/yade", line 182, in runScript
execfile(
File "uniax.py", line 78, in <module>
sp=
File "/usr/lib/
if max(dim)
TypeError: 'int' object is not iterable
Question information
- Language:
- English Edit question
- Status:
- Solved
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Solved by:
- Zhoufeng Shi
- Solved:
- 2020-09-20
- Last query:
- 2020-09-20
- Last reply:
- 2020-09-20
|
#1 |
hi lifan,
for Q2, please check #660243 for 2d random dense pack. it provides some instruction on how to modify the randomDensePack code to make it 2d.
As for Q1, you can also try increasing the periodic cell size in the randomDensePack code and the spheresincell will increase to the value as requested.
Chen Lifan (chenlifan) said : | #2 |
Thanks Zhoufeng Shi, that solved my question.
Jan Stránský (honzik) said : | #3 |
Hello,
1)
if spheresInCell > 0, then periodic compaction is created, containing spheresInCell number of particles.
This periodic packing is then copied wherever needed and then cropped to form the desired packing.
So, spheresInCell is independent of number of particles in the resulting packing.
It is especially advantageous for large initial packing (but is usable universally), e.g. 1M particles, where randomDensePack with 1M particles would take much time. This way, you can generate a periodic cube with e.g. 1k particles and quickly copy it in the space.
With this approach, the packing generation has "almost" O(1) complexity.
**Personally** I do not use randomDensePack without spheresInCell parameter
cheers
Jan
Zhoufeng Shi (zhoufeng-s) said : | #4 |
hi Jan
if the spheresInCell is not approximately equal to the number of particles in resulting packing(eg. sphereincel/final particles in packing =100), there seems to be clear pattern which is a kind of regularity that I don't desire. So what is the best ratio between sphereInCell and final particle number to make sure its randomness and save computation cost at the same time?
regards,
zhoufeng
Jan Stránský (honzik) said : | #5 |
> there seems to be clear pattern which is a kind of regularity
there **is** a regular pattern, by design (one periodic packing is copied wherever needed to fill the final packing)
> So what is the best ratio ...
You have to choose. According to your definition of "best", "randomness" etc.
cheers
Jan
Zhoufeng Shi (zhoufeng-s) said : | #6 |
thanks Jan, that is very clear