← Back to team overview

yade-users team mailing list archive

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

 

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

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.