Re: [Yade-users] [Question #707088]: Dynamic Compaction Can't Repeat
Question #707088 on Yade changed: https://answers.launchpad.net/yade/+question/707088 Status: Needs information => Solved Huan confirmed that the question is solved: Thank Karol, I resolve my issue. Resolve of my code import random import math from yade import geom, pack, utils, plot, ymport, export import numpy as np # Define cylinder parameters diameter = 0.102 height = 0.18 center = (0, 0, height/2) # create cylindrical body with radius 0.102 m and height 0.064 m cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6) # add cylinder to simulation O.bodies.append(cylinder) # add sphere packing O.bodies.append(ymport.textExt('packing_loose.txt',format='x_y_z_r')) # materials Properties gravel = CohFrictMat(young = 1e6, poisson = 0.25, density = 2700, label = 'gravel') asphalt_binder = CohFrictMat(young = 3e5, poisson = 0.25, density = 1060, frictionAngle = radians(40), normalCohesion = 1e4, shearCohesion = 1e4, label = 'asphalt_binder') weight = CohFrictMat(young = 1.9e8, poisson = 0.28, density = 8645,frictionAngle = radians(0), label = 'weight') # add properties O.materials.append(gravel) O.materials.append(asphalt_binder) O.materials.append(weight) # give color and properties to shpere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == 0.01575/2 : body.shape.color = (0,0,1) #blue body.material = gravel if body.shape.radius == 0.011/2: body.shape.color = (1,0,0) #red body.material = gravel if body.shape.radius == 0.007125/2: body.shape.color = (0,1,0) #green body.material = gravel if body.shape.radius == 0.003555/2: body.shape.color = (1,1,0) #yellow body.material = gravel if body.shape.radius == 0.00160/2 : body.shape.color = (1,0,1) #magenta body.material = gravel if body.shape.radius == 0.0008/2 : body.shape.color = (0,0,0) #black body.material = asphalt_binder # add clump plate clump_bodies = ymport.textExt('clump_loose.txt',format='x_y_z_r') # plate properties clump_plate = CohFrictMat(young = 1.9e8, poisson = 0.28, density = 7500, label = 'clump_plate') # add properties O.materials.append(clump_plate) # define layer total_clump_bodies = len(clump_bodies) bodies_per_layer = total_clump_bodies / 8 layer_7_bodies = [] for i, clump_body in enumerate(clump_bodies): layer_number = i // bodies_per_layer # Calculate the layer number for the clump body if layer_number % 2 == 0: color = (1, 0, 0) # red for even-numbered layers else: color = (1, 1, 1) # white for odd-numbered layers clump_body.shape.color = color clump_body.material = clump_plate # Add clump body to layer 7 list if layer_number == 7: layer_7_bodies.append(clump_body) # Calculate the mean z-coordinate of layer 7 center_top_clump_surface = np.mean([clump_body.state.pos[2] for clump_body in layer_7_bodies]) O.bodies.appendClumped(clump_bodies) # clump center of mass clump_z = np.mean([clump_body.state.pos[2] for clump_body in clump_bodies]) # clump (center of mass) z-coordinate O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]), InteractionLoop( # handle sphere+sphere and facet+sphere collisions [Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()] ), NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.4), # call the checkUnbalanced function (defined below) every 600 seconds ] # set dt to stabilize the force in packing O.dynDt = False # function for stabalize def impaction(): # stabalize the packing O.dt = PWaveTimeStep() print("dt=",O.dt) O.run(2000,True) print("2000") # create large ball idball = O.bodies.append(sphere((0, 0, center_top_clump_surface + 0.05721), 0.1/2)) O.bodies[idball].material = weight O.bodies[idball].shape.color = (0.5, 0.5, 0.5) s = 0.445 g = 9.81 v = math.sqrt(2*g*s) O.bodies[idball].state.vel = (0,0,-v) # stabilize when ball impact packing O.run(5000,True) print("7000") O.run(5000,True) print("12000") O.run(5000,True) print("17000") # remove ball after impact O.bodies.erase(idball) print("weight removed") # list to store the bodies to be removed to_remove = [] # remove asphalt and aggregate that is above clump for body in O.bodies: if isinstance(body.shape, Sphere) and (body.material == gravel or body.material == asphalt_binder): if body.state.pos[2] > clump_z: to_remove.append(body) for body in to_remove:
Re: [Yade-users] [Question #707088]: Dynamic Compaction Can't Repeat
Question #707088 on Yade changed: https://answers.launchpad.net/yade/+question/707088 Status: Open => Needs information Karol Brzezinski requested more information: Hi, Honestly, I don't understand the question. Could you please rephrase it? Secondly, I thought that running the code would be helpful, but I the packing is stored in the external file 'packing8.txt'. Please try to simplify your example (MWE[1]) Cheers, Karol [1] https://www.yade-dem.org/wiki/Howtoask -- 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
[Yade-users] [Question #707088]: Dynamic Compaction Can't Repeat
New question #707088 on Yade: https://answers.launchpad.net/yade/+question/707088 Hi, I'm trying to create a simulation that would have large spherical ball drop and hit the clump plate repeatedly 100 times. and calculate the average z and mass every time. Also, use export.text to get position of the packing every 10th time. However, the calculation would calculated every time the large ball drop instead of calculating in after it hit the plate. -This is my code import random import math from yade import geom, pack, utils, plot, ymport, export import numpy as np # Define cylinder parameters diameter = 0.102 height = 0.18 center = (0, 0, height/2) # create cylindrical body with radius 0.102 m and height 0.064 m cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6) # add cylinder to simulation O.bodies.append(cylinder) # add sphere packing O.bodies.append(ymport.textExt('packing8.txt',format='x_y_z_r')) # materials Properties gravel = CohFrictMat(young = 1e7, poisson = 0.25, density = 2700, label = 'gravel') asphalt_binder = CohFrictMat(young = 1e7, poisson = 0.25, density = 1060, frictionAngle = radians(40), normalCohesion = 5e4, shearCohesion = 5e4, label = 'asphalt_binder') weight = CohFrictMat(young = 1e7, poisson = 0.25, density = 11450,frictionAngle = radians(0), label = 'weight') # add properties O.materials.append(gravel) O.materials.append(asphalt_binder) O.materials.append(weight) # give color and properties to shpere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == 0.01575/2 : body.shape.color = (0,0,1) #blue body.material = gravel if body.shape.radius == 0.011/2: body.shape.color = (1,0,0) #red body.material = gravel if body.shape.radius == 0.007125/2: body.shape.color = (0,1,0) #green body.material = gravel if body.shape.radius == 0.003555/2: body.shape.color = (1,1,0) #yellow body.material = gravel if body.shape.radius == 0.00160/2 : body.shape.color = (1,0,1) #magenta body.material = gravel if body.shape.radius == 0.0008/2 : body.shape.color = (0,0,0) #black body.material = asphalt_binder # add clump plate clump_bodies = ymport.textExt('clump8.txt',format='x_y_z_r') # plate properties clump_plate = CohFrictMat(density = 7500, label = 'clump_plate') # add properties O.materials.append(clump_plate) # define layer total_clump_bodies = len(clump_bodies) bodies_per_layer = total_clump_bodies / 8 for i, clump_body in enumerate(clump_bodies): layer_number = i // bodies_per_layer # Calculate the layer number for the clump body if layer_number % 2 == 0: color = (1, 0, 0) # red for even-numbered layers else: color = (1, 1, 1) # white for odd-numbered layers clump_body.shape.color = color clump_body.material = clump_plate O.bodies.appendClumped(clump_bodies) # z-coordinate for clump clump_z = np.mean([clump_body.state.pos[2] for clump_body in clump_bodies]) # clump (center of mass) z-coordinate # create large ball O.bodies.append(sphere((0, 0, clump_z + 0.25), 0.1/2)) # give color and properties to shpere for body in O.bodies: if not isinstance(body.shape, Sphere): continue if body.shape.radius == 0.10/2 : body.shape.color = (0.5,0.5,0.5) #grey body.material = weight # define original condition x = 0 y = 0 window = 0.01575/2 def calculate_zmax(x, y, window): zmax = float('-inf') # Initialize zmax to negative infinity # Define the square region x_min = x - window x_max = x + window y_min = y - window y_max = y + window # Iterate over all bodies in the simulation for body in O.bodies: if isinstance(body.shape, Sphere) and (body.material == gravel or body.material == asphalt_binder or body.material == weight): sphere_x, sphere_y, sphere_z = body.state.pos # Get the position of the sphere sphere_radius = body.shape.radius # Check if the sphere is within the square region if x_min <= sphere_x <= x_max and y_min <= sphere_y <= y_max: z = sphere_z + sphere_radius # Calculate the z-coordinate of the top of the sphere # Update zmax if the current z-coordinate is higher if z > zmax: zmax = z return zmax def hundredblows(): # Perform 100 blows of the large ball for blow_number in range(100): # Perform the blow O.run() # Adjust the number of iterations as needed # Calculate clump_z clump_z = np.mean([clump_body.state.pos[2] for clump_body in clump_bodies]) # clump (center of mass) z-coordinate #