dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #18533
[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.