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) 7df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 86ce558aeSBarry Smith #define snessolve_ SNESSOLVE 98d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 108d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 118e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 12*17a42bb7SSatish Balay #define snessetjacobian1_ SNESSETJACOBIAN1 13*17a42bb7SSatish Balay #define snessetjacobian2_ SNESSETJACOBIAN2 148e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 158e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 168e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 17be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 18dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 198e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 20be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 218e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 228d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 23e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 248e27ec22SSatish Balay #define snesview_ SNESVIEW 258e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 268e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 278e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 288e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 298e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 30a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 31a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 324619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 33a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 34a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 35c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 363b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 37fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 384e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 39df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 406ce558aeSBarry Smith #define snessolve_ snessolve 418d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 428d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 438e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 44*17a42bb7SSatish Balay #define snessetjacobian1_ snessetjacobian1 45*17a42bb7SSatish Balay #define snessetjacobian2_ snessetjacobian2 468e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 478e27ec22SSatish Balay #define snesgettype_ snesgettype 488e27ec22SSatish Balay #define snessetfunction_ snessetfunction 49be95d8f1SBarry Smith #define snessetngs_ snessetngs 50dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 518e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 52be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 538e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 548d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 55e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 568e27ec22SSatish Balay #define snesview_ snesview 578e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 588e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 598e27ec22SSatish Balay #define snessettype_ snessettype 608e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 618e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 624619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 63a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 64a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 65a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 66a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 67c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 683b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 69fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 708e27ec22SSatish Balay #endif 718e27ec22SSatish Balay 72f6291634SJed Brown static struct { 73f6291634SJed Brown PetscFortranCallbackId function; 74f6291634SJed Brown PetscFortranCallbackId test; 75f6291634SJed Brown PetscFortranCallbackId destroy; 76f6291634SJed Brown PetscFortranCallbackId jacobian; 77f6291634SJed Brown PetscFortranCallbackId monitor; 78f6291634SJed Brown PetscFortranCallbackId mondestroy; 79be95d8f1SBarry Smith PetscFortranCallbackId ngs; 80dfef22ccSBarry Smith PetscFortranCallbackId update; 81c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 827cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 8389e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 8489e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 85c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 863c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 8789e00c7dSSatish Balay #endif 88f6291634SJed Brown } _cb; 8990b77ac2SPeter Brune 90c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx) 91c9368356SGlenn Hammond { 92c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 93c9368356SGlenn Hammond void* ptr; 94c9368356SGlenn Hammond PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr); 95c9368356SGlenn Hammond #endif 96c9368356SGlenn 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))); 97c9368356SGlenn Hammond } 98c9368356SGlenn Hammond 9919caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 100c9368356SGlenn Hammond { 101c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 102c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 103c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 104c9368356SGlenn Hammond #endif 105c9368356SGlenn Hammond SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL); 106c9368356SGlenn Hammond } 107c9368356SGlenn Hammond 108c9368356SGlenn Hammond 109c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx) 1107cb011f5SBarry Smith { 1117cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1127cb011f5SBarry Smith void* ptr; 1133c2ee7eaSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr); 1147cb011f5SBarry Smith #endif 115c9368356SGlenn 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))); 1167cb011f5SBarry Smith } 1177cb011f5SBarry Smith 11819caf8f3SSatish 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)) 1197cb011f5SBarry Smith { 1207cb011f5SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 1217cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1223c2ee7eaSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 1237cb011f5SBarry Smith #endif 1247cb011f5SBarry Smith SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 1257cb011f5SBarry Smith } 1267cb011f5SBarry Smith 1278e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 1288e27ec22SSatish Balay { 12989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 13089e00c7dSSatish Balay void* ptr; 13189e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 13289e00c7dSSatish Balay #endif 13389e00c7dSSatish 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))); 1348e27ec22SSatish Balay } 135b8ebb45fSBarry Smith 13606ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1378e27ec22SSatish Balay { 138f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1397f7931b9SBarry Smith } 1407f7931b9SBarry Smith 1417f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1427f7931b9SBarry Smith { 143f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1448e27ec22SSatish Balay } 1458e27ec22SSatish Balay 146d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1478e27ec22SSatish Balay { 148d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1498e27ec22SSatish Balay } 150f6291634SJed Brown 151dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 152dfef22ccSBarry Smith { 153dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 154dfef22ccSBarry Smith } 155be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 15690b77ac2SPeter Brune { 157be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 15890b77ac2SPeter Brune } 1598e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1608e27ec22SSatish Balay { 161f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1628e27ec22SSatish Balay } 163c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1648e27ec22SSatish Balay { 165f6291634SJed Brown SNES snes = (SNES)*ctx; 166f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1678e27ec22SSatish Balay } 1688e27ec22SSatish Balay 1698e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1708e27ec22SSatish Balay /* 1718d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1728e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1738e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1748e27ec22SSatish Balay */ 175d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 176df66969eSBarry Smith { 177d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 178df66969eSBarry Smith } 179d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1808e27ec22SSatish Balay { 181d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1828e27ec22SSatish Balay } 183d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1848e27ec22SSatish Balay { 185d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1868e27ec22SSatish Balay } 1878e27ec22SSatish Balay 18819caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 18919caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 190f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1918e27ec22SSatish Balay { 192f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1938d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1948d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1958d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 196e025ade3SBarry Smith if (!ctx) { 197e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 198e025ade3SBarry Smith return; 199e025ade3SBarry Smith } 2008d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 201df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 202df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2038e27ec22SSatish Balay } else { 204f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2050298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2068e27ec22SSatish Balay } 2078e27ec22SSatish Balay } 208*17a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 209*17a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 210*17a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 211*17a42bb7SSatish Balay { 212*17a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 213*17a42bb7SSatish Balay } 214*17a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 215*17a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 216*17a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 217*17a42bb7SSatish Balay { 218*17a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 219*17a42bb7SSatish Balay } 2208e27ec22SSatish Balay /* -------------------------------------------------------------*/ 2218e27ec22SSatish Balay 22219caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2238e27ec22SSatish Balay { 2248e27ec22SSatish Balay const char *tname; 2258e27ec22SSatish Balay 2268e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2278e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 228d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2298e27ec22SSatish Balay } 2308e27ec22SSatish Balay 23119caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2328e27ec22SSatish Balay { 2338e27ec22SSatish Balay const char *tname; 2348e27ec22SSatish Balay 2358e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2368e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2377c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2388e27ec22SSatish Balay } 239e3da1266SHong Zhang 2408e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2418e27ec22SSatish Balay 2428e27ec22SSatish Balay /* 2438e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2448e27ec22SSatish Balay to transparently set these monitors from .F code 2458e27ec22SSatish Balay */ 2468e27ec22SSatish Balay 24719caf8f3SSatish 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)) 2488e27ec22SSatish Balay { 249aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 25089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 251aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 25289e00c7dSSatish Balay #endif 253aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2548e27ec22SSatish Balay } 255c79ef259SPeter Brune 256c79ef259SPeter Brune 25719caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 258c79ef259SPeter Brune { 259aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 260aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 261c79ef259SPeter Brune } 26219caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 263dfef22ccSBarry Smith { 264aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 265aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 266dfef22ccSBarry Smith } 2678e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2688e27ec22SSatish Balay 2698e27ec22SSatish Balay /* the func argument is ignored */ 27019caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 2718e27ec22SSatish Balay { 2728e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2730298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 274146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 2750298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 2768e27ec22SSatish Balay } 277c79ef259SPeter Brune 27819caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 279c79ef259SPeter Brune { 280be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 281c79ef259SPeter Brune } 282c79ef259SPeter Brune 2838e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2848e27ec22SSatish Balay 28569c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2863f149594SLisandro Dalcin { 2878d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 2883f149594SLisandro Dalcin } 2893f149594SLisandro Dalcin 290e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 2913f149594SLisandro Dalcin { 292e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 2933f149594SLisandro Dalcin } 2943f149594SLisandro Dalcin 29519caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 2968e27ec22SSatish Balay { 2973f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2983f149594SLisandro Dalcin 2998d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3008d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 301e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 302e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3038e27ec22SSatish Balay } else { 304aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 305aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 306aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3078e27ec22SSatish Balay } 3088e27ec22SSatish Balay } 3098e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3108e27ec22SSatish Balay 31119caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3128e27ec22SSatish Balay { 3138e27ec22SSatish Balay PetscViewer v; 3148e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3158e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 3188e27ec22SSatish Balay /* func is currently ignored from Fortran */ 31919caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3208e27ec22SSatish Balay { 3218e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3228e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3238e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3240298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3250298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 326f2e0d3f1SJed Brown 3278e27ec22SSatish Balay } 3288e27ec22SSatish Balay 32919caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3308e27ec22SSatish Balay { 3310298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3328e27ec22SSatish Balay } 3338e27ec22SSatish Balay 33419caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3358e27ec22SSatish Balay { 3368e27ec22SSatish Balay char *t; 3378e27ec22SSatish Balay 3388e27ec22SSatish Balay FIXCHAR(type,len,t); 339d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3408e27ec22SSatish Balay FREECHAR(type,t); 3418e27ec22SSatish Balay } 3428e27ec22SSatish Balay 34319caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3448e27ec22SSatish Balay { 3458e27ec22SSatish Balay char *t; 3468e27ec22SSatish Balay 3478e27ec22SSatish Balay FIXCHAR(prefix,len,t); 348d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3498e27ec22SSatish Balay FREECHAR(prefix,t); 3508e27ec22SSatish Balay } 3518e27ec22SSatish Balay 35219caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3538e27ec22SSatish Balay { 3548e27ec22SSatish Balay char *t; 3558e27ec22SSatish Balay 3568e27ec22SSatish Balay FIXCHAR(prefix,len,t); 357d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 3588e27ec22SSatish Balay FREECHAR(prefix,t); 3598e27ec22SSatish Balay } 3608e27ec22SSatish Balay 3618e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3628e27ec22SSatish Balay 3639611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3648e27ec22SSatish Balay { 3654619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3668e27ec22SSatish Balay } 3678e27ec22SSatish Balay 36852f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3698e27ec22SSatish Balay { 370410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 3718e27ec22SSatish Balay } 3728e27ec22SSatish Balay 37352f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3748e27ec22SSatish Balay { 375410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 3768e27ec22SSatish Balay } 3778e27ec22SSatish Balay 37852f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3798e27ec22SSatish Balay { 380410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 3818e27ec22SSatish Balay } 3828e27ec22SSatish Balay 3838e27ec22SSatish Balay 38419caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3858e27ec22SSatish Balay { 386aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 387a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 3881cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 389a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 3901cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 391a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 3921cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 3934619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3943e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 3958e27ec22SSatish Balay } else { 396aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 397aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 398aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3998e27ec22SSatish Balay } 4008e27ec22SSatish Balay } 4018e27ec22SSatish Balay 40219caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 403fe2efc57SMark { 404fe2efc57SMark char *t; 405fe2efc57SMark 406fe2efc57SMark FIXCHAR(type,len,t); 407fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 408fe2efc57SMark FREECHAR(type,t); 409fe2efc57SMark } 410