← Back to team overview

yade-users team mailing list archive

Re: [Question #294531]: Change colour of spheres when based on Movement

 

Question #294531 on Yade changed:
https://answers.launchpad.net/yade/+question/294531

    Status: Open => Answered

Jan Stránský proposed the following answer:
Hi Clinton,
create a separate function and separate PyRunner with desired period for
coloring your particles. Then everything works as expected :-) Do not put
it inside functions of totally different purpose.
In your first example, checkUnbalanced was called 2x in my case, in your
second example checkUnbalancedtunnelmovement was called not even once.
Hence no changes were visible
cheers
Jan


2016-05-29 1:32 GMT+02:00 Clinton Schramm <
question294531@xxxxxxxxxxxxxxxxxxxxx>:

> Question #294531 on Yade changed:
> https://answers.launchpad.net/yade/+question/294531
>
> Clinton Schramm gave more information on the question:
> Sorry ignore that previous post. It is a bad example and obviously isn't
> running the way it was supposed to.  Here is the actual problem code.
>
> readParamsFromTable(rMean=.01,rRelFuzz=.003,maxLoad=1e5,minLoad=1e4)
> # make rMean, rRelFuzz, maxLoad accessible directly as variables later
> from yade.params.table import *
> numspherespack1=1000
> numspherespack2 = 173
> Zextentbox = 0.200
> width = 0.154
> length = 0.441
> cylinderheight = 0.130
> cylinderradius = 0.05
> nosides = 10
>
> #Set materials for spheres, and box
> O.materials.append(FrictMat(young=78.71e6,poisson=0.27,frictionAngle=.5934,density=2600,label='spheres'))
> #Need to find youngs modulus
>
> O.materials.append(FrictMat(young=30e9,poisson=0.2,frictionAngle=0,label='walls'))
>
> # create box with free top, and ceate loose packing inside the box
> from yade import pack, plot
> O.bodies.append(geom.facetBox((0,0,0),(width/2,length/2,Zextentbox),wallMask=31,material='walls'))
>  #(centre),(x,y,z) Old Box with correct dimensions
>
> TBM=O.bodies.append(geom.facetCylinder(center=(-0.077,.1555,-.100),radius=cylinderradius,height=cylinderheight,orientation=Quaternion((1,0,0),3.1415926/2),segmentsNumber=nosides,wallMask=7,angleRange=None,closeGap=False,wire=False,highlight=False))
>
> sp=pack.SpherePack()
> sp.makeCloud((-0.077,0.180,-0.200),(0.077,-0.200,-0.155),rMean=rMean,rRelFuzz=rRelFuzz,num=numspherespack2)
> #Cloud for under tunnel
> #May need to make cloud larger tos full up the model
> sp.makeCloud((-0.077,0.180,-0.05),(0.077,-0.180,0.550),rMean=rMean,rRelFuzz=rRelFuzz,num=numspherespack1)
> #Move cloud in +z 400
> sp.toSimulation(material='spheres',color=(0,1,1))
>
> O.engines=[
>    ForceResetter(),
>    # sphere, facet, wall
>
>  InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]),
>    InteractionLoop(
>       # the loading plate is a wall, we need to handle sphere+sphere,
> sphere+facet, sphere+wall
>
> [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()],
>       [Ip2_FrictMat_FrictMat_FrictPhys()],
>       [Law2_ScGeom_FrictPhys_CundallStrack()]
>    ),
>    NewtonIntegrator(gravity=(0,0,-9.81),damping=0.5),
>
>  #SnapshotEngine(iterPeriod=300,fileBase='/home/clinton/Desktop/Video/1/Centri-',label='cent'),
>    # the label creates an automatic variable referring to this engines
>    PyRunner(command='checkUnbalanced1()',iterPeriod = 200,label='checker'),
> ]
> O.dt=.5*PWaveTimeStep()
>
> # the following checkUnbalanced, unloadPlate and stopUnloading functions
> are all called by the 'checker'
> # (the last engine) one after another; this sequence defines progression
> of different stages of the
> # simulation, as each of the functions, when the condition is satisfied,
> updates 'checker' to call
> # the next function when it is run from within the simulation next time
>
> # check whether the gravity deposition has already finished
> # if so, add wall on the top of the packing and start the oedometric test
> def checkUnbalanced1():
>    # at the very start, unbalanced force can be low as there is only few
> contacts, but it does not mean the packing is stable
>    if O.iter<5000: return
>    # the rest will be run only if unbalanced is < .1 (stabilized packing)
>    if unbalancedForce()>.1: return
>    # add plate at the position on the top of the packing
>    # the maximum finds the z-coordinate of the top of the topmost particle
>    O.bodies.append(wall(max([b.state.pos[2]+b.shape.radius for b in
> O.bodies if isinstance(b.shape,Sphere)]),axis=2,sense=-1,material='walls'))
>    global plate        # without this line, the plate variable would only
> exist inside this function
>    plate=O.bodies[-1]  # the last particles is the plate
>    # Wall objects are "fixed" by default, i.e. not subject to forces
>    # prescribing a velocity will therefore make it move at constant
> velocity (downwards)
>    plate.state.vel=(0,0,-.7)
>    # start plotting the data now, it was not interesting before
>    #O.engines=O.engines+[PyRunner(command='addPlotData()',iterPeriod=200)]
>    # next time, do not call this function anymore, but the next one
> (unloadPlate) instead
>    checker.command='unloadPlate1()'
>
> def unloadPlate1():
>    # if the force on plate exceeds maximum load, start unloading
>    if abs(O.forces.f(plate.id)[2])>maxLoad :
>       plate.state.vel*=-3
>       # next time, do not call this function anymore, but the next one
> (stopUnloading) instead
>       checker.command='stopUnloading()'
>
> def stopUnloading():
>
>    if abs(O.forces.f(plate.id)[2])<minLoad:
>         plate.state.vel*=0
>         areacylinder =
> (.5*nosides*cylinderradius**2*(sin(degrees(360)/10)))/2
>         Volcylinder = areacylinder*cylinderheight
>         height = max([b.state.pos[2]+b.shape.radius for b in O.bodies if
> isinstance(b.shape,Sphere)])+Zextentbox
>         print 'Height of heighest sphere is: ',height
>         v1=Volcylinder+sum([4./3.*pi*(b.shape.radius)**3. for b in
> O.bodies if isinstance(b.shape,Sphere)])
>         v2=width*length*height
>         Voidratio=(v2-v1)/v2*100.
>         print'The Void Ratio:',Voidratio,'%','This is the second one'
>
>         checker.command='checkUnbalancedtunnelmovement()'
>
> def checkUnbalancedtunnelmovement():
>
> O.engines=O.engines+[TranslationEngine(translationAxis=[0,1,0],velocity=.08,ids=TBM)]
>         # start plotting the data now, it was not interesting before
>
> #O.engines=O.engines+[PyRunner(command='addPlotDataForceTunnel()',iterPeriod=200)]
>         # we use it below to changefor s in O.bodies if
> isinstance(s.shape,Sphere):
>         global CylinderforceX,  CylinderforceY, CylinderforceZ
>
>         for s in O.bodies:
>
> s.shape.color=scalarOnColorScale(s.state.displ().norm(),0,1)
>                 #print 0.1*s.state.displ()
>
> #s.shape.color=scalarOnColorScale(0.1*s.state.displ().norm(),0.1*s.state.displ().norm(),0.1*s.state.displ().norm())
>                 # for changing color based on the movement of sheres. its
> attributes from the functions called
>         #print 'Change'
>         CylinderforceX =
> utils.sumForces([10,14,16,22,26,30,34,36,42,46],(1,0,0))
>         CylinderforceY =
> utils.sumForces([10,14,16,22,26,30,34,36,42,46],(0,1,0))
>         CylinderforceZ =
> utils.sumForces([10,14,16,22,26,30,34,36,42,46],(0,0,1))
>
>         #Cylindernormalforce =
> sumFacetNormalForces([10,14,16,22,26,30,34,36,42,46],1)
>         print 'The sum of normal forces are: ',Cylindernormalforce
>
>
> plot.addData(CylinderforceX=CylinderforceX,tx=(O.bodies[20].state.pos[1]-O.bodies[20].state.refPos[1]),CylinderforceY=CylinderforceY,ty=(O.bodies[20].state.pos[1]-O.bodies[20].state.refPos[1]),CylinderforceZ=CylinderforceZ,tz=(O.bodies[20].state.pos[1]-O.bodies[20].state.refPos[1]),Cylindernormalforce=Cylindernormalforce,t=(O.bodies[20].state.pos[1]-O.bodies[20].state.refPos[1]),i=O.iter)
>         # start plotting the data now, it was not interesting before
>
> #O.engines=O.engines+[PyRunner(command='addPlotDataForceTunnel()',iterPeriod=200)]
>         # next time, do not call this function anymore, but the next one
> (unloadPlate) instead
>         #O.pause()
>
> #plot.saveDataTxt(O.tags['d.id']+'.txt')
>
>
>
> def addPlotData():
>
>    if not isinstance(O.bodies[-1].shape,Wall):
>       plot.addData(); return
>    Fz=O.forces.f(plate.id)[2]
>
>  plot.addData(Fz=Fz,w=plate.state.pos[2]-plate.state.refPos[2],unbalanced=unbalancedForce(),i=O.iter)
>
> #Plotting the force on the tunnel face
> def addPlotDataForceTunnel():
>   print 'test => ',CylinderforceX
>
> plot.addData(CylinderforceX,tx=(O.bodies[20].state.pos[1]-O.bodies[20].state.refPos[1]),i=O.iter)
>
>
>
> # besides unbalanced force evolution, also plot the displacement-force
> diagram
>
> plot.plots={'tx':('CylinderforceX',),'ty':('CylinderforceY',),'tz':('CylinderforceZ',),'t':('Cylindernormalforce',)}
> #plot.plots={'i':('unbalanced',),'w':('Fz',),'tx':('Facex',)}
>
> plot.plot()
>
>
> #O.saveTmp()
> from yade import qt
> v=qt.View()
> v.eyePosition=(-1,0.3,0.25);v.upVector=(0,0,1); v.lookAt=(0,0,0);
> v.axes=False; v.sceneRadius=1.9
>
> --
> You received this question notification because your team yade-users is
> an answer contact for Yade.
>
> _______________________________________________
> Mailing list: https://launchpad.net/~yade-users
> Post to     : yade-users@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~yade-users
> More help   : https://help.launchpad.net/ListHelp
>

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.