Hi all.
I'm modeling a problem where a body is pulled on a small patch of the
boundary by a tool. The movement of the tool is prescribed. So I thought
I'd use a boundary condition defined by a function, as so:
def table_select_by_ts(ts, coords, bc=None, problem=None, table=None):
return np.tile(table[ts.step], (coords.shape[0], 1))
tool_disp_fun = Function('tool_disp_fun', table_select_by_ts,
extra_args={'table': displacement_table})
tool_velo_fun = Function('tool_velo_fun', table_select_by_ts,
extra_args={'table': velocity_table})
tool_accel_fun = Function('tool_accel_fun', table_select_by_ts,
extra_args={'table': accel_table})
tool_bc = EssentialBC('tool_bc', self._tool, {
'u.all': tool_disp_fun,
'v.all': tool_velo_fun,
'a.all': tool_accel_fun
})
Then I tried to use it with the Newmark solver, but got a behaviour where
the solver doesn't responde to changes in direction. It produces a nice
result for a constant-velocity movement in one direction, but fails if
there is then a bend in the path. As much as I understand, this is because
the solver's idea is to always combine the previous acceleration ield with
the current, and so it misses the prescribed acceleration when it changes.
I also looked at Generalized-alpha and Bathe, but those seem to only use
the first boundary condition and not update on subsequent frames.
So my question is, what do you think the right solver for this problem is,
or am I using the right solver already but doing it wrong?
Thanks,
Yosef Meller.