# -*- coding: utf-8 -*- # encoding: utf-8 from yade import utils, ymport, qt #### logging from yade import log log.setLevel('Law2_ScGeom_WirePhys_WirePM',log.TRACE) # must compile with debug option to get logs #log.setLevel('Law2_ScGeom_WirePhys_WirePM',log.DEBUG) #log.setLevel('',log.WARN) ## definition of some colors for colored text output in terminal BLUE = '\033[94m' GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' BLACK = '\033[0m' #### short description of script print BLUE+'Simple test for two particles to test contact law with '+RED+'UniaxialStrainer'+BLUE+'.'+BLACK #### define parameters for the net # mesh opening size mos = 80./1000. a = mos/sqrt(3) # wire diameter d = 2.7/1000. # particle radius radius = d*5. # define piecewise lineare stress-strain curve strainStressValues=[(0.0019230769,2.5e8),(0.0192,3.2195e8),(0.05,3.8292e8),(0.15,5.1219e8),(0.25,5.5854e8),(0.3,5.6585e8),(0.35,5.6585e8)] # elastic material properties
qt.Controller() qt.View() O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_Dem3DofGeom(),Ig2_Facet_Sphere_Dem3DofGeom(),Ig2_Wall_Sphere_Dem3DofGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_Dem3DofGeom_FrictPhys_CundallStrack()], ), GravityEngine(gravity=[1e2,1e2,1e2]), NewtonIntegrator(damping=0.01), ] O.dt=utils.PWaveTimeStep() O.save('/tmp/a.xml') O.saveTmp() from yade import log log.setLevel('Ig2_Wall_Sphere_Dem3DofGeom',log.TRACE) O.run() #O.bodies.append([ # utils.facet([[-1,-1,0],[1,-1,0],[0,1,0]],dynamic=False,color=[1,0,0],young=1e3), # utils.facet([[1,-1,0],[0,1,0,],[1,.5,.5]],dynamic=False,young=1e3) #]) #import random
O.periodic=True O.cell.refSize=(20,20,10) from yade import pack,log,timing O.materials.append(FrictMat(young=30e9,density=2400)) p=pack.SpherePack() p.makeCloud(Vector3().ZERO,O.cell.refSize,1,.5,700,True) for sph in p: O.bodies.append(utils.sphere(sph[0],sph[1])) log.setLevel("PeriIsoCompressor",log.DEBUG) O.timingEnabled=True O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_Dem3DofGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_Dem3DofGeom_FrictPhys_CundallStrack()], ), PeriIsoCompressor(charLen=.5,stresses=[-50e9,-1e8],doneHook="print 'FINISHED'; O.pause() ",keepProportions=True), NewtonIntegrator(damping=.4,homotheticCellResize=1) ] O.dt=utils.PWaveTimeStep() O.saveTmp() print O.cell.refSize from yade import qt; qt.Controller(); qt.View() O.run() O.wait() timing.stats() #while True: # O.step()
""" Playground for tuning collider strides depending on maximum velocity. """ from yade import timing,log import os.path loadFrom='/tmp/triax.xml' #if not os.path.exists(loadFrom): TriaxialTest(numberOfGrains=2000,noFiles=True).generate(loadFrom) O.load(loadFrom) log.setLevel('TriaxialCompressionEngine',log.WARN) # shut up log.setLevel('InsertionSortCollider',log.DEBUG) collider=utils.typedEngine('InsertionSortCollider') newton=utils.typedEngine('NewtonIntegrator') # use striding; say "if 0:" to disable striding and compare to regular runs if 1: # length by which bboxes will be made larger collider.verletDist=.2*O.bodies[100].shape.radius O.step() # filter out initialization O.timingEnabled=True totalTime=0 # run a few times 500 steps, show timings to see what is the trend # notably, the percentage of collider time should decrease as the max velocity decreases as well for i in range(0,5): O.run(1000,True) timing.stats() totalTime+=sum([e.execTime for e in O.engines]) print 'Number of interactions: %d (real ratio: %g)'%(len(O.interactions),float(O.interactions.countReal())/len(O.interactions)) print '=======================================================' timing.reset()
for s in sp: O.bodies.append(utils.sphere(s[0],s[1])) O.dt=utils.PWaveTimeStep() O.run(); O.wait() sp=SpherePack(); sp.fromSimulation() #print 'Resulting cellSize',sp.cellSize,'proportions',sp.cellSize[1]/sp.cellSize[0],sp.cellSize[2]/sp.cellSize[0] # repetition to the required cell size will be done below, after memoizing the result else: assumedFinalDensity=0.6 V=(4/3)*pi*radius**3; N=assumedFinalDensity*fullDim[0]*fullDim[1]*fullDim[2]/V; TriaxialTest( numberOfGrains=int(N),radiusMean=radius,radiusStdDev=rRelFuzz, # upperCorner is just size ratio, if radiusMean is specified upperCorner=fullDim, ## no need to touch any the following noFiles=True,lowerCorner=[0,0,0],sigmaIsoCompaction=1e7,sigmaLateralConfinement=1e3,StabilityCriterion=.05,strainRate=.2,thickness=-1,maxWallVelocity=.1,wallOversizeFactor=1.5,autoUnload=True,autoCompressionActivation=False).load() log.setLevel('TriaxialCompressionEngine',log.WARN) O.run(); O.wait() sp=SpherePack(); sp.fromSimulation() O.switchScene() ### !! _memoizePacking(memoizeDb,sp,radius,rRelFuzz,wantPeri,fullDim) if wantPeri: sp.cellFill(Vector3(fullDim[0],fullDim[1],fullDim[2])) if orientation: sp.cellSize=(0,0,0); # reset periodicity to avoid warning when rotating periodic packing sp.rotate(*orientation.toAxisAngle()) return filterSpherePack(predicate,sp,material=material,color=color,returnSpherePack=returnSpherePack) def randomPeriPack(radius,initSize,rRelFuzz=0.0,memoizeDb=None,noPrint=False): """Generate periodic dense packing. A cell of initSize is stuffed with as many spheres as possible, then we run periodic compression with PeriIsoCompressor, just like with randomDensePack.
"""Script that shrinks the periodic cell progressively. It prints strain and average stress (computed from total volume force) once in a while.""" from yade import log,timing log.setLevel("InsertionSortCollider",log.TRACE) O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_Dem3DofGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_Dem3DofGeom_FrictPhys_CundallStrack()], ), NewtonIntegrator(damping=.6,homotheticCellResize=1) ] import random for i in xrange(250): O.bodies.append(utils.sphere(Vector3(10*random.random(),10*random.random(),10*random.random()),.5+random.random())) cubeSize=20 # absolute positioning of the cell is not important O.periodic=True O.cell.refSize=(cubeSize,cubeSize,cubeSize) O.dt=utils.PWaveTimeStep() O.saveTmp() from yade import qt qt.Controller(); qt.View() O.run(200,True) rate=-1e-3*cubeSize/(O.dt*200)*Matrix3.Identity O.cell.velGrad=rate for i in range(0,25): O.run(2000,True)
# coding: utf-8 # 2009 © Václav Šmilauer <*****@*****.**> "Test and demonstrate use of PeriTriaxController." from yade import * from yade import pack,log,qt log.setLevel('PeriTriaxController',log.TRACE) O.periodic=True O.cell.setBox(.1,.1,.1) #O.cell.Hsize=Matrix3(0.1,0,0, 0,0.1,0, 0,0,0.1) sp=pack.SpherePack() radius=5e-3 num=sp.makeCloud((0,0,0),(.1,.1,.1),radius,.2,500,periodic=True) # min,max,radius,rRelFuzz,spheresInCell,periodic O.bodies.append([utils.sphere(s[0],s[1]) for s in sp]) O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb()],verletDist=.05*radius), InteractionLoop( [Ig2_Sphere_Sphere_Dem3DofGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_Dem3DofGeom_FrictPhys_CundallStrack()] ), PeriTriaxController(dynCell=True,mass=0.2,maxUnbalanced=0.01,relStressTol=0.02,goal=[-1e4,-1e4,0],stressMask=3,globUpdate=5,maxStrainRate=[1.,1.,1.],doneHook='triaxDone()',label='triax'), NewtonIntegrator(damping=.2), ] phase=0 def triaxDone(): global phase if phase==0:
from yade import pack,log,timing,utils log.setLevel("SubdomainBalancer",log.INFO) #log.setLevel("BodyContainer",log.TRACE) utils.readParamsFromTable(noTableOk=True,num=12000) import yade.params.table sp=pack.SpherePack() sp.makeCloud((0,0,0),(1,1,1),.03*((12000./yade.params.table.num)**(1/3.)),.5) sp.toSimulation() O.bodies.append(utils.wall((0,0,0),axis=2)) O.bodies.append(utils.wall((0,0,0),axis=1)) #O.bodies.append(utils.wall((0,0,0),axis=0)) #O.bodies.append(utils.wall((0,2,0),axis=1)) #O.bodies.append(utils.wall((2,0,0),axis=0)) O.engines=([SubdomainBalancer(axesOrder='xyz',colorize=True)] if 'SubdomainBalancer' in dir() else [])+[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Wall_Aabb()],verletDist=.05*.05), InteractionLoop([Ig2_Sphere_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()],[Ip2_FrictMat_FrictMat_FrictPhys()],[Law2_ScGeom_FrictPhys_CundallStrack()]), NewtonIntegrator(gravity=(0,0,-10)), #PyRunner(iterPeriod=5000,command='O.pause(); timing.stats();') ] O.dt=utils.PWaveTimeStep() O.timingEnabled=True #O.step(); #O.run(10000,True) timing.stats() from yade import qt qt.View() #O.step() #O.run(5000,True)
import time # change this line to load your reference simulation O.load2('ref.boost.bin.gz') base='~sim~' from yade import log log.setLevel('Omega',log.WARN) # http://blogmag.net/blog/read/38/Print_human_readable_file_size def sizeof_fmt(num): for x in ['bytes','KB','MB','GB','TB']: if num<1024.0: return "%3.1f%s"%(num,x) num/=1024.0 def io(ext,load,noBoost=False): t0=time.time() f=base+('.yade.' if noBoost else '.boost.')+ext ((O.load if noBoost else O.load2) if load else (O.save if noBoost else O.save2))(f) print ('Loaded' if load else 'Saved '),('yade ' if noBoost else 'boost'),'%-7s '%ext,'%7s'%sizeof_fmt(os.path.getsize(f)),'%.1fs'%(time.time()-t0) for ext in ['xml','xml.bz2']: io(ext,False,True) io(ext,True,True) for ext in ['xml','xml.gz','xml.bz2','bin','bin.gz','bin.bz2']: io(ext,False) io(ext,True)
# encoding: utf-8 # 2011 © Bruno Chareyre <*****@*****.**> # Check the result of a triaxial test on a dense 100 spheres packing with position defined, # comparing stresses at the "peak" state. The initial positions have been generated by # internal compaction without friction, so that it is initially at equilibrium without shear forces. # Positions and reference results are in data folder. from yade import pack,log,utils,export,plot import math,os,sys log.setLevel('TriaxialCompressionEngine',log.ERROR) tolerance=0.01 interactive=False errors=0 tt=TriaxialTest(internalCompaction=True,numberOfGrains=100,compactionFrictionDeg=0,sphereFrictionDeg=30,importFilename=checksPath+'/data/checkTestTriax.spheres') tt.generate("checkTest.yade") O.load("checkTest.yade") O.run(2020,True) if interactive: print O.engines[4].stress(0)[1],O.engines[4].stress(1)[1], O.engines[4].stress(2)[0], O.engines[4].stress(3)[0], O.engines[4].stress(4)[2], O.engines[4].stress(5)[2] os.system('gnuplot -e "plot \'./WallStresses\' using 1:3; replot'+checksPath+'\'/data/WallStressesCheckTest\' using 1:3; replot '+checksPath+'\'/data/WallStresses\' using 1:4; replot '+checksPath+'\'/data/WallStressesCheckTest\' using 1:4; pause -1"') if abs((O.engines[4].stress(3)[1]-107157.2)/107157.2)>tolerance : print "Triaxial checkTest: difference on peak stress" errors+=1 if abs((O.engines[4].stress(1)[0]-50058.7)/50058.7)>tolerance : print "Triaxial checkTest: difference on confining stress" errors+=1 if (errors): resultStatus +=1 #Test is failed