New question #706022 on Yade: https://answers.launchpad.net/yade/+question/706022
import random import math from yade import geom, pack, utils from yade import export import numpy as np # Define cylinder parameters center = (0, 0, 0) radius = 0.08 height = 0.10 # create cylindrical body with radius 0.08 m and height 0.0605 m cylinder = yade.geom.facetCylinder(center=center, radius=radius, height=height, segmentsNumber=80, wallMask=6) O.bodies.append(cylinder) # Define sphere parameters and percentages radii = [0.000075, 0.0006, 0.00236, 0.00475, 0.0095, 0.0125] percentages = [0.04, 0.06, 0.05, 0.35, 0.2, 0.3] # Generate sphere pack sp = pack.SpherePack() for r, ratio in zip(radii, percentages): num_spheres = int(ratio * 1000) sp.makeCloud((-0.055,-0.055,0.35), (0.055,0.055,0.01), rMean=r, rRelFuzz=0, num=num_spheres) # add the sphere pack to the simulation sp.toSimulation() # Define gravity engine O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_ScGeom6D(), Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys()], [Law2_ScGeom_FrictPhys_CundallStrack()] ), GlobalStiffnessTimeStepper(defaultDt=0.0001, timestepSafetyCoefficient=0.8), NewtonIntegrator(gravity=(0,0,-9.81), damping=0.4), ] # Define simulation duration and time step O.dt = 1e-5 O.run(1000) # Count the number of spheres in the cylinder num_spheres_in_cylinder = 0 for body in O.bodies: if body.id == 0: # skip the cylinder continue sphere_center = body.state.pos dist_to_axis = math.sqrt(sphere_center[0]**2 + sphere_center[1]**2) if dist_to_axis <= radius and sphere_center[2] >= center[2] and sphere_center[2] <= center[2] + height: num_spheres_in_cylinder += 1 # Calculate volume of spheres in cylinder volume_of_spheres_in_cylinder = 0 for body in O.bodies: if body.id == 0: # skip the cylinder continue sphere_center = body.state.pos dist_to_axis = math.sqrt(sphere_center[0]**2 + sphere_center[1]**2) if dist_to_axis <= radius and sphere_center[2] >= center[2] and sphere_center[2] <= center[2] + height: if isinstance(body.shape, Sphere): # check if body is a sphere sphere_volume = (4/3) * math.pi * body.shape.radius**3 volume_of_spheres_in_cylinder += sphere_volume # Calculate volume of cylinder volume_of_cylinder = (math.pi * radius**2) * height # Calculate porosity porosity = (volume_of_cylinder - volume_of_spheres_in_cylinder) / volume_of_cylinder porosity_percent = porosity * 100 # Print results print("Number of spheres in cylinder:", num_spheres_in_cylinder) print("Volume of spheres in cylinder:", volume_of_spheres_in_cylinder) print("Volume of cylinder:", volume_of_cylinder) print("Porosity:", porosity) print("Porosity:", porosity_percent, "%") I have two question 1. Is it possible to add color to each radii sphere radius? 2. After simulation, the sphere seems to pack well in the container, but my porosity after calculation if above 80+% did I have mistake in my calculation process? -- 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