Thread Previous • Date Previous • Date Next • Thread Next |
Hi guys, I tried to write some python code to analyse the distribution of fragments produced during one of my simulation. Since it can interest some of you, I wanted to share the first draft. As indicated in the file, I use it with CohesiveFrictionalPM, but it can be easily adapted to every cohesive contact laws. This is really basic stuff due to my still very poor coding knowledge, but I think this kind of feature should be included into the sources. Obviously, any improvement/advice on the code is welcome. In its current form, the script produces a text file where each fragment (cohesive block) is identified with its X,Y,Z dimensions, as well as the number of particles involved and the corresponding volume. I have attached an example of the results (picture+text file) obtained for a slope stability simulation involving a wedge formed by two discontinuity planes. If you think this could be useful in YADE, maybe we could include a function in yade.utils with few more lines to plot the corresponding distribution curve. Cheers Luc
Attachment:
WedgeIdentification.png
Description: PNG image
Attachment:
wedgeFragmentDistribution.spheres
Description: Binary data
# -*- coding: utf-8 -*- # encoding: utf-8 ## THSI SCRIPT PRODUCES A TEXT FILE GIVING THE DISTRIBUTION SIZE OF FRAGMENTS (VALID FOR COHESIVE CONTACT LAWS, WRITTEN HERE FOR CFpm WHERE isCohesive INDICATES IF AN INTERACTION IS COHESIVE OR NOT) ### load simulation O.load('wedge.xml') ###################################################################################### nbFragments=0 fragments=particles=[] # fragments not used here because some pb. The idea was to stock ID depending on the fragment to which they belong (see line 63 for pb) color=[0.,0.,0.] a=b=0 colorInc=1.0 ## initialize if some bodies are non dynamic (isDynamic is used to determine if particles have already been checked) for o in O.bodies : o.isDynamic=True o.shape.color=color ### to clean the file (other way?) outFile=open('fragmentDistribution.spheres','w') outFile.close() outFile=open('fragmentDistribution.spheres','a') outFile.write('# Id_nbPart_X_Y_Z_V' + '\n') for o in O.bodies : if o.shape.name=='Sphere' and o.isDynamic==True : del particles[:] ## color setting (EXPERIMENTAL-> probably something cleaner to do here) if color[a]>=1 : a+=1 if a>2 : b+=1 color=[0.,0.,0.] a=b if b>2 : color=[0.,0.,0.] a=0 b=0 color[a]=color[a]+colorInc nbFragments+=1 print 'fragment ID=', nbFragments, ' | color=', color particles.append(o.id) o.isDynamic=False #marked o.shape.color=color for c in particles : for i in O.interactions.withBody(c) : if i.phys.isCohesive : if i.id1==c and O.bodies[i.id2].isDynamic==True : particles.append(i.id2) O.bodies[i.id2].isDynamic=False O.bodies[i.id2].shape.color=color elif i.id2==c and O.bodies[i.id1].isDynamic==True : particles.append(i.id1) O.bodies[i.id1].isDynamic=False O.bodies[i.id1].shape.color=color #fragments.append(particles) # does not work since del particles[:] seems to delete fragments components too xmin=ymin=zmin=1000 xmax=ymax=zmax=0 nbParticles=X=Y=Z=V=0 for p in particles : nbParticles+=1 V+=1.333*3.14*pow(O.bodies[p].shape.radius,3) if O.bodies[p].state.pos[0]<xmin : xmin=O.bodies[p].state.pos[0]-O.bodies[p].shape.radius if O.bodies[p].state.pos[0]>xmax : xmax=O.bodies[p].state.pos[0]+O.bodies[p].shape.radius if O.bodies[p].state.pos[1]<ymin : ymin=O.bodies[p].state.pos[1]-O.bodies[p].shape.radius if O.bodies[p].state.pos[1]>ymax : ymax=O.bodies[p].state.pos[1]+O.bodies[p].shape.radius if O.bodies[p].state.pos[2]<zmin : zmin=O.bodies[p].state.pos[2]-O.bodies[p].shape.radius if O.bodies[p].state.pos[2]>zmax : zmax=O.bodies[p].state.pos[2]+O.bodies[p].shape.radius X=xmax-xmin Y=ymax-ymin Z=zmax-zmin outFile.write('%g\t%g\t%g\t%g\t%g\t%g\n'%(nbFragments,nbParticles,X,Y,Z,V)) print 'nbFragments=', nbFragments outFile.close() ################################################################################ ## graphical interface from yade import qt qt.Controller() v=qt.View() renderer=qt.Renderer() renderer.bgColor=(0.5,0.5,0.5)
Thread Previous • Date Previous • Date Next • Thread Next |