Number of Breakage in JCFPmMat

Asked by Sam

Hey,

I am trying to implement nbTensCracks and nbShearCracks functions [1] & [2], to count the number of breakage after compression of one single particle. BTW, I faced attribute error, the error is:

AttributeError: 'Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM' object has no attribute 'nbTensCracks'.

[1] https://answers.launchpad.net/yade/+question/635871

[2] https://answers.launchpad.net/yade/+question/676014

the MWE is as follows:

from yade import pack, utils, ymport, export
import numpy as np
import yade.timing
import matplotlib.pyplot as plt
import os.path

particleDiameter = 0.6e-3
displacementRate = 1.6667e-6 # m/s
strainRate = displacementRate/particleDiameter # m/s

young =3e8 #elastic modulus [Pa]
poisson = 0.3
density = 5000
relDuctility=30 #relative ductility of bonds in normal direction
mn,mx=Vector3(-0.52e-3, -1e-3,-1e-3),Vector3(0.52e-3, 1e-3, 1e-3) #size of particle
finalFricDegree = 25 #Contact friction angle
intRadius= 1.329 #Internal Radius
sigmaT = 7e6 #Normal shear stress
identifier=str(particleDiameter)
output='./out/'+identifier
rate = strainRate*10000
stabilityThreshold=0.01
iterper=1000 #Periodicity criterion using step number (deactivated if <= 0)
cohesion=20e6

jCFmat = O.materials.append(JCFpmMat(young=young, cohesion=cohesion, density=density, frictionAngle=radians(finalFricDegree), tensileStrength=sigmaT, poisson=poisson, label='JCFmat'))

#frictionless walls
wallmat = O.materials.append(FrictMat(young=80e9,poisson=.45,frictionAngle=radians(finalFricDegree),density=7000,label='frictionlessWalls'))

walls=aabbWalls([mn,mx], material='frictionlessWalls')
wallIds=O.bodies.append(walls)

sp = O.bodies.append(ymport.textExt('sandGrain_0-6mmdiameter.spheres', 'x_y_z_r',color=(0,0.2,0.7), material='JCFmat'))

triax = TriaxialStressController(
 thickness=0,
 stressMask=7,
 internalCompaction=False,
 )

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=intRadius),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(interactionDetectionFactor=intRadius),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_JCFpmMat_JCFpmMat_JCFpmPhys(cohesiveTresholdIteration=10, label='jcf')],
  [Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(Key=identifier, smoothJoint=True,label='interactionLaw', recordCracks=True, neverErase=True),Law2_ScGeom_FrictPhys_CundallStrack()]
 ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.5),
 triax,
 VTKRecorder(dead=0,Key=identifier,iterPeriod=iterper,initRun=True,fileName=(output+'-'),recorders=['spheres','intr','stress', 'bstresses','jcfpm','cracks']),
 NewtonIntegrator(damping=0.9)
]

O.dt = 0.3 * utils.PWaveTimeStep()

from yade import qt
v=qt.Controller()
v=qt.View()

from yade import plot
O.engines=O.engines[0:6]+[PyRunner(iterPeriod=iterper/4,command='stressStrainHist()',label='recorder')]+O.engines[6:7]

def stressStrainHist():
 plot.addData(e11=np.exp(-O.engines[4].strain[0])-1,
  e22=exp(-(O.engines[4].strain[1]))-1,
  e33=-O.engines[4].strain[2],
  s11=-O.engines[4].stress(0)[0],
  s22=-O.engines[4].stress(2)[1],
  s33=-O.engines[4].stress(4)[2],
  i=O.iter,
  displacement=(exp(-(O.engines[4].strain[1]))-1)*particleDiameter,
  P = -O.engines[4].stress(0)[0]*O.engines[4].height*O.engines[4].depth)
 plot.saveDataTxt('txt/data'+identifier+'.txt',vars= ('displacement','e11','s11','P'))

plot.plots={'displacement':(('P'))} #,None,('Uk'))}
plot.plot()

def addPlotData():
    yade.plot.addData({'i':O.iter,
         'tc':interactionLaw.nbTensCracks,
         'sc':interactionLaw.nbShearCracks,
         'te':interactionLaw.totalTensCracksE,
         'se':interactionLaw.totalShearCracksE,
         'unbF':utils.unbalancedForce()})
 })
    plot.saveDataTxt('txt/data.txt')

#### coordination number verification
numSSlinks=0
numCohesivelinks=0
for i in O.interactions:
    if isinstance(O.bodies[i.id1].shape,Sphere) and isinstance(O.bodies[i.id2].shape,Sphere):
      numSSlinks+=1
    if i.phys.isCohesive :
      numCohesivelinks+=1

print "nblinks=", numSSlinks, " | nbCohesivelinks=", numCohesivelinks, " || Kcohesive=", 2.0*numCohesivelinks/nbSpheres

O.engines=O.engines[0:7]+[PyRunner(iterPeriod=iterper/4,command='stopifDamaged()',label='recorder')]+O.engines[7:8]

def stopifDamaged():
 sigma,eps, P=plot.data['s11'],plot.data['e11'],plot.data['P']
 if O.iter > 5000:
  if P[-1]>10 and P[-1] < 0.6*max(P):
   print 'failure reached'
   yade.timing.stats()
   O.pause()

triax.stressMask = 0

triax.goal2=rate
triax.goal1=-rate
triax.goal3=rate

Question information

Language:
English Edit question
Status:
Answered
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Luc Scholtès (luc) said :
#1

Hi Sayed,

I tried to work a bit on your script but it is not exactly a MWE for many reasons (call for a packing that only you have and many lines that are not relevant to your problem) and I spent several minutes already to try to make your script work on my computer without success (and my errors are not related to the problem you are facing, i.e., attributes of JCFPM).

Please, try to modify your script so as it is a usable MWE so that we can then try to see what is wrong.

FYI, I tried yade daily with one of my MWE and there is no problem with getting the nbTensCracks. Thus there must be something wrong in your script, not with JCFPM.

A remark: there is not need to use FrictMat for the walls. You can use JCFpmMat and set the type != to the type used for the particles (e.g., type=0 for walls and type=1 for particles). With such configuration, particles and walls will interact without any cohesion, and you'll have much less engines to define.

Luc

Can you help with this problem?

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

To post a message you must log in.