← Back to team overview

ffc team mailing list archive

Re: [Bug 426512] Re: Problems parsing form file with diff and derivative

 

On Thu, Sep 10, 2009 at 12:04:21PM -0000, oelgaard wrote:
> I have fixed the issues with variable and exponents != IntValue, so the
> above form should compile with FFC now.
>
> I can confirm that it takes 2m46s (166s) to compile the form on my
> machine and the bottlenecks are:
>
> expand_indices, time = 114.66s
> visit integrand, time =    36.59s
>
> expand_indices is a UFL algorithm, so to make things faster we will have to generate code without calling this.
> The time spent in visit integrand might be reduced if we don't call expand_indices on the integrand.
>
> This bug should be fixed and I'm going to close it unless anyone has
> objections. We can create an appropriate blueprint to take care of the
> compile time issue.

We should not call expand_indices. It's something I added to fix the
lhs/rhs bug. We just need to decipher Martin's instructions to find
out what the correct fix is... :-)

--
Anders

-- 
Problems parsing form file with diff and derivative
https://bugs.launchpad.net/bugs/426512
You received this bug notification because you are subscribed to FFC.

Status in FEniCS Form Compiler: Confirmed

Bug description:
FFC has problems parsing the following form file. As I have pointed out in the code, I need to use the following:

from ufl.algorithms import expand_derivatives, strip_variables
L = strip_variables(expand_derivatives(L_temp))
a = strip_variables(expand_derivatives(a_temp))

to get it to compile via FFC. This is not needed for SFC, and while SFC takes a few seconds (without these lines), FFC takes 6m 25s)

Also, FFC doesn't like fractional exponents which is pointed out in bug #423398.

# Finite strain elasticity

# Function space
vector = VectorElement("Lagrange", "tetrahedron", 1)

# Functions
v  = TestFunction(vector)   # Test function
du = TrialFunction(vector)  # Incremental displacement
B  = Function(vector)       # Body force
u  = Function(vector)       # Displacement at previous iteration

# Kinematics
I = Identity(3)
F = I + grad(u).T
C = F.T*F
J = sqrt(det(C))
Fbar = J**(-1./3.)*F  # Does not like fractional exponents
Cbar = J**(-2./3.)*C  # Does not like fractional exponents

E = (J*C - I)/2       # Want to try Cbar here, but using J*C instead
E = variable(E)

# Material law
mu    = Constant("tetrahedron")
lmbda = Constant("tetrahedron")

psi = lmbda/2*(tr(E)**2) + mu*tr(E*E)
S = diff(psi, E)
P = F*S

# Balance of momentum in the reference configuration
L_temp = inner(P, grad(v).T)*dx - inner(B, v)*dx
a_temp = derivative(L_temp, u, du)

# FIXME: Shouldn't need to do the following
from ufl.algorithms import expand_derivatives, strip_variables
L = strip_variables(expand_derivatives(L_temp))
a = strip_variables(expand_derivatives(a_temp))


References