<p>Shri,</p>
<p>Would it rather be more appropriate to call it a constrained minimizer then ? I have looked at TAO before and hence my curiosity in the new solver. I shall look at the reference you suggested before asking any more naive questions.</p>

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