How to integrate motion in only one direction?

Asked by Guo, Chang

I'd like to model the soil-structure interaction. My structure is created by spheres as a clump. I only want to give it one DoF in the Z direction but keep its coordinate in X and Y directions constant or zero. How should I do?

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Karol Brzezinski
Solved:
Last query:
Last reply:
Revision history for this message
Guo, Chang (guopolyu) said :
#1

I guess maybe I can set the dynamic of this clump is false and write a one-dimensional newton-integrator for the clump.

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#2

Hi Guo,

You can block all degrees of freedom, except for 'z'. Let's say 'b' is your body, so:

b.state.blockedDOFs='xyXYZ'

the above code constrains body, and allows only for vertical movement (capital letters control rotation).

Best wishes,
Karol

Revision history for this message
Guo, Chang (guopolyu) said (last edit ):
#3

Hi Karol,
Thank you very much for your reply.
I've tried to use this function to block DoFs. But it didn't work.

This is part of my code. The clump's DoFs weren't blocked.

OutDiameter=0.1143

PipeRoughR=0.01

SectionNum=20

LongNum=15

WidthX=0.6

HeightZ=3

HeightZ0=0.3

thickness=0.01

gravity=(0,0,-10)

densityPipe=7850

InputR=OutDiameter/2-PipeRoughR

Gap=sin(pi/SectionNum)*2*InputR

LengthY=Gap*(LongNum-1)+PipeRoughR

PipeParticleNum=0

PP=[]

for j in range(LongNum):

    for i in range(SectionNum):

        PipeParticleNum += 1

        PP.append(sphere([InputR*sin(i*2*pi/SectionNum)+0.3,j*Gap,InputR*cos(i*2*pi/SectionNum)+0.3],radius=PipeRoughR,,color=(1,1,0)))

PPID=O.bodies.appendClumped(PP)

PPClump=O.bodies[PPID[0]]

PPClump.dynamic=1

PPClump.state.blockDOFs='xyXYZ'

PPClump.state.vel = (0, 1,0)

PPClump.state.angVel = (0,0,0)

h=0.4

sp=pack.SpherePack()

sp.makeCloud((thickness*5,0.001,h),(WidthX-thickness*5,LengthY-0.001,h+.2),rMean=0.02)

#

sp.toSimulation(material=O.materials[SphereMID])

newton=NewtonIntegrator(damping=0.4,gravity=gravity,dampGravity=0)

O.engines=[

 ForceResetter(),

 #(1) This is where we allow big bodies, else it would crash due to the very large bottom box:

 InsertionSortCollider([Bo1_Box_Aabb(),Bo1_Sphere_Aabb()],allowBiggerThanPeriod=True),

 InteractionLoop(

  [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],

  [Ip2_FrictMat_FrictMat_FrictPhys()],

  [Law2_ScGeom_FrictPhys_CundallStrack()]

 ),

 GlobalStiffnessTimeStepper(),

    newton,

]

for b in O.bodies:

    if isinstance(b.shape,Sphere):

        b.state.vel[2]=-1

Thank you.

Yours sincerely,
GUO

Revision history for this message
Best Karol Brzezinski (kbrzezinski) said :
#4

Hi,

Try
PPClump.state.blockedDOFs='xyXYZ'

Instead of
PPClump.state.blockDOFs='xyXYZ'

Cheers,
Karol

Revision history for this message
Guo, Chang (guopolyu) said (last edit ):
#5

OK. Thank you very much.
One more small question: why is there no warning when I write a wrong code?

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#6

It is because you can give a new attribute to the body this way. For example, if you want to discriminate between groups of bodies, you can do something like this.

###
if b.state.pos[2]<z1:
    b.shape.belongsTo = 'bottom'
###

belongsTo is an attribute that I have just made up.

Cheers,
Karol

Revision history for this message
Guo, Chang (guopolyu) said :
#7

OK. I get it.
Thank you very much.

Yours sincerely,
GUO

Revision history for this message
Guo, Chang (guopolyu) said :
#8

Thanks Karol Brzezinski, that solved my question.