← Back to team overview

yade-users team mailing list archive

Re: [Question #240275]: Avoid interaction between two particles in a four particles experiment

 

Question #240275 on Yade changed:
https://answers.launchpad.net/yade/+question/240275

Description changed to:
Hello all,

I am doing a special biaxial test which only content Four particles laying to be a rhombus, like this
                                   
                         1
                         o
                 2 o ---- o 0
                         o
                         3

how can I avoid interaction between axial line particles 1 and 3 if they
contact?

I already tried the 'mask' and 'avoidSelfInteractionMask' to cooperate,
as

O.bodies[0].groupMask=1;O.bodies[2].groupMask=1
O.bodies[1].groupMask=2;O.bodies[3].groupMask=2
[engines]collider.avoidSelfInteractionMask=2

but when the 1,3 interaction is avoided it is also impossible to
establish interactions between two different mask's particles, then all
interaction will lose by using 'avoidSelfInteractionMask'.

Do you have any idea to achieve that? thank you.


Huaxiang


here is my code
-------------------------------------------------------------------------------------------------------

import math
from yade import plot

conf=100000
poisson=0.5
kn=1.0e8
E=kn/1.0
ks=poisson*kn
rate=5e-4
status=[0.0,0.0,0.0,0.0]

O.materials.append(FrictMat(young=E,poisson=poisson,frictionAngle=radians(99.0),density=2600,label='spheres'))
O.materials.append(FrictMat(young=1.0e3*kn,poisson=0.3,frictionAngle=radians(99.0),density=0,label='walls'))

mn,mx=Vector3(-math.sqrt(2)-1,-math.sqrt(2)-1,-1.1),Vector3(math.sqrt(2)+1,math.sqrt(2)+1,1.1)
walls=utils.aabbWalls([mn,mx],thickness=0.001,material='walls')
wallIds=O.bodies.append(walls)

O.bodies.append([
   utils.sphere(center=(math.sqrt(2),0.0,0.0),radius=1.0,material='spheres'),
   utils.sphere(center=(0.0,math.sqrt(2),0.0),radius=1.0,material='spheres'),
   utils.sphere(center=(-math.sqrt(2),0.0,0.0),radius=1.0,material='spheres'),
   utils.sphere((0.0,-math.sqrt(2),0.0),1.0,material='spheres')
])


for k in O.bodies:
   if isinstance(k.shape, Sphere): k.state.blockedDOFs='zXY'

O.dt=.5*utils.PWaveTimeStep()
O.usesTimeStepper=True


O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys()],
  [Law2_ScGeom_FrictPhys_CundallStrack()]
 ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8, defaultDt=4*utils.PWaveTimeStep()),
 NewtonIntegrator(damping=0.01),
]

O.dt=.5e-3*utils.PWaveTimeStep()

def setVel(velX,velY):
  O.bodies[0].state.vel=Vector3(velX,0.0,0.0)
  O.bodies[1].state.vel=Vector3(-velX,0.0,0.0)
  O.bodies[2].state.vel=Vector3(0.0,velY,0.0)
  O.bodies[3].state.vel=Vector3(0.0,-velY,0.0)

rateTmp=rate
while 1:
  meanS=(abs(O.forces.f(1)[0])+abs(O.forces.f(3)[1]))
  unb=unbalancedForce()
  if rateTmp>0.0 and meanS>conf:
     print 'convert'
     rateTmp=-0.5*rateTmp
  elif rateTmp<0.0 and meanS<conf:
     print 'convert'
     rateTmp=-0.5*rateTmp
  setVel(rateTmp,rateTmp)
  O.run(1, True)
  unb=unbalancedForce()
  meanS=(abs(O.forces.f(1)[0])+abs(O.forces.f(3)[1]))*0.5
  print 'unbalanced force:',unb,' mean stress: ',meanS
  if unb<0.001 and abs(meanS-conf)/conf<0.005:
    break

plot.plots={'e2':'q'}
plot.plot()
raw_input('confining finish')

'''
ini=O.bodies[7].state.se3[0][1]
e22=0.0
e11=0.0
#rate=1e2*rate
while 1:
   setVel(0.0,rate);e22+=rate
   O.run(1,True)
   while unbalancedForce()>0.001:
       setVel(0.0,0.0)
       O.run(1,True)
   rateTmp=-0.5*rate
   lateralS=(abs(O.forces.f(0)[0])+abs(O.forces.f(1)[0]))*0.5
   while abs(lateralS-conf)/conf>0.001:
       lateralS=(abs(O.forces.f(0)[0])+abs(O.forces.f(1)[0]))*0.5
       if rateTmp>0.0 and lateralS>conf:
          rateTmp=-0.5*rateTmp
       elif rateTmp<0.0 and lateralS<conf:
          rateTmp=-0.5*rateTmp
       setVel(rateTmp,0.0)
       O.run(1, True);e11+=rateTmp
       lateralS=(abs(O.forces.f(0)[0])+abs(O.forces.f(1)[0]))*0.5
   print O.forces.f(3)[1]-O.forces.f(1)[0],O.forces.f(1)[0],(ini-O.bodies[7].state.se3[0][1])/ini
   plot.addData(e2=e22,e1=e11,q=O.forces.f(3)[1]-O.forces.f(1)[0],i=O.iter)
'''

rate=10.0*rate
adjust=math.cos(75.0*pi/180.0)/math.sin(75.0*pi/180.0)*rate*1e-1
ini=O.bodies[7].state.se3[0][1]
e22=0.0
e11=0.0
rateX=0.0
while 1:
   lateralS=(abs(O.forces.f(0)[0])+abs(O.forces.f(1)[0]))*0.5
   if lateralS>conf:
       adjust=-abs(adjust)
   elif lateralS<conf:
       adjust=abs(adjust)
   rateX+=adjust
   setVel(rateX,rate);e22+=rate
   O.run(1,True)
   while unbalancedForce()>0.01:
       setVel(0.0,0.0)
       O.run(1,True)
   print O.forces.f(3)[1]-O.forces.f(1)[0],O.forces.f(1)[0],(ini-O.bodies[7].state.se3[0][1])/ini,unbalancedForce()
   plot.addData(e2=e22,e1=e11,q=O.forces.f(3)[1]-O.forces.f(1)[0],i=O.iter)

-- 
You received this question notification because you are a member of
yade-users, which is an answer contact for Yade.