PETSc SNES solver for mixed space and bounds;


Hi All,

I am trying to solve a NonLinear mixed problem using PETSc SNES solver. The mixed space is made up of 3 elements (P2-P1-P1) to solve for three unknowns say (u, p, s). I need upper and lower bounds only on the last solution (0<= s <=1). Extending from the snes demo, I need to create two functions carrying the upper and lower bounds for the solution of s. As a naive attempt I did the following.

#Creating function spaces
V_ele   = VectorElement('P',mesh.ufl_cell(), 2)
Q_ele   = FiniteElement('P',mesh.ufl_cell(), 1)
W       = FunctionSpace(mesh,MixedElement(V_ele,Q_ele,Q_ele))

#Creating the box constraints to pass to the SNES solver
smin, smax = Function(W), Function(W)
smin_nodal_values = smin.sub(2).vector()
smin_array = smin_nodal_values.get_local()
smin.sub(2).vector()[:] = smin_array

smax_nodal_values = smax.sub(2).vector()
smax_array = smax_nodal_values.get_local()
smax.sub(2).vector()[:] = smax_array

And then I go ahead and pass these to the solver by

NonlinearVariationalProbelm().set_bounds(smin, smax)

Is there any better way to do this? At the moment I cannot verify with the solution of the problem, because there is a divergence maybe because of some other reason or because of this method. At least want to make sure I am doing this right. One thing I am not sure about is if I am passing any unintended bounds to the u and p spaces also by this method. Since they are not assigned any bounds they must be 0 ? Ideally they should not have any.