Welcome to ask.woodem.org. You may post when you login through your GitHub account.

impose Forces on particles

0 votes
asked Aug 29, 2018 by trucgiao91 (500 points)
Hi Vaclav,

I have read different methods to impose force or velocity on particles but still haven't figured out how to impose linearly increased Forces  over time (say in x and y direction where F_x = 2 *F_y, F_x final would be 100). Is there a way to make this possible? My plan is to perform different biaxial tests on concrete specimen to identify its 2D yield surface.
commented Aug 29, 2018 by trucgiao91 (500 points)
edited Aug 29, 2018 by trucgiao91

My current idea is to use pyRunner in combination with a method to impose Radialforce * S.time. However it does not seem to work...

commented Aug 30, 2018 by eudoxos (49,070 points)

I would typically do such test with periodic boundary conditions where you can prescribe homogenized stress/deformation of the entire cell (see e.g. https://woodem.org/cases/x-aniso/index.html#element-test); the code has some rough edges but you can avoid boundary influence this way.

You know better if you need force-control or displacement-control for your test. Most of the impositions are displacement-control (velocity or position).

You are right that there does not seem to be a way to prescribe force interpolated in time (see https://woodem.org/woo.dem.html#woo.dem.Impose for available impositions); there is InterpolatedMotion (for position/orientation but not force), Local6Dofs (any generalized force/velocity, but not variable in time), ConstantForce (not variable in time).

As quick workaround, you can use ConstantForce and adjust the ConstantForce.F=(2*a*S.time,a*S.time,0) from PyRunner, that should work, but is a hack. (RadialForce - is something like attraction towards line, I am quite sure you don't need that one, do you?).

I will be happy to wrote InterpolatedForce for you (it will be like InterpolatedMotion, which is about 10 lines of code, but easier); prescribing torque does not seem to be useful (but why now, whatever), so just 3 components of force varying over time (the force being optionally rotated by a node defining local coords) - that would work for you?

Mind you, though, you'd need to recompile the code, but using the WSL that should be a snap :)

commented Aug 30, 2018 by trucgiao91 (500 points)

Hi Vaclav :),

Thank you for such a thoughtful support!
The main idea was to control the ratio between F1 and F2 over time , I have tried the Pyrunner as you mentioned, (and yes with Constance Force) but did not work as expected. And thank you for offering to write the InterpolatedForce, personally I think it would be useful someday for some one including me. Last night I have decided to just simply impose velocities as shown:

vrtImpose=VelocityAndReadForce(dir = (0,0,1),vel=1e-4,invF=True) #vertical impose
hrtImpose=VelocityAndReadForce(dir = (1,0,0),vel=1e-4*tanAlpha,invF=True) #horizontal impose

At the end the force ratio is different than tanAlpha, but I needed a combination of different ratio values anyway so I think I am satisfied with this approach.

One more question: is there a way to run the same simulation with different parameter values of tanAlpha at one? so far I am doing it quite manually: change tanAlpha value, save the script, run it again, etc..

I am personally very interested in learning DEM and find it powerful. Still I am new to it and as you can see my programming skill is limited... But I am more than happy to share with you as soon as my studies about foamed concrete having positive results. :)

Looking forward for more discussion in the future with you!

commented Sep 16, 2018 by trucgiao91 (500 points)
edited Sep 17, 2018 by trucgiao91

Hi Vaclav,

I have written the script using ConstantForce on pyRunner for simulate biaxial test with force control method. However based on the impose.cpp, the force value of the set of particles would have the same value P. My codes are something like this:

for id1 in top: S.dem.nodes[id1].dem.impose=topImpose

(where top contains list of particles'id on on the top layers). But when I try to sum all the forces in this set (for plotting) , the force value in z direction is vastly different and much less. Is there something that I missed?

for i in top: fTop += S.dem.nodes[i].dem.force[2] #sum all forces in z-dir

Please log in or register to answer this question.