← Back to team overview

dolfin team mailing list archive

[Question #114079]: Piecewise defined form (conditional in ufl file?)

 

New question #114079 on DOLFIN:
https://answers.launchpad.net/dolfin/+question/114079

Hi everybody,

I need to write in a ufl file a piecewise defined functional:

L = 
inner(grad(v),grad(u))                                     if normg(u)<= t1
1/normg(u)*inner(grad(v),grad(u))           if t1<normg(u)<=t2
2*inner(grad(v),grad(u))                                     if normg(u)>= t2

normg() is a function that gives the norm of the gradient. I tried to use conditional(condition, true_form, false_form) in a nested way, but it doesn't seem to work. Also reducing the form to one condition instead of two (i.e. a L= condition( norm(grad(u)), first_form, second_form) doesn't work. I tried to use a simpler condition like 3>2, but there was no improvement. I get an error "Conditional is not yet supported (yet)". Am I doing a mistake or it is not yet available? I hope not, I really need it and it seems it is working if one reads the documentation.

Thanks a lot for the help!

Here is the code of the ufl file:

t1=1
t2=2

element=FiniteElement("CG","triangle",1)                                                                                                                                        v = TestFunction(element)                                                                                                                                                        
w = TrialFunction(element)                                                                                                                                       
f  = Coefficient(element)                                                                                                                                                        
u  = Coefficient(element) 
# Euclidean norm of the gradient                                                                                                                                                 
def normg(v):                                                                                                                                                                    
    return sqrt(inner(grad(v),grad(v)))                                                                                                                                          

L = conditional( lt(normg(u),t1), inner(grad(v),grad(u))*dx,\
                        1/normg(u)*inner(grad(v),grad(u))*dx )

# L = conditional( lt(normg(u),t1), m2*normg(u), \
#     conditional( lt(normg(u),t2), \
#     m2*t1, \
#     m1*normg(u))) \
#     *inner(grad(v),grad(u))/sqrt(inner(grad(u),grad(u)))*dx 





-- 
You received this question notification because you are a member of
DOLFIN Team, which is an answer contact for DOLFIN.