Transferring stress from fluid to structure

Registered by selim

The current interface of the hyperelasticity solver requires that Neumann boundary conditions are given as a Function or Expression defined on the structure mesh. Such a Function is difficult to construct given only the fluid stress in the fluid domain.

However, it is simple to compute the resulting entries that should go into the right-hand side vector by first assembling the entries on the fluid domain and then mapping those entries over to corresponding entries in the structure domain:

L_F = dot(v_F, dot(Sigma_F, N_F))*ds

b_F = assemble(L_F)

b_S += b_F with a suitable reordering of the entries

I suggest that the elasticity solver does not use VariationalProblem internally but instead assembles and applies boundary conditions "manually" and extends the user interface such that one may add entries to the vector.

Blueprint information

Status:
Not started
Approver:
None
Priority:
Undefined
Drafter:
None
Direction:
Needs approval
Assignee:
None
Definition:
New
Series goal:
None
Implementation:
Unknown
Milestone target:
None

Related branches

Sprints

Whiteboard

With some recent changes to the Expression stuff in DOLFIN, I am not able to run any of the twist demos to test changes. Is it a trivial fix to the Expression syntax that is required in the cbc.twist algorithms?

AL: It may or may not work now. I just fixed a bug in UFL that might make things work. The changes in the interface are as follows:

1. Argument V=V should be removed in Expression
2. Mesh argument should be removed in Constant
3. Subclassed Expressions overloading eval must implement the dim() function if not scalar.

e.g. $ python twist.py
A hyperelastic cube twisted by 60 degrees
Debug: Trying to automatically figure out the element [at python-path/dolfin/expression.py:554 in __new__()]
Debug: Assuming it's a triangle [at python-path/dolfin/expression.py:555 in __new__()]
Debug: It's a vector [at python-path/dolfin/expression.py:563 in __new__()]
Traceback (most recent call last):
  File "twist.py", line 53, in <module>
    u = twist.solve()
  File "/Users/hnarayan/Work/FEniCS/apps/cbc.solve/cbc/twist/problem_definitions.py", line 19, in solve
    return solver.solve(self)
  File "/Users/hnarayan/Work/FEniCS/apps/cbc.solve/cbc/twist/solution_algorithms.py", line 26, in solve
    dirichlet_conditions = problem.dirichlet_conditions(vector)
  File "twist.py", line 14, in dirichlet_conditions
    clamp = Expression(("0.0", "0.0", "0.0"), V = vector)
  File "/Users/hnarayan/Work/FEniCS/unstable/build/lib/python2.5/site-packages/dolfin/expression.py", line 564, in __new__
    element = ufl.VectorElement("Quadrature", domain, None, shape[0])
  File "/Users/hnarayan/Work/FEniCS/unstable/build/lib/python2.5/site-packages/ufl/finiteelement.py", line 241, in __init__
    (self._family, self._cell, self._degree, len(self._sub_elements))
TypeError: int argument required

(?)

Work Items

This blueprint contains Public information 
Everyone can see this information.