Question #305894 on Yade changed: https://answers.launchpad.net/yade/+question/305894
Jan Stránský proposed the following answer: Hi James, according to docs [1,2], one option is ti use Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(..., *recordCracks=True,Key='test'*) It should not be difficult to add some more information in the source code. another option (with some modifications also applicable to different materials) is to use a python function and call it with PyRunner. For this purpose, set (Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(..., *neverDamage=True*) [3] to make broken interactions still exist and make possible to get information form them ("crack width" etc.) ################################### def processBrokenInteractions(): print print 'iter',O.iter for i in O.interactions: if i.phys.isBroken: b1 = O.bodies[i.id1] b2 = O.bodies[i.id2] w = i.phys.initD-i.geom.penetrationDepth # not 100% sure print 'cp',i.geom.contactPoint,'mat',b1.mat,'normal',i.geom.normal,'width',w # write to file instead of print possible # extract whatever you want from the interaction i ################################### cheers Jan [1] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM.recordCracks [2] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM.Key [3] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM.neverErase 2016-07-28 0:43 GMT+02:00 James X <question305...@answers.launchpad.net>: > Question #305894 on Yade changed: > https://answers.launchpad.net/yade/+question/305894 > > James X posted a new comment: > Hi Jan, > > Thank you very much. I have included a simplified version of what I am > trying to do. It is currently a pseudo-2D simulation, though I would > ideally like to be able to handle both 3D and 2D. What I would hope for > is to be able to export, at any user-defined timestep, the fracture > event coordinates, the coordinates of the element pair that broke, and > the material of the two elements. > > However, having just the coordinates of the fracture event themselves > itself would be great. > > Just as a FYI, the first half is just a 2D gravity-settling script to > generate a 2D mesh. While I would like to do 3D simulations, the > limitations of my experimental data does not allow me to go 3D at the > moment. > > > import numpy as np > import time > > from yade import pack > from yade import geom > from yade import polyhedra_utils > from yade import utils > from yade import linterpolation > from yade import export > from yade import ymport > > #other random parameters > start = time.time() > > #this function just makes a 2D sphere mesh and exports it as > <FILENAME>.sphere > def Make_Packed_file(filename, xSize, ySize, radius, rRelFuzz_value, > nbIter=3000): > #filename = filename #output a msh file > sp=pack.SpherePack() > > sp.makeCloud(minCorner=(0,0,0),maxCorner=(xSize,ySize*2.5,0),rMean=radius, > rRelFuzz = 0) > sp.toSimulation() > for b in O.bodies: > b.state.blockedDOFs = 'zXY' > > box=O.bodies.append(utils.geom.facetBox((xSize/2,1.25*ySize,0),(xSize/2,1.25*ySize,radius),wallMask=63)) > # the same box of makeCloud > > O.engines=[ > ForceResetter(), > > InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]), > InteractionLoop( > > [Ig2_Sphere_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()], > [Ip2_FrictMat_FrictMat_FrictPhys()], > [Law2_ScGeom_FrictPhys_CundallStrack()] > ), > NewtonIntegrator(gravity=(0,-2.0,0),damping=.1), > PyRunner(iterPeriod=500,initRun=False,command='print("elapsed time > is: " + str(time.time() - start) ) '), > > DomainLimiter(lo=(-0.01,-0.01,-0.01),hi=(xSize,ySize,1.1*radius),iterPeriod=nbIter-1) > ] > O.dt=utils.PWaveTimeStep() > O.stopAtIter=nbIter > O.run() > O.wait() > export.text(filename+'.spheres') > > > ###random parameters > radius = 3 > smoothContact=True > jointFrict=radians(20) > jointDil=radians(0) > new_scale = 1.0 > xSize = 250; > ySize = 150; > rRelFuzz_value = 0; > > #actually make this packed mesh > Make_Packed_file("simplified_packed_2D_mesh", xSize, ySize, radius, > rRelFuzz_value) > > O.reset() #reset everything, just in case > > > #defin the material > def mat_1(): return > JCFpmMat(type=1,young=30.0e9,poisson=0.3,frictionAngle=radians(30),density=3000,tensileStrength=1.23e8,cohesion=1.23e8,jointNormalStiffness=1e7,jointShearStiffness=1e7,jointCohesion=1e6,jointFrictionAngle=radians(20),jointDilationAngle=0.0) > > > O.materials.append((mat_1())) > > #import the mesh created in the previous simulation > import_spheres = > ymport.text("simplified_packed_2D_mesh.spheres",scale=new_scale,shift=Vector3(0,0,0),material=mat_1) > O.bodies.append(import_spheres) > > > #add in wall information, from uniax.py > young = 90e9 > mn,mx=Vector3(0,0,0),Vector3(xSize*new_scale,1.01*ySize*new_scale,2.00001*radius) > # corners of the initial packing > > 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) > > > #from uniax.py > bb=uniaxialTestFeatures() > > negIds,posIds,axis,crossSectionArea=bb['negIds'],bb['posIds'],bb['axis'],bb['area'] > > strainRateTension=.05 > setSpeeds=True > > > interactionRadius=1.60 # to set initial contacts to larger neighbours and > a bit further > > O.engines=[ > > ForceResetter(), > > InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=interactionRadius,label='is2aabb'),]), > InteractionLoop( > > [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=interactionRadius,label='ss2d3dg')], > > [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=1,label='interactionPhys')], > > [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(smoothJoint=smoothContact,label='interactionLaw')] > ), > GlobalStiffnessTimeStepper(timestepSafetyCoefficient=0.8), > NewtonIntegrator(damping=0.2,gravity=(0.,0,0.)), > > UniaxialStrainer(strainRate=strainRateTension,axis=axis,asymmetry=0,posIds=posIds,negIds=negIds,crossSectionArea=crossSectionArea,blockDisplacements=False,blockRotations=False,setSpeeds=setSpeeds,label='strainer'), > ] > > #### time step definition (low here to create cohesive links without big > changes in the assembly) > O.dt=0.05*utils.PWaveTimeStep() > > #### set cohesive links with interaction radius>=1 > O.step(); > > #### initializes now the interaction detection factor to strictly 1 > ss2d3dg.interactionDetectionFactor=-1.0 > is2aabb.aabbEnlargeFactor=-1.0 > > -- > 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 > -- 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