1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 48ad9143bSBarry Smith #include <petsc/private/f90impl.h> 58e27ec22SSatish Balay 68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 791f3e32bSBarry Smith #define snesconvergedreasonview_ SNESCONVERGEDREASONVIEW 8df2570feSBarry Smith #define snessetpicard_ SNESSETPICARD 9df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 106ce558aeSBarry Smith #define snessolve_ SNESSOLVE 118d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 128d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 138e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 1417a42bb7SSatish Balay #define snessetjacobian1_ SNESSETJACOBIAN1 1517a42bb7SSatish Balay #define snessetjacobian2_ SNESSETJACOBIAN2 168e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 178e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 188e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 19be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 20dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 218e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 22be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 238e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 248d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 25e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 268e27ec22SSatish Balay #define snesview_ SNESVIEW 278e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 288e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 298e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 308e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 318e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 32a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 33a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 34a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 35a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 36c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 373b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 3841ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ SNESNEWTONTRDCSETPRECHECK 3941ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_ SNESNEWTONTRDCSETPOSTCHECK 40fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 41c4421ceaSFande Kong #define snesgetconvergedreasonstring_ SNESGETCONVERGEDREASONSTRING 424e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 4391f3e32bSBarry Smith #define snesconvergedreasonview_ snesconvergedreasonview 44df2570feSBarry Smith #define snessetpicard_ snessetpicard 45df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 466ce558aeSBarry Smith #define snessolve_ snessolve 478d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 488d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 498e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 5017a42bb7SSatish Balay #define snessetjacobian1_ snessetjacobian1 5117a42bb7SSatish Balay #define snessetjacobian2_ snessetjacobian2 528e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 538e27ec22SSatish Balay #define snesgettype_ snesgettype 548e27ec22SSatish Balay #define snessetfunction_ snessetfunction 55be95d8f1SBarry Smith #define snessetngs_ snessetngs 56dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 578e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 58be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 598e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 608d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 61e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 628e27ec22SSatish Balay #define snesview_ snesview 638e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 648e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 658e27ec22SSatish Balay #define snessettype_ snessettype 668e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 678e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 68a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 69a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 70a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 71a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 72c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 733b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 7441ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ snesnewtontrdcsetprecheck 7541ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_ snesnewtontrdcsetpostcheck 76fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 77c4421ceaSFande Kong #define snesgetconvergedreasonstring_ snesgetconvergedreasonstring 788e27ec22SSatish Balay #endif 798e27ec22SSatish Balay 80f6291634SJed Brown static struct { 81f6291634SJed Brown PetscFortranCallbackId function; 82f6291634SJed Brown PetscFortranCallbackId test; 83f6291634SJed Brown PetscFortranCallbackId destroy; 84f6291634SJed Brown PetscFortranCallbackId jacobian; 85f6291634SJed Brown PetscFortranCallbackId monitor; 86f6291634SJed Brown PetscFortranCallbackId mondestroy; 87be95d8f1SBarry Smith PetscFortranCallbackId ngs; 88dfef22ccSBarry Smith PetscFortranCallbackId update; 89c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 907cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 9189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 9289e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 93c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 943c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 9589e00c7dSSatish Balay #endif 96f6291634SJed Brown } _cb; 9790b77ac2SPeter Brune 98c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes, Vec x, Vec y, PetscBool *changed_y, void *ctx) 99c9368356SGlenn Hammond { 100c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 101c9368356SGlenn Hammond void *ptr; 102*3ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.trprecheck_pgiptr, NULL, &ptr)); 103c9368356SGlenn Hammond #endif 104c9368356SGlenn Hammond PetscObjectUseFortranCallback(snes, _cb.trprecheck, (SNES *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&snes, &x, &y, changed_y, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr))); 105c9368356SGlenn Hammond } 106c9368356SGlenn Hammond 10719caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES, Vec, Vec, PetscBool *, void *), void *ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 108c9368356SGlenn Hammond { 109*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscVoidFunction)func, ctx); 110*3ba16761SJacob Faibussowitsch if (*ierr) return; 111c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 112*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr); 113*3ba16761SJacob Faibussowitsch if (*ierr) return; 114c9368356SGlenn Hammond #endif 115*3ba16761SJacob Faibussowitsch *ierr = SNESNewtonTRSetPreCheck(*snes, ourtrprecheckfunction, NULL); 116c9368356SGlenn Hammond } 117c9368356SGlenn Hammond 11841ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES, Vec, Vec, PetscBool *, void *), void *ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 11941ba4c6cSHeeho Park { 120*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscVoidFunction)func, ctx); 121*3ba16761SJacob Faibussowitsch if (*ierr) return; 12241ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 123*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr); 124*3ba16761SJacob Faibussowitsch if (*ierr) return; 12541ba4c6cSHeeho Park #endif 126*3ba16761SJacob Faibussowitsch *ierr = SNESNewtonTRDCSetPreCheck(*snes, ourtrprecheckfunction, NULL); 12741ba4c6cSHeeho Park } 12841ba4c6cSHeeho Park 129c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *ctx) 1307cb011f5SBarry Smith { 1317cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1327cb011f5SBarry Smith void *ptr; 133*3ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.trpostcheck_pgiptr, NULL, &ptr)); 1347cb011f5SBarry Smith #endif 135c9368356SGlenn Hammond PetscObjectUseFortranCallback(snes, _cb.trpostcheck, (SNES *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, void *, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&snes, &x, &y, &w, changed_y, changed_w, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr))); 1367cb011f5SBarry Smith } 1377cb011f5SBarry Smith 13819caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetpostcheck_(SNES *snes, void (*func)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void *ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 1397cb011f5SBarry Smith { 140*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscVoidFunction)func, ctx); 141*3ba16761SJacob Faibussowitsch if (*ierr) return; 1427cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 143*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr); 144*3ba16761SJacob Faibussowitsch if (*ierr) return; 1457cb011f5SBarry Smith #endif 146*3ba16761SJacob Faibussowitsch *ierr = SNESNewtonTRSetPostCheck(*snes, ourtrpostcheckfunction, NULL); 1477cb011f5SBarry Smith } 1487cb011f5SBarry Smith 14941ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetpostcheck_(SNES *snes, void (*func)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), void *ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 15041ba4c6cSHeeho Park { 151*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscVoidFunction)func, ctx); 152*3ba16761SJacob Faibussowitsch if (*ierr) return; 15341ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 154*3ba16761SJacob Faibussowitsch *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr); 155*3ba16761SJacob Faibussowitsch if (*ierr) return; 15641ba4c6cSHeeho Park #endif 157*3ba16761SJacob Faibussowitsch *ierr = SNESNewtonTRDCSetPostCheck(*snes, ourtrpostcheckfunction, NULL); 15841ba4c6cSHeeho Park } 15941ba4c6cSHeeho Park 1608e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes, Vec x, Vec f, void *ctx) 1618e27ec22SSatish Balay { 16289e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 16389e00c7dSSatish Balay void *ptr; 164*3ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 16589e00c7dSSatish Balay #endif 16689e00c7dSSatish Balay PetscObjectUseFortranCallback(snes, _cb.function, (SNES *, Vec *, Vec *, void *, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&snes, &x, &f, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr))); 1678e27ec22SSatish Balay } 168b8ebb45fSBarry Smith 16906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1708e27ec22SSatish Balay { 171f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1727f7931b9SBarry Smith } 1737f7931b9SBarry Smith 1747f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1757f7931b9SBarry Smith { 176f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1778e27ec22SSatish Balay } 1788e27ec22SSatish Balay 179d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1808e27ec22SSatish Balay { 181d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1828e27ec22SSatish Balay } 183f6291634SJed Brown 184dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 185dfef22ccSBarry Smith { 186dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 187dfef22ccSBarry Smith } 188be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 18990b77ac2SPeter Brune { 190be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 19190b77ac2SPeter Brune } 1928e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1938e27ec22SSatish Balay { 194f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1958e27ec22SSatish Balay } 196c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1978e27ec22SSatish Balay { 198f6291634SJed Brown SNES snes = (SNES)*ctx; 199f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 2008e27ec22SSatish Balay } 2018e27ec22SSatish Balay 2028e27ec22SSatish Balay /* 2038d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 2048e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 2058e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 2068e27ec22SSatish Balay */ 207d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 208df66969eSBarry Smith { 209d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 210df66969eSBarry Smith } 211d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2128e27ec22SSatish Balay { 213d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 2148e27ec22SSatish Balay } 215d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2168e27ec22SSatish Balay { 217d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 2188e27ec22SSatish Balay } 2198e27ec22SSatish Balay 22019caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 22119caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 222f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 2238e27ec22SSatish Balay { 224f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 2258d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 2268d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 2278d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 228e025ade3SBarry Smith if (!ctx) { 229e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 230e025ade3SBarry Smith return; 231e025ade3SBarry Smith } 2328d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 233df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 234df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2358e27ec22SSatish Balay } else { 236f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2370298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2388e27ec22SSatish Balay } 2398e27ec22SSatish Balay } 24017a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 24117a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 24217a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 24317a42bb7SSatish Balay { 24417a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 24517a42bb7SSatish Balay } 24617a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 24717a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 24817a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 24917a42bb7SSatish Balay { 25017a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 25117a42bb7SSatish Balay } 252f6dfbefdSBarry Smith 253df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes, Vec x, Vec f, void *ctx) 254df2570feSBarry Smith { 255df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 256df2570feSBarry Smith void *ptr; 257*3ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 258df2570feSBarry Smith #endif 259df2570feSBarry Smith PetscObjectUseFortranCallback(snes, _cb.function, (SNES *, Vec *, Vec *, void *, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&snes, &x, &f, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr))); 260df2570feSBarry Smith } 261df2570feSBarry Smith 262df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 263df2570feSBarry Smith { 264df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 265df2570feSBarry Smith } 266df2570feSBarry Smith 267df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B, 268df2570feSBarry Smith PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 269df2570feSBarry Smith { 270df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 271df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 272df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 273df2570feSBarry Smith #endif 274df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx); 275df2570feSBarry Smith if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL); 276df2570feSBarry Smith } 2778e27ec22SSatish Balay 27819caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2798e27ec22SSatish Balay { 2808e27ec22SSatish Balay const char *tname; 2818e27ec22SSatish Balay 2828e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2838e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 284d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2858e27ec22SSatish Balay } 2868e27ec22SSatish Balay 28719caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2888e27ec22SSatish Balay { 2898e27ec22SSatish Balay const char *tname; 2908e27ec22SSatish Balay 2918e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2928e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2937c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2948e27ec22SSatish Balay } 295e3da1266SHong Zhang 2968e27ec22SSatish Balay /* 2978e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2988e27ec22SSatish Balay to transparently set these monitors from .F code 2998e27ec22SSatish Balay */ 3008e27ec22SSatish Balay 30119caf8f3SSatish Balay PETSC_EXTERN void snessetfunction_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 3028e27ec22SSatish Balay { 303aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 30489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 305aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 30689e00c7dSSatish Balay #endif 307aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 3088e27ec22SSatish Balay } 309c79ef259SPeter Brune 31019caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 311c79ef259SPeter Brune { 312aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 313aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 314c79ef259SPeter Brune } 31519caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 316dfef22ccSBarry Smith { 317aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 318aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 319dfef22ccSBarry Smith } 3208e27ec22SSatish Balay 3218e27ec22SSatish Balay /* the func argument is ignored */ 32219caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 3238e27ec22SSatish Balay { 3248e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 3250298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 326146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 3270298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 3288e27ec22SSatish Balay } 329c79ef259SPeter Brune 33019caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 331c79ef259SPeter Brune { 332be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 333c79ef259SPeter Brune } 334c79ef259SPeter Brune 33569c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 3363f149594SLisandro Dalcin { 3378d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 3383f149594SLisandro Dalcin } 3393f149594SLisandro Dalcin 340e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 3413f149594SLisandro Dalcin { 342e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 3433f149594SLisandro Dalcin } 3443f149594SLisandro Dalcin 34519caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 3468e27ec22SSatish Balay { 3473f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 3483f149594SLisandro Dalcin 3498d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3508d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 351e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 352e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3538e27ec22SSatish Balay } else { 354aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 355aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 356aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3578e27ec22SSatish Balay } 3588e27ec22SSatish Balay } 3598e27ec22SSatish Balay 36019caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3618e27ec22SSatish Balay { 3628e27ec22SSatish Balay PetscViewer v; 3638e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3648e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3658e27ec22SSatish Balay } 3668e27ec22SSatish Balay 3678e27ec22SSatish Balay /* func is currently ignored from Fortran */ 36819caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3698e27ec22SSatish Balay { 3708e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3718e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3728e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3730298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3740298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 375f2e0d3f1SJed Brown 3768e27ec22SSatish Balay } 3778e27ec22SSatish Balay 37819caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3798e27ec22SSatish Balay { 3800298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3818e27ec22SSatish Balay } 3828e27ec22SSatish Balay 38319caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3848e27ec22SSatish Balay { 3858e27ec22SSatish Balay char *t; 3868e27ec22SSatish Balay 3878e27ec22SSatish Balay FIXCHAR(type,len,t); 388d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3898e27ec22SSatish Balay FREECHAR(type,t); 3908e27ec22SSatish Balay } 3918e27ec22SSatish Balay 39219caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3938e27ec22SSatish Balay { 3948e27ec22SSatish Balay char *t; 3958e27ec22SSatish Balay 3968e27ec22SSatish Balay FIXCHAR(prefix,len,t); 397d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3988e27ec22SSatish Balay FREECHAR(prefix,t); 3998e27ec22SSatish Balay } 4008e27ec22SSatish Balay 40119caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 4028e27ec22SSatish Balay { 4038e27ec22SSatish Balay char *t; 4048e27ec22SSatish Balay 4058e27ec22SSatish Balay FIXCHAR(prefix,len,t); 406d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 4078e27ec22SSatish Balay FREECHAR(prefix,t); 4088e27ec22SSatish Balay } 4098e27ec22SSatish Balay 41052f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4118e27ec22SSatish Balay { 412410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 4138e27ec22SSatish Balay } 4148e27ec22SSatish Balay 41552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4168e27ec22SSatish Balay { 417410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 4188e27ec22SSatish Balay } 4198e27ec22SSatish Balay 42052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4218e27ec22SSatish Balay { 422410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 4238e27ec22SSatish Balay } 4248e27ec22SSatish Balay 42519caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 4268e27ec22SSatish Balay { 427aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 428a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 4291cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 430a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 4311cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 432a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 4331cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 4348e27ec22SSatish Balay } else { 435aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 436aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 437aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 4388e27ec22SSatish Balay } 4398e27ec22SSatish Balay } 4408e27ec22SSatish Balay 44119caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 442fe2efc57SMark { 443fe2efc57SMark char *t; 444fe2efc57SMark 445fe2efc57SMark FIXCHAR(type,len,t); 446b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 447fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 448fe2efc57SMark FREECHAR(type,t); 449fe2efc57SMark } 45091f3e32bSBarry Smith 45191f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 45291f3e32bSBarry Smith { 45391f3e32bSBarry Smith PetscViewer v; 45491f3e32bSBarry Smith PetscPatchDefaultViewers_Fortran(viewer,v); 45591f3e32bSBarry Smith *ierr = SNESConvergedReasonView(*snes,v); 45691f3e32bSBarry Smith } 457c4421ceaSFande Kong 458c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 459c4421ceaSFande Kong { 460c4421ceaSFande Kong const char *tstrreason; 461c4421ceaSFande Kong *ierr = SNESGetConvergedReasonString(*snes,&tstrreason); 462c4421ceaSFande Kong *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return; 463c4421ceaSFande Kong FIXRETURNCHAR(PETSC_TRUE,strreason,len); 464c4421ceaSFande Kong } 465