<div dir="ltr"><div dir="ltr">On Wed, Dec 4, 2024 at 8:09 AM Blauth, Sebastian <<a href="mailto:sebastian.blauth@itwm.fraunhofer.de">sebastian.blauth@itwm.fraunhofer.de</a>> wrote:</div><div class="gmail_quote gmail_quote_container"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="msg4337572636078472976"><div lang="DE" style="overflow-wrap: break-word;"><div class="m_4337572636078472976WordSection1"><p class="MsoNormal"><span lang="EN-US">Thanks a lot for the hint. With this I could find the error myself: I had not initialized the residual vector correctly, which has to be duplicated, hence the error. Assembling this once with FEniCS fixed the error and I can now use nonlinear preconditioning. Thanks a lot!</span></p></div></div></div></blockquote><div><br></div><div>I would be very interested to hear how it works if you have the time to mail us back.</div><div><br></div><div>  Thanks</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="msg4337572636078472976"><div lang="DE" style="overflow-wrap: break-word;"><div class="m_4337572636078472976WordSection1"><p class="MsoNormal"> </p><p class="MsoNormal"><span lang="EN-US">Best,<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US">Sebastian<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal">--<u></u><u></u></p><p class="MsoNormal">Dr. Sebastian Blauth<u></u><u></u></p><p class="MsoNormal">Fraunhofer-Institut für<u></u><u></u></p><p class="MsoNormal">Techno- und Wirtschaftsmathematik ITWM<u></u><u></u></p><p class="MsoNormal">Abteilung Transportvorgänge<u></u><u></u></p><p class="MsoNormal">Fraunhofer-Platz 1, 67663 Kaiserslautern<u></u><u></u></p><p class="MsoNormal">Telefon: +49 631 31600-4968<u></u><u></u></p><p class="MsoNormal"><a href="mailto:sebastian.blauth@itwm.fraunhofer.de" target="_blank">sebastian.blauth@itwm.fraunhofer.de</a><u></u><u></u></p><p class="MsoNormal"><a href="https://urldefense.us/v3/__https://www.itwm.fraunhofer.de__;!!G_uCfscf7eWS!apTDPPZWCcPl0SpwhG_O2c_qShB9EsoiAl8XyoHxoNowvDTMyo8-w17OoKH1i5zqmYbvLI9l0EMpe17p3IXT$" target="_blank">https://www.itwm.fraunhofer.de</a><u></u><u></u></p><p class="MsoNormal"><span><u></u> <u></u></span></p><div style="border-top:none;border-right:none;border-bottom:none;border-left:1.5pt solid blue;padding:0cm 0cm 0cm 4pt"><div><div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm"><p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Stefano Zampini <<a href="mailto:stefano.zampini@gmail.com" target="_blank">stefano.zampini@gmail.com</a>> <br><b>Sent:</b> Wednesday, December 4, 2024 1:56 PM<br><b>To:</b> Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank">knepley@gmail.com</a>><br><b>Cc:</b> Blauth, Sebastian <<a href="mailto:sebastian.blauth@itwm.fraunhofer.de" target="_blank">sebastian.blauth@itwm.fraunhofer.de</a>>; PETSc users list <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>><br><b>Subject:</b> Re: [petsc-users] Setting up nonlinear preconditioning with petsc4py<u></u><u></u></span></p></div></div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">FENICS swallows any useful error information returned from PETSc. You can try using the below code snippet at the beginning of your script right after you loaded dolfin stuff<u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">PETSc.Sys.pushErrorHandler('python')<u></u><u></u></p></div></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">On Wed, Dec 4, 2024, 15:48 Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank">knepley@gmail.com</a>> wrote:<u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><div><p class="MsoNormal">On Wed, Dec 4, 2024 at 4:44 AM Blauth, Sebastian <<a href="mailto:sebastian.blauth@itwm.fraunhofer.de" target="_blank">sebastian.blauth@itwm.fraunhofer.de</a>> wrote:<u></u><u></u></p></div><div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><div><div><p class="MsoNormal">Hi everyone,<u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">I wanted to try nonlinear preconditioning for solving nonlinear systems. The problems arise from PDEs discretized with FEniCS and I have successfully implemented a wrapper for SNES. However, once I want to try nonlinear preconditioning by adding the option “-npc_snes_type newtonls” (or other solvers such as nrichardson), I get the error code 56.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">My approach looks something like this</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">from petsc4py import PETSc</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes = PETSc.SNES().create()</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes.setFunction(self.assemble_function, self.residual_petsc)</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes.setJacobian(self.assemble_jacobian, self.A_petsc, self.P_petsc)</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes.setFromOptions()</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes.solve(None, self.u.vector().vec())</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">snes.destroy()</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">I don’t think that my user defined functions are problematic. The code runs well with the options (just an example)</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-snes_type newtonls</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-snes_rtol 1e-6</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-snes_monitor</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-ksp_type gmres</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-ksp_monitor_true_residual</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-pc_type lu</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-pc_factor_mat_solver_type mumps</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-mat_mumps_icntl_24</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">Here, the gmres is just used to verify that the direct solver works as expected. Newton Krylov methods also work well.</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">However, once I use</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-snes_type nrichardson</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-npc_snes_type newtonls</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">-npc_snes_max_it 4</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">(as discussed e.g. in <a href="https://urldefense.us/v3/__https:/climatemodeling.org/*rmills/talks/PSU-ACM-seminar-2024.pdf__;fg!!G_uCfscf7eWS!ZpQxakVxVcyih0WUbW_MxFNHXR0tUbZAvis8z497q782yqbJraYBBCMst79xJm6nlGdBUqW3I2vIDAtJiUTR$" target="_blank">https://climatemodeling.org/~rmills/talks/PSU-ACM-seminar-2024.pdf</a>) I get the error message</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">File "/p/tv/blauths/cashocs/cashocs/nonlinear_solvers/snes.py", line 250, in solve</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">    snes.solve(None, self.u.vector().vec())</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">  File "petsc4py/PETSc/SNES.pyx", line 1555, in petsc4py.PETSc.SNES.solve</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">petsc4py.PETSc.Error: error code 56</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">I would be really grateful if someone could point me to the right direction on how to use nonlinear precondition with petsc4py.</span><u></u><u></u></p></div></div></div></blockquote><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">56 is PETSC_ERR_SUP, which means we hit an unsupported operation. petsc4py preserves the stack trace, so FEniCS should not be throwing it away (along with the error message). Maybe run in the debugger so we can see the error message and stack?<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">  Thanks,<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">      Matt<u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><div><div><p class="MsoNormal"><span lang="EN-US">Thanks a lot in advance,</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US">Sebastian</span><u></u><u></u></p><p class="MsoNormal"><span lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal">--<u></u><u></u></p><p class="MsoNormal">Dr. Sebastian Blauth<u></u><u></u></p><p class="MsoNormal">Fraunhofer-Institut für<u></u><u></u></p><p class="MsoNormal">Techno- und Wirtschaftsmathematik ITWM<u></u><u></u></p><p class="MsoNormal">Abteilung Transportvorgänge<u></u><u></u></p><p class="MsoNormal"><a href="https://urldefense.us/v3/__https://www.google.com/maps/search/Fraunhofer-Platz*1,*67663*Kaiserslautern?entry=gmail&source=g__;Kysr!!G_uCfscf7eWS!apTDPPZWCcPl0SpwhG_O2c_qShB9EsoiAl8XyoHxoNowvDTMyo8-w17OoKH1i5zqmYbvLI9l0EMpe-CZb10E$" target="_blank">Fraunhofer-Platz 1, 67663 Kaiserslautern</a><u></u><u></u></p><p class="MsoNormal">Telefon: +49 631 31600-4968<u></u><u></u></p><p class="MsoNormal"><a href="mailto:sebastian.blauth@itwm.fraunhofer.de" target="_blank">sebastian.blauth@itwm.fraunhofer.de</a><u></u><u></u></p><p class="MsoNormal"><a href="https://urldefense.us/v3/__https:/www.itwm.fraunhofer.de__;!!G_uCfscf7eWS!ZpQxakVxVcyih0WUbW_MxFNHXR0tUbZAvis8z497q782yqbJraYBBCMst79xJm6nlGdBUqW3I2vIDJ9nKGZK$" target="_blank">https://www.itwm.fraunhofer.de</a><u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p></div></div></div></blockquote></div><div><p class="MsoNormal"><br clear="all"><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><p class="MsoNormal"><span class="m_4337572636078472976gmailsignatureprefix">-- </span><u></u><u></u></p><div><div><div><div><div><div><div><p class="MsoNormal">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><a href="https://urldefense.us/v3/__http:/www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!ZpQxakVxVcyih0WUbW_MxFNHXR0tUbZAvis8z497q782yqbJraYBBCMst79xJm6nlGdBUqW3I2vIDIJYMNfe$" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><u></u><u></u></p></div></div></div></div></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div><div><br clear="all"></div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!apTDPPZWCcPl0SpwhG_O2c_qShB9EsoiAl8XyoHxoNowvDTMyo8-w17OoKH1i5zqmYbvLI9l0EMpe9EEiG6C$" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>