New question #707888 on Yade: https://answers.launchpad.net/yade/+question/707888
Dear all, In the Yade official examples, I found the concrete Brazilian splitting test [1], which is a simple process where two walls approach the specimen at a constant speed, resulting in tensile failure of the specimen. Below is the code: ------------------------------------- # -*- encoding=utf-8 -*- from __future__ import print_function from yade import plot,pack """ A simple script of a Brazilian splitting test. A cylinder with x axis form 0 to specimenLength. Load in z direction by z-perpendicular walls. Code strongly inspired by uniax.py """ # default parameters or from table readParamsFromTable(noTableOk=True, # unknownOk=True, young = 24e9, poisson = .2, sigmaT = 3.5e6, frictionAngle = atan(0.8), epsCrackOnset = 1e-4, relDuctility = 30, intRadius = 1.5, dtSafety = .8, strainRate = 1, specimenLength = .15, specimenRadius = .05, sphereRadius = 3.5e-3, ) from yade.params.table import * # material concreteId = O.materials.append(CpmMat( young = young, poisson = poisson, frictionAngle = frictionAngle, epsCrackOnset = epsCrackOnset, relDuctility = relDuctility, sigmaT = sigmaT, )) # spheres sp=pack.randomDensePack( pack.inCylinder((0,0,0),(specimenLength,0,0),specimenRadius), radius = sphereRadius, spheresInCell = 500, memoizeDb = '/tmp/packing-brazilian.db', returnSpherePack = True ) sp.toSimulation() # walls zMin,zMax=[pt[2] for pt in aabbExtrema()] wallIDs = O.bodies.append([wall((0,0,z),2) for z in (zMin,zMax)]) walls = wallMin,wallMax = [O.bodies[i] for i in wallIDs] v = strainRate * 2*specimenRadius wallMin.state.vel = (0,0,+v) wallMax.state.vel = (0,0,-v) # engines O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=intRadius,label='is2aabb'),Bo1_Wall_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intRadius,label='ss2sc'),Ig2_Wall_Sphere_ScGeom()], [Ip2_CpmMat_CpmMat_CpmPhys()], [Law2_ScGeom_CpmPhys_Cpm()], ), NewtonIntegrator(damping=.2), CpmStateUpdater(realPeriod=.5), PyRunner(iterPeriod=100,command='addPlotData()',initRun=True), PyRunner(iterPeriod=100,command='stopIfDamaged()'), ] # stop condition def stopIfDamaged(): if O.iter < 1000: # do nothing at the beginning return fMax = max(plot.data["f"]) f = plot.data["f"][-1] if f/fMax < .6: print("Damaged, stopping.") print("ft = ",max(plot.data["stress"])) O.pause() # plot stuff def addPlotData(): # forces of walls. f1 is "down", f2 is "up" (f1 needs to be negated for evlauation) f1,f2 = [O.forces.f(i)[2] for i in wallIDs] f1 *= -1 # average force f = .5*(f1+f2) # displacement (2 times each wall) wall = O.bodies[wallIDs[0]] dspl = 2*wall.state.displ()[2] # stress (according to standard brazilian test evaluation formula) stress = f/(pi*specimenRadius*specimenLength) # store values yade.plot.addData( t = O.time, i = O.iter, dspl = dspl, f1 = f1, f2 = f2, f = f, stress = stress, ) # plot dspl on x axis, stress on y1 axis and f,f1,f2 in y2 axis plot.plots={'dspl':('stress',None,'f1','f2','f')} O.dt = 0. O.step(); # to create initial contacts # now reset the interaction radius and go ahead ss2sc.interactionDetectionFactor=1. is2aabb.aabbEnlargeFactor=1. # time step O.dt = dtSafety*PWaveTimeStep() # run simulation plot.plot() #O.run() ------------------------------------------------------- Regarding this process, I have two questions, and I would appreciate any assistance or insights from the community. 1. According to the model's micro-scale parameters, this should simulate a concrete specimen, but the stress-displacement curve indicates that the displacement is too large, roughly an order of magnitude greater than real-world conditions. Why is there such a significant difference between micro-scale parameters and macroscopic behavior, and how should I adjust it? (I believe that as an example, the micro-scale parameters in this code are reasonably set, at least in the same order of magnitude.) 2. I would like to simulate a uniaxial compression test, so I changed the original specimen shape to a cube. However, the process becomes very strange, with a sudden increase in stress, and the specimen composed of particles eventually explodes. What is causing this? Did I miss setting some parameters? I have replaced the #spheres section of the original code with the following codeļ¼ # spheres sp=pack.randomDensePack( pack.inAlignedBox((0,0,0),(specimenLength,specimenLength,specimenLength)), radius = sphereRadius, spheresInCell = 500, memoizeDb = '/tmp/packing-brazilian.db', returnSpherePack = True ) sp.toSimulation() Thanks Antonia [1] https://gitlab.com/yade-dev/trunk/-/blob/master/examples/concrete/brazilian.py?ref_type=heads -- 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