1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 48e27ec22SSatish Balay 58e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 76ce558aeSBarry Smith #define snessolve_ SNESSOLVE 88e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 98e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 108e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 118e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 128e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 138e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 14c79ef259SPeter Brune #define snessetgs_ SNESSETGS 158e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 16c79ef259SPeter Brune #define snesgetgs_ SNESGETGS 178e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 183f149594SLisandro Dalcin #define snesdefaultconverged_ SNESDEFAULTCONVERGED 193f149594SLisandro Dalcin #define snesskipconverged_ SNESSKIPCONVERGED 208e27ec22SSatish Balay #define snesview_ SNESVIEW 218e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 228e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 238e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 248e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 258e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 26a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 27a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 284619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 29a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 30a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 31d20b5d95SPeter Brune #define snesgetsneslinesearch_ SNESGETSNESLINESEARCH 328e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 33df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 346ce558aeSBarry Smith #define snessolve_ snessolve 358e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 368e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 378e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 388e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 398e27ec22SSatish Balay #define snesgettype_ snesgettype 408e27ec22SSatish Balay #define snessetfunction_ snessetfunction 41c79ef259SPeter Brune #define snessetgs_ snessetgs 428e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 43c79ef259SPeter Brune #define snesgetgs_ snesgetgs 448e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 453f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 463f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 478e27ec22SSatish Balay #define snesview_ snesview 488e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 498e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 508e27ec22SSatish Balay #define snessettype_ snessettype 518e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 528e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 534619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 54a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 55a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 56a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 57a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 583b229b18SJed Brown #define snesgetsneslinesearch_ snesgetsneslinesearch 598e27ec22SSatish Balay #endif 608e27ec22SSatish Balay 61f6291634SJed Brown static struct { 62f6291634SJed Brown PetscFortranCallbackId function; 63f6291634SJed Brown PetscFortranCallbackId test; 64f6291634SJed Brown PetscFortranCallbackId destroy; 65f6291634SJed Brown PetscFortranCallbackId jacobian; 66f6291634SJed Brown PetscFortranCallbackId monitor; 67f6291634SJed Brown PetscFortranCallbackId mondestroy; 68f6291634SJed Brown PetscFortranCallbackId gs; 69f6291634SJed Brown } _cb; 7090b77ac2SPeter Brune 71de64c4c2SJed Brown #undef __FUNCT__ 72de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction" 738e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 748e27ec22SSatish Balay { 75f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr)); 768e27ec22SSatish Balay return 0; 778e27ec22SSatish Balay } 78b8ebb45fSBarry Smith 79de64c4c2SJed Brown #undef __FUNCT__ 80de64c4c2SJed Brown #define __FUNCT__ "oursnestest" 8106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 828e27ec22SSatish Balay { 83f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 847f7931b9SBarry Smith return 0; 857f7931b9SBarry Smith } 867f7931b9SBarry Smith 87de64c4c2SJed Brown #undef __FUNCT__ 88de64c4c2SJed Brown #define __FUNCT__ "ourdestroy" 897f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 907f7931b9SBarry Smith { 91f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 928e27ec22SSatish Balay return 0; 938e27ec22SSatish Balay } 948e27ec22SSatish Balay 95de64c4c2SJed Brown #undef __FUNCT__ 96de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian" 978e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat *m,Mat *p,MatStructure *type,void *ctx) 988e27ec22SSatish Balay { 99f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),(&snes,&x,m,p,type,_ctx,&ierr)); 1008e27ec22SSatish Balay return 0; 1018e27ec22SSatish Balay } 102f6291634SJed Brown 103de64c4c2SJed Brown #undef __FUNCT__ 104de64c4c2SJed Brown #define __FUNCT__ "oursnesgs" 10590b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void *ctx) 10690b77ac2SPeter Brune { 107f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 10890b77ac2SPeter Brune return 0; 10990b77ac2SPeter Brune } 110de64c4c2SJed Brown #undef __FUNCT__ 111de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor" 1128e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1138e27ec22SSatish Balay { 114f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1158e27ec22SSatish Balay return 0; 1168e27ec22SSatish Balay } 117de64c4c2SJed Brown #undef __FUNCT__ 118de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy" 119c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1208e27ec22SSatish Balay { 121f6291634SJed Brown SNES snes = (SNES)*ctx; 122f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1238e27ec22SSatish Balay return 0; 1248e27ec22SSatish Balay } 1258e27ec22SSatish Balay 1268e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1278e27ec22SSatish Balay /* 1288e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1298e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1308e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1318e27ec22SSatish Balay 1328e27ec22SSatish Balay functions, hence no STDCALL 1338e27ec22SSatish Balay */ 134df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr) 135df66969eSBarry Smith { 136df66969eSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx); 137df66969eSBarry Smith } 1388e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr) 1398e27ec22SSatish Balay { 1408e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1418e27ec22SSatish Balay } 1428e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr) 1438e27ec22SSatish Balay { 1448e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1458e27ec22SSatish Balay } 1468e27ec22SSatish Balay 147*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B, 148f5af7f23SKarl Rupp void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*), 149f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1508e27ec22SSatish Balay { 1518e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 152f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 153f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1548e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 155f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1568e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 157df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 158df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 159f5b6597dSBarry Smith } else if (!func) { 160f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1618e27ec22SSatish Balay } else { 162f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 1630298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 1648e27ec22SSatish Balay } 1658e27ec22SSatish Balay } 1668e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1678e27ec22SSatish Balay 168*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr) 1696ce558aeSBarry Smith { 170a69afd8bSBarry Smith Vec B = *b,X = *x; 1710298fd71SBarry Smith if (FORTRANNULLOBJECT(b)) B = NULL; 1720298fd71SBarry Smith if (FORTRANNULLOBJECT(x)) X = NULL; 173a69afd8bSBarry Smith *__ierr = SNESSolve(*snes,B,X); 1746ce558aeSBarry Smith } 1756ce558aeSBarry Smith 176*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1778e27ec22SSatish Balay { 1788e27ec22SSatish Balay const char *tname; 1798e27ec22SSatish Balay 1808e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1818e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1828e27ec22SSatish Balay } 1838e27ec22SSatish Balay 184*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1858e27ec22SSatish Balay { 1868e27ec22SSatish Balay const char *tname; 1878e27ec22SSatish Balay 1888e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1898e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1907c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1918e27ec22SSatish Balay } 192e3da1266SHong Zhang 1938e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1948e27ec22SSatish Balay 1958e27ec22SSatish Balay /* 1968e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1978e27ec22SSatish Balay to transparently set these monitors from .F code 1988e27ec22SSatish Balay 1998e27ec22SSatish Balay functions, hence no STDCALL 2008e27ec22SSatish Balay */ 2018e27ec22SSatish Balay 202*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 2038e27ec22SSatish Balay { 2048e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 205f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 2060298fd71SBarry Smith if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2078e27ec22SSatish Balay } 208c79ef259SPeter Brune 209c79ef259SPeter Brune 210*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 211c79ef259SPeter Brune { 212c79ef259SPeter Brune CHKFORTRANNULLOBJECT(ctx); 213f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx); 2140298fd71SBarry Smith if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,NULL); 215c79ef259SPeter Brune } 2168e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2178e27ec22SSatish Balay 2188e27ec22SSatish Balay /* the func argument is ignored */ 219*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2208e27ec22SSatish Balay { 2218e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2228e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2230298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 2240298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 2258e27ec22SSatish Balay } 226c79ef259SPeter Brune 227*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 228c79ef259SPeter Brune { 229c79ef259SPeter Brune CHKFORTRANNULLINTEGER(ctx); 2300298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,NULL,ctx); 231c79ef259SPeter Brune } 232c79ef259SPeter Brune 2338e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2348e27ec22SSatish Balay 2357f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2363f149594SLisandro Dalcin { 2373f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2383f149594SLisandro Dalcin } 2393f149594SLisandro Dalcin 240f5af7f23SKarl Rupp void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 2413f149594SLisandro Dalcin { 2423f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2433f149594SLisandro Dalcin } 2443f149594SLisandro Dalcin 245*8cc058d9SJed Brown PETSC_EXTERN 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) 2468e27ec22SSatish Balay { 2478e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2483f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2493f149594SLisandro Dalcin 2503f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_) { 2517f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0); 2523f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_) { 2537f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0); 2548e27ec22SSatish Balay } else { 255f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx); 256f6291634SJed Brown if (*ierr) return; 2573f22127dSBarry Smith if (!destroy) { 2580298fd71SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL); 2597f7931b9SBarry Smith } else { 260f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx); 261f6291634SJed Brown if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2627f7931b9SBarry Smith } 2638e27ec22SSatish Balay } 2648e27ec22SSatish Balay } 2658e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2668e27ec22SSatish Balay 267*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2688e27ec22SSatish Balay { 2698e27ec22SSatish Balay PetscViewer v; 2708e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2718e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2728e27ec22SSatish Balay } 2738e27ec22SSatish Balay 2748e27ec22SSatish Balay /* func is currently ignored from Fortran */ 275*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2768e27ec22SSatish Balay { 2778e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2788e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2798e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2800298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 2810298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 282f2e0d3f1SJed Brown 2838e27ec22SSatish Balay } 2848e27ec22SSatish Balay 285*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2868e27ec22SSatish Balay { 2870298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 2888e27ec22SSatish Balay } 2898e27ec22SSatish Balay 290*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2918e27ec22SSatish Balay { 2928e27ec22SSatish Balay char *t; 2938e27ec22SSatish Balay 2948e27ec22SSatish Balay FIXCHAR(type,len,t); 2958e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2968e27ec22SSatish Balay FREECHAR(type,t); 2978e27ec22SSatish Balay } 2988e27ec22SSatish Balay 299*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3008e27ec22SSatish Balay { 3018e27ec22SSatish Balay char *t; 3028e27ec22SSatish Balay 3038e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3048e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 3058e27ec22SSatish Balay FREECHAR(prefix,t); 3068e27ec22SSatish Balay } 3078e27ec22SSatish Balay 308*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3098e27ec22SSatish Balay { 3108e27ec22SSatish Balay char *t; 3118e27ec22SSatish Balay 3128e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3138e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3148e27ec22SSatish Balay FREECHAR(prefix,t); 3158e27ec22SSatish Balay } 3168e27ec22SSatish Balay 3178e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3188e27ec22SSatish Balay /* functions, hence no STDCALL */ 3198e27ec22SSatish Balay 3204619e776SBarry Smith void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3218e27ec22SSatish Balay { 3224619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3238e27ec22SSatish Balay } 3248e27ec22SSatish Balay 325a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3268e27ec22SSatish Balay { 327a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3288e27ec22SSatish Balay } 3298e27ec22SSatish Balay 330a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3318e27ec22SSatish Balay { 332a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3338e27ec22SSatish Balay } 3348e27ec22SSatish Balay 335a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3368e27ec22SSatish Balay { 337a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3388e27ec22SSatish Balay } 3398e27ec22SSatish Balay 3408e27ec22SSatish Balay 341*8cc058d9SJed Brown PETSC_EXTERN 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) 3428e27ec22SSatish Balay { 3438e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 344a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 345a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 346a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 347a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 348a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 349a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 3504619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3514619e776SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0); 3528e27ec22SSatish Balay } else { 353f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx); 354f6291634SJed Brown if (*ierr) return; 3558e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)) { 3560298fd71SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL); 3578e27ec22SSatish Balay } else { 3585d4ebb51SBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 359f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx); 360f6291634SJed Brown if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3618e27ec22SSatish Balay } 3628e27ec22SSatish Balay } 3638e27ec22SSatish Balay } 3648e27ec22SSatish Balay 365*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr) 366a6dfd86eSKarl Rupp { 367f1c6b773SPeter Brune *__ierr = SNESGetSNESLineSearch(*snes, linesearch); 368ea5d4fccSPeter Brune } 3698e27ec22SSatish Balay 370