------------------------------------------------------------ revno: 1719 committer: Václav Šmilauer <vac...@flux> branch nick: trunk timestamp: Sat 2009-08-22 20:21:25 +0200 message: ef2_Sphere_Sphere_Dem3Dof: change meaning of distanceFactor, see docs (if < 0, equilibrium is sum of radii, otherwise the initial distance; defaults to -1). Renamed to distFactor, to break old code intentionally InteractingSphere2AABB: allow negative aabbEnlargeFactor, which doesn't scale aabb at all (same as if it is 1.) yade-multi: use the first non-blank line as column headings (not necessarily the first line of the file, as is used to be) SpatialQuickSortCollider: fix clearing interaction with openMP examples/concrete/uniaxial: move files around, add confinement and docs; remove examples/concrete/pack since not in the pack module (an example should be given, though) examples/collider-perf: remove PersistentSAPCollider, add InsertionSortCollide with strides, but commented out since no effect at hthe beginning of simulation PeriodicInsertionSortCollider: remove unnecessary (hopefully) condition that would abort in scripts/test/periodic-simple.py removed: examples/concrete/pack/ examples/concrete/pack/mk-pack.py examples/concrete/uniaxial/ added: examples/concrete/README renamed: examples/concrete/uniaxial/rb.py => examples/concrete/uniax.py modified: .bzrignore core/InteractionContainer.cpp core/InteractionContainer.hpp examples/collider-perf/README examples/collider-perf/mkGraph.py examples/collider-perf/perf.py examples/collider-perf/perf.table examples/dynamic_simulation_tests/ringCundallDamping.py examples/dynamic_simulation_tests/ringSimpleViscoelastic.py extra/PeriodicInsertionSortCollider.cpp gui/py/yade-multi pkg/common/Engine/EngineUnit/InteractingSphere2AABB.cpp pkg/common/Engine/EngineUnit/InteractingSphere2AABB.hpp pkg/common/Engine/StandAloneEngine/SpatialQuickSortCollider.cpp pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.cpp pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.hpp py/utils.py scripts/test/collider-stride-triax.py examples/concrete/uniax.py
-- lp:yade https://code.launchpad.net/~yade-dev/yade/trunk Your team Yade developers is subscribed to branch lp:yade. To unsubscribe from this branch go to https://code.launchpad.net/~yade-dev/yade/trunk/+edit-subscription.
=== modified file '.bzrignore' --- .bzrignore 2009-08-20 19:55:52 +0000 +++ .bzrignore 2009-08-22 18:21:25 +0000 @@ -3,3 +3,8 @@ scons.profile-* .project ./doc/doxygen +VERSION +yade.1 +debian/changelog +debian/control +doc/epydoc === modified file 'core/InteractionContainer.cpp' --- core/InteractionContainer.cpp 2009-07-17 20:50:55 +0000 +++ core/InteractionContainer.cpp 2009-08-22 18:21:25 +0000 @@ -20,6 +20,14 @@ #endif } +void InteractionContainer::clearPendingErase(){ + #ifdef YADE_OPENMP + FOREACH(list<bodyIdPair>& pendingErase, threadsPendingErase){ + #endif + pendingErase.clear(); + } +} + int InteractionContainer::unconditionalErasePending(){ int ret=0; #ifdef YADE_OPENMP === modified file 'core/InteractionContainer.hpp' --- core/InteractionContainer.hpp 2009-08-06 21:05:28 +0000 +++ core/InteractionContainer.hpp 2009-08-22 18:21:25 +0000 @@ -135,6 +135,13 @@ This function doesn't lock pendingEraseMutex, as it is (supposedly) called from no-parallel sections only once per iteration */ int unconditionalErasePending(); + + /*! Clear the list of interaction pending erase: all interactions queued for considering erasing them + will be dropped; useful for colliders that handle that by themselves, without needing the hint; + with openMP, it would not be enough to call pendingErase->clear(), this helper function + does it for all threads. Use this only if you understand this explanation. */ + void clearPendingErase(); + /*! Traverse all pending interactions and erase them if the (T*)->shouldBeErased(id1,id2) return true and keep it if it return false; finally, pendingErase will be clear()'ed. === modified file 'examples/collider-perf/README' --- examples/collider-perf/README 2009-05-22 21:06:02 +0000 +++ examples/collider-perf/README 2009-08-22 18:21:25 +0000 @@ -1,21 +1,28 @@ -This example tests performance of PersistentSAPCollider and SpatialQuickSortCollider -and was basis for http://yade.wikia.com/wiki/Colliders_performace . +This example tests performance of InsertionSortCollider (with and without stride) and +SpatialQuickSortCollider and was basis for http://yade.wikia.com/wiki/Colliders_performace, +which features now-removed PersistentSAPCollider as well. To run the test, say: yade-trunk-multi perf.table perf.py -It will take time to finish. To get graphs from the generated log files, say +It will take time to finish. To collet results and get graphs from the generated log files, say python mkGraph.py *.log -To see other results, log files are named like perf.64k.log (64k spheres with -PersistentSAPCollider), perf.32k.q.log (32k spheres, SpatialQuickSortCollider) etc. +To see other results, log files are named like perf.64k.q.log (64k spheres with +SpatialQuickSortCollider), perf.32k.i.log (32k spheres, InsertionSortCollider), +perf.40k.is.log (InsertionSortCollider with stride) etc. 1. File with nSpheres spheres (loose packing) is generated first, it if doesn't exist yet. This can take a few minutes, but is done only the first time for the particular sphere number. + 2. First iteration on the scene (TriaxialTest and the selected collider) with timings is done and timing.stats() printed (appears in the log file). + 3. Another 100 iterations are measured with timing.stats(), after which the test exits. +(Note: InsertionSortCollider with stride is currently commented out in the table, +as striding is not effective until later during the simulation.) + === modified file 'examples/collider-perf/mkGraph.py' --- examples/collider-perf/mkGraph.py 2009-05-24 08:19:26 +0000 +++ examples/collider-perf/mkGraph.py 2009-08-22 18:21:25 +0000 @@ -1,5 +1,5 @@ #encoding: utf-8 -dta={'QS':{},'SAP':{},'IS':{}} +dta={'QS':{},'IS':{},'ISS':{}} import sys for f in sys.argv[1:]: print f,'', @@ -7,7 +7,8 @@ assert(N[-1]=='k'); N=1000*int(N[:-1]) if '.q.' in f: collider='QS' elif '.i.' in f: collider='IS' - else: collider='SAP' + elif '.is.' in f: collider='ISS' + else: raise RuntimeError("Unknown collider type for file "+f) for l in open(f): if 'Collider' in l: t=l.split()[2]; assert(t[-2:]=='us'); t=float(t[:-2])/1e6 @@ -15,25 +16,23 @@ else: dta[collider][N]+=[t*0.01] # the second time is per 100 iterations print -SAP_N=dta['SAP'].keys(); SAP_N.sort() +ISS_N=dta['ISS'].keys(); ISS_N.sort() QS_N=dta['QS'].keys(); QS_N.sort() IS_N=dta['IS'].keys(); IS_N.sort() -SAPinit=[dta['SAP'][N][0] for N in SAP_N]; SAPstep=[dta['SAP'][N][1] for N in SAP_N] +ISSinit=[dta['ISS'][N][0] for N in ISS_N]; ISSstep=[dta['ISS'][N][1] for N in ISS_N] QSinit=[dta['QS'][N][0] for N in QS_N]; QSstep=[dta['QS'][N][1] for N in QS_N] ISinit=[dta['IS'][N][0] for N in IS_N]; ISstep=[dta['IS'][N][1] for N in IS_N] from pylab import * -plot(SAP_N,SAPinit,'m') -plot(IS_N,ISinit,'y') +plot(IS_N,ISinit,'y',ISS_N,ISSinit) gca().set_yscale('log') xlabel("Number of spheres") -ylabel(u"Log (!) time for the 1st SAP collider step [s]") -title("SAP vs. QuickSort colliders performance") -legend(('SAP init','IS init'),'upper left') - +ylabel(u"Log time for the 1st collider step [s]") +title("Colliders performance (QS=QuickSoft, IS=InsertionSort, IS/s=IS+stride)") +legend(('IS init','IS/s init',),'upper left') ax2=twinx() -plot(SAP_N,SAPstep,'r-',IS_N,ISstep,'k-',QS_N,QSstep,'g-',QS_N,QSinit,'b-') +plot(IS_N,ISstep,'k-',ISS_N,ISSstep,'r-',QS_N,QSstep,'g-',QS_N,QSinit,'b-') ylabel(u"Linear time per 1 step [s]") -legend(('SAP step','InsertionSort step','QuickSort step','QuickSort init'),'right') +legend(('IS step','IS/s step','QS step','QS init'),'right') grid() savefig('colliders.svg') show() === modified file 'examples/collider-perf/perf.py' --- examples/collider-perf/perf.py 2009-03-08 21:15:35 +0000 +++ examples/collider-perf/perf.py 2009-08-22 18:21:25 +0000 @@ -1,12 +1,14 @@ -utils.readParamsFromTable(nSpheres=8000,collider='PersistentSAPCollider',noTableOk=True) +utils.readParamsFromTable(nSpheres=8000,collider='InsertionSortCollider',noTableOk=True) # name of file containing sphere packing with given number of spheres spheresFile="packing-%dk.spheres"%(nSpheres/1000) +fast='@stride' in collider + import os if not os.path.exists(spheresFile): print "Generating packing" - p=Preprocessor('TriaxialTest',{'numberOfGrains':nSpheres,'radiusMean':1e-3,'lowerCorner':[0,0,0],'upperCorner':[1,1,1]}) + p=TriaxialTest(numberOfGrains=nSpheres,radiusMean=1e-3,lowerCorner=[0,0,0],upperCorner=[1,1,1],noFiles=True) p.load() utils.spheresToFile(spheresFile) O.reset() @@ -16,15 +18,16 @@ from yade import timing O.timingEnabled=True -p=Preprocessor('TriaxialTest',{'importFilename':spheresFile}).load() +TriaxialTest(importFilename=spheresFile,fast=fast,noFiles=True).load() O.dt=utils.PWaveTimeStep() -utils.replaceCollider(StandAloneEngine(collider)) - -mem0=utils.vmData() +isc=O.engines[2] +isc['sweepLength']=1e-1 + +if not fast: utils.replaceCollider(StandAloneEngine(collider)) + O.step() timing.stats() -print 'Extra memory:',utils.vmData()-mem0,'kB' timing.reset() -O.run(100,True) +O.run(200,True) timing.stats() quit() === modified file 'examples/collider-perf/perf.table' --- examples/collider-perf/perf.table 2009-05-29 13:35:22 +0000 +++ examples/collider-perf/perf.table 2009-08-22 18:21:25 +0000 @@ -1,77 +1,76 @@ !OMP_NUM_THREADS description nSpheres collider -3 128k 128000 'PersistentSAPCollider' -3 96k 96000 'PersistentSAPCollider' -3 64k 64000 'PersistentSAPCollider' -3 56k 56000 'PersistentSAPCollider' -3 48k 48000 'PersistentSAPCollider' -3 40k 40000 'PersistentSAPCollider' -3 36k 36000 'PersistentSAPCollider' -3 32k 32000 'PersistentSAPCollider' -3 28k 28000 'PersistentSAPCollider' -3 24k 24000 'PersistentSAPCollider' -3 20k 20000 'PersistentSAPCollider' -3 18k 18000 'PersistentSAPCollider' -3 16k 16000 'PersistentSAPCollider' -3 14k 14000 'PersistentSAPCollider' -3 12k 12000 'PersistentSAPCollider' -3 10k 10000 'PersistentSAPCollider' -3 9k 9000 'PersistentSAPCollider' -3 8k 8000 'PersistentSAPCollider' -3 7k 7000 'PersistentSAPCollider' -3 6k 6000 'PersistentSAPCollider' -3 5k 5000 'PersistentSAPCollider' -3 4k 4000 'PersistentSAPCollider' -3 3k 3000 'PersistentSAPCollider' -3 2k 2000 'PersistentSAPCollider' -3 1k 1000 'PersistentSAPCollider' -3 128k.q 128000 'SpatialQuickSortCollider' -3 96k.q 96000 'SpatialQuickSortCollider' -3 64k.q 64000 'SpatialQuickSortCollider' -3 56k.q 56000 'SpatialQuickSortCollider' -3 48k.q 48000 'SpatialQuickSortCollider' -3 40k.q 40000 'SpatialQuickSortCollider' -3 36k.q 36000 'SpatialQuickSortCollider' -3 32k.q 32000 'SpatialQuickSortCollider' -3 28k.q 28000 'SpatialQuickSortCollider' -3 24k.q 24000 'SpatialQuickSortCollider' -3 20k.q 20000 'SpatialQuickSortCollider' -3 18k.q 18000 'SpatialQuickSortCollider' -3 16k.q 16000 'SpatialQuickSortCollider' -3 14k.q 14000 'SpatialQuickSortCollider' -3 12k.q 12000 'SpatialQuickSortCollider' -3 10k.q 10000 'SpatialQuickSortCollider' -3 9k.q 9000 'SpatialQuickSortCollider' -3 8k.q 8000 'SpatialQuickSortCollider' -3 7k.q 7000 'SpatialQuickSortCollider' -3 6k.q 6000 'SpatialQuickSortCollider' -3 5k.q 5000 'SpatialQuickSortCollider' -3 4k.q 4000 'SpatialQuickSortCollider' -3 3k.q 3000 'SpatialQuickSortCollider' -3 2k.q 2000 'SpatialQuickSortCollider' -3 1k.q 1000 'SpatialQuickSortCollider' -1 128k.i1 128000 'InsertionSortCollider' -3 128k.i 128000 'InsertionSortCollider' -3 96k.i 96000 'InsertionSortCollider' -3 64k.i 64000 'InsertionSortCollider' -3 56k.i 56000 'InsertionSortCollider' -3 48k.i 48000 'InsertionSortCollider' -3 40k.i 40000 'InsertionSortCollider' -3 36k.i 36000 'InsertionSortCollider' -3 32k.i 32000 'InsertionSortCollider' -3 28k.i 28000 'InsertionSortCollider' -3 24k.i 24000 'InsertionSortCollider' -3 20k.i 20000 'InsertionSortCollider' -3 18k.i 18000 'InsertionSortCollider' -3 16k.i 16000 'InsertionSortCollider' -3 14k.i 14000 'InsertionSortCollider' -3 12k.i 12000 'InsertionSortCollider' -3 10k.i 10000 'InsertionSortCollider' -3 9k.i 9000 'InsertionSortCollider' -3 8k.i 8000 'InsertionSortCollider' -3 7k.i 7000 'InsertionSortCollider' -3 6k.i 6000 'InsertionSortCollider' -3 5k.i 5000 'InsertionSortCollider' -3 4k.i 4000 'InsertionSortCollider' -3 3k.i 3000 'InsertionSortCollider' -3 2k.i 2000 'InsertionSortCollider' -3 1k.i 1000 'InsertionSortCollider' +4 128k.q 128000 'SpatialQuickSortCollider' +4 96k.q 96000 'SpatialQuickSortCollider' +4 64k.q 64000 'SpatialQuickSortCollider' +4 56k.q 56000 'SpatialQuickSortCollider' +4 48k.q 48000 'SpatialQuickSortCollider' +4 40k.q 40000 'SpatialQuickSortCollider' +4 36k.q 36000 'SpatialQuickSortCollider' +4 32k.q 32000 'SpatialQuickSortCollider' +4 28k.q 28000 'SpatialQuickSortCollider' +4 24k.q 24000 'SpatialQuickSortCollider' +4 20k.q 20000 'SpatialQuickSortCollider' +4 18k.q 18000 'SpatialQuickSortCollider' +4 16k.q 16000 'SpatialQuickSortCollider' +4 14k.q 14000 'SpatialQuickSortCollider' +4 12k.q 12000 'SpatialQuickSortCollider' +4 10k.q 10000 'SpatialQuickSortCollider' +4 9k.q 9000 'SpatialQuickSortCollider' +4 8k.q 8000 'SpatialQuickSortCollider' +4 7k.q 7000 'SpatialQuickSortCollider' +4 6k.q 6000 'SpatialQuickSortCollider' +4 5k.q 5000 'SpatialQuickSortCollider' +4 4k.q 4000 'SpatialQuickSortCollider' +4 3k.q 3000 'SpatialQuickSortCollider' +4 2k.q 2000 'SpatialQuickSortCollider' +4 1k.q 1000 'SpatialQuickSortCollider' +4 128k.i 128000 'InsertionSortCollider' +4 96k.i 96000 'InsertionSortCollider' +4 64k.i 64000 'InsertionSortCollider' +4 56k.i 56000 'InsertionSortCollider' +4 48k.i 48000 'InsertionSortCollider' +4 40k.i 40000 'InsertionSortCollider' +4 36k.i 36000 'InsertionSortCollider' +4 32k.i 32000 'InsertionSortCollider' +4 28k.i 28000 'InsertionSortCollider' +4 24k.i 24000 'InsertionSortCollider' +4 20k.i 20000 'InsertionSortCollider' +4 18k.i 18000 'InsertionSortCollider' +4 16k.i 16000 'InsertionSortCollider' +4 14k.i 14000 'InsertionSortCollider' +4 12k.i 12000 'InsertionSortCollider' +4 10k.i 10000 'InsertionSortCollider' +4 9k.i 9000 'InsertionSortCollider' +4 8k.i 8000 'InsertionSortCollider' +4 7k.i 7000 'InsertionSortCollider' +4 6k.i 6000 'InsertionSortCollider' +4 5k.i 5000 'InsertionSortCollider' +4 4k.i 4000 'InsertionSortCollider' +4 3k.i 3000 'InsertionSortCollider' +4 2k.i 2000 'InsertionSortCollider' +4 1k.i 1000 'InsertionSortCollider' +#4 128k.is 128000 'InsertionSortCollider' +#4 96k.is 96000 'InsertionSortCollider' +#4 64k.is 64000 'InsertionSortCollider' +#4 56k.is 56000 'InsertionSortCollider' +#4 48k.is 48000 'insertionsortcolli...@stride' +#4 40k.is 40000 'insertionsortcolli...@stride' +#4 36k.is 36000 'insertionsortcolli...@stride' +#4 32k.is 32000 'insertionsortcolli...@stride' +#4 28k.is 28000 'insertionsortcolli...@stride' +#4 24k.is 24000 'insertionsortcolli...@stride' +#4 20k.is 20000 'insertionsortcolli...@stride' +#4 18k.is 18000 'insertionsortcolli...@stride' +#4 16k.is 16000 'insertionsortcolli...@stride' +#4 14k.is 14000 'insertionsortcolli...@stride' +#4 12k.is 12000 'insertionsortcolli...@stride' +#4 10k.is 10000 'insertionsortcolli...@stride' +#4 9k.is 9000 'insertionsortcolli...@stride' +#4 8k.is 8000 'insertionsortcolli...@stride' +#4 7k.is 7000 'insertionsortcolli...@stride' +#4 6k.is 6000 'insertionsortcolli...@stride' +#4 5k.is 5000 'insertionsortcolli...@stride' +#4 4k.is 4000 'insertionsortcolli...@stride' +#4 3k.is 3000 'insertionsortcolli...@stride' +#4 2k.is 2000 'insertionsortcolli...@stride' +#4 1k.is 1000 'insertionsortcolli...@stride' === added file 'examples/concrete/README' --- examples/concrete/README 1970-01-01 00:00:00 +0000 +++ examples/concrete/README 2009-08-22 18:21:25 +0000 @@ -0,0 +1,10 @@ +uniax.py shows uniaxiax tension/compression test on concrete specimen with +optional confinement. + +Run using yade-multi and confined.table (see comments in that file) to run +simulation with different confinement values. + +Run plain uniax.py to get one unconfined tension/compression simulation. +Type yade.plot.plot() to see strain/stress plot during the simulation. + +See comments at the beginning of uniax.py for more information. === removed directory 'examples/concrete/pack' === removed file 'examples/concrete/pack/mk-pack.py' --- examples/concrete/pack/mk-pack.py 2009-05-31 09:09:14 +0000 +++ examples/concrete/pack/mk-pack.py 1970-01-01 00:00:00 +0000 @@ -1,73 +0,0 @@ -from yade import log -import shutil, tempfile -# -# Generate box or cylindrical packing that is rather compact using TriaxialTest. -# - -# if non-negative, the resulting sample will be cylindrical; if < 0, generate box -cylAxis=1 -# how many layers of average spheres to cut away from flat parts (relative to mean sphere radius); sphere center count -cutoffFlat=3.5 -# how many layers of average spheres to cut away from round surfaces (relative to mean sphere radius); sphere centers count -cutoffRound=2 - -tt=TriaxialTest( - numberOfGrains=5000, - radiusMean=3e-4, - # this is just size ratio if radiusMean is specified - # if you comment out the line above, it will be the corner (before compaction) and radiusMean will be set accordingly - upperCorner=[2,4,2], - radiusStdDev=0, # all spheres exactly the same radius - - ## - ## no need to touch any the following, till the end of file - ## - noFiles=True, - lowerCorner=[0,0,0], - sigmaIsoCompaction=1e7, - sigmaLateralConfinement=1e3, - StabilityCriterion=.05, - strainRate=.2, - fast=True, - maxWallVelocity=.1, - wallOversizeFactor=2, - autoUnload=True, # unload after isotropic compaction - autoCompressionActivation=False # stop once unloaded -) - -tt.load() -log.setLevel('TriaxialCompressionEngine',log.WARN) -O.run() ## triax stops by itself once unloaded -O.wait() - -# resulting specimen geometry -ext=utils.aabbExtrema() -rSphere=tt['radiusMean'] - -outFile=tempfile.NamedTemporaryFile(delete=False).name - -if cylAxis<0: # box-shaped packing - aabbMin,aabbMax=tuple([ext[0][i]+rSphere*cutoffFlat for i in 0,1,2]),tuple([ext[1][i]-rSphere*cutoffFlat for i in 0,1,2]) - def isInBox(id): - pos=O.bodies[id].phys.pos - return utils.ptInAABB(pos,aabbMin,aabbMax) - nSpheres=utils.spheresToFile(outFile,consider=isInBox) -else: # cylinger packing - mid =[.5*(ext[1][i]+ext[0][i]) for i in [0,1,2]] - extent=[.5*(ext[1][i]-ext[0][i]) for i in [0,1,2]] - ax1,ax2=(cylAxis+1)%3,(cylAxis+2)%3 - cylRadius=min(extent[ax1],extent[ax2])-cutoffRound*rSphere - cylHalfHt=extent[cylAxis]-cutoffFlat*rSphere - def isInCyl(id): - pos=O.bodies[id].phys.pos - axisDist=sqrt((pos[ax1]-mid[ax1])**2+(pos[ax2]-mid[ax2])**2) - if axisDist>cylRadius: return False - axialDist=abs(pos[cylAxis]-mid[cylAxis]) - if axialDist>cylHalfHt: return False - return True - nSpheres=utils.spheresToFile(outFile,consider=isInCyl) - -outFile2='pack-%d-%s.spheres'%(nSpheres,'box' if cylAxis<0 else 'cyl') -shutil.move(outFile,outFile2) -print nSpheres,'spheres written to',outFile2 -quit() === renamed file 'examples/concrete/uniaxial/rb.py' => 'examples/concrete/uniax.py' --- examples/concrete/uniaxial/rb.py 2009-08-04 07:46:09 +0000 +++ examples/concrete/uniax.py 2009-08-22 18:21:25 +0000 @@ -55,6 +55,9 @@ specimenLength=.2, sphereRadius=3.5e-3, + + # isotropic confinement (should be negative) + isoPrestress=0, ) if 'description' in O.tags.keys(): O.tags['id']=O.tags['id']+O.tags['description'] @@ -63,7 +66,7 @@ # 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 -spheres=pack.triaxialPack(pack.inHyperboloid((0,0,-.5*specimenLength),(0,0,.5*specimenLength),.25*specimenLength,.2*specimenLength),radius=sphereRadius,memoizeDb='/tmp/triaxPackCache.sqlite',young=young,poisson=poisson,frictionAngle=frictionAngle,physParamsClass='CpmMat',density=density) +spheres=pack.randomDensePack(pack.inHyperboloid((0,0,-.5*specimenLength),(0,0,.5*specimenLength),.25*specimenLength,.2*specimenLength),spheresInCell=2000,radius=sphereRadius,memoizeDb='/tmp/triaxPackCache.sqlite',young=young,poisson=poisson,frictionAngle=frictionAngle,physParamsClass='CpmMat',density=density) O.bodies.append(spheres) bb=utils.uniaxialTestFeatures() negIds,posIds,axis,crossSectionArea=bb['negIds'],bb['posIds'],bb['axis'],bb['area'] @@ -79,8 +82,8 @@ BoundingVolumeMetaEngine([InteractingSphere2AABB(aabbEnlargeFactor=intRadius,label='is2aabb'),MetaInteractingGeometry2AABB()]), InsertionSortCollider(), InteractionDispatchers( - [ef2_Sphere_Sphere_Dem3DofGeom(distanceFactor=intRadius,label='ss2d3dg')], - [Ip2_CpmMat_CpmMat_CpmPhys(sigmaT=sigmaT,relDuctility=relDuctility,epsCrackOnset=epsCrackOnset,G_over_E=G_over_E)], + [ef2_Sphere_Sphere_Dem3DofGeom(distFactor=intRadius,label='ss2d3dg')], + [Ip2_CpmMat_CpmMat_CpmPhys(sigmaT=sigmaT,relDuctility=relDuctility,epsCrackOnset=epsCrackOnset,G_over_E=G_over_E,isoPrestress=isoPrestress)], [Law2_Dem3DofGeom_CpmPhys_Cpm()], ), NewtonsDampedLaw(damping=damping,label='damper'), @@ -91,7 +94,8 @@ ] O.miscParams=[GLDrawCpmPhys(dmgLabel=False,colorStrain=False,epsNLabel=False,epsT=False,epsTAxes=False,normal=False,contactLine=True)] -plot.plots={'eps':('sigma','sigma.25','sigma.50','sigma.75')} +# plot stresses in ¼, ½ and ¾ if desired as well; too crowded in the graph that includes confinement, though +plot.plots={'eps':('sigma',)} #'sigma.25','sigma.50','sigma.75')} plot.maxDataLen=4000 O.saveTmp('initial'); @@ -116,8 +120,8 @@ print "init done, will now run." O.step(); O.step(); # to create initial contacts # now reset the interaction radius and go ahead - ss2d3dg['distanceFactor']=1. - is2aabb['aabbEnlargeFactor']=1. + ss2d3dg['distFactor']=-1. + is2aabb['aabbEnlargeFactor']=-1. O.run() def stopIfDamaged(): @@ -129,7 +133,7 @@ if extremum==0: return print O.tags['id'],mode,strainer['strain'],sigma[-1] import sys; sys.stdout.flush() - if abs(sigma[-1]/extremum)<minMaxRatio: + if abs(sigma[-1]/extremum)<minMaxRatio or abs(strainer['strain'])>5e-3: if mode=='tension' and doModes & 2: # only if compression is enabled mode='compression' print "Damaged, switching to compression... "; O.pause() @@ -149,16 +153,15 @@ sys.exit(0) def addPlotData(): - yade.plot.addData({'t':O.time,'i':O.iter,'eps':strainer['strain'],'sigma':strainer['avgStress'], - 'sigma.25':utils.forcesOnCoordPlane(coord_25,axis)[axis]/area_25, - 'sigma.50':utils.forcesOnCoordPlane(coord_50,axis)[axis]/area_50, - 'sigma.75':utils.forcesOnCoordPlane(coord_75,axis)[axis]/area_75, + yade.plot.addData({'t':O.time,'i':O.iter,'eps':strainer['strain'],'sigma':strainer['avgStress']+isoPrestress, + 'sigma.25':utils.forcesOnCoordPlane(coord_25,axis)[axis]/area_25+isoPrestress, + 'sigma.50':utils.forcesOnCoordPlane(coord_50,axis)[axis]/area_50+isoPrestress, + 'sigma.75':utils.forcesOnCoordPlane(coord_75,axis)[axis]/area_75+isoPrestress, }) - - initTest() -#while True: time.sleep(1) +# sleep forever if run by yade-multi, exit is called from stopIfDamaged +if os.environ.has_key('PARAM_TABLE'): time.sleep(1e12) === removed directory 'examples/concrete/uniaxial' === modified file 'examples/dynamic_simulation_tests/ringCundallDamping.py' --- examples/dynamic_simulation_tests/ringCundallDamping.py 2009-08-10 16:59:33 +0000 +++ examples/dynamic_simulation_tests/ringCundallDamping.py 2009-08-22 18:21:25 +0000 @@ -80,7 +80,7 @@ for b in o.bodies: if b.shape.name=='Sphere': - b.phys['blockedDOFs']=4 # blocked movement along Z + b.phys.blockedDOFs=['z'] # blocked movement along Z o.dt=0.2*utils.PWaveTimeStep() === modified file 'examples/dynamic_simulation_tests/ringSimpleViscoelastic.py' --- examples/dynamic_simulation_tests/ringSimpleViscoelastic.py 2009-08-10 16:59:33 +0000 +++ examples/dynamic_simulation_tests/ringSimpleViscoelastic.py 2009-08-22 18:21:25 +0000 @@ -85,7 +85,7 @@ for b in o.bodies: if b.shape.name=='Sphere': - b.phys['blockedDOFs']=4 # blocked movement along Z + b.phys.blockedDOFs=['z'] o.dt=0.2*tc === modified file 'extra/PeriodicInsertionSortCollider.cpp' --- extra/PeriodicInsertionSortCollider.cpp 2009-08-22 15:05:20 +0000 +++ extra/PeriodicInsertionSortCollider.cpp 2009-08-22 18:21:25 +0000 @@ -137,7 +137,9 @@ int j=i_1; Bound vi=v[i]; const bool viHasBB=vi.flags.hasBB; while(v[j].coord>vi.coord + /* wrap for elt just below split */ (v.norm(j+1)==loIdx ? v.cellDim : 0)){ long j1=v.norm(j+1); - if (v[j].coord>v.cellMax+v.cellDim){ + // OK, now if many bodies move at the same pace through the cell and at one point, there is inversion, + // this can happen without any side-effects + if (false && v[j].coord>v.cellMax+v.cellDim){ // this condition is not strictly necessary, but the loop of insertionSort would have to run more times. // Since size of particle is required to be < .5*cellDim, this would mean simulation explosion anyway LOG_FATAL("Body #"<<v[j].id<<" going faster than 1 cell in one step? Not handled."); === modified file 'gui/py/yade-multi' --- gui/py/yade-multi 2009-05-22 21:06:02 +0000 +++ gui/py/yade-multi 2009-08-22 18:21:25 +0000 @@ -124,11 +124,12 @@ print "Will run `%s' on `%s' with nice value %d, output redirected to `%s', %d jobs at a time."%(executable,simul,nice,logFormat,maxJobs) ll=[re.sub('\s*#.*','',l) for l in ['']+open(table,'r').readlines()] # remove comments -availableLines=[i for i in range(len(ll)) if not re.match(r'^\s*(#.*)?$',ll[i][:-1]) and i>1] - +availableLines=[i for i in range(len(ll)) if not re.match(r'^\s*(#.*)?$',ll[i][:-1])] +# first non-blank line are column headings +headings=ll[availableLines[0]].split() +availableLines=availableLines[1:] # read actual data values={} -headings=ll[1].split() for l in availableLines: val={} for i in range(len(headings)): @@ -185,7 +186,8 @@ nSlots=1 for col,head in enumerate(headings): if head=='!EXEC': executable=values[l][col] - if head=='!OMP_NUM_THREADS': nSlots=int(values[l][col]) + if head=='!OMP_NUM_THREADS': + nSlots=int(values[l][col]); maxCpu=getNumCores() if head[0]=='!': envVars+=['%s=%s'%(head[1:],values[l][col])] if nSlots>maxJobs: logging.warning('WARNING: job #%d wants %d slots but only %d are available'%(i,nSlots,maxJobs)) jobs.append(JobInfo(i,idStrings[l] if idStrings else '#'+str(i),'PARAM_TABLE=%s:%d %s nice -n %d %s -N PythonUI -- -n -x %s > %s 2>&1'%(table,l,' '.join(envVars),nice,executable,simul,pipes.quote(logFile)),logFile,nSlots)) === modified file 'pkg/common/Engine/EngineUnit/InteractingSphere2AABB.cpp' --- pkg/common/Engine/EngineUnit/InteractingSphere2AABB.cpp 2009-08-19 12:00:35 +0000 +++ pkg/common/Engine/EngineUnit/InteractingSphere2AABB.cpp 2009-08-22 18:21:25 +0000 @@ -14,7 +14,7 @@ InteractingSphere* sphere = static_cast<InteractingSphere*>(cm.get()); AABB* aabb = static_cast<AABB*>(bv.get()); aabb->center = se3.position; - aabb->halfSize = aabbEnlargeFactor*Vector3r(sphere->radius,sphere->radius,sphere->radius); + aabb->halfSize = (aabbEnlargeFactor>0?aabbEnlargeFactor:1.)*Vector3r(sphere->radius,sphere->radius,sphere->radius); aabb->min = aabb->center-aabb->halfSize; aabb->max = aabb->center+aabb->halfSize; === modified file 'pkg/common/Engine/EngineUnit/InteractingSphere2AABB.hpp' --- pkg/common/Engine/EngineUnit/InteractingSphere2AABB.hpp 2009-05-01 14:47:26 +0000 +++ pkg/common/Engine/EngineUnit/InteractingSphere2AABB.hpp 2009-08-22 18:21:25 +0000 @@ -13,7 +13,7 @@ class InteractingSphere2AABB : public BoundingVolumeEngineUnit { public : - InteractingSphere2AABB(): aabbEnlargeFactor(1.) {} + InteractingSphere2AABB(): aabbEnlargeFactor(-1.) {} void go(const shared_ptr<InteractingGeometry>& cm, shared_ptr<BoundingVolume>& bv, const Se3r& se3, const Body*); double aabbEnlargeFactor; FUNCTOR2D(InteractingSphere,AABB); === modified file 'pkg/common/Engine/StandAloneEngine/SpatialQuickSortCollider.cpp' --- pkg/common/Engine/StandAloneEngine/SpatialQuickSortCollider.cpp 2009-08-03 10:02:11 +0000 +++ pkg/common/Engine/StandAloneEngine/SpatialQuickSortCollider.cpp 2009-08-22 18:21:25 +0000 @@ -28,7 +28,7 @@ const shared_ptr<BodyContainer>& bodies = ncb->bodies; // This collider traverses all interactions at every step, therefore interactions that were reset() will be deleted automatically as needed - ncb->interactions->pendingErase.clear(); + ncb->interactions->clearPendingErase(); size_t nbElements=bodies->size(); if (nbElements!=rank.size()) === modified file 'pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.cpp' --- pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.cpp 2009-08-09 16:17:53 +0000 +++ pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.cpp 2009-08-22 18:21:25 +0000 @@ -152,7 +152,7 @@ bool ef2_Sphere_Sphere_Dem3DofGeom::go(const shared_ptr<InteractingGeometry>& cm1, const shared_ptr<InteractingGeometry>& cm2, const Se3r& se31, const Se3r& se32, const shared_ptr<Interaction>& c){ InteractingSphere *s1=static_cast<InteractingSphere*>(cm1.get()), *s2=static_cast<InteractingSphere*>(cm2.get()); Vector3r normal=se32.position-se31.position; - Real penetrationDepthSq=pow(distanceFactor*(s1->radius+s2->radius),2)-normal.SquaredLength(); + Real penetrationDepthSq=pow((distFactor>0?distFactor:1.)*(s1->radius+s2->radius),2)-normal.SquaredLength(); if (penetrationDepthSq<0 && !c->isReal()){ return false; } @@ -164,7 +164,7 @@ ss=shared_ptr<Dem3DofGeom_SphereSphere>(new Dem3DofGeom_SphereSphere()); c->interactionGeometry=ss; // constants - if(distanceFactor>1) ss->refLength=dist; + if(distFactor>0) ss->refLength=dist; else ss->refLength=s1->radius+s2->radius; ss->refR1=s1->radius; ss->refR2=s2->radius; Real penetrationDepth=s1->radius+s2->radius-ss->refLength; === modified file 'pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.hpp' --- pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.hpp 2009-08-21 10:06:00 +0000 +++ pkg/dem/DataClass/InteractionGeometry/Dem3DofGeom_SphereSphere.hpp 2009-08-22 18:21:25 +0000 @@ -61,14 +61,14 @@ public: virtual bool go(const shared_ptr<InteractingGeometry>& cm1, const shared_ptr<InteractingGeometry>& cm2, const Se3r& se31, const Se3r& se32, const shared_ptr<Interaction>& c); virtual bool goReverse( const shared_ptr<InteractingGeometry>&, const shared_ptr<InteractingGeometry>&, const Se3r&, const Se3r&, const shared_ptr<Interaction>&){throw runtime_error("goReverse on symmetric functor should never be called!");} - //! Factor of sphere radius such that sphere "touch" if their centers are not further than distanceFactor*(r1+r2); defaults to 1. - //! If >1, equilibrium distance is the one when spheres get into initial contact; it is the sum of their radii otherwise. - Real distanceFactor; - ef2_Sphere_Sphere_Dem3DofGeom(): distanceFactor(1.) {} + //! Factor of sphere radius such that sphere "touch" if their centers are not further than distFactor*(r1+r2); + //! if negative, equilibrium distance is the sum of the sphere's radii, which is the default. + Real distFactor; + ef2_Sphere_Sphere_Dem3DofGeom(): distFactor(-1.) {} FUNCTOR2D(InteractingSphere,InteractingSphere); DEFINE_FUNCTOR_ORDER_2D(InteractingSphere,InteractingSphere); REGISTER_CLASS_AND_BASE(ef2_Sphere_Sphere_Dem3DofGeom,InteractionGeometryEngineUnit); - REGISTER_ATTRIBUTES(InteractionGeometryEngineUnit,(distanceFactor)); + REGISTER_ATTRIBUTES(InteractionGeometryEngineUnit,(distFactor)); DECLARE_LOGGER; }; REGISTER_SERIALIZABLE(ef2_Sphere_Sphere_Dem3DofGeom); === modified file 'py/utils.py' --- py/utils.py 2009-08-12 20:12:21 +0000 +++ py/utils.py 2009-08-22 18:21:25 +0000 @@ -264,7 +264,7 @@ count=0 for b in o.bodies: if not b.shape or not b.shape.name=='Sphere' or not consider(b.id): continue - out.write('%g\t%g\t%g\t%g\n'%(b.phys['se3'][0],b.phys['se3'][1],b.phys['se3'][2],b.shape['radius'])) + out.write('%g\t%g\t%g\t%g\n'%(b.phys.pos[0],b.phys.pos[1],b.phys.pos[2],b.shape['radius'])) count+=1 out.close() return count @@ -376,9 +376,10 @@ The format of the file is as follows (commens starting with # and empty lines allowed) - name1 name2 ⦠# 0th line - val1 val2 ⦠# 1st line - val2 val2 ⦠# 2nd line + # commented lines allowed anywhere + name1 name2 ⦠# first non-blank line are column headings + val1 val2 ⦠# 1st parameter set + val2 val2 ⦠# 2nd ⦠The name `description' is special and is assigned to Omega().tags['description'] @@ -394,7 +395,7 @@ o=Omega() tagsParams=[] dictDefaults,dictParams={},{} - import os, __builtin__ + import os, __builtin__,re if not tableFileLine and not os.environ.has_key('PARAM_TABLE'): if not noTableOk: raise EnvironmentError("PARAM_TABLE is not defined in the environment") o.tags['line']='l!' @@ -405,7 +406,12 @@ tableFile,tableLine=env[0],env[1] if len(env)>2: tableDesc=env[3] o.tags['line']='l'+tableLine - ll=[l.split('#')[0] for l in ['']+open(tableFile).readlines()]; names=ll[1].split(); values=ll[int(tableLine)].split() + # the empty '#' line to make line number 1-based + ll=[l for l in ['#']+open(tableFile).readlines()]; values=ll[int(tableLine)].split('#')[0].split() + names=None + for l in ll: + if not re.match(r'^\s*(#.*)?$',l): names=l.split(); break + if not names: raise RuntimeError("No non-blank line (colum headings) found."); assert(len(names)==len(values)) if 'description' in names: O.tags['description']=values[names.index('description')] else: === modified file 'scripts/test/collider-stride-triax.py' --- scripts/test/collider-stride-triax.py 2009-07-13 18:31:44 +0000 +++ scripts/test/collider-stride-triax.py 2009-08-22 18:21:25 +0000 @@ -3,8 +3,8 @@ from yade import timing,log import os.path loadFrom='/tmp/triax.xml' -if not os.path.exists(loadFrom): - TriaxialTest(numberOfGrains=20000,fast=True,noFiles=True).generate(loadFrom) +#if not os.path.exists(loadFrom): +TriaxialTest(numberOfGrains=2000,fast=True,noFiles=True).generate(loadFrom) O.load(loadFrom) log.setLevel('TriaxialCompressionEngine',log.WARN) # shut up log.setLevel('InsertionSortCollider',log.DEBUG) @@ -15,9 +15,9 @@ # use striding; say "if 0:" to disable striding and compare to regular runs if 1: # length by which bboxes will be made larger - collider['sweepLength']=0.05*O.bodies[100].shape['radius'] + collider['sweepLength']=.2*O.bodies[100].shape['radius'] # if this is enabled, bboxes will be enlarged based on velocity bin for each body - if 0: + if 1: collider['nBins']=3 collider['binCoeff']=10 log.setLevel('VelocityBins',log.DEBUG)
_______________________________________________ Mailing list: https://launchpad.net/~yade-dev Post to : yade-...@lists.launchpad.net Unsubscribe : https://launchpad.net/~yade-dev More help : https://help.launchpad.net/ListHelp
_______________________________________________ yade-dev mailing list yade-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/yade-dev