Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Status: Answered => Open Huan is still having a problem: Thanks Karol, that solve my problem. # set color for sphere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == rMean1: #SP1 body.shape.color = (0,0,1) #blue if body.shape.radius == rMean2: #SP1 body.shape.color = (1,0,0) #red if body.shape.radius == rMean3: #SP2 body.shape.color = (0,1,0) #green if body.shape.radius == rMean4: #SP3 body.shape.color = (1,1,1) #white I try this to create color for the spheres, but it doesn't seems to work. Any idea? Also, I would like to use oedometric test on the simulation. My question is how would I know the load that I should use? -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Huan posted a new comment: Thanks Karol, that solve my problem. # set color for sphere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == rMean1: #SP1 body.shape.color = (0,0,1) #blue if body.shape.radius == rMean2: #SP1 body.shape.color = (1,0,0) #red if body.shape.radius == rMean3: #SP2 body.shape.color = (0,1,0) #green if body.shape.radius == rMean4: #SP3 body.shape.color = (1,1,1) #white I try this to create color for the spheres, but it doesn't seems to work. Any idea? Also, I would like to use oedometric test on the simulation. My question is how would I know the load that I should use? -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Status: Solved => Open Huan is still having a problem: Thanks Karol, that solve my problem. # set color for sphere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == rMean1: #SP1 body.shape.color = (0,0,1) #blue if body.shape.radius == rMean2: #SP1 body.shape.color = (1,0,0) #red if body.shape.radius == rMean3: #SP2 body.shape.color = (0,1,0) #green if body.shape.radius == rMean4: #SP3 body.shape.color = (1,1,1) #white I try this to create color for the spheres, but it doesn't seems to work. Any idea? Also, I would like to use oedometric test on the simulation. My question is how would I know the load that I should use? -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Status: Open => Solved Huan confirmed that the question is solved: Thanks Karol Brzezinski, that solved my question. -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Jan Stránský posted a new comment: Hello, > Also, I would like to use oedometric test on the simulation. My question is how would I know the load that I should use? plese open a new question for a new question ([1], point 5) Cheers Jan [1] https://www.yade-dem.org/wiki/Howtoask -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
[Yade-users] [Question #706553]: About simulating constant volume condition in a triaxial test
New question #706553 on Yade: https://answers.launchpad.net/yade/+question/706553 Hi, I would like to simulate a constant volume condition in a triaxial test (i.e., undrained triaxial test). In general, we can simulate the constant volume by setting triax controller like: triax.stressMask = 0 ## all strain control triax.goal2=rate triax.goal1=-0.5*rate triax.goal3=-0.5*rate For a constant volume condition, volumetric strain should be zero theoretically, while there could be some fluctuation in volumetric strain since it is a numerical simulation. It is OK if I only have a small amount of volumetric strain during the simulation (e.g. below 1e-5). However, I always get accumulation in volumetric strain to a relative large value (e.g. up to 1e-3), which doesn't satisfy the constant volume condition. Do you have any ideas about simulating a constant volume condition more precisely? For example, what parameters we can adjust to help us simulate constant volume more accurately? A MWE below modified from Bruno's triaxial script shows the accumulation in volumetric strain during undrained loading. from yade import pack nRead = readParamsFromTable( num_spheres=1000, compFricDegree=30, key='_triax_base_', unknownOk=True ) from yade.params import table num_spheres = table.num_spheres key = table.key targetPorosity = 0.43 compFricDegree = table.compFricDegree finalFricDegree = 30 rate = -0.01 damp = 0.2 stabilityThreshold = 0.01 young = 5e6 mn, mx = Vector3(0, 0, 0), Vector3(1, 1, 1) O.materials.append(FrictMat(young=young, poisson=0.5, frictionAngle=radians(compFricDegree), density=2600, label='spheres')) O.materials.append(FrictMat(young=young, poisson=0.5, frictionAngle=0, density=0, label='walls')) walls = aabbWalls([mn, mx], thickness=0, material='walls') wallIds = O.bodies.append(walls) sp = pack.SpherePack() sp.makeCloud(mn, mx, -1, 0., num_spheres, False, 0.95, seed=1) O.bodies.append([sphere(center, rad, material='spheres') for center, rad in sp]) triax = TriaxialStressController( maxMultiplier=1. + 2e4 / young, finalMaxMultiplier=1. + 2e3 / young, thickness=0, stressMask=7, internalCompaction=True, ) newton = NewtonIntegrator(damping=damp) O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Box_Aabb()]), InteractionLoop([Ig2_Sphere_Sphere_ScGeom(), Ig2_Box_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()]), ## We will use the global stiffness of each body to determine an optimal timestep (see https://yade-dem.org/w/images/1/1b/Chareyre&Villard2005_licensed.pdf) GlobalStiffnessTimeStepper(active=1, timeStepUpdateInterval=100, timestepSafetyCoefficient=0.8), triax, TriaxialStateRecorder(iterPeriod=100, file='WallStresses' + table.key), newton ] Gl1_Sphere.stripes = 0 if nRead == 0: yade.qt.Controller(), yade.qt.View() triax.goal1 = triax.goal2 = triax.goal3 = -1 while 1: O.run(1000, True) unb=unbalancedForce() print 'unbalanced force:',unb,' mean stress: ',triax.meanStress if unbtargetPorosity: compFricDegree = 0.95*compFricDegree setContactFriction(radians(compFricDegree)) print "\r Friction: ",compFricDegree," porosity:",triax.porosity, sys.stdout.flush() O.run(500,1) triax.internalCompaction=False setContactFriction(radians(finalFricDegree)) triax.stressMask = 0 triax.goal2=rate triax.goal1=-0.5*rate triax.goal3=-0.5*rate newton.damping=0.6 from yade import plot def history(): plot.addData(e11=-triax.strain[0], e22=-triax.strain[1], e33=-triax.strain[2],ev=-triax.strain[0]-triax.strain[1]-triax.strain[2], s11=-triax.stress(triax.wall_right_id)[0],s22=-triax.stress(triax.wall_top_id)[1],s33=-triax.stress(triax.wall_front_id)[2],i=O.iter) O.engines=O.engines[0:5]+[PyRunner(iterPeriod=20,command='history()',label='recorder')]+O.engines[5:7] O.run(100,True) plot.plots={'e22':('s11',None,'ev')} plot.plot() ## Thanks Leonard -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Status: Open => Answered Karol Brzezinski proposed the following answer: Hi Huan, For each radius, I prescribed some 'spread', so the radii of particles fall between given sieve sizes (rRelFuzz1 = (0.019-0.0125)/4/rMean1). If you want to have all the particles in a given size to have equal radius, set rRelFuzz = 0 everywhere. In such a case, your colouring method should work. As Jan said, please open a new topic for the new question. Cheers, Karol -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706553]: About simulating constant volume condition in a triaxial test
Question #706553 on Yade changed: https://answers.launchpad.net/yade/+question/706553 Status: Open => Answered Karol Brzezinski proposed the following answer: Hi Leonard, triax.goal2=rate triax.goal1=-0.5*rate triax.goal3=-0.5*rate Comes from the fact that volumetric strain is equal to e11+e22+e33 for small deformations. One assumes e22=e33 and wants e11+e22+e33 = 0. So 2*e22 = -e11, hence e22=e33=0.5*e11. The error comes from the inaccuracy of the formula for large strains (apparently, your strains are large if the error is not acceptable). You can propose your own triax.goals by taking into account that the actual volumetric strain is (1+e11)*(1+e22)*(1+e33). Cheers, Karol -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706553]: About simulating constant volume condition in a triaxial test
Question #706553 on Yade changed: https://answers.launchpad.net/yade/+question/706553 Karol Brzezinski proposed the following answer: After some 'gymnastics', I would propose: triax.goal2=-(2*rate+rate**2)/(1+2*rate+rate**2) triax.goal1=rate triax.goal3=rate Cheers, Karol -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706553]: About simulating constant volume condition in a triaxial test
Question #706553 on Yade changed: https://answers.launchpad.net/yade/+question/706553 Karol Brzezinski posted a new comment: After second thought I think that I misunderstood the problem. Because you are actually checking if the obtained strain is equall to the value expected from the prescribed rate. Maybe strainDamping is [1] is the source of the error... I cannot check right now, but it looks like a good clue, since affects the change in strain rate. Cheers, Karol [1] https://yade- dem.org/doc/yade.wrapper.html?highlight=triaxialstresscontroller#yade.wrapper.TriaxialStressController.strainDamping -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706553]: About simulating constant volume condition in a triaxial test
Question #706553 on Yade changed: https://answers.launchpad.net/yade/+question/706553 Leonard posted a new comment: Hi Karol, Thanks very much for your reply. Yes, the strainDamping is a good clue. I add one line of code "triax.strainDamping=0.01" in the MWE and run the simulation. I compare the results with the original MWE results whose triax.strainDamping=0.99 by default. I found: triax.strainDamping=0.99 gives ev=4.3e-4 at e22=0.4 triax.strainDamping=0.01 gives ev=2.2e-6 at e22=0.4, which is much close to zero. This suggests that using a small strainDamping can make it close to a perfect constant volume condition, although the stress-strain results also change. Thanks Leonard -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
[Yade-users] [Question #706560]: Removing a box side
New question #706560 on Yade: https://answers.launchpad.net/yade/+question/706560 How to drop particles in the box to a certain void ratio and then remove one side of the box and see them roll? -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
Re: [Yade-users] [Question #706540]: Trouble in generating sphere packing
Question #706540 on Yade changed: https://answers.launchpad.net/yade/+question/706540 Status: Answered => Solved Huan confirmed that the question is solved: Thanks Karol Brzezinski, that solved my question. -- 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@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp
[Yade-users] [Question #706562]: Trying to add Oedometric test
New question #706562 on Yade: https://answers.launchpad.net/yade/+question/706562 Hello, I am confuse by the Oedometric test provided in the example: https://yade-dem.org/doc/tutorial-examples.html?highlight=oedometric I don't understand where the max and min load come. I was able to add the test to my experiment, but I decided to remove it first because after the compression the sphere would be directly bounce off through the plate. Following is my current code: import random import math from yade import geom, pack, utils, plot, ymport import pandas as pd # Define material properties youngModulus = 1e7 poissonRatio = 0.25 density = 2000 # Create material material = O.materials.append(FrictMat(young=youngModulus, poisson=poissonRatio, density=density)) # Define cylinder with funnel parameters center = (0, 0, 0) diameter = 0.102 height = 0.18 # create cylindrical body with radius 0.102 m and height 0.064 m cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6) # assign material to each body in the cylinder for body in cylinder: body.bodyMat = material # add cylinder to simulation O.bodies.append(cylinder) # Define cylinder with funnel parameters center1 = (0,0,height/2) dBunker = 0.4 dOutput = 0.102 hBunker = 0 hOutput = 0.15 hPipe = 0 # create funnel as a bunker with diameter 0.102 m, height 0.064 m funnel = geom.facetBunker(center=center1, dBunker=dBunker, dOutput=dOutput, hBunker=hBunker,hOutput=hOutput, hPipe=hPipe, segmentsNumber=80, wallMask=4) # assign material to each body in the funnel for body in funnel: body.bodyMat = material # add funnel to simulation O.bodies.append(funnel) # define sphere parameters and number of spheres rMean1 = (0.0125+0.019)/4 rRelFuzz1 = (0.019-0.0125)/4/rMean1 num1 = 28 rMean2 = (0.0095+0.0125)/4 rRelFuzz2 = (0.0125-0.0095)/4/rMean2 num2 = 86 rMean3 = (0.00475+0.0095)/4 rRelFuzz3 = (0.0095-0.00475)/4/rMean3 num3 = 2071 rMean4 = (0.00236+0.00475)/4 rRelFuzz4 = (0.00475-0.00236)/4/rMean4 num4 = 18997 #create empty sphere packing sp = pack.SpherePack() # generate randomly sphere sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean1, rRelFuzz = rRelFuzz1, num = num1) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean2, rRelFuzz = rRelFuzz2, num = num2) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean3, rRelFuzz = rRelFuzz3, num = num3) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean4, rRelFuzz = rRelFuzz4, num = num4) # add the sphere pack to the simulation sp.toSimulation(material = material) for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == rRelFuzz1: #SP body.shape.color = (0,0,1) #blue if body.shape.radius == rRelFuzz2: #SP1 body.shape.color = (1,0,0) #red if body.shape.radius == rRelFuzz3: #SP2 body.shape.color = (0,1,0) #green if body.shape.radius == rRelFuzz4: #SP3 body.shape.color = (1,1,0) #yellow O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]), InteractionLoop( # handle sphere+sphere and facet+sphere collisions [Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()] ), NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.4), # call the checkUnbalanced function (defined below) every 2 seconds PyRunner(command='checkUnbalanced()', realPeriod=2), # call the addPlotData function every 200 steps PyRunner(command='addPlotData()', iterPeriod=100) ] O.dt = .5 * PWaveTimeStep() # enable energy tracking; any simulation parts supporting it # can create and update arbitrary energy types, which can be # accessed as O.energy['energyName'] subsequently O.trackEnergy = True # if the unbalanced forces goes below .05, the packing # is considered stabilized, therefore we stop collected # data history and stop def checkUnbalanced(): if unbalancedForce() < 1e-2: O.pause() plot.saveDataTxt('bbb.txt.bz2') # plot.saveGnuplot('bbb') is also possible # collect history of data which will be plotted def addPlotData(): # each item is given a names, by which it can be the unsed in plot.plots # the **O.energy converts dictionary-like O.energy to plot.addData arguments plot.addData(i=O.iter, unbalanced=unbalancedForce(), **O.energy) # define how to plot data: 'i' (step number) on the x-axis, unbalanced force # on the left y-axis, all energies on the right y-axis # (O.energy.keys is function which will be called to get all defined energies) # None separates left and right y-axis plot.plots = {'i': ('unba
Re: [Yade-users] [Question #706562]: Trying to add Oedometric test
Question #706562 on Yade changed: https://answers.launchpad.net/yade/+question/706562 Description changed to: Hello, I am confuse by the Oedometric test provided in the example: https://yade-dem.org/doc/tutorial-examples.html?highlight=oedometric I don't understand where the max and min load come. I was able to add the test to my experiment, but I decided to remove it first because after the compression the sphere would be directly bounce off through the plate. Following is my current code: import random import math from yade import geom, pack, utils, plot, ymport import pandas as pd # Define material properties youngModulus = 1e7 poissonRatio = 0.25 density = 2000 # Create material material = O.materials.append(FrictMat(young=youngModulus, poisson=poissonRatio, density=density)) # Define cylinder with funnel parameters center = (0, 0, 0) diameter = 0.102 height = 0.18 # create cylindrical body with radius 0.102 m and height 0.064 m cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6) # assign material to each body in the cylinder for body in cylinder: body.bodyMat = material # add cylinder to simulation O.bodies.append(cylinder) # Define cylinder with funnel parameters center1 = (0,0,height/2) dBunker = 0.4 dOutput = 0.102 hBunker = 0 hOutput = 0.15 hPipe = 0 # create funnel as a bunker with diameter 0.102 m, height 0.064 m funnel = geom.facetBunker(center=center1, dBunker=dBunker, dOutput=dOutput, hBunker=hBunker,hOutput=hOutput, hPipe=hPipe, segmentsNumber=80, wallMask=4) # assign material to each body in the funnel for body in funnel: body.bodyMat = material # add funnel to simulation O.bodies.append(funnel) # define sphere parameters and number of spheres rMean1 = (0.0125+0.019)/4 rRelFuzz1 = (0.019-0.0125)/4/rMean1 num1 = 28 rMean2 = (0.0095+0.0125)/4 rRelFuzz2 = (0.0125-0.0095)/4/rMean2 num2 = 86 rMean3 = (0.00475+0.0095)/4 rRelFuzz3 = (0.0095-0.00475)/4/rMean3 num3 = 2071 rMean4 = (0.00236+0.00475)/4 rRelFuzz4 = (0.00475-0.00236)/4/rMean4 num4 = 18997 #create empty sphere packing sp = pack.SpherePack() # generate randomly sphere sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean1, rRelFuzz = rRelFuzz1, num = num1) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean2, rRelFuzz = rRelFuzz2, num = num2) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean3, rRelFuzz = rRelFuzz3, num = num3) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean4, rRelFuzz = rRelFuzz4, num = num4) # add the sphere pack to the simulation sp.toSimulation(material = material) for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == (rMean1, rRelFuzz1): body.shape.color = (0,0,1) #blue if body.shape.radius == (rMean2, rRelFuzz2): body.shape.color = (1,0,0) #red if body.shape.radius == (rMean3, rRelFuzz3): body.shape.color = (0,1,0) #green if body.shape.radius == (rMean4, rRelFuzz4): body.shape.color = (1,1,0) #yellow O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]), InteractionLoop( # handle sphere+sphere and facet+sphere collisions [Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()] ), NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.4), # call the checkUnbalanced function (defined below) every 2 seconds PyRunner(command='checkUnbalanced()', realPeriod=2), # call the addPlotData function every 200 steps PyRunner(command='addPlotData()', iterPeriod=100) ] O.dt = .5 * PWaveTimeStep() # enable energy tracking; any simulation parts supporting it # can create and update arbitrary energy types, which can be # accessed as O.energy['energyName'] subsequently O.trackEnergy = True # if the unbalanced forces goes below .05, the packing # is considered stabilized, therefore we stop collected # data history and stop def checkUnbalanced(): if unbalancedForce() < 1e-2: O.pause() plot.saveDataTxt('bbb.txt.bz2') # plot.saveGnuplot('bbb') is also possible # collect history of data which will be plotted def addPlotData(): # each item is given a names, by which it can be the unsed in plot.plots # the **O.energy converts dictionary-like O.energy to plot.addData arguments plot.addData(i=O.iter, unbalanced=unbalancedForce(), **O.energy) # define how to plot data: 'i' (step number) on the x-axis, unbalanced force # on the left y-axis, all energies on the right y-axis # (O.energy.keys is function which will be called to get all defined energies) # None separate
Re: [Yade-users] [Question #706562]: Trying to add Oedometric test
Question #706562 on Yade changed: https://answers.launchpad.net/yade/+question/706562 Description changed to: Hello, I am confuse by the Oedometric test provided in the example: https://yade-dem.org/doc/tutorial-examples.html?highlight=oedometric I don't understand where the max and min load come. I was able to add the test to my experiment, but I decided to remove it first because after the compression the sphere would be directly bounce off through the plate. Following is my current code: import random import math from yade import geom, pack, utils, plot, ymport import pandas as pd # Define material properties youngModulus = 1e7 poissonRatio = 0.25 density = 2000 # Create material material = O.materials.append(FrictMat(young=youngModulus, poisson=poissonRatio, density=density)) # Define cylinder with funnel parameters center = (0, 0, 0) diameter = 0.102 height = 0.18 # create cylindrical body with radius 0.102 m and height 0.064 m cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6) # assign material to each body in the cylinder for body in cylinder: body.bodyMat = material # add cylinder to simulation O.bodies.append(cylinder) # Define cylinder with funnel parameters center1 = (0,0,height/2) dBunker = 0.4 dOutput = 0.102 hBunker = 0 hOutput = 0.15 hPipe = 0 # create funnel as a bunker with diameter 0.102 m, height 0.064 m funnel = geom.facetBunker(center=center1, dBunker=dBunker, dOutput=dOutput, hBunker=hBunker,hOutput=hOutput, hPipe=hPipe, segmentsNumber=80, wallMask=4) # assign material to each body in the funnel for body in funnel: body.bodyMat = material # add funnel to simulation O.bodies.append(funnel) # define sphere parameters and number of spheres rMean1 = (0.0125+0.019)/4 rRelFuzz1 = (0.019-0.0125)/4/rMean1 num1 = 28 rMean2 = (0.0095+0.0125)/4 rRelFuzz2 = (0.0125-0.0095)/4/rMean2 num2 = 86 rMean3 = (0.00475+0.0095)/4 rRelFuzz3 = (0.0095-0.00475)/4/rMean3 num3 = 2071 rMean4 = (0.00236+0.00475)/4 rRelFuzz4 = (0.00475-0.00236)/4/rMean4 num4 = 18997 #create empty sphere packing sp = pack.SpherePack() # generate randomly sphere sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean1, rRelFuzz = rRelFuzz1, num = num1) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean2, rRelFuzz = rRelFuzz2, num = num2) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean3, rRelFuzz = rRelFuzz3, num = num3) sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean4, rRelFuzz = rRelFuzz4, num = num4) # add the sphere pack to the simulation sp.toSimulation(material = material) ### Finding method to fix this color doesn't seems to work### for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == rMean1: body.shape.color = (0,0,1) #blue if body.shape.radius == rMean2: body.shape.color = (1,0,0) #red if body.shape.radius == rMean3: body.shape.color = (0,1,0) #green if body.shape.radius == rMean4: body.shape.color = (1,1,0) #yellow if body.shape.radius == rRelFuzz1: body.shape.color = (0,0,1) #blue if body.shape.radius == rRelFuzz2: body.shape.color = (1,0,0) #red if body.shape.radius == rRelFuzz3: body.shape.color = (0,1,0) #green if body.shape.radius == rRelFuzz4: body.shape.color = (1,1,0) #yellow ### Finding method to fix this color doesn't seems to work### O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]), InteractionLoop( # handle sphere+sphere and facet+sphere collisions [Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()] ), NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.4), # call the checkUnbalanced function (defined below) every 2 seconds PyRunner(command='checkUnbalanced()', realPeriod=2), # call the addPlotData function every 200 steps PyRunner(command='addPlotData()', iterPeriod=100) ] O.dt = .5 * PWaveTimeStep() # enable energy tracking; any simulation parts supporting it # can create and update arbitrary energy types, which can be # accessed as O.energy['energyName'] subsequently O.trackEnergy = True # if the unbalanced forces goes below .05, the packing # is considered stabilized, therefore we stop collected # data history and stop def checkUnbalanced(): if unbalancedForce() < 1e-2: O.pause() plot.saveDataTxt('bbb.txt.bz2') # plot.saveGnuplot('bbb') is also possible # collect history of data which will be plotted def addPlotData(): # each item is given a names, by which it can be the unsed in plot.plots