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) 7*91f3e32bSBarry 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 344619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 35a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 36a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 37c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 383b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 39fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 404e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 41*91f3e32bSBarry Smith #define snesconvergedreasonview_ snesconvergedreasonview 42df2570feSBarry Smith #define snessetpicard_ snessetpicard 43df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 446ce558aeSBarry Smith #define snessolve_ snessolve 458d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 468d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 478e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 4817a42bb7SSatish Balay #define snessetjacobian1_ snessetjacobian1 4917a42bb7SSatish Balay #define snessetjacobian2_ snessetjacobian2 508e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 518e27ec22SSatish Balay #define snesgettype_ snesgettype 528e27ec22SSatish Balay #define snessetfunction_ snessetfunction 53be95d8f1SBarry Smith #define snessetngs_ snessetngs 54dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 558e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 56be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 578e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 588d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 59e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 608e27ec22SSatish Balay #define snesview_ snesview 618e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 628e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 638e27ec22SSatish Balay #define snessettype_ snessettype 648e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 658e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 664619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 67a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 68a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 69a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 70a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 71c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 723b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 73fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 748e27ec22SSatish Balay #endif 758e27ec22SSatish Balay 76f6291634SJed Brown static struct { 77f6291634SJed Brown PetscFortranCallbackId function; 78f6291634SJed Brown PetscFortranCallbackId test; 79f6291634SJed Brown PetscFortranCallbackId destroy; 80f6291634SJed Brown PetscFortranCallbackId jacobian; 81f6291634SJed Brown PetscFortranCallbackId monitor; 82f6291634SJed Brown PetscFortranCallbackId mondestroy; 83be95d8f1SBarry Smith PetscFortranCallbackId ngs; 84dfef22ccSBarry Smith PetscFortranCallbackId update; 85c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 867cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 8789e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 8889e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 89c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 903c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 9189e00c7dSSatish Balay #endif 92f6291634SJed Brown } _cb; 9390b77ac2SPeter Brune 94c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx) 95c9368356SGlenn Hammond { 96c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 97c9368356SGlenn Hammond void* ptr; 98c9368356SGlenn Hammond PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr); 99c9368356SGlenn Hammond #endif 100c9368356SGlenn 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))); 101c9368356SGlenn Hammond } 102c9368356SGlenn Hammond 10319caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 104c9368356SGlenn Hammond { 105c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 106c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 107c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 108c9368356SGlenn Hammond #endif 109c9368356SGlenn Hammond SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL); 110c9368356SGlenn Hammond } 111c9368356SGlenn Hammond 112c9368356SGlenn Hammond 113c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx) 1147cb011f5SBarry Smith { 1157cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1167cb011f5SBarry Smith void* ptr; 1173c2ee7eaSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr); 1187cb011f5SBarry Smith #endif 119c9368356SGlenn 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))); 1207cb011f5SBarry Smith } 1217cb011f5SBarry Smith 12219caf8f3SSatish 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)) 1237cb011f5SBarry Smith { 1247cb011f5SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 1257cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1263c2ee7eaSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 1277cb011f5SBarry Smith #endif 1287cb011f5SBarry Smith SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 1297cb011f5SBarry Smith } 1307cb011f5SBarry Smith 1318e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 1328e27ec22SSatish Balay { 13389e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 13489e00c7dSSatish Balay void* ptr; 13589e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 13689e00c7dSSatish Balay #endif 13789e00c7dSSatish 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))); 1388e27ec22SSatish Balay } 139b8ebb45fSBarry Smith 14006ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1418e27ec22SSatish Balay { 142f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1437f7931b9SBarry Smith } 1447f7931b9SBarry Smith 1457f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1467f7931b9SBarry Smith { 147f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1488e27ec22SSatish Balay } 1498e27ec22SSatish Balay 150d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1518e27ec22SSatish Balay { 152d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1538e27ec22SSatish Balay } 154f6291634SJed Brown 155dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 156dfef22ccSBarry Smith { 157dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 158dfef22ccSBarry Smith } 159be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 16090b77ac2SPeter Brune { 161be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 16290b77ac2SPeter Brune } 1638e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1648e27ec22SSatish Balay { 165f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1668e27ec22SSatish Balay } 167c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1688e27ec22SSatish Balay { 169f6291634SJed Brown SNES snes = (SNES)*ctx; 170f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1718e27ec22SSatish Balay } 1728e27ec22SSatish Balay 1738e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1748e27ec22SSatish Balay /* 1758d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1768e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1778e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1788e27ec22SSatish Balay */ 179d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 180df66969eSBarry Smith { 181d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 182df66969eSBarry Smith } 183d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1848e27ec22SSatish Balay { 185d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1868e27ec22SSatish Balay } 187d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1888e27ec22SSatish Balay { 189d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1908e27ec22SSatish Balay } 1918e27ec22SSatish Balay 19219caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 19319caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 194f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1958e27ec22SSatish Balay { 196f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1978d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1988d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1998d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 200e025ade3SBarry Smith if (!ctx) { 201e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 202e025ade3SBarry Smith return; 203e025ade3SBarry Smith } 2048d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 205df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 206df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2078e27ec22SSatish Balay } else { 208f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2090298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2108e27ec22SSatish Balay } 2118e27ec22SSatish Balay } 21217a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 21317a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 21417a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 21517a42bb7SSatish Balay { 21617a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 21717a42bb7SSatish Balay } 21817a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 21917a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 22017a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 22117a42bb7SSatish Balay { 22217a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 22317a42bb7SSatish Balay } 2248e27ec22SSatish Balay /* -------------------------------------------------------------*/ 225df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx) 226df2570feSBarry Smith { 227df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 228df2570feSBarry Smith void* ptr; 229df2570feSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 230df2570feSBarry Smith #endif 231df2570feSBarry 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))); 232df2570feSBarry Smith } 233df2570feSBarry Smith 234df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 235df2570feSBarry Smith { 236df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 237df2570feSBarry Smith } 238df2570feSBarry Smith 239df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B, 240df2570feSBarry Smith PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 241df2570feSBarry Smith { 242df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 243df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 244df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 245df2570feSBarry Smith #endif 246df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx); 247df2570feSBarry Smith if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL); 248df2570feSBarry Smith } 249df2570feSBarry Smith /* -------------------------------------------------------------*/ 2508e27ec22SSatish Balay 25119caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2528e27ec22SSatish Balay { 2538e27ec22SSatish Balay const char *tname; 2548e27ec22SSatish Balay 2558e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2568e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 257d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2588e27ec22SSatish Balay } 2598e27ec22SSatish Balay 26019caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2618e27ec22SSatish Balay { 2628e27ec22SSatish Balay const char *tname; 2638e27ec22SSatish Balay 2648e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2658e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2667c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2678e27ec22SSatish Balay } 268e3da1266SHong Zhang 2698e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2708e27ec22SSatish Balay 2718e27ec22SSatish Balay /* 2728e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2738e27ec22SSatish Balay to transparently set these monitors from .F code 2748e27ec22SSatish Balay */ 2758e27ec22SSatish Balay 27619caf8f3SSatish 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)) 2778e27ec22SSatish Balay { 278aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 27989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 280aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 28189e00c7dSSatish Balay #endif 282aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2838e27ec22SSatish Balay } 284c79ef259SPeter Brune 285c79ef259SPeter Brune 28619caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 287c79ef259SPeter Brune { 288aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 289aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 290c79ef259SPeter Brune } 29119caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 292dfef22ccSBarry Smith { 293aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 294aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 295dfef22ccSBarry Smith } 2968e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2978e27ec22SSatish Balay 2988e27ec22SSatish Balay /* the func argument is ignored */ 29919caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 3008e27ec22SSatish Balay { 3018e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 3020298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 303146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 3040298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 3058e27ec22SSatish Balay } 306c79ef259SPeter Brune 30719caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 308c79ef259SPeter Brune { 309be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 310c79ef259SPeter Brune } 311c79ef259SPeter Brune 3128e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3138e27ec22SSatish Balay 31469c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 3153f149594SLisandro Dalcin { 3168d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 3173f149594SLisandro Dalcin } 3183f149594SLisandro Dalcin 319e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 3203f149594SLisandro Dalcin { 321e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 3223f149594SLisandro Dalcin } 3233f149594SLisandro Dalcin 32419caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 3258e27ec22SSatish Balay { 3263f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 3273f149594SLisandro Dalcin 3288d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3298d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 330e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 331e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3328e27ec22SSatish Balay } else { 333aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 334aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 335aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3368e27ec22SSatish Balay } 3378e27ec22SSatish Balay } 3388e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3398e27ec22SSatish Balay 34019caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3418e27ec22SSatish Balay { 3428e27ec22SSatish Balay PetscViewer v; 3438e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3448e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3458e27ec22SSatish Balay } 3468e27ec22SSatish Balay 3478e27ec22SSatish Balay /* func is currently ignored from Fortran */ 34819caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3498e27ec22SSatish Balay { 3508e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3518e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3528e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3530298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3540298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 355f2e0d3f1SJed Brown 3568e27ec22SSatish Balay } 3578e27ec22SSatish Balay 35819caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3598e27ec22SSatish Balay { 3600298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3618e27ec22SSatish Balay } 3628e27ec22SSatish Balay 36319caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3648e27ec22SSatish Balay { 3658e27ec22SSatish Balay char *t; 3668e27ec22SSatish Balay 3678e27ec22SSatish Balay FIXCHAR(type,len,t); 368d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3698e27ec22SSatish Balay FREECHAR(type,t); 3708e27ec22SSatish Balay } 3718e27ec22SSatish Balay 37219caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3738e27ec22SSatish Balay { 3748e27ec22SSatish Balay char *t; 3758e27ec22SSatish Balay 3768e27ec22SSatish Balay FIXCHAR(prefix,len,t); 377d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3788e27ec22SSatish Balay FREECHAR(prefix,t); 3798e27ec22SSatish Balay } 3808e27ec22SSatish Balay 38119caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3828e27ec22SSatish Balay { 3838e27ec22SSatish Balay char *t; 3848e27ec22SSatish Balay 3858e27ec22SSatish Balay FIXCHAR(prefix,len,t); 386d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 3878e27ec22SSatish Balay FREECHAR(prefix,t); 3888e27ec22SSatish Balay } 3898e27ec22SSatish Balay 3908e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3918e27ec22SSatish Balay 3929611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3938e27ec22SSatish Balay { 3944619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3958e27ec22SSatish Balay } 3968e27ec22SSatish Balay 39752f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3988e27ec22SSatish Balay { 399410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 4008e27ec22SSatish Balay } 4018e27ec22SSatish Balay 40252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4038e27ec22SSatish Balay { 404410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 4058e27ec22SSatish Balay } 4068e27ec22SSatish Balay 40752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4088e27ec22SSatish Balay { 409410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 4108e27ec22SSatish Balay } 4118e27ec22SSatish Balay 4128e27ec22SSatish Balay 41319caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 4148e27ec22SSatish Balay { 415aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 416a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 4171cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 418a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 4191cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 420a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 4211cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 4224619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 4233e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 4248e27ec22SSatish Balay } else { 425aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 426aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 427aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 4288e27ec22SSatish Balay } 4298e27ec22SSatish Balay } 4308e27ec22SSatish Balay 43119caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 432fe2efc57SMark { 433fe2efc57SMark char *t; 434fe2efc57SMark 435fe2efc57SMark FIXCHAR(type,len,t); 436fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 437fe2efc57SMark FREECHAR(type,t); 438fe2efc57SMark } 439*91f3e32bSBarry Smith 440*91f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 441*91f3e32bSBarry Smith { 442*91f3e32bSBarry Smith PetscViewer v; 443*91f3e32bSBarry Smith PetscPatchDefaultViewers_Fortran(viewer,v); 444*91f3e32bSBarry Smith *ierr = SNESConvergedReasonView(*snes,v); 445*91f3e32bSBarry Smith } 446