Vijay,
VI solvers do not solve (directly anyway) an optimization problem. For
optimization you should use the Tao package. VI solvers solve a nonlinear
equation coupled to inequality constraints. In our case the inequality
constraints can only be on the independent variables (called boxed
constraints). Essentially for each equation F_i(x) at the solution x* either
F_i(x*) is 0 or x_i is on the constraint and F_i(x*) is of a particular sign. I
am not the person to ask about good references on this topic, I know there are
lots of books and papers on the topic.
Barry
On Jul 25, 2011, at 10:17 PM, Vijay S. Mahadevan wrote:
> Barry/Shri,
>
> Is the new VI SNES type in general terms a constrained nonlinear
> solver ? In other words, given a certain constraint as a function of
> the variables of interest, does it find the optimal solution that both
> minimizes the residual and satisfy the constraint ? I have been
> looking at L-BFGS constrained optimization methods and from what I
> understand, the variational inequality solver seems to fall under a
> similar but much broader category. I would much appreciate it if you
> can point me to some papers related to the method. And if I
> misunderstood the domain of applicability, please do feel free to
> correct me.
>
> Thanks,
> Vijay
>
> On Mon, Jul 25, 2011 at 9:58 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>>
>> On Jul 25, 2011, at 5:50 PM, Jonathan Backs wrote:
>>
>>> Hi Shri,
>>>
>>> Thanks for your message and all the helpful tips. If the
>>> TSVISetVariableBounds() functions are available now, I would like to try
>>> them as well. Is the interface essentially the same as with
>>> SNESVISetVariableBounds()? I will get back to you and Barry when I have had
>>> a chance to modify my application.
>>>
>>> For my problem, I believe it makes sense to have bounds on one of the
>>> variables as well as one function of the variables. The two relevant
>>> degrees of freedom are the block voltage (one for each finite difference
>>> block) and the electrode voltage (one for each electrode, which may be
>>> present in multiple blocks). The electrode voltage should keep a constant
>>> phase while the magnitude is constrained between zero and some maximum. The
>>> block voltages near the electrodes depend on the electrode voltages as well
>>> as the neighbouring block voltages. The electrode current for a given
>>> electrode is a function of its electrode voltage and several nearby block
>>> voltages, and should be constrained in magnitude between zero and some
>>> maximum (and the phase unconstrained). Would I need to use
>>> SNESVISetComputeVariableBounds since the electrode current is a function of
>>> the other variables? Would any other provisions need to be made for the
>>> block voltages, since they depend on the electrode voltages?
>>>
>>
>> You cannot directly make a bound on some function of other variables.
>> Instead you need to introduce another variable that is defined to be equal
>> to that function and put the bound on that new variable.
>>
>> Barry
>>
>>> Thank you again,
>>>
>>> Jon
>>>
>>> On 2011-07-25, at 11:58 AM, Shri wrote:
>>>
>>>>
>>>> ----- Original Message -----
>>>>> On Jul 22, 2011, at 4:16 PM, Jonathan Backs wrote:
>>>>>
>>>>>> Barry,
>>>>>>
>>>>>> Thank you so much for your response. Lucky, indeed! I look forward
>>>>>> to trying out these new features.
>>>>>>
>>>>>> I neglected to mention in my original post that my electrical
>>>>>> problem is part of a DAE, which includes a time-dependent heating
>>>>>> problem. Can SNESVI constraints be used in conjunction with
>>>>>> TSSetIFunction() and TSSetIJacobian() as well? (Of course, I only
>>>>>> need the constraints for the time-independent electrical portion.)
>>>>>
>>>>> We have not yet put that in but Shri is starting to look at that just
>>>>> now. Basically we would have a TSVISetVariableBounds() and handle
>>>>> everything from there. I suggest you start with a simple time
>>>>> electrical portion with constraints to explore and we'll go from
>>>>> there. Shri is actually a electrical networks guy and so can speak
>>>>> your language.
>>>>
>>>>
>>>> I've added TSVISetVariableBounds() for setting the bounds on the
>>>> variables using the TS object directly.
>>>> A few things that i want to mention here about using the variational
>>>> inequality nonlinear solver (SNESVI).
>>>> i) Use the runtime option -snes_type vi or explicitly set
>>>> SNESSetType(snes,SNESVI).
>>>> ii) There are two tested algorithms currently available, (a) semismooth
>>>> (-snes_vi_type ss) and (b) active set or reduced space
>>>> (-snes_vi_type rs).
>>>> iii) Take a look at example,ex61.c, in src/snes/examples/tutorials which
>>>> is a time-stepping nonlinear problem with constraints on the variables.
>>>> This example does not use the TS object directly but rather a time-loop is
>>>> explicitly written. Another example,ex8.c, in src/snes/examples/tests/ is
>>>> a minimum surface area problem which uses SNESVI.
>>>>
>>>> By the way, does your problem have bounds on the variables or bounds on
>>>> some function of the variables?
>>>>
>>>> Shri
>>>>
>>>>
>>>>
>>>>>
>>>>> Barry
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> Thank you again,
>>>>>>
>>>>>> Jon
>>>>>>
>>>>>> On 2011-07-22, at 2:46 PM, Barry Smith wrote:
>>>>>>
>>>>>>>
>>>>>>> Jon,
>>>>>>>
>>>>>>> You may be in luck. In PETSc-dev
>>>>>>> http://www.mcs.anl.gov/petsc/petsc-as/developers/index.html we
>>>>>>> have now implemented variational inequality non-linear solvers
>>>>>>> with box constraints.
>>>>>>>
>>>>>>> That is one has a set of variables u and algebraic equations
>>>>>>> F(u) = 0 (say of size n each) but in addition one has
>>>>>>> constraints lu <= u <= uu where some or all of lu may be
>>>>>>> negative infinity (no constraints) and some or all of uu may be
>>>>>>> infinity (no constraints). There is also a constraint on the
>>>>>>> sign of F() for those equations associated with active
>>>>>>> constraints. If your constraints are not in this form sometimes
>>>>>>> you can introduce new additional variables to get it in this
>>>>>>> form. Read up a little on variational inequalities on the web.
>>>>>>>
>>>>>>> To use this you provide the usual SNES function and Jacobian but
>>>>>>> you also provide SNESVISetVariableBounds() there is a manual
>>>>>>> page for this function and for for SNESVI at
>>>>>>>
>>>>>>> http://www.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-dev/docs/index.html
>>>>>>> (the link is broken right now but Satish is fixing it). Plus
>>>>>>> several examples in src/snes/examples/tutorials (in petsc-dev).
>>>>>>>
>>>>>>> This is all new code so we would be interested in your feedback.
>>>>>>>
>>>>>>>
>>>>>>> Barry
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Jul 22, 2011, at 3:33 PM, Jonathan Backs wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I am trying to add a constraint feature to my first PETSc
>>>>>>>> application, which uses the finite difference method to calculate
>>>>>>>> the potential distribution produced by a collection of electrodes
>>>>>>>> in a resistive medium. I would like to make this simulation more
>>>>>>>> realistic by imposing a maximum electric current and a maximum
>>>>>>>> potential difference that can be supplied to each electrode by the
>>>>>>>> power supply. If the medium between the electrodes is very
>>>>>>>> conductive, the current maximum would be exceeded by the maximum
>>>>>>>> potential difference, so the potential difference should be
>>>>>>>> decreased from maximum until it produces the maximum current. On
>>>>>>>> the other hand, the potential difference between the electrodes
>>>>>>>> should remain at maximum as long as the current remains below
>>>>>>>> maximum (say, for a less conductive medium).
>>>>>>>>
>>>>>>>> I added an extra degree of freedom (the electrode voltages) to my
>>>>>>>> DMDA, and I developed a set of conditional expressions that
>>>>>>>> describe the above constraints, but one problem is that the logic
>>>>>>>> relies on if-then-else decisions that are made when forming the
>>>>>>>> function/residual and the Jacobian. Once these decisions are made,
>>>>>>>> of course, the conditions are not checked again until the next
>>>>>>>> function or Jacobian evaluation. The non-linear solver then tends
>>>>>>>> to oscillate between extreme solutions to the opposing conditions
>>>>>>>> with each iteration, and never converges towards a reasonable
>>>>>>>> solution.
>>>>>>>>
>>>>>>>> Is there a better strategy for solving such problems? Does PETSc
>>>>>>>> offer mechanisms to aid in their solution? I would very much
>>>>>>>> appreciate any hints.
>>>>>>>>
>>>>>>>> Thank you for your time,
>>>>>>>>
>>>>>>>> Jon
>>>>>>>
>>>>>>
>>>>
>>>
>>
>>