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

Hi,
Due to the needs of laboratory tests, I need to use cylindrical specimens for 
triaxial compression numerical simulation.
Since TriaxialStressController does not seem to be applicable to cylinder 
specimens, I refer to the example in [1], but [1] does not mention measuring 
transverse strain. Can anyone help?
My code as follows:
----------------------------------------
from yade import pack, ymport, plot, utils, export, timing
import numpy as np
import sys

rate=-0.2
damp=0.4
stabilityThreshold=0.001
key='_triax_base_'
young=100e9
name='JCFPM_triax'
compFricDegree=30
poisson=0.4
name='cylinder'
preStress=-20e6
strainRate = -1
OUT=str(preStress)+'_JCFPM_triax'

nw=24
nh=15
rParticle=0.000731723
bcCoeff = 5
width = 0.025
height = 0.05

mn,mx=Vector3(-0.025,-0.025,0),Vector3(0.025,0.025,0.1)
O.materials.append(JCFpmMat(type=1,density=2640,young=young,poisson=poisson,tensileStrength=15e6,cohesion=20e6,frictionAngle=radians(25),label='sphere'))
O.materials.append(JCFpmMat(type=1,label='wall',young=young,poisson=poisson,frictionAngle=radians(25)))

spheres=O.bodies.append(ymport.text('packing-'+name+'.spheres',scale=1,shift=Vector3(0,0,0),material='sphere',color=(0.6,0.5,0.15)))

bot = [O.bodies[s] for s in spheres if 
O.bodies[s].state.pos[2]<rParticle*bcCoeff]
top = [O.bodies[s] for s in spheres if 
O.bodies[s].state.pos[2]>height-rParticle*bcCoeff]
vel = strainRate*(height-rParticle*2*bcCoeff)
for s in bot:
        s.shape.color = (1,0,0)
        s.state.blockedDOFs = 'xyzXYZ'
        s.state.vel = (0,0,-vel)
for s in top:
        s.shape.color = Vector3(0,1,0)
        s.state.blockedDOFs = 'xyzXYZ'
        s.state.vel = (0,0,vel)

facets = []
rCyl2 = .5*width / cos(pi/float(nw))
for r in range(nw):
        for h in range(nh):
                v1 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), 
rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+0)/float(nh) )
                v2 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), 
rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+0)/float(nh) )
                v3 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), 
rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+1)/float(nh) )
                v4 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), 
rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+1)/float(nh) )
                f1 = facet((v1,v2,v3),color=(0,0,1),material='wall')
                f2 = facet((v1,v3,v4),color=(0,0,1),material='wall')
                facets.extend((f1,f2))

O.bodies.append(facets)
mass = O.bodies[0].state.mass
for f in facets:
        f.state.mass = mass
        f.state.blockedDOFs = 'XYZz'
plot.plots = { 'e':('s',), }


def addForces():
        for f in facets:
                n = f.shape.normal
                a = f.shape.area
                O.forces.addF(f.id,preStress*a*n)

def stopIfDamaged(maxEps=0.001):
        extremum = max(abs(s) for s in plot.data['s'])
        s = abs(plot.data['s'][-1])
        e = abs(plot.data['e'][-1])
        if O.iter < 1000 or s > .5*extremum and e < maxEps:
                return
        if abs(s)/abs(extremum) < 0.8 :
                print('Simulation finished')
                presentcohesive_count = 0
                for i in O.interactions:
                        if hasattr(i.phys, 'isCohesive'):
                                if i.phys.isCohesive == True:
                                        presentcohesive_count+=1
                print('the number of cohesive bond now 
is:',presentcohesive_count)
                print('Max stress and strain:',extremum,e)
                O.pause()

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

newton=NewtonIntegrator(damping=damp)
        
O.engines=[
        ForceResetter(),
        
InsertionSortCollider([Bo1_Sphere_Aabb(aabbEnlargeFactor=1.5,label='is2aabb'),Bo1_Facet_Aabb()]),
        InteractionLoop(
                
[Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=1.5,label='ss2sc'),Ig2_Facet_Sphere_ScGeom()],
                [Ip2_JCFpmMat_JCFpmMat_JCFpmPhys()],
                
[Law2_ScGeom_JCFpmPhys_JointedCohesiveFrictionalPM(recordCracks=True,Key=OUT+'_Crack',label='interactionLaw')]
        ),
        PyRunner(iterPeriod=1,command="addForces()"),
        newton,
        PyRunner(command='plotAddData()',iterPeriod=10),
        PyRunner(iterPeriod=50,command='stopIfDamaged()'),
        
VTKRecorder(iterPeriod=2000,initRun=True,fileName='triax/JFFPM-',recorders=['spheres','jcfpm','cracks'],Key=OUT+'_Crack',label='vtk',dead=0),

]

def plotAddData():
        f1 = sum(O.forces.f(b.id)[2] for b in top)
        f2 = sum(O.forces.f(b.id)[2] for b in bot)
        f = .5*(f2-f1)
        s = f/(pi*.25*width*width) 
        e = (top[0].state.displ()[2] - bot[0].state.displ()[2]) / 
(height-rParticle*2*bcCoeff)
        plot.addData(
                i = O.iter,
                s = -s,
                e = -e,
                tc = interactionLaw.nbTensCracks,
                sc = interactionLaw.nbShearCracks,
        )
        plot.saveDataTxt(OUT)

O.step()
ss2sc.interactionDetectionFactor=-1
is2aabb.aabbEnlargeFactor=-1
cohesiveCount = 0
for i in O.interactions:
        if hasattr(i.phys, 'isCohesive'):
                if i.phys.isCohesive == True:
                        cohesiveCount+=1
print('the origin total number of cohesive bond is:',cohesiveCount)

plot.plot()
O.run()
----------------------------------------------
Thanks for kindly help!

[1]https://gitlab.com/yade-dev/trunk/-/blob/master/examples/concrete/triax.py

-- 
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     : yade-users@lists.launchpad.net
Unsubscribe : https://launchpad.net/~yade-users
More help   : https://help.launchpad.net/ListHelp

Reply via email to