Cylindrical triaxial test using Pfacet
Hi! I am new to Yade. I am working on the simulation of cylindrical triaxial tests. I have looked through all questions on the launchpad related to this field. But, unfortunately, there is no complete simulation code for cylindrical triaxial tests.
My questions about the simulation of cylindrical triaxial tests are summarized as follows:
1) Is it possible to simulate the cylindrical triaxial tests in Yade?
2) If so, which code or what kind of methods should be referred to?
3) How do I achieve servo control?
4) Someone mentioned that the code 'triax.py' in the 'concrete' folder is valuable for reference. But the problem is that when implementing the code, facets generated using the command 'Pfacet' are destroyed. What caused the simulation to be like this? How do I avoid this?
5) Can someone provide a MWE (Minimum Working Example) for simulating cylindrical triaxial tests?
Many thanks.
Kyle
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
|
#1 |
Hello,
1) Yes
2) triax.py
3) How do I achieve servo control?
4) [1]
- what does "are destroyed" mean?
- please provide a MWE
5) triax.py
Of course, triax.py is just a primitive approach - a cylindrical surface divided in triangles with fixed force.
It will not work if the surface is significantly distorted and it does not contain any "membrane effect".
You can use other shapes for the surface, maybe a bit overlapped?
Or PFacets to also simulate a membrane effect.
Or ...
Cheers
Jan
[1] https:/
Revision history for this message
|
#2 |
Dear Jan,
Thanks for your reply.
1) I'll check. Many thanks.
2) I'll check. Many thanks.
3) How do I achieve servo control? I am still not clear about this. I guess there is no displacement-based servo control in the code 'triax.py'.
4) This means the cylindrical surface is divided into triangles. Maybe you can try to run the code 'triax.py' and you will understand what I am talking about.
5) I'll check. Many thanks.
Cheers,
Kyle
Revision history for this message
|
#3 |
> How do I achieve servo control? I am still not clear about this
e.g. using ServoPIDController [1]
> I guess there is no displacement-based servo control in the code 'triax.py'
Yes.
The loading is simply such that a constant velocity is prescribed (s.state.vel = ...)
>>> But the problem is that when implementing the code, facets generated using the command 'Pfacet' are destroyed
>> what does "are destroyed" mean? please provide a MWE
> Maybe you can try to run the code 'triax.py' and you will understand what I am talking about.
No, I will not understand, since there are no PFacets in current triax.py.
Therefore I ask for a MWE and better description of "are destroyed" (anyway useful even with the code).
Cheers
Jan
Revision history for this message
|
#4 |
Hi! Jan
Thanks for your reply.
> The loading is simply such that a constant velocity is prescribed (s.state.vel = ...)
But which velocity value should I define to achieve quasi-equilibrium compression? Can you show me the code? I am sorry for my stupidity.
>Therefore I ask for a MWE and better description of "are destroyed" (anyway useful even with the code).
Actually, what I mean is that when you run the 'triax' py without any change, the triangle facets will break. And my current problem is not with the 'triax' py.
My problem is that I just finished the part about generating flexible membranes using Pfacet and don't know what to do next. What I want to achieve is isotropic compression with a confining pressure equal to 50 kPa. And then, maintain the confining pressure in the x and y directions and apply a displacement-
my MWE is presented as below
#######
### 1 ###
### LOAD INITIAL PACKING ###
#######
dir_inipacking = '/home/
O.load(
# Define engine
O.engines = [
ForceResetter(),
InsertionSort
Bo1_
sortThenCo
InteractionLoop(
[
Ig2_
Ig2_
Ig2_
Ig2_
],
[
Ip2_
],
[
Law2_
Law2_
Law2_
]
),
GlobalStif
NewtonIntegra
]
# encoding: utf-8
from yade import qt
from yade.gridpfacet import *
import math
#######
### 2 ###
### DEFINING VARIABLES AND MATERIALS ###
#######
# The following lines are used parameter definitions
readParamsFromT
# directory
dir_vtk = '/home/
dir_txt = '/home/
dir_xml = '/home/
# 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
# confining pressure
preStress = -50000,
# axial strain rate
)
from yade.params.table import *
#######
### 3 ###
### CREATE TOP AND BOTTOM PLATES ###
#######
# erase rigid cylindrical facets
for b in O.bodies:
if isinstance(
# 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.
bottom_plate = O.bodies.
'''
vel = strainRate * (h - rParticle * 2 * bcCoeff)
for s in bot:
s.shape.color = (1, 0, 0)
s.state.
s.state.vel = (0, 0, -vel)
for s in top:
s.shape.color = Vector3(0, 1, 0)
s.state.
s.state.vel = (0, 0, vel)
'''
#######
### 4 ###
### GENERATE FLEXIBLE MEMBRANE ###
#######
# Materials
O.materials.
O.materials.append( FrictMat( young=1e7,
# Generate flexible membrane
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=
color2=[0,0,0]
color3=
color4=
#color3=
#color4=
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(
v2 = Vector3(
v3 = Vector3(
v4 = Vector3(
V1=
V2=
V3=
V4=
# append node ids to seperate matrix for later use
nodesIds.
nodesIds.
nodesIds.
nodesIds.
#create grid connection
cylIds.
cylIds.
cylIds.
cylIds.
cylIds.
#create Pfacets
pfacets.
pfacets.
# calculate void ratio
def myClumpVoidRati
mass=sum([ b.state.mass for b in O.bodies if b.isClump])
VolSolid = mass/density
poro = (VolTot-
return poro
h_cyl = max([b.state.pos[2] + b.shape.radius for b in O.bodies if isinstance(b.shape, Sphere)])
Vol = math.pi * h_cyl * r_cyl * r_cyl
poro_ini = myClumpVoidRati
print('Initial void ratio:', str(poro_ini))
Revision history for this message
|
#5 |
>> The loading is simply such that a constant velocity is prescribed (s.state.vel = ...)
> But which velocity value should I define to achieve quasi-equilibrium compression?
Define such velocity which and whose effect on the sample satisfy your definition of "quasi-equilibrium compression".
> Can you show me the code?
[2]
> I am sorry for my stupidity.
stupidity is not the right word here.
"Lack of experience" fits better
>Therefore I ask for a MWE and better description of "are destroyed" (anyway useful even with the code).
Actually, what I mean is that when you run the 'triax' py without any change,
> the triangle facets will break.
the same, what does "will break" mean?
That they do not touch each other?
> And my current problem is not with the 'triax' py.
> My problem is that I just finished the part about generating flexible membranes using Pfacet and don't know what to do next.
I do not use PFacet myself, so I cannot help here..
But thanks for description, maybe you can open a new more specific question (here the description is maybe too "deep" in the thread)
Cheers
Jan
[2] https:/
Revision history for this message
|
#6 |
Hi,
> "My problem is that I just finished the part about generating flexible membranes using Pfacet and don't know what to do next."
I did not read all the details but if you are at this step I suppose "what to do next" is to assign forces to the nodes of the membranes to reflect external pressure. It certainly needs to account for some area and local orientation.
I never tried such thing myself so I'm not 100% sure what to expect. It should work but it probably needs to update the external forces after large deformations.
Cheers
Bruno
Revision history for this message
|
#7 |
Hi! Jan
Thanks for your reply.
>the same, what does "will break" mean? That they do not touch each other?
The particles went out of the cylinder and flew all around [1].
[1]https:/
Cheers,
Kyle
Revision history for this message
|
#8 |
Can someone help me with servo-control part? Many thanks.
Revision history for this message
|
#9 |
Have you tried ServoPIDController [1]?
If yes, why it did not help?
Cheers
Jan
[1] https:/
Revision history for this message
|
#10 |
Hi, Jan.
>Have you tried ServoPIDController?
I try to use it but can't find any tutorials. In PFC [1], the velocity value of the wall is determined by multiplying a factor by the stress difference (target stress minus current stress). This value is updated regularly. I am not sure whether the principle of the ServoPIDController is the same as that in PFC.
Looking forward to your reply.
Kyle
Revision history for this message
|
#11 |
> I am not sure whether the principle of the ServoPIDController is the same as that in PFC
yes, it looks pretty similar [4]
Cheers
Jan
[4] https:/
Revision history for this message
|
#12 |
Hi, Jan.
>yes, it looks pretty similar [4]
Could you please provide an example of using ServoPIDController? Because there is no tutorial about how to use it. I am inclined to think that this command's explanation is not easy to understand without an example. Many thanks.
Looking forward to your reply.
Kyle
Revision history for this message
|
#13 |
There is an example [5].
you can play with iterPeriod (try 10 or 1 instead of 1000) and/or other parameters.
The referenced source code [4] may be useful, as well as documentation itself [6] and links therein.
Cheers
Jan
[5] https:/
[6] https:/
Revision history for this message
|
#14 |
You may also consider creating a new question aiming to the servo control, as here it might be already too "deep" in the thread.
Also, it is a separate problem and as such should have its own question [7]
Cheers
Jan
Can you help with this problem?
Provide an answer of your own, or ask Ruidong LI for more information if necessary.