yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #18508
[Question #676609]: problem with createInteraction() command
New question #676609 on Yade:
https://answers.launchpad.net/yade/+question/676609
Hi all,
When I used createInteraction() command to manually create intrs between 2 spheres, I got an error:
RuntimeError: Interaction #39+#18 already exists.
I have then check these 2 spheres #39 and #18:
Sphere #39 has no intrs, len(O.bodies[39].intrs()) = 0, while sphere #18 has 7 intrs but #39 is not in the neighboring list of sphere #18.
Please see the MWE (Minimal Working Example™) generating this error down below. Please let me know why I have this RuntimeError error?
Best regards,
Thai-Son
PS: I have also tried aabbEnlargeFactor and interactionDetectionFactor but I could not obtain what I want, that's why I have to try doing this createInteraction manually. To be more specified, what I want is that all spheres in the packing has at least 1 intrs.
#-------------- MWE ------------------------------#
# encoding: utf-8
# ------------------------------------------------------------------------------ #
#######################
### INPUT PARAMETERs ###
#######################
seed0=1 # = 1 -> same packing everytime
distributeMass0=False # True -> Mass fraction, False -> PARTICLE COUNT fraction
num_spheres0=200
mx=Vector3(.4e-2,.6e-2,.4e-2) # size of aggregate
mn=Vector3(0,0,0)
porosity0=0.4
rRelFuzz0=0.7 # for the case of polydisperse
compFricDegree = 15.0 # initial contact friction during the confining phase (will be decreased during the REFD compaction process)
confiningS=-1e5
surfaceTension=0.07274 # [N/m]
young0= 50e9 # 50 GPa
poisson0= 0.2
density0 = 2530 # 2.53 g/cm3 = 2530 kg/m3
tensileStrength = 3.3e9 # 3.3 GPa
shearStrength = 3.3e9 # 3.3 GPa
####################################
## GENERATING PARTICLE PACKING ###
####################################
from yade import pack
import pylab
O.materials.append(CohFrictMat(young=young0,poisson=poisson0,density=density0,frictionAngle=radians(compFricDegree), normalCohesion=tensileStrength, shearCohesion=shearStrength, momentRotationLaw=True,etaRoll=0.1,label='spheres'))
O.materials.append(FrictMat(young=young0,poisson=poisson0,frictionAngle=0,density=0,label='frictionlessWalls'))
walls=aabbWalls((mn,mx),thickness=0,material='frictionlessWalls')
wallIds=O.bodies.append(walls)
### Aggregate generation ###
num_spheres1D=int(round(num_spheres0**(1./3))) # for calculation of rMean0
sp=pack.SpherePack()
rMean0=(1-rRelFuzz0) * ((mx[0]/num_spheres1D)/2) # Irregular case, in order to obtain: num_spheres_real not less than num_spheres
sp.makeCloud(minCorner=mn,maxCorner=mx,rMean=rMean0,rRelFuzz=rRelFuzz0,porosity=porosity0,num=num_spheres0,distributeMass=distributeMass0,seed=seed0)
O.bodies.append([utils.sphere(center,rad,material='spheres') for center,rad in sp])
### mechanical loading #### To confer a solid-like nature to the packing
triax=TriaxialStressController(
internalCompaction=True,
goal1=confiningS,
goal2=confiningS,
goal3=confiningS,
max_vel=10,
label="triax"
)
newton=NewtonIntegrator(damping=0.4)
unsat=UnsaturatedEngine(dead=1,label="unsat")
# ---------------------------------------------------------------------------
O.engines=[
ForceResetter(),
### Collsion detector
InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
### Interaction handling
InteractionLoop(
[Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom()],
[Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label="cohesiveIp")],
[Law2_ScGeom_FrictPhys_CundallStrack(),Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
useIncrementalForm=True, #useIncrementalForm is turned on as we want plasticity on the contact moments
always_use_moment_law=False, #if we want "rolling" friction even if the contact is not cohesive (or cohesion is broken), we will have to turn this true somewhere
label='cohesiveLaw')]
),
GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=1,timestepSafetyCoefficient=0.5),
triax,
newton
]
# ---------------------------------------------------------------------------
numDEMiter1stDEMloop=3000
numDEMiter2ndDEMloop=2000
numDEMiter3rdDEMloop=500
numDEMiterPerDryIter=250
while 1:
O.run(numDEMiter1stDEMloop,True)
unb=unbalancedForce()
if unb<0.01 and abs(triax.goal1-triax.meanStress)/abs(triax.goal1)<0.001:
break
## REACH NEW EQU. STATE ###
finalFricDegree = 30 # contact friction during the deviatoric loading
# We move to deviatoric loading, let us turn internal compaction off to keep particles sizes constant
triax.internalCompaction=False
# Change contact friction (remember that decreasing it would generate instantaneous instabilities)
setContactFriction(radians(finalFricDegree))
while 1:
O.run(numDEMiter2ndDEMloop,True)
unb=unbalancedForce()
if unb<0.001 and abs(triax.goal1-triax.meanStress)/abs(triax.goal1)<0.001:
break
triax.depth0=triax.depth
triax.height0=triax.height
triax.width0=triax.width
O.run(numDEMiter3rdDEMloop,True)
ei0=-triax.strain[0];ei1=-triax.strain[1];ei2=-triax.strain[2]
si0=-triax.stress(0)[0];si1=-triax.stress(2)[1];si2=-triax.stress(4)[2]
### counting the real number of spheres generated by YADE
num_spheres_real=0
for b in O.bodies:
if not isinstance(b.shape,Box):
num_spheres_real =num_spheres_real+1
num_spheres=num_spheres_real
### --------------------------------------------------------------------###
### ---- GLUEING THE PARTICLE manually ---- ###
### --------------------------------------------------------------------###
### calculating number of no-intrs bodies to see the effect of manuallly creating bond between particles
NoIntrsBodies=[]
for i in range(6,len(O.bodies)): # exclude walls, id<6
if len(O.bodies[i].intrs()) == 0 and not i in NoIntrsBodies :
NoIntrsBodies+=[i]
print 'NoIntrsBodies before creating additional bonds: ', len(NoIntrsBodies)
#-----------------------------------------------------------#
# CREATE BONDS BETWEEN PARTICLES MANUALLY
#-----------------------------------------------------------#
# List of no-bond particles
EnlargeFactorManual=150./100.
ParticleWithManualBondCreatedList=[]
for i in NoIntrsBodies:
if not i in ParticleWithManualBondCreatedList:
for j in range(6,len(O.bodies)): # exclude walls, id<6, only manually create bonds between spheres
if not i==j and not i in ParticleWithManualBondCreatedList: # skip the sphere i itself and skip i if i has been already added in this "for" loop
if (float((O.bodies[i].state.pos-O.bodies[j].state.pos).norm())-O.bodies[j].shape.radius) / O.bodies[i].shape.radius < EnlargeFactorManual:
# --- MANUALLY CREATE INTERATION (BOND) BETWEEN 2 SPHERES --- #
createInteraction(i,j)
# -- this ParticleWithManualBondCreatedList is used for avoiding checking a sphere which already turned from no-bond to bonded sphere
if not i in ParticleWithManualBondCreatedList:
ParticleWithManualBondCreatedList+=[i]
if not j in ParticleWithManualBondCreatedList:
ParticleWithManualBondCreatedList+=[j]
NoIntrsBodiesAfter=[]
for i in range(6,len(O.bodies)): # exclude walls, id<6
if len(O.bodies[i].intrs()) == 0 and not i in NoIntrsBodiesAfter :
NoIntrsBodiesAfter+=[i]
print 'EnlargeFactorManual: ', EnlargeFactorManual
print 'NoIntrsBodies after creating additional bonds: ', len(NoIntrsBodiesAfter)
### --- DEBUGGING section --- # Please use this pack of codes after getting the error "RuntimeError: Interaction #39+#18 already exists."
#%cpaste
print ''
print "i in NoIntrsBodies >>>", i in NoIntrsBodies
print "j in NoIntrsBodies >>>", j in NoIntrsBodies
print "i in ParticleWithManualBondCreatedList >>>",i in ParticleWithManualBondCreatedList
print "j in ParticleWithManualBondCreatedList >>>",j in ParticleWithManualBondCreatedList
print "EnlargeFactorManual: ",EnlargeFactorManual
print "len(O.bodies[i].intrs()):", len(O.bodies[i].intrs())
print "len(O.bodies[j].intrs()):", len(O.bodies[j].intrs())
if len(O.bodies[i].intrs()) >0:
for k in range(len(O.bodies[i].intrs())):
print "O.bodies[i].intrs()[",k,"].dict(): id1=", O.bodies[i].intrs()[k].id1, " id2=", O.bodies[i].intrs()[k].id2
print " ", O.bodies[i].intrs()[k].dict()
if len(O.bodies[j].intrs()) >0:
for k in range(len(O.bodies[j].intrs())):
print "O.bodies[j].intrs()[",k,"].dict(): id1=", O.bodies[j].intrs()[k].id1, " id2=", O.bodies[j].intrs()[k].id2
print " ", O.bodies[j].intrs()[k].dict()
--
You received this question notification because your team yade-users is
an answer contact for Yade.