Hi,
I am trying to apply normal stress boundary conditions with fish and I am a little confused by how it works in FLAC3d.
Here is a minimal viable example to showcase my issue.
I apply a normal stress boundary condition on the top of a box model using a fish function and run the model for 2 step to visualize the result. See code and plot below.
model new
model large-strain off
zone create brick size 8 8 8 ratio 1 1 1
zone face skin
zone cmodel elas
zone prop dens 2000 young 1e9 poi 0.3
zone face apply velo-normal 0 range group "bottom" or "east" or "west" or "north" or "south"
fish def stress_callback
loop foreach gp gp.list
gp.force.load(gp) = (0,0,0)
end_loop
loop foreach zone zone.list
loop i (1,6)
Current_stress = vector(0,0,1e5/4)
if zone.face.group(zone,i,"Skin") = "Top"
gplist = zone.face.gp(zone,i)
loop foreach gp gplist
gp.force.load(gp) = gp.force.load(gp) - Current_stress
end_loop
end_if
end_loop
end_loop
end
[stress_callback]
model step 2
This is fine and I get what I want.
Now I want to make sure that there are not an issue when the faces have different surface areas as in my real application this will be the case.
Therefore I apply a ratio in the x direction of my box. Given the simplicity of the model I am expecting to have exactly or nearly exactly the same results. Only line 5 is changed to:
zone create brick size 8 8 8 ratio 1.1 1 1
This gives the following results that I did not expected.
The normal stress-vector is the same but it effects on the stress within the box surprised me.
So I compared it to a model using the zone face apply command as below:
model new
model large-strain off
zone create brick size 8 8 8 ratio 1.1 1 1
zone face skin
zone cmodel elas
zone prop dens 2000 young 1e9 poi 0.3
zone face apply velo-normal 0 range group "bottom" or "east" or "west" or "north" or "south"
[Current_stress = 1e5]
zone face apply stress-normal [-Current_stress] range group 'top'
model step 100
This gives me a correct result. Therefore, The issue seems to be the face surface area.
To summarize my issue in questions:
- It seems that gp.force.load is an force applied to a gridpoint. Therefore I need to normalize by the area to get the right stress. It seems to work, but are there other corrections I am not seeing at the moment?
- Is there a simpler way to apply boundary conditions with fish (or python) that would give me a result very similar to using zone face apply?
- In the plot: It seems that applied force from the zone vectors item is not what I want to visualized. If I want to look at a boundary condition stress like in my case should I rather use the reaction force instead, but only at the initial stage because once the system is solved the reaction force desappear.