<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:等线;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@等线";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.w
        {mso-style-name:w;}
span.n
        {mso-style-name:n;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Thanks Barry, this is exactly what I was looking for!<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hongrui<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From:</b> Barry Smith <bsmith@petsc.dev> <br><b>Sent:</b> Wednesday, July 5, 2023 8:23 PM<br><b>To:</b> Hongrui Yu <yuhongrui@utexas.edu><br><b>Cc:</b> petsc-users@mcs.anl.gov<br><b>Subject:</b> Re: [petsc-users] Abort SNES Mid-iteration<o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal>   I assume you want to stop the SNES solve, but you do not want the program to end immediately? Instead, you want SNESSolve() to end immediately with a very useful message?<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>    This is done with <a href="https://petsc.org/release/manualpages/SNES/SNESSetFunctionDomainError/#snessetfunctiondomainerror">https://petsc.org/release/manualpages/SNES/SNESSetFunctionDomainError/#snessetfunctiondomainerror</a> or <a href="https://petsc.org/release/manualpages/SNES/SNESSetJacobianDomainError/#snessetjacobiandomainerror">https://petsc.org/release/manualpages/SNES/SNESSetJacobianDomainError/#snessetjacobiandomainerror</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>    In conjunction with using this, you must call <a href="https://petsc.org/release/manualpages/SNES/SNESGetConvergedReason/#snesgetconvergedreason">https://petsc.org/release/manualpages/SNES/SNESGetConvergedReason/#snesgetconvergedreason</a> immediately after each SNESSolve() and check if the reason is negative. The specific values <span class=w><span style='font-size:10.0pt;color:#F8F8F8'> </span></span><span class=n><a href="https://petsc.org/release/manualpages/SNES/SNESConvergedReason/"><span style='text-decoration:none'>SNES_DIVERGED_FUNCTION_DOMAIN</span></a> will be set if you had called SNESSetFunctionDomainError() and </span><a href="https://petsc.org/release/manualpages/SNES/SNESConvergedReason/"><span style='text-decoration:none'>SNES_DIVERGED_JACOBIAN_DOMAIN</span></a> will be set if you had called SNESSetJacobianDomainError().<o:p></o:p></p></div><div><p class=MsoNormal><br><br><o:p></o:p></p></div><div><p class=MsoNormal>   Also take a look at the Note in <a href="https://petsc.org/release/manualpages/SNES/SNESSetFunctionDomainError/#snessetfunctiondomainerror">https://petsc.org/release/manualpages/SNES/SNESSetFunctionDomainError/#snessetfunctiondomainerror</a>. This provides two alternatives to simply giving up on the nonlinear solve but provides ways to either bound the tentative solutions into their physical regime or to "nudge" the tentative solutions back into their physical regime.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>   PETSc errors are hard, meaning when one is encountered the program ends! Thus one cannot use the error handler infrastructure to recover from errors, even user created errors; that is why we provide the SNES domain "error" mechanism since it does not involve the PETSc error handlers.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>   Good luck.<o:p></o:p></p></div><div><p class=MsoNormal><span style='font-size:10.0pt'><br><br></span><o:p></o:p></p></div><div><div><p class=MsoNormal><br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>On Jul 5, 2023, at 8:54 PM, Hongrui Yu <<a href="mailto:yuhongrui@utexas.edu">yuhongrui@utexas.edu</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>Hello PETSc users,<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>I’d like to use the error handling mechanism to abort SNES mid-iteration if certain quantities become nonphysical by calling SETERRQ() inside FormFunction() or FormJacobian(). I’m wondering if users can define their own error handler routines to use with PetscPushErrorHandler() and PetscPopErrorHandler()? I’m also open to any suggestion on better ways to quit SNES mid-iteration.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Thanks in advance for any help or advice!<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Hongrui<o:p></o:p></p></div></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>