New question #707278 on Yade: https://answers.launchpad.net/yade/+question/707278
Hi! I am trying to model a cylindrical triaxial test based on Pfacet and ServoPIDController. I would like to model a triaxial compression test with confining pressure equal to 50kPa. The bottom and top loading plates are created using the 'facet' element. The top one is assumed to move slowly in the vertical direction while the bottom one is fixed. The cylindrical walls are generated using 'Pfacet' elements. Referring to [1], I wrote the current MWE but don't know how to use the ServoPIDController to achieve servo control of the flexible membrane with confining pressure. The MWE is presented below: from __future__ import print_function from yade import pack, ymport, qt import gts, os.path, locale, plot, random import numpy as np from yade.gridpfacet import * import math locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) #gts is locale-dependend. If, for example, german locale is used, gts.read()-function does not import floats normally ############################################ ### 1 ### ### DEFINING VARIABLES AND MATERIALS ### ############################################ # The following lines are used parameter definitions readParamsFromTable( # material parameters young_w = 5e9, # Young's modulus of plates and walls young_g = 1.8e6, # Young's modulus of grains [1] den_w = 7874, # density of plates and walls den_g = 980, # density of grains poi_w = 0.3, # possion's ratio of plates and walls poi_g = 0.25, # possion's ratio of grains friAngle_w = 0.5,#radians(15), # friction angle of plates and walls friAngle_g = 0.5,#radians(29), # friction angle of grains # Parameters of cylindrical walls x_cyl = 0.0547, # x-coordinate of center of cylindrical walls y_cyl = 0.0535, # y-coordinate of center of cylindrical walls z_cyl = 0, # z-coordinate of center of cylindrical walls r_cyl = 0.0358, # radius of the cylinder h_cyl = 0.14, # height of the cylinder ) from yade.params.table import * # create materials for spheres and walls wallMat = O.materials.append(FrictMat(young = young_w, poisson = poi_w, frictionAngle = friAngle_w, density = den_w, label = 'walls')) sphereMat = O.materials.append(FrictMat(young = young_g, poisson = poi_g, frictionAngle = friAngle_g, density = den_g, label = 'spheres')) ############################################### ### 2 ### ### IMPORTING GRAINS AND CREATING CLUMPS ### ############################################### # spheres pred = pack.inCylinder((x_cyl, y_cyl, z_cyl), (x_cyl, y_cyl, h_cyl), r_cyl) sp = SpherePack() sp = pack.randomDensePack(pred, spheresInCell=2000, radius=0.005, returnSpherePack=True) spheres = sp.toSimulation(color=(0, 1, 1), material=sphereMat) # assign unique color for each sphere currentSphereId = O.bodies[0].id color = randomColor() for b in O.bodies: if b.id != currentSphereId:#change color each time clumpId changes currentSphereId = b.id color = randomColor() if isinstance(b.shape,Sphere):#colorize spheres b.shape.color = color # create top and bottom plates h_cyl = max([b.state.pos[2] + b.shape.radius for b in O.bodies if isinstance(b.shape, Sphere)]) top_plate = O.bodies.append(yade.geom.facetCylinder((x_cyl,y_cyl,h_cyl),radius=r_cyl*1.2,material=wallMat,height=0,segmentsNumber=10,color=(1,1,1),wire=True)) bottom_plate = O.bodies.append(yade.geom.facetCylinder((x_cyl,y_cyl,0),radius=r_cyl*1.2,material=wallMat,height=0,segmentsNumber=40,color=(1,1,1))) #O.bodies[top_plate].state.vel = (0, 0, -0.01) #O.bodies[bottom_plate].state.vel = (0, 0, 0) #O.bodies[bottom_plate].state.blockedDOFs = 'xyzXYZ' # Define engine O.engines = [ ForceResetter(), InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_PFacet_Aabb(), Bo1_Facet_Aabb()], sortThenCollide=True), InteractionLoop( [ Ig2_GridNode_GridNode_GridNodeGeom6D(), Ig2_GridConnection_GridConnection_GridCoGridCoGeom(), Ig2_Sphere_Sphere_ScGeom6D(), Ig2_Sphere_PFacet_ScGridCoGeom(), Ig2_Facet_Sphere_ScGeom(), ], [ Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True,setCohesionOnNewContacts=True), Ip2_FrictMat_FrictMat_FrictPhys() ], [ Law2_ScGeom6D_CohFrictPhys_CohesionMoment(), Law2_ScGeom_FrictPhys_CundallStrack(), Law2_ScGridCoGeom_FrictPhys_CundallStrack(), Law2_GridCoGridCoGeom_FrictPhys_CundallStrack(), ] ), NewtonIntegrator(gravity=(0,-9.81,0),damping=0.1,label='newton'), TranslationEngine(translationAxis=[0, 0, 1], velocity=-2, ids=top_plate, dead=False, label='translat'), CombinedKinematicEngine(ids=top_plate, label='combEngine', dead=True) + ServoPIDController(axis=[0, 0, 1], maxVelocity=2, iterPeriod=100, ids=top_plate, target=1.0e7, kP=1.0, kI=1.0, kD=1.0), PyRunner(command='addPlotData()', iterPeriod=1000, label='graph'), PyRunner(command='switchTranslationEngine()', iterPeriod=45000, nDo=2, label='switchEng'), ] ## Generate flexible membrane O.materials.append(CohFrictMat(young=1e7,poisson=1,density=2650,frictionAngle=radians(30),normalCohesion=3e7,shearCohesion=3e7,momentRotationLaw=True,label='gridNodeMat')) O.materials.append( FrictMat( young=1e7,poisson=0.1,density=2650,frictionAngle=radians(30),label='pFacetMat' )) nodesIds=[] cylIds=[] pfacets=[] width=2*r_cyl #diameter of cylinder height=h_cyl #height of cylinder nw=40 # no of nodes along perimeter nh=25 # no of nodes along height rNode=width/100 #radius of grid node color1=[255./255.,102./255.,0./255.] color2=[0,0,0] color3=[248/255,248/255,168/255] color4=[156/255,160/255,98/255] rCyl2 = 0.5*width / cos(pi/float(nw)) vCenter = Vector3(x_cyl, y_cyl, 0) 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))+vCenter v2 = Vector3(rCyl2*cos(2*pi*(r+1)/float(nw)),rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+0)/float(nh))+vCenter v3 = Vector3(rCyl2*cos(2*pi*(r+1)/float(nw)),rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+1)/float(nh))+vCenter v4 = Vector3(rCyl2*cos(2*pi*(r+0)/float(nw)),rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+1)/float(nh))+vCenter V1=(O.bodies.append(gridNode(v1,rNode,wire=False,fixed=False, material='gridNodeMat',color=color2)) ) V2=(O.bodies.append(gridNode(v2,rNode,wire=False,fixed=False, material='gridNodeMat',color=color2)) ) V3=(O.bodies.append(gridNode(v3,rNode,wire=False,fixed=False, material='gridNodeMat',color=color2)) ) V4=(O.bodies.append(gridNode(v4,rNode,wire=False,fixed=False, material='gridNodeMat',color=color2)) ) # append node ids to seperate matrix for later use nodesIds.append(V1) nodesIds.append(V2) nodesIds.append(V3) nodesIds.append(V4) #create grid connection cylIds.append(O.bodies.append(gridConnection(V1,V2,rNode,material='gridNodeMat',color=color3))) cylIds.append(O.bodies.append(gridConnection(V2,V3,rNode,material='gridNodeMat',color=color3))) cylIds.append(O.bodies.append(gridConnection(V1,V3,rNode,material='gridNodeMat',color=color3))) cylIds.append(O.bodies.append(gridConnection(V3,V4,rNode,material='gridNodeMat',color=color3))) cylIds.append(O.bodies.append(gridConnection(V4,V1,rNode,material='gridNodeMat',color=color3))) #create Pfacets pfacets.append(O.bodies.append(pfacet(V1,V2,V3,wire=True,material='pFacetMat',color=color3))) pfacets.append(O.bodies.append(pfacet(V1,V3,V4,wire=True,material='pFacetMat',color=color4))) from yade import qt qt.View() r = qt.Renderer() r.bgColor = 1, 1, 1 def addPlotData(): fMove = Vector3(0, 0, 0) for i in top_plate: fMove += O.forces.f(i) plot.addData(z=O.iter, pMove=fMove[2], pFest=fMove[2]) def switchTranslationEngine(): print("Switch from TranslationEngine engine to ServoPIDController") translat.dead = True combEngine.dead = False plot.plots = {'z': ('pMove', 'pFest')} plot.plot() O.run() -- 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