Unexpected Reaction

Asked by Jeff Steadman

Hello everyone,

I have a block of particles that I'm applying a force field to via a meshed wall. I'm applying the load to a prescribed area on top of the block. When the load is applied some particles in the area move while some don't. Also, the particles that are pushed down from the top "sink" through the block, hit the floor, and bounce back up. The particles in the block show no reaction to the force outside of the particles initially pushed down on the top of the blocks. My code is shown below,
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
from esys.lsm import *
from esys.lsm.util import *
from esys.lsm.geometry import *
from POVsnaps import POVsnaps
from BSplineWallMover import WallLoaderRunnable

sim = LsmMpi(numWorkerProcesses=12, mpiDimList=[3,2,2])
sim.initNeighbourSearch(
   particleType="NRotSphere",
   gridSpacing=1.25,
   verletDist=0.02
)

sim.setNumTimeSteps(100)
sim.setTimeStepSize(2.085e-5)

domain = BoundingBox(Vec3(-15,-5,-5), Vec3(15,5,5))
sim.setSpatialDomain(domain)

geoRandomBlock = RandomBoxPacker (
   minRadius = 0.1,
   maxRadius = 0.5,
   cubicPackRadius = 1.1000,
   maxInsertFails = 1000,
   bBox = BoundingBox(
      Vec3(0.0000, 0.0000, 0.0000),
      Vec3(10.0000, 2.0000, 2.0000)
   ),
   circDimList = [False, False, False],
   tolerance = 1.0000e-05
)
geoRandomBlock.generate()
geoRandomBlock_particles = geoRandomBlock.getSimpleSphereCollection()

myParticleList = SimpleSphereCollection()
Density =.0017987 #slug/in^3

for pp in geoRandomBlock_particles:
   centre = pp.getPosn()
   radius = pp.getRadius()
   pp.setMass(Density*(4*3**-1)*3.1416*radius**3)
   X = centre[0]
   Y = centre[1]
   if (X <=30 and Y >= 1.1*radius):
      pp.setTag(1)
   else:
    if (Y < 1.1*radius):
       pp.setTag(2)
    else:
       pp.setTag(3)
   myParticleList.create(pp)

sim.createParticles(myParticleList)

sim.createWall (
   name = "floor",
   posn = Vec3(0.0000, 0.0000, 0.0000),
   normal = Vec3(0.0000,1.0000, 0.0000)
)

sim.readMesh(
   fileName = "ForceWallMesh.msh",
   meshName = "Force_Mesh_Wall"
)

sim.createInteractionGroup (
    NRotFrictionPrms (
      name = "friction",
      normalK = 1000, #I'm not sure about this value
      dynamicMu = 0.5,
      shearK = 100, #I'm not sure about this value
      scaling=True
   )
)

sim.createInteractionGroup (
   NRotBondedWallPrms (
      name = "floor_bonds",
      wallName = "floor",
      normalK = 10000,
      particleTag = 2
   )
)

sim.createInteractionGroup (
   GravityPrms (
      name = "gravity",
      acceleration = Vec3(0.0000,-32.2, 0.0000) #ft/s^2
   )
)

sim.createInteractionGroup (
   LinDampingPrms (
      name = "viscosity",
      viscosity = 0.10000,
      maxIterations = 100
   )
)

sim.createInteractionGroup (
   NRotBondedTriMeshPrms (
      name = "WallForce_bonds",
      meshName = "Force_Mesh_Wall",
      normalK = 10000, #I'm not sure about this value
      breakDistance = .01,
      buildPrms = MeshGapBuildPrms(1)
   )
)

wall_loader = WallLoaderRunnable(
   LsmMpi = sim,
   wallName = "Force_Mesh_Wall",
   StartTime = 0,
   EndTime = 20,
   Support = 4.17e-4,
   Magnitude = 1,
)

sim.addPreTimeStepRunnable (wall_loader)

displacement = ParticleVectorFieldSaverPrms(
  fieldName="displacement",
  fileName="Displacement.txt",
  fileFormat="RAW_SERIES",
  beginTimeStep=0,
  endTimeStep=100,
  timeStepIncr=1
)
sim.createFieldSaver(displacement)

