<div dir="ltr">Hi Barry,<div><br></div><div>I called the SNESGetSolution() through SNESMonitorSet(). I understand that it may not be effective, but I was able to change the values of iteration solution in old releases (two years ago). Was the solution vector set to read status in recent version?</div><div><br></div><div>About the -snes_type vinewtonrsls, we discussed this a few years ago. It does not work well for my problem, so I want to manually perform some post processing after each iteration. For example, setting a bound for the solution or set the maximum changes for each component of the solution in each iteration.</div><div><a href="https://lists.mcs.anl.gov/pipermail/petsc-users/2014-May/021520.html">https://lists.mcs.anl.gov/pipermail/petsc-users/2014-May/021520.html</a></div><div><br></div><div><br></div><div>Best,</div><div>Xiangdong</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 17, 2018 at 5:24 PM, Smith, Barry F. <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
   Where are you call SNESGetSolution() from? Inside a SNES monitor routine, a SNES convergence test routine, a SNESLineSearchPostCheck() routine?<br>
<br>
    The SNES linear solvers are solving the system, you really shouldn't be changing the values of the solution any time while they are doing their job solving the system. Of course you can change the values after the solver is done.<br>
<br>
    If you are trying to "solve" a linear system with upper and/or lower bounds on the variables you should solve it as a variational inequality and use SNESVISetVariableBounds(), you should not try to manually restrict the values (that won't work). And use  -snes_type vinewtonrsls<br>
<br>
   Barry<br>
<span class="gmail-m_3975158734343999543HOEnZb"><font color="#888888"><br>
<br>
<br>
   Barry<br>
</font></span><div class="gmail-m_3975158734343999543HOEnZb"><div class="gmail-m_3975158734343999543h5"><br>
<br>
> On Apr 17, 2018, at 12:04 PM, Xiangdong <<a href="mailto:epscodes@gmail.com" target="_blank">epscodes@gmail.com</a>> wrote:<br>
> <br>
> Hello everyone,<br>
> <br>
> Here are a little more information.<br>
> <br>
> Here is the function calls I have: <br>
> <br>
> SNESGetSolution(snes,&x);<br>
> VecPointwiseMax(x,x,xl);   Fail<br>
> VecPointwiseMax(x,y,xl); Fail<br>
> <br>
> The error messages are"Object is in wrong state, Vec is locked read only, argument #1."<br>
> <br>
> It seems that the vector x returned from SNESGetSolution is locked read only, Is it true? <br>
> <br>
> If I want do some post processing by modifying the x after each nonlinear iteration, how can I get the solution and modify it?<br>
> <br>
> Thank you.<br>
> <br>
> Best,<br>
> Xiangdong<br>
> <br>
> <br>
> <br>
> On Tue, Apr 17, 2018 at 11:33 AM, Xiangdong <<a href="mailto:epscodes@gmail.com" target="_blank">epscodes@gmail.com</a>> wrote:<br>
> Hello everyone,<br>
> <br>
> When I call VecPointwiseMax(x,x,y) , I got an error message "object is in wrong state. Vec is locked read only, argument #1."<br>
> <br>
> However, In the online manual of output parameters of VecPointwiseMax, it says:<br>
> <br>
> <a href="http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecPointwiseMax.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/p<wbr>etsc-current/docs/manualpages/<wbr>Vec/VecPointwiseMax.html</a><br>
> Output Parameter<br>
> <br>
> w -the result <br>
> <br>
> Notes: any subset of the x, y, and w may be the same vector. For complex numbers compares only the real part<br>
> <br>
> However, in the implementation of VecPointwiseMax_Seq,<br>
> <a href="http://www.mcs.anl.gov/petsc/petsc-current/src/vec/vec/impls/seq/bvec2.c.html#VecPointwiseMax_Seq" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/p<wbr>etsc-current/src/vec/vec/impls<wbr>/seq/bvec2.c.html#VecPointwise<wbr>Max_Seq</a>, <br>
> <br>
> it seems that xin is read locked, and win and xin cannot be the same vectors.<br>
>  PetscErrorCode VecPointwiseMax_Seq(Vec win,Vec xin,Vec yin)<br>
>  17: <br>
> {<br>
> <br>
>  19:   PetscInt<br>
>        n = win->map->n,i;<br>
> <br>
>  20:   PetscScalar    *ww,*xx,*yy; /* cannot make xx or yy const since might be ww */<br>
> <br>
> <br>
> <br>
>  23:   VecGetArrayRead(xin,(const PetscScalar<br>
> **)&xx);<br>
> <br>
>  24:   VecGetArrayRead(yin,(const PetscScalar<br>
> **)&yy);<br>
> <br>
>  25:   VecGetArray<br>
> (win,&ww);<br>
> <br>
> <br>
>  27:   for (i=0; i<n; i++) ww[i] = PetscMax(PetscRealPart(xx[i]),<br>
> PetscRealPart(yy[i]));<br>
> <br>
> <br>
>  29:   VecRestoreArrayRead(xin,(<wbr>const PetscScalar<br>
> **)&xx);<br>
> <br>
>  30:   VecRestoreArrayRead(yin,(<wbr>const PetscScalar<br>
> **)&yy);<br>
> <br>
>  31:   VecRestoreArray<br>
> (win,&ww);<br>
> <br>
>  32:   PetscLogFlops<br>
> (n);<br>
> <br>
>  33:   return<br>
> (0);<br>
> <br>
>  34: }<br>
> Can w and x really be same vector in the VecPointwiseMax? Thanks.<br>
> <br>
> Best,<br>
> Xiangdong<br>
> <br>
<br>
</div></div></blockquote></div><br></div></div>