1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 38e27ec22SSatish Balay 48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 66ce558aeSBarry Smith #define snessolve_ SNESSOLVE 78e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 88e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 98e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 108e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 118e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 128e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 13c79ef259SPeter Brune #define snessetgs_ SNESSETGS 148e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 15c79ef259SPeter Brune #define snesgetgs_ SNESGETGS 168e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 173f149594SLisandro Dalcin #define snesdefaultconverged_ SNESDEFAULTCONVERGED 183f149594SLisandro Dalcin #define snesskipconverged_ SNESSKIPCONVERGED 198e27ec22SSatish Balay #define snesview_ SNESVIEW 208e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 218e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 228e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 238e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 248e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 25a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 26a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 274619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 28a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 29a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 30d20b5d95SPeter Brune #define snesgetsneslinesearch_ SNESGETSNESLINESEARCH 318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 32df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 336ce558aeSBarry Smith #define snessolve_ snessolve 348e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 358e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 368e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 378e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 388e27ec22SSatish Balay #define snesgettype_ snesgettype 398e27ec22SSatish Balay #define snessetfunction_ snessetfunction 40c79ef259SPeter Brune #define snessetgs_ snessetgs 418e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 42c79ef259SPeter Brune #define snesgetgs_ snesgetgs 438e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 443f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 453f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 468e27ec22SSatish Balay #define snesview_ snesview 478e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 488e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 498e27ec22SSatish Balay #define snessettype_ snessettype 508e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 518e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 524619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 53a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 54a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 55a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 56a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 573b229b18SJed Brown #define snesgetsneslinesearch_ snesgetsneslinesearch 588e27ec22SSatish Balay #endif 598e27ec22SSatish Balay 60*f6291634SJed Brown static struct { 61*f6291634SJed Brown PetscFortranCallbackId function; 62*f6291634SJed Brown PetscFortranCallbackId test; 63*f6291634SJed Brown PetscFortranCallbackId destroy; 64*f6291634SJed Brown PetscFortranCallbackId jacobian; 65*f6291634SJed Brown PetscFortranCallbackId monitor; 66*f6291634SJed Brown PetscFortranCallbackId mondestroy; 67*f6291634SJed Brown PetscFortranCallbackId gs; 68*f6291634SJed Brown } _cb; 6990b77ac2SPeter Brune 708e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 718e27ec22SSatish Balay { 72*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr)); 738e27ec22SSatish Balay return 0; 748e27ec22SSatish Balay } 75b8ebb45fSBarry Smith 7606ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 778e27ec22SSatish Balay { 78*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 797f7931b9SBarry Smith return 0; 807f7931b9SBarry Smith } 817f7931b9SBarry Smith 827f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx) 837f7931b9SBarry Smith { 84*f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 858e27ec22SSatish Balay return 0; 868e27ec22SSatish Balay } 878e27ec22SSatish Balay 888e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 898e27ec22SSatish Balay { 90*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),(&snes,&x,m,p,type,_ctx,&ierr)); 918e27ec22SSatish Balay return 0; 928e27ec22SSatish Balay } 93*f6291634SJed Brown 9490b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void*ctx) 9590b77ac2SPeter Brune { 96*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 9790b77ac2SPeter Brune return 0; 9890b77ac2SPeter Brune } 998e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 1008e27ec22SSatish Balay { 101*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1028e27ec22SSatish Balay return 0; 1038e27ec22SSatish Balay } 104c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx) 1058e27ec22SSatish Balay { 106*f6291634SJed Brown SNES snes = (SNES)*ctx; 107*f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1088e27ec22SSatish Balay return 0; 1098e27ec22SSatish Balay } 1108e27ec22SSatish Balay 1118e27ec22SSatish Balay EXTERN_C_BEGIN 1128e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1138e27ec22SSatish Balay /* 1148e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1158e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1168e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1178e27ec22SSatish Balay 1188e27ec22SSatish Balay functions, hence no STDCALL 1198e27ec22SSatish Balay */ 120df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 121df66969eSBarry Smith { 122df66969eSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx); 123df66969eSBarry Smith } 1248e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1258e27ec22SSatish Balay { 1268e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1278e27ec22SSatish Balay } 1288e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1298e27ec22SSatish Balay { 1308e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1318e27ec22SSatish Balay } 1328e27ec22SSatish Balay 1338e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1348e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1358e27ec22SSatish Balay { 1368e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 137f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 138f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1398e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 140f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1418e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 142df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 143df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 144f5b6597dSBarry Smith } else if (!func) { 145f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1468e27ec22SSatish Balay } else { 147*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 148*f6291634SJed Brown if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,PETSC_NULL); 1498e27ec22SSatish Balay } 1508e27ec22SSatish Balay } 1518e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1528e27ec22SSatish Balay 1536ce558aeSBarry Smith void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr ) 1546ce558aeSBarry Smith { 155a69afd8bSBarry Smith Vec B = *b,X = *x; 156c8d1aa3aSSatish Balay if (FORTRANNULLOBJECT(b)) B = PETSC_NULL; 157c8d1aa3aSSatish Balay if (FORTRANNULLOBJECT(x)) X = PETSC_NULL; 158a69afd8bSBarry Smith *__ierr = SNESSolve(*snes,B,X); 1596ce558aeSBarry Smith } 1606ce558aeSBarry Smith 161e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1628e27ec22SSatish Balay { 1638e27ec22SSatish Balay const char *tname; 1648e27ec22SSatish Balay 1658e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1668e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1678e27ec22SSatish Balay } 1688e27ec22SSatish Balay 1697f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1708e27ec22SSatish Balay { 1718e27ec22SSatish Balay const char *tname; 1728e27ec22SSatish Balay 1738e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1748e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1757c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1768e27ec22SSatish Balay } 177e3da1266SHong Zhang 1788e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1798e27ec22SSatish Balay 1808e27ec22SSatish Balay /* 1818e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1828e27ec22SSatish Balay to transparently set these monitors from .F code 1838e27ec22SSatish Balay 1848e27ec22SSatish Balay functions, hence no STDCALL 1858e27ec22SSatish Balay */ 1868e27ec22SSatish Balay 1872613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1888e27ec22SSatish Balay { 1898e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 190*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 191*f6291634SJed Brown if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,PETSC_NULL); 1928e27ec22SSatish Balay } 193c79ef259SPeter Brune 194c79ef259SPeter Brune 195c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 196c79ef259SPeter Brune { 197c79ef259SPeter Brune CHKFORTRANNULLOBJECT(ctx); 198*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx); 199*f6291634SJed Brown if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,PETSC_NULL); 200c79ef259SPeter Brune } 2018e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2028e27ec22SSatish Balay 2038e27ec22SSatish Balay /* the func argument is ignored */ 2048e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2058e27ec22SSatish Balay { 2068e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2078e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 208*f6291634SJed Brown *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,PETSC_NULL,ctx); 2098e27ec22SSatish Balay } 210c79ef259SPeter Brune 211c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 212c79ef259SPeter Brune { 213c79ef259SPeter Brune CHKFORTRANNULLINTEGER(ctx); 214*f6291634SJed Brown *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,PETSC_NULL,ctx); 215c79ef259SPeter Brune } 216c79ef259SPeter Brune 2178e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2188e27ec22SSatish Balay 2197f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2203f149594SLisandro Dalcin { 2213f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2223f149594SLisandro Dalcin } 2233f149594SLisandro Dalcin 2243f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2253f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2263f149594SLisandro Dalcin { 2273f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2283f149594SLisandro Dalcin } 2293f149594SLisandro Dalcin 2307f7931b9SBarry Smith void PETSC_STDCALL snessetconvergencetest_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (PETSC_STDCALL *destroy)(void*),PetscErrorCode *ierr) 2318e27ec22SSatish Balay { 2328e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2333f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2343f149594SLisandro Dalcin 2353f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){ 2367f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0); 2373f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){ 2387f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0); 2398e27ec22SSatish Balay } else { 240*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx); 241*f6291634SJed Brown if (*ierr) return; 2423f22127dSBarry Smith if (!destroy) { 2437f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL); 2447f7931b9SBarry Smith } else { 245*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx); 246*f6291634SJed Brown if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2477f7931b9SBarry Smith } 2488e27ec22SSatish Balay } 2498e27ec22SSatish Balay } 2508e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2518e27ec22SSatish Balay 2528e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2538e27ec22SSatish Balay { 2548e27ec22SSatish Balay PetscViewer v; 2558e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2568e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2578e27ec22SSatish Balay } 2588e27ec22SSatish Balay 2598e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2608e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2618e27ec22SSatish Balay { 2628e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2638e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2648e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2658e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2668e27ec22SSatish Balay } 2678e27ec22SSatish Balay 2688e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2698e27ec22SSatish Balay { 2708e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 2718e27ec22SSatish Balay } 2728e27ec22SSatish Balay 2737f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2748e27ec22SSatish Balay { 2758e27ec22SSatish Balay char *t; 2768e27ec22SSatish Balay 2778e27ec22SSatish Balay FIXCHAR(type,len,t); 2788e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2798e27ec22SSatish Balay FREECHAR(type,t); 2808e27ec22SSatish Balay } 2818e27ec22SSatish Balay 2827f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2838e27ec22SSatish Balay { 2848e27ec22SSatish Balay char *t; 2858e27ec22SSatish Balay 2868e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2878e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 2888e27ec22SSatish Balay FREECHAR(prefix,t); 2898e27ec22SSatish Balay } 2908e27ec22SSatish Balay 2917f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2928e27ec22SSatish Balay { 2938e27ec22SSatish Balay char *t; 2948e27ec22SSatish Balay 2958e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2968e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 2978e27ec22SSatish Balay FREECHAR(prefix,t); 2988e27ec22SSatish Balay } 2998e27ec22SSatish Balay 3008e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3018e27ec22SSatish Balay /* functions, hence no STDCALL */ 3028e27ec22SSatish Balay 3034619e776SBarry Smith void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3048e27ec22SSatish Balay { 3054619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3068e27ec22SSatish Balay } 3078e27ec22SSatish Balay 308a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3098e27ec22SSatish Balay { 310a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 313a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3148e27ec22SSatish Balay { 315a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 318a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3198e27ec22SSatish Balay { 320a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3218e27ec22SSatish Balay } 3228e27ec22SSatish Balay 3238e27ec22SSatish Balay 3246895c445SBarry Smith void PETSC_STDCALL snesmonitorset_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3258e27ec22SSatish Balay { 3268e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 327a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 328a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 329a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 330a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 331a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 332a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 3334619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3344619e776SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0); 3358e27ec22SSatish Balay } else { 336*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx); 337*f6291634SJed Brown if (*ierr) return; 3388e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 3397f7931b9SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL); 3408e27ec22SSatish Balay } else { 3415d4ebb51SBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 342*f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx); 343*f6291634SJed Brown if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3448e27ec22SSatish Balay } 3458e27ec22SSatish Balay } 3468e27ec22SSatish Balay } 3478e27ec22SSatish Balay 348f1c6b773SPeter Brune void PETSC_STDCALL snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr ){ 349f1c6b773SPeter Brune *__ierr = SNESGetSNESLineSearch(*snes, linesearch); 350ea5d4fccSPeter Brune } 3518e27ec22SSatish Balay 3528e27ec22SSatish Balay EXTERN_C_END 353