force = ParticleVectorFieldSaverPrms(
  fieldName="force",
  fileName="Force.txt",
  fileFormat="RAW_SERIES",
  beginTimeStep=0,
  endTimeStep=100,
  timeStepIncr=1
)

sim.createFieldSaver(force)

povcami = POVsnaps(sim=sim, interval=1)
povcami.configure(lookAt=Vec3(0,0,0), camPosn=(10,5,5), zoomFactor=0.2)
sim.addPostTimeStepRunnable(povcami)

sim.run()

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
from esys.lsm import *
from esys.lsm.util import *
from BSpline import BSpline

class WallLoaderRunnable (Runnable):
   def __init__ (self,
                 LsmMpi=None,
                 wallName=None,
                 StartTime=0,
                 EndTime = 0,
                 Support = .01,
                 Magnitude = 1):

      Runnable.__init__(self)
      self.sim = LsmMpi
      self.wallName = wallName
      self.StartTime = StartTime
      self.Support = Support
      self.Magnitude = Magnitude
      self.Interval = self.sim.getTimeStepSize()
      self.EndTime = EndTime
      self.Nt = 0
      self.Mt = 1

   def run (self):
      if (self.Nt >= self.EndTime):
        Dmove = 0
      else:
       if (self.Nt == 0):
        Value = BSpline(self.Support,self.Nt*self.Interval)
        Dmove = self.Magnitude*Value.B
        self.sim.translateMeshBy(meshName = self.wallName,translation = Vec3(0.0,-Dmove,0.0))
       else:
        iValue = BSpline(self.Support,self.Nt*self.Interval)
        jValue = BSpline(self.Support,(self.Nt-self.Mt)*self.Interval)
        DDmove = self.Magnitude*(iValue.B-jValue.B)
        self.sim.translateMeshBy(meshName = self.wallName,translation = Vec3(0.0,-DDmove,0.0))
      self.Nt += 1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
from math import*

class BSpline:
   def __init__ (self,Support,Time):
       self.Time = Time/Support

       if (0 <= self.Time < 0.25):
        self.B = (32*3**-1)*self.Time**3
       else:
         if (self.Time >= 0.25 and self.Time < 0.5):
          self.B = -32*self.Time**3+32*self.Time**2-8*self.Time+(2*3**-1)
         else:
           if (self.Time >= 0.5 and self.Time < 0.75):
            self.B = 32*self.Time**3-64*self.Time**2+40*self.Time-(22*3**-1)
           else:
             if (self.Time >= 0.75 and self.Time < 1):
              self.B = -(32*3**-1)*self.Time**3+32*self.Time**2-32*self.Time+(32*3**-1)
             else:
              self.B = 0
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
My suspension is the values for the bond interactions and, the particle-wall interactions are not calibrated correctly. I'm trying to model a 10"x2"x2" (x,y,z) specimen with density = 100 lb/ft^3(.0017987 slugs/in^3) . The wall is suppose to push the particles down for 10 timesteps and then, the wall is suppose to move upward eventually moving back to it's original position after 10 more timesteps. The load is a B-Spline applied over 20 timesteps on a 2"x2" area at the center of the block.

 How do you calibrate the particle interaction parameters and the particle to wall stiffnesses? Any help would be greatly appreciated. Thanks.

Question information

Language:
English Edit question
Status:
Answered
For:
ESyS-Particle Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
SteffenAbe (s-abe) said :
#1

Hi Jeff,

without reading your script in detail there are 2 issues:
(1) The elastic properties of your model are determined by the bond / interaction normal stiffness. In particular, Young's modulus is roughly (there is a packing dependency in it) the value of normalK in whatever units you're using. Same thing goes for wall-particle interactions.
(2) Having a significant displacement in only 10 time steps sounds odd to me. I haven't calculated it with the values in your script, but considering the constraints on the time step this will normally result in a rather large accleration. Also, you need to consider that with the usual approach to setting the time step size (i.e. p-wave speed / min. particle radius * 0.2) this would mean that the displacement induced by the wall would only propagate ~2 min. particle diameters into the material during those 10 time steps.

Steffen

Can you help with this problem?

Provide an answer of your own, or ask Jeff Steadman for more information if necessary.

To post a message you must log in.