Question #692918 on Yade changed: https://answers.launchpad.net/yade/+question/692918
chanaka Udaya posted a new comment: Dear Dr. Robert Caluk, Many thanks for sharing the code. I was able to run the simulation using the provided script with JCFPM model.(result-https://www.dropbox.com/s/7tx32am1b33pbwb/JCFPM-fail- matched.PNG?dl=0 ) Later, I have used CPM model with same particle packing file (240x80mmBeam_1.5mmrad.sphres)provided by you. (result- https://www.dropbox.com/s/cbfcut6up5dvrcp/cpm-same%20packing.PNG?dl=0 ) It worked ! Then, I tried to use randomdensepackfunction to generate the packing instead of your packing file. This is the line I changed ------------------------------------------------- numSpheres=10000 mn,mx=Vector3(-0.04, -.140,-0.020),Vector3(0.04, .140, 0.020) pred = pack.inAlignedBox(mn, mx) sp = pack.randomDensePack(pred, radius=0.0015, spheresInCell=numSpheres, rRelFuzz=0.25, material='JCFmat', returnSpherePack=True) sp.toSimulation() ---------------------------------------------- Then I tried to run the program again with above changes and after some time program stopped with the error "Core dumped-Aborted") what could be the reason. The working CPM model script for attached image as follows, ------------------------------------------------------------------------------------------------------------------------------- from yade import ymport, utils, pack, export from yade import plot from pylab import * import os import math import numpy as np import numpy.linalg as la import time timeStr = time.strftime('%m-%d-%Y') readParamsFromTable(noTableOk=True, conf = 0, weibullCutOffMax=10, weibullCutOffMin=0.1, xSectionShape = 4, xSectionScale = 0, ) from yade.params.table import * mn,mx=Vector3(-0.04, -.140,-0.020),Vector3(0.04, .140, 0.020) young = 30e9 poisson = 0.3 targetPorosity = 0.55 density = 5000 relDuctility=30 finalFricDegree = 19 intRadius= 1.329 sigmaT = 10e6 epsCrackOnset=(10e6/30e9) iterper=1000 cohesion=40e6 dispVel = -0.02 # m/s highFric = 45 identifier='shape-'+str(xSectionShape)+'-'+timeStr outputDir='out_'+identifier if not os.path.exists(outputDir): os.mkdir(outputDir) if not os.path.exists('txt'): os.mkdir('txt') output = './'+outputDir+'/'+identifier wallMat = O.materials.append(FrictMat(young=80e9,poisson=.45,frictionAngle=radians(highFric),density=7000,label='frictionlessWalls')) JCFmat=O.materials.append(CpmMat(young=young, poisson=poisson, density=density,frictionAngle=radians(finalFricDegree), sigmaT=cohesion,epsCrackOnset=epsCrackOnset,neverDamage=False,label='JCFmat',relDuctility=0,)) #### preprocessing to get dimensions sp = O.bodies.append(ymport.textExt('240x80mmBeam_1.5mmrad.spheres', 'x_y_z_r',color=(0,0.2,0.7), material='JCFmat')) dim=utils.aabbExtrema() xinf=dim[0][0] xsup=dim[1][0] X=xsup-xinf yinf=dim[0][1] ysup=dim[1][1] Y=ysup-yinf zinf=dim[0][2] zsup=dim[1][2] Z=zsup-zinf r=X/15. O.reset() wallMat = O.materials.append(FrictMat(young=80e9,poisson=.45,frictionAngle=radians(highFric),density=7000,label='frictionlessWalls')) # Rigid blocks block1 = O.bodies.append(geom.facetCylinder(center=(xinf-0.971*r,yinf+2*r,0),radius=r,height=Z,orientation=Quaternion((0, 0, 0), 90),segmentsNumber=20,wire=False,material=wallMat)) block2 = O.bodies.append(geom.facetCylinder(center=(xinf-0.915*r,ysup-2*r,0),radius=r,height=Z,orientation=Quaternion((0, 0, 0), 90),segmentsNumber=20,wire=False,material=wallMat)) # Loading piston piston=O.bodies.append(geom.facetCylinder(center=(xsup+0.943*r,0,0),radius=r,height=Z,dynamic=False,orientation=Quaternion((1,0, 0),0),segmentsNumber=20,wire=False,material=wallMat)) p0=O.bodies[piston[0]].state.pos[1] JCFmat=O.materials.append(CpmMat(young=young, poisson=poisson, density=density,frictionAngle=radians(finalFricDegree), sigmaT=cohesion,epsCrackOnset=epsCrackOnset,neverDamage=False,label='JCFmat',relDuctility=0,)) # Specimen beam = O.bodies.append(ymport.textExt('240x80mmBeam_1.5mmrad.spheres', 'x_y_z_r',color=(0,0.2,0.7), material='JCFmat')) AEfile = 'AEcounts_'+identifier+'.txt' f = open('txt/'+AEfile, 'w') f.write('time iteration AEcount P deflection pistonDisp\n') f.close # remove rigid block DOFs for i in block1: O.bodies[i].state.blockedDOFs='xyzXYZ' for i in block2: O.bodies[i].state.blockedDOFs='xyzXYZ' # set engine list O.engines=[ ForceResetter(), InsertionSortCollider([Bo1_Box_Aabb(),Bo1_Sphere_Aabb(aabbEnlargeFactor=intRadius,label='Saabb'),Bo1_Facet_Aabb()]), InteractionLoop( [Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=intRadius,label='SSgeom'),Ig2_Facet_Sphere_ScGeom()], [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CpmMat_CpmMat_CpmPhys(cohesiveThresholdIter=10, label='jcf')], [Law2_ScGeom_CpmPhys_Cpm(label='interactionLaw'),Law2_ScGeom_FrictPhys_CundallStrack()] ), GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.4, defaultDt=0.1*utils.PWaveTimeStep()), TranslationEngine(ids=piston,translationAxis=(1,0,0), velocity=dispVel, label='pistonEngine'), TranslationEngine(ids=block1,translationAxis=(1,0,0), velocity=0, label='block1Engine'), TranslationEngine(ids=block2,translationAxis=(1,0,0), velocity=0, label='block2Engine'), #VTKRecorder(dead=0,iterPeriod=iterper*2,initRun=True,fileName=(output+'-'),recorders=['jcfpm','cracks','facets','moments','intr'],Key=identifier,label='vtk'), NewtonIntegrator(damping=0.2) ] # options for AE model #interactionLaw.momentRadiusFactor=3 #interactionLaw.clusterMoments=True #interactionLaw.neverErase=True #interactionLaw.useIncrementalForm=True #interactionLaw.useStrainEnergy = True O.dt = 0.004 * utils.PWaveTimeStep() # collect data for active plotting and post processing from yade import plot O.engines=O.engines[0:7]+[PyRunner(dead=0,iterPeriod=int(iterper/4),command='stressStrainHist()',label='dataCollector')]+O.engines[7:8] O.engines=O.engines[0:8]+[PyRunner(dead=0,iterPeriod=iterper,command='stopifDamaged()',label='damageCheck')]+O.engines[8:9] # engage blocks to ensure force balance and remove dynamics of system O.engines=O.engines[0:9]+[PyRunner(dead=0, iterPeriod=1,command='ensureBlockEngagement()',label='blockEngagement')]+O.engines[9:10] def ensureBlockEngagement(): Pblock1, Pblock2 = checkBlockEngagement() P = getPistonForce() maxVel = 0.01 if Pblock1 != P/2.: multiplier = (P/2. - Pblock1)/(P/2.) block1Engine.velocity = multiplier*maxVel if Pblock2 != P/2.: multiplier = (P/2. - Pblock2)/(P/2.) block2Engine.velocity = multiplier*maxVel def getPistonForce(): P=0 for i in piston: P += la.norm(O.forces.f(i)) return P def getPistonDisp(): pistonDisp = O.bodies[piston[0]].state.displ().norm() block1Disp = O.bodies[block1[0]].state.displ().norm() block2Disp = O.bodies[block2[0]].state.displ().norm() return pistonDisp + (block1Disp + block2Disp)/2. def checkBlockEngagement(): Pblock1 = Pblock2 = 0 for i in block1: Pblock1+= la.norm(O.forces.f(i)) for i in block2: Pblock2+= la.norm(O.forces.f(i)) return Pblock1, Pblock2 def stressStrainHist(): plot.addData( i=O.iter, time = O.time, disp = -O.time*dispVel, P = getPistonForce(), pistonVel = pistonEngine.velocity, PistonDisp = getPistonDisp(), Pblock1 = checkBlockEngagement()[0], Pblock2 = checkBlockEngagement()[1]) plot.saveDataTxt('txt/data'+identifier+'.txt',vars= ('i', 'disp','P', 'pistonVel','PistonDisp')) #momentFile = 'moments_'+identifier+'.txt' #AEcount=0 #if os.path.isfile(momentFile): #AEcount = sum(1 for line in open(momentFile)) #f = open('txt/'+AEfile, 'a') #P, pistonDisp = plot.data['P'],plot.data['PistonDisp'] #f.write('%g %g %g %g %g\n' % (O.time, O.iter, AEcount, P[-1], pistonDisp[-1])) #f.close def stopifDamaged(): P=plot.data['P'] if O.iter > 10000: if max(P)>2000 and P[-1] < 0.5*max(P): print('failure reached') sigma_t = 3*max(P)*(2*(ysup-2*r))/(2*Z*X**2) print("Tensile strength=",sigma_t/1e6) O.pause() plot.plots={'PistonDisp':('P'), 'i':('Pblock1','Pblock2')} plot.plot(subPlots=True) O.step() ### initializes the interaction detection factor SSgeom.interactionDetectionFactor=-1. Saabb.aabbEnlargeFactor=-1. O.run() waitIfBatch() ---------------------------------------------------------------------------------------------------------- I got a bit confusion about following lines, # Rigid blocks block1 = O.bodies.append(geom.facetCylinder(center=(xinf-0.971*r,yinf+2*r,0),radius=r,height=Z,orientation=Quaternion((0, 0, 0), 90),segmentsNumber=20,wire=False,material=wallMat)) block2 = O.bodies.append(geom.facetCylinder(center=(xinf-0.915*r,ysup-2*r,0),radius=r,height=Z,orientation=Quaternion((0, 0, 0), 90),segmentsNumber=20,wire=False,material=wallMat)) # Loading piston piston=O.bodies.append(geom.facetCylinder(center=(xsup+0.943*r,0,0),radius=r,height=Z,dynamic=False,orientation=Quaternion((1,0, 0),0),segmentsNumber=20,wire=False,material=wallMat)) from there, I can see xinf-0.971*r xinf-0.915*r xsup+0.943*r should this be changed to xinf-1*r xinf-1*r xsup+1*r this or, I would like to know why there are different coefficients(0.971, 0.915,0.943)? Could you please help me on this? May I know how the packing is generated also? -- You received this question notification because your team yade-users is an answer contact for Yade. _______________________________________________ Mailing list: https://launchpad.net/~yade-users Post to : [email protected] Unsubscribe : https://launchpad.net/~yade-users More help : https://help.launchpad.net/ListHelp

