1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 489e00c7dSSatish Balay #include <../src/sys/f90-src/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 128e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 138e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 148e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 15be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 16dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 178e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 18be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 198e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 208d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 21e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 228e27ec22SSatish Balay #define snesview_ SNESVIEW 238e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 248e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 258e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 268e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 278e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 28a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 29a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 304619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 31a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 32a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 338e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 34df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 356ce558aeSBarry Smith #define snessolve_ snessolve 368d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 378d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 388e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 398e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 408e27ec22SSatish Balay #define snesgettype_ snesgettype 418e27ec22SSatish Balay #define snessetfunction_ snessetfunction 42be95d8f1SBarry Smith #define snessetngs_ snessetngs 43dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 448e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 45be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 468e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 478d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 48e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 498e27ec22SSatish Balay #define snesview_ snesview 508e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 518e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 528e27ec22SSatish Balay #define snessettype_ snessettype 538e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 548e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 554619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 56a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 57a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 58a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 59a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 608e27ec22SSatish Balay #endif 618e27ec22SSatish Balay 62f6291634SJed Brown static struct { 63f6291634SJed Brown PetscFortranCallbackId function; 64f6291634SJed Brown PetscFortranCallbackId test; 65f6291634SJed Brown PetscFortranCallbackId destroy; 66f6291634SJed Brown PetscFortranCallbackId jacobian; 67f6291634SJed Brown PetscFortranCallbackId monitor; 68f6291634SJed Brown PetscFortranCallbackId mondestroy; 69be95d8f1SBarry Smith PetscFortranCallbackId ngs; 70dfef22ccSBarry Smith PetscFortranCallbackId update; 7189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 7289e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 7389e00c7dSSatish Balay #endif 74f6291634SJed Brown } _cb; 7590b77ac2SPeter Brune 76de64c4c2SJed Brown #undef __FUNCT__ 77de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction" 788e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 798e27ec22SSatish Balay { 8089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 8189e00c7dSSatish Balay void* ptr; 8289e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 8389e00c7dSSatish Balay #endif 8489e00c7dSSatish 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))); 858e27ec22SSatish Balay } 86b8ebb45fSBarry Smith 87de64c4c2SJed Brown #undef __FUNCT__ 88de64c4c2SJed Brown #define __FUNCT__ "oursnestest" 8906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 908e27ec22SSatish Balay { 91f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 927f7931b9SBarry Smith } 937f7931b9SBarry Smith 94de64c4c2SJed Brown #undef __FUNCT__ 95de64c4c2SJed Brown #define __FUNCT__ "ourdestroy" 967f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 977f7931b9SBarry Smith { 98f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 998e27ec22SSatish Balay } 1008e27ec22SSatish Balay 101de64c4c2SJed Brown #undef __FUNCT__ 102de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian" 103d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1048e27ec22SSatish Balay { 105d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1068e27ec22SSatish Balay } 107f6291634SJed Brown 108de64c4c2SJed Brown #undef __FUNCT__ 109dfef22ccSBarry Smith #define __FUNCT__ "oursnesupdate" 110dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 111dfef22ccSBarry Smith { 112dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 113dfef22ccSBarry Smith } 114dfef22ccSBarry Smith #undef __FUNCT__ 115be95d8f1SBarry Smith #define __FUNCT__ "oursnesngs" 116be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 11790b77ac2SPeter Brune { 118be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 11990b77ac2SPeter Brune } 120de64c4c2SJed Brown #undef __FUNCT__ 121de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor" 1228e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1238e27ec22SSatish Balay { 124f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1258e27ec22SSatish Balay } 126de64c4c2SJed Brown #undef __FUNCT__ 127de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy" 128c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1298e27ec22SSatish Balay { 130f6291634SJed Brown SNES snes = (SNES)*ctx; 131f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1328e27ec22SSatish Balay } 1338e27ec22SSatish Balay 1348e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1358e27ec22SSatish Balay /* 1368d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1378e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1388e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1398e27ec22SSatish Balay 1408e27ec22SSatish Balay functions, hence no STDCALL 1418e27ec22SSatish Balay */ 142d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 143df66969eSBarry Smith { 144d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 145df66969eSBarry Smith } 146d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1478e27ec22SSatish Balay { 148d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1498e27ec22SSatish Balay } 150d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1518e27ec22SSatish Balay { 152d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1538e27ec22SSatish Balay } 1548e27ec22SSatish Balay 1558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B, 156d1e9a80fSBarry Smith void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 157f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1588e27ec22SSatish Balay { 1598e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 160f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1618d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1628d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1638d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 164*e025ade3SBarry Smith if (!ctx) { 165*e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 166*e025ade3SBarry Smith return; 167*e025ade3SBarry Smith } 1688d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 169df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 170df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 171f5b6597dSBarry Smith } else if (!func) { 172f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1738e27ec22SSatish Balay } else { 174f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 1750298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 1768e27ec22SSatish Balay } 1778e27ec22SSatish Balay } 1788e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1798e27ec22SSatish Balay 1808cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr) 1816ce558aeSBarry Smith { 182a69afd8bSBarry Smith Vec B = *b,X = *x; 1830298fd71SBarry Smith if (FORTRANNULLOBJECT(b)) B = NULL; 1840298fd71SBarry Smith if (FORTRANNULLOBJECT(x)) X = NULL; 185a69afd8bSBarry Smith *__ierr = SNESSolve(*snes,B,X); 1866ce558aeSBarry Smith } 1876ce558aeSBarry Smith 1888cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1898e27ec22SSatish Balay { 1908e27ec22SSatish Balay const char *tname; 1918e27ec22SSatish Balay 1928e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1938e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1948e27ec22SSatish Balay } 1958e27ec22SSatish Balay 1968cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1978e27ec22SSatish Balay { 1988e27ec22SSatish Balay const char *tname; 1998e27ec22SSatish Balay 2008e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2018e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2027c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2038e27ec22SSatish Balay } 204e3da1266SHong Zhang 2058e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2068e27ec22SSatish Balay 2078e27ec22SSatish Balay /* 2088e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2098e27ec22SSatish Balay to transparently set these monitors from .F code 2108e27ec22SSatish Balay 2118e27ec22SSatish Balay functions, hence no STDCALL 2128e27ec22SSatish Balay */ 2138e27ec22SSatish Balay 21489e00c7dSSatish Balay PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 2158e27ec22SSatish Balay { 2168e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 217f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 21889e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 21989e00c7dSSatish Balay *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,PETSC_NULL,ptr); 22089e00c7dSSatish Balay #endif 2210298fd71SBarry Smith if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2228e27ec22SSatish Balay } 223c79ef259SPeter Brune 224c79ef259SPeter Brune 225be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 226c79ef259SPeter Brune { 227c79ef259SPeter Brune CHKFORTRANNULLOBJECT(ctx); 228be95d8f1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx); 229be95d8f1SBarry Smith if (!*ierr) *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 230c79ef259SPeter Brune } 231dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 232dfef22ccSBarry Smith { 233dfef22ccSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL); 234dfef22ccSBarry Smith if (!*ierr) *ierr = SNESSetUpdate(*snes,oursnesupdate); 235dfef22ccSBarry Smith } 2368e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2378e27ec22SSatish Balay 2388e27ec22SSatish Balay /* the func argument is ignored */ 2398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2408e27ec22SSatish Balay { 2418e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2428e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2430298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 2440298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 2458e27ec22SSatish Balay } 246c79ef259SPeter Brune 247be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 248c79ef259SPeter Brune { 249c79ef259SPeter Brune CHKFORTRANNULLINTEGER(ctx); 250be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 251c79ef259SPeter Brune } 252c79ef259SPeter Brune 2538e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2548e27ec22SSatish Balay 25569c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2563f149594SLisandro Dalcin { 2578d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 2583f149594SLisandro Dalcin } 2593f149594SLisandro Dalcin 260e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 2613f149594SLisandro Dalcin { 262e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 2633f149594SLisandro Dalcin } 2643f149594SLisandro Dalcin 2658cc058d9SJed 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) 2668e27ec22SSatish Balay { 2678e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2683f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2693f149594SLisandro Dalcin 2708d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 2718d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 272e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 273e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 2748e27ec22SSatish Balay } else { 275f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx); 276f6291634SJed Brown if (*ierr) return; 2773f22127dSBarry Smith if (!destroy) { 2780298fd71SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL); 2797f7931b9SBarry Smith } else { 280f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx); 281f6291634SJed Brown if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2827f7931b9SBarry Smith } 2838e27ec22SSatish Balay } 2848e27ec22SSatish Balay } 2858e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2868e27ec22SSatish Balay 2878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2888e27ec22SSatish Balay { 2898e27ec22SSatish Balay PetscViewer v; 2908e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2918e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2928e27ec22SSatish Balay } 2938e27ec22SSatish Balay 2948e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2958cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2968e27ec22SSatish Balay { 2978e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2988e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2998e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3000298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3010298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 302f2e0d3f1SJed Brown 3038e27ec22SSatish Balay } 3048e27ec22SSatish Balay 3058cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3068e27ec22SSatish Balay { 3070298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3088e27ec22SSatish Balay } 3098e27ec22SSatish Balay 3108cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3118e27ec22SSatish Balay { 3128e27ec22SSatish Balay char *t; 3138e27ec22SSatish Balay 3148e27ec22SSatish Balay FIXCHAR(type,len,t); 3158e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 3168e27ec22SSatish Balay FREECHAR(type,t); 3178e27ec22SSatish Balay } 3188e27ec22SSatish Balay 3198cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3208e27ec22SSatish Balay { 3218e27ec22SSatish Balay char *t; 3228e27ec22SSatish Balay 3238e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3248e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 3258e27ec22SSatish Balay FREECHAR(prefix,t); 3268e27ec22SSatish Balay } 3278e27ec22SSatish Balay 3288cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3298e27ec22SSatish Balay { 3308e27ec22SSatish Balay char *t; 3318e27ec22SSatish Balay 3328e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3338e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3348e27ec22SSatish Balay FREECHAR(prefix,t); 3358e27ec22SSatish Balay } 3368e27ec22SSatish Balay 3378e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3388e27ec22SSatish Balay /* functions, hence no STDCALL */ 3398e27ec22SSatish Balay 3409611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3418e27ec22SSatish Balay { 3424619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3438e27ec22SSatish Balay } 3448e27ec22SSatish Balay 34552f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3468e27ec22SSatish Balay { 347410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 3488e27ec22SSatish Balay } 3498e27ec22SSatish Balay 35052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3518e27ec22SSatish Balay { 352410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 3538e27ec22SSatish Balay } 3548e27ec22SSatish Balay 35552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3568e27ec22SSatish Balay { 357410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 3588e27ec22SSatish Balay } 3598e27ec22SSatish Balay 3608e27ec22SSatish Balay 3618cc058d9SJed 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) 3628e27ec22SSatish Balay { 3638e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 364a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 3651cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 366a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 3671cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 368a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 3691cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 3704619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3713e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 3728e27ec22SSatish Balay } else { 373f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx); 374f6291634SJed Brown if (*ierr) return; 3758e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)) { 3760298fd71SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL); 3778e27ec22SSatish Balay } else { 3785d4ebb51SBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 379f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx); 380f6291634SJed Brown if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3818e27ec22SSatish Balay } 3828e27ec22SSatish Balay } 3838e27ec22SSatish Balay } 3848e27ec22SSatish Balay 385