add uniform fibers to the cylinder-shape specimen
Hi,
This is a yade user working on 'How to add uniform fibers in a cylinder shape specimen of a traix experiment',my problem is how to add uniform fibers, the fibers should be seen as cylinder so should i use "gridconnection" to create grids first then connect them with cylinder/segment? If so, how can i get a uniform distribution of fibers?
and i wanna take a traix experiment with it but i have no idea how to set the wall outside a cylinder specimen.
besides, i am working on this article[1], trying to simulate the experiment in it. Do you guys have any suggestions to me on modeling or any articles to study on? Thank you so much.
Respectfully,
xxxe
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,
> how to add uniform fibers
> how can i get a uniform distribution of fibers?
what does "uniform" mean? the same sizes? uniformly distributed sizes? uniformly distributed orientations?
> should i use "gridconnection" to create grids first then connect them with cylinder/segment?
sounds like a reasonable approach.
Alternatively you can approximate the cylinder as a clump made of spheres.
cheers
Jan
Revision history for this message
|
#2 |
Hi Jan,
> what does "uniform" mean? the same sizes? uniformly distributed sizes? uniformly distributed orientations?
"uniform" means that the possibility of the position of fibers occurring in the specimen is equal at every spot. and there are different sizes of fibers, the orientations of the fibers are random, just like a real specimen that you mix fibers with sand well, fibers' position are uniform and the orientations are random.
> Alternatively you can approximate the cylinder as a clump made of spheres.
I want to simulate quartz sand which was reinforced with discrete polypropylene fibers with the average dimensions 12 mm in length, 0.0015 mm in diameter, and with specific density of 0.91, tensile strength of 460 MPa and elastic modulus of 3.5 MPa. The fiber content used in the experiments was 0.15, 0.25, 0.35 and 0.5% by weight of sand.
The specimens were statically compacted in three layers into a 39.1 mm diameter by 80 mm high split mold.
"the average dimensions 12 mm in length, 0.0015 mm in diameter" I think its not working with clumps.
thank you soooooo much, waiting for your reply.
xxxe
Revision history for this message
|
#3 |
One approach is a "makeCloud -> compaction", very similar to the problems involving only spheres.
1) using makeCloud, create spheres representing sand
2) using makeCloud, add "fibre-spheres" - spheres with dimensions of the fibers
3) replace "fibre-spheres" with cylinders
4) compact the specimen
> just like a real specimen that you mix fibers with sand well, fibers' position are uniform and the orientations are random.
are they? (a bit philosophical question, depending on definition of "random" :-)
> the orientations of the fibers are random
please be more specific. Random is too random word :-)
Do you want the directions to be random with uniform distribution, or just "some randomness" is ok?
see [1,2] (quickly googled)
> "the average dimensions 12 mm in length, 0.0015 mm in diameter" I think its not working with clumps.
probably..
cheers
Jan
[1] https:/
[2] https:/
Revision history for this message
|
#4 |
Hi Jan,
sorry for the late reply.
> Do you want the directions to be random with uniform distribution, or just "some randomness" is ok?
the former, random directions and uniform distribution. although i think the difference between both may be not much.
> I check the links and this code is almost what i want.
#########
def randomOrientati
from random import random as r
return Quaternion(
# create loose spherical packing using makeCloud
sp = yade.pack.
mi,ma = (0,0,0),(20,20,20)
nCyls,nSphs = 40,30
sp.makeCloud(
sp.makeCloud(
for i,(pos,radius) in enumerate(sp):
if i < nCyls: # add cylinder
ori = randomOrientation()
extents = (radius,
O.
else: # add sphere
O.
##########
but there are still questions:
1)i try to increase the number of spheres and change cubic size, while error occurs "Exceeded 1000 tries to insert non-overlapping sphere to packing. Only 15 spheres were added, although you requested 500." and box turns out to be different sizes, i mean two kinds of size with big difference, nothing about relFuzz.
2)it seems that cylinders(box actually) take up the whole cubic space(depending on the longest edge) so that no sphere appears around the cylinder within cubic space, this is not what i want.
i am still working on the "for" part of the code, its a little confusing to me.
thanks a lot.
xxxe
Revision history for this message
|
#5 |
The fiber content used in the experiments was 0.15, 0.25, 0.35 and 0.5% by weight of sand. How can i get specific fiber content by weight of sand?
thanks a lot
xxxe
Revision history for this message
|
#6 |
> random directions and uniform distribution.
I have no experience, you have to search a bit..
my randomOrientation most likely is not uniform, just "some randomness"
> 1)i try to increase the number of spheres and change cubic size, while error occurs "Exceeded 1000 tries to insert non-overlapping sphere to packing. Only 15 spheres were added, although you requested 500." and box turns out to be different sizes, i mean two kinds of size with big difference, nothing about relFuzz.
it seems the number of spheres and the makeCloud "volume" is not "proportional", difficult to say without values.
> 2)it seems that cylinders(box actually) take up the whole cubic space(depending on the longest edge) so that no sphere appears around the cylinder within cubic space, this is not what i want.
cylinders (boxes) replaces spheres, so no sphere is generated within spherical space (not cubic).
This is intended, makeCloud creates a loose packing and you have to compact it anyway before a serious simulation.
> i am still working on the "for" part of the code, its a little confusing to me.
what is ""for" part"?
> How can i get specific fiber content by weight of sand?
there are many ways.
E.g. create more fibres and then delete one-by-one unless the content match your need.
cheers
Jan
Revision history for this message
|
#7 |
>my randomOrientation most likely is not uniform, just "some randomness"
that works for me too(i didn't figure out way to achieve ‘random directions and uniform distribution’ so…)
>cylinders (boxes) replaces spheres, so no sphere is generated within spherical space (not cubic).
replaces? i don't get it…the code below makes cloud of 40 spheres and 30 spheres first(not adding to simulation),then when i<40, add every box to bodies,(where are those 40 spheres?),then add 30 spheres to bodies? Why not adding all 70 spheres to bodies?
>>for i,(pos,radius) in enumerate(sp):
>>O.bodies.
#########
def randomOrientati
from random import random as r
return Quaternion(
# create loose spherical packing using makeCloud
sp = yade.pack.
mi,ma = (0,0,0),(20,20,20)
nCyls,nSphs = 40,30
cylinder(
sp.makeCloud(
sp.makeCloud(
for i,(pos,radius) in enumerate(sp):
if i < nCyls: # add cylinder
ori = randomOrientation()
extents = (radius,
O.
else: # add sphere
O.
##########
1)i need to simulate fiber so i changed a bit then it's not working, cylinders are out of space requested before.
2)i set orientation=
my code is below.
#########
from random import random as r
def randomOrientati
from random import random as r
return Quaternion(
# create loose spherical packing using makeCloud
sp = yade.pack.
mi,ma = (0,0,0)
nCyls,nSphs = 1000,100000
sp.makeCloud(
sp.makeCloud(
for i,(pos,radius) in enumerate(sp):
if i < nCyls: # add cylinder
O.
else: # add sphere
#
O.
##########
thank u soooo much
xxxe
Revision history for this message
|
#8 |
> ... random directions and uniform distribution
> that ["some randomness"] works for me too
please be consistent
> i didn't figure out way to achieve ‘random directions and uniform distribution’ so…
see e.g. [3] (UnitRandom function) and following links and source code
> replaces? i don't get it…the code below makes cloud of 40 spheres and 30 spheres first(not adding to simulation),then when i<40, add every box to bodies,(where are those 40 spheres?),then add 30 spheres to bodies? Why not adding all 70 spheres to bodies?
mentioned here (#3) as well as in [1]:
1) create some spheres, meant to be actual spheres in simulation (30 in the mentioned case)
2) create some spheres ("fibre-spheres"), meant just to reserve space for fibres (not added to the simulation). 40 in the mentioned case. Those 40 spheres are not anywhere, they are "replaced" by the fibres.
3) replace "fibre-spheres" by fibres
> 1)i need to simulate fiber so i changed a bit then it's not working, cylinders are out of space requested before.
> O.bodies.
here you set random position, no surprise that "cylinders are out of space". Use center=pos instead
> 2)i set orientation=
> O.bodies.
no, you set orientation=
If you really set orientation=
> sp.makeCloud(
...
> O.bodies.
size (height) of the cylinder should be equal to the sphere size (2*radius). Either do not use rRelFuzz (then the size is fixed) or better use the radius value for facetCylinder creation.
cheers
Jan
[3] https:/
Revision history for this message
|
#9 |
>please be ocnsistant.
the paper i want to simulate writes"The compacted sand and fiber-reinforced specimens for triaxial tests were prepared by hand-mixing dry sand, water and polypropylene fibers. To prevent floating of the fibers, it is important to add the water before adding the fibers during the mixing process. The specimens were statically compacted in three layers into a 39.1 mm diameter by 80 mm high split mold. "
i think what the specimen needs to achieve is "random directions and uniform distribution", but indeed what it can get is just "some randomness".
>no, you set orientation=
If you really set orientation=
i changed code according to your suggestion, they all works except the orientation one. the randomness of cylinders seems like randomness in a small amount of angles off one direction.
>1) create some spheres, meant to be actual spheres in simulation (30 in the mentioned case)
2) create some spheres ("fibre-spheres"), meant just to reserve space for fibres (not added to the simulation). 40 in the mentioned case. Those 40 spheres are not anywhere, they are "replaced" by the fibres.
3) replace "fibre-spheres" by fibres
i still wonder how same codes turn out to be "create some spheres, meant to be actual spheres in simulation" and "create some spheres ("fibre-spheres"), meant just to reserve space for fibres (not added to the simulation)"……and i need to calculate two mass of spheres and cylinders, how can i distinguish them with codes.
#########
from random import random as r
def randomOrientati
from random import random as r
return Quaternion(
# create loose spherical packing using makeCloud
sp = yade.pack.
mi,ma = (0,0,0)
nCyls,nSphs = 1000,100000
sp.makeCloud(
sp.makeCloud(
for i,(pos,radius) in enumerate(sp):
if i < nCyls: # add cylinder
O.
else: # add sphere
#
O.
##########
cyl = pack.inCylinder
#for c,r in sp:
# if cyl(c,r): O.bodies.
#mass = 0.0
#for b in O.bodies:
# if cyl(b.state.pos): # b is inside cyl1
# mass += b.state.mass
##########
thanks
xxxe
Revision history for this message
|
#10 |
Concerning random orientation, you can try the approach from [3]
###
def randomOrientati
# from the source code of Quaternion:
# https:/
from random import random as r
u1 = r()
u2 = r() * pi
u3 = r() * pi
a = sqrt(1 - u1)
b = sqrt(u1)
return Quaternion(
# test
O.bodies.
O.step()
###
> i still wonder how same codes turn out to be "create some spheres, meant to be actual spheres in simulation" and "create some spheres ("fibre-spheres"), meant just to reserve space for fibres (not added to the simulation)"
this I did not get..
what is "same code"?
> ……and i need to calculate two mass of spheres and cylinders, how can i distinguish them with codes.
spheres = [b for b in O.bodies if isisntance(
massSpheres = sum(b.state.mass for b in spheres)
(facet)cylinders - depends if sum is needed etc..
You can also have the two lists directly from the code:
###
cyls = []
sphs = []
for i,(pos,radius) in enumerate(sp):
if i < nCyls: # add cylinder
cyl = geom.facetCylin
O.
cyls.
else: # add sphere
sph = sphere(pos,radius)
O.
sphs.
# do whetever with sphs and cyls lists
###
If you need specific masses for spheres and cylinders, you can modify the procedure a bit:
1) create spheres, add them to simulation, compute their mass if needed
2) create "fibre-spheres"
3) replace "fibre-spheres" by fibres one by one (also add them to simulation one by one). If the desired fibre mass matches desired value, stop replacing and adding fibres.
cheers
Jan
Revision history for this message
|
#11 |
Concerning randomOrientation, it is now part of Yade as utils.randomOri
cheers
Jan
[1] https:/
Revision history for this message
|
#12 |
hi,
1)Is there a geom module that can be used to simulate fiber? it should be deformable(shear force need be applied on it) and look like a fiber(cylinder would be fine, i used facetcylinder before then i found it cant deform… )
2)the specimen should be cylinder shape. i wonder how specimens can be isotropically consolidated to pressures of 50 kPa, 100 kPa, 200 kPa and 300 kPa. ususlly the pressures are applied by wall and i think that cylinder dont have side ?
3)i need to observe the stress–dilatancy relationship of specimen so the exteral surface should be deformable too,what kind of geom module/material should i use?
my script is below, it's totally a mess…
##########
from yade import pack
###############
#cubic generate
###############
def randomOrientati
# from the source code of Quaternion:
# https:/
from random import random as r
u1 = r()
u2 = r() * pi
u3 = r() * pi
a = sqrt(1 - u1)
b = sqrt(u1)
return Quaternion(
# create loose spherical packing using makeCloud
sp = yade.pack.
mi,ma = (0,0,0)
nCyls,nSphs = 2350,50000
sp.makeCloud(
sp.makeCloud(
for i,(pos,radius) in enumerate(sp):
if i < nSphs:
O.
for i in O.bodies:
#if i < nSphs:
else:
O.
#if i < nCyls: # add cylinder
# O.bodies.
#for i in O.bodies:
#if i < nSphs:
# i.shape.
# else: # add sphere
# O.bodies.
##########
#predicate
##########
#pred = pack.inCylinder
#for (pos,radius) in sp:
# if pred(pos,radius): O.bodies.
################
#certain content
################
#spheres = [b for b in O.bodies if isisntance(
#massSpheres = sum(b.state.mass for b in spheres)
#cylinders = [b for b in O.bodies if isisntance(
#massSCylinders = sum(b.state.mass for b in cylinders)
#x = massSCylinders/
#for i,(pos,radius) in enumerate(sp):
# if x < 0.35: # 35%
#mass = 0.0
#for b in O.bodies:
# if cyl(b.state.pos): # b is inside cyl1
# mass += b.state.mass
##########
#######
### DEFINING ENGINES ###
#######
O.materials.
O.materials.
walls=aabbWalls
wallIds=
triax=TriaxialC
wall_bottom_
wall_top_
wall_left_
wall_right_
wall_back_
wall_front_
internalCompac
sigmaIsoCompac
sigmaLateralCo
max_vel=10,
strainRate=0.01,
label="triax"
)
O.engines=[
ForceResetter(),
InsertionSortC
Bo1_Sphere_
Bo1_GridConne
InteractionLoop([
Ig2_GridNode_
Ig2_GridConne
],
[
Ip2_CohFrictM
Ip2_FrictMat_
],
[ Law2_ScGeom_
Law2_
Law2_
]
),
## We will use the global stiffness of each body to determine an optimal timestep (see https:/
GlobalStiffnes
triax,
#TriaxialState
NewtonIntegrat
]
Gl1_Sphere.
#if nRead==0: yade.qt.
yade.qt.View()
#######
### APPLYING CONFINING PRESSURE ###
#######
#triax.
#while 1:
# O.run(10, True)
#the global unbalanced force on dynamic bodies, thus excluding boundaries, which are not at equilibrium
#unb=
#print 'unbalanced force:',unb,' mean stress: ',triax.meanStress
#if unb<stabilityTh
# break
#O.save(
#print "### Isotropic state saved ###"
############
thanks
xxxe
Revision history for this message
|
#13 |
> 1)Is there a geom module that can be used to simulate fiber? it should be deformable(shear force need be applied on it) and look like a fiber(cylinder would be fine, i used facetcylinder before then i found it cant deform… )
Have a look at cylinders connected with GridConnections *
> 2)the specimen should be cylinder shape. i wonder how specimens can be isotropically consolidated to pressures of 50 kPa, 100 kPa, 200 kPa and 300 kPa. ususlly the pressures are applied by wall and i think that cylinder dont have side ?
You can discretize the surface with boxes applying appropriate force on them. Boxes are independent, so in a sense it simulates deformable surface.
Or maybe PFacets *
> 3)i need to observe the stress–dilatancy relationship of specimen so the exteral surface should be deformable too,what kind of geom module/material should i use?
just a note, the need of stress-dilatancy IMO does not imply deformable surface.
Have a look at PFacets *
> my script is below, it's totally a mess…
some script is usually better than nothing, but at the same time you cannot expect much from it :-)
* I have no experience with cylinders, grid connections, PFacets.. just to point you to a direction where to search or how to ask further questions
cheers
Jan
Can you help with this problem?
Provide an answer of your own, or ask Hanying Zhang for more information if necessary.