1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 48ad9143bSBarry Smith #include <petsc/private/f90impl.h> 58e27ec22SSatish Balay 68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 7df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 86ce558aeSBarry Smith #define snessolve_ SNESSOLVE 98d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 108d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 118e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 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 33c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 343b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 35fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 364e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 37df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 386ce558aeSBarry Smith #define snessolve_ snessolve 398d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 408d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 418e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 428e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 438e27ec22SSatish Balay #define snesgettype_ snesgettype 448e27ec22SSatish Balay #define snessetfunction_ snessetfunction 45be95d8f1SBarry Smith #define snessetngs_ snessetngs 46dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 478e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 48be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 498e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 508d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 51e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 528e27ec22SSatish Balay #define snesview_ snesview 538e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 548e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 558e27ec22SSatish Balay #define snessettype_ snessettype 568e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 578e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 584619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 59a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 60a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 61a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 62a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 63c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 643b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 65fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 668e27ec22SSatish Balay #endif 678e27ec22SSatish Balay 68f6291634SJed Brown static struct { 69f6291634SJed Brown PetscFortranCallbackId function; 70f6291634SJed Brown PetscFortranCallbackId test; 71f6291634SJed Brown PetscFortranCallbackId destroy; 72f6291634SJed Brown PetscFortranCallbackId jacobian; 73f6291634SJed Brown PetscFortranCallbackId monitor; 74f6291634SJed Brown PetscFortranCallbackId mondestroy; 75be95d8f1SBarry Smith PetscFortranCallbackId ngs; 76dfef22ccSBarry Smith PetscFortranCallbackId update; 77c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 787cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 7989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 8089e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 81c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 823c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 8389e00c7dSSatish Balay #endif 84f6291634SJed Brown } _cb; 8590b77ac2SPeter Brune 86c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx) 87c9368356SGlenn Hammond { 88c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 89c9368356SGlenn Hammond void* ptr; 90c9368356SGlenn Hammond PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr); 91c9368356SGlenn Hammond #endif 92c9368356SGlenn 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))); 93c9368356SGlenn Hammond } 94c9368356SGlenn Hammond 95*19caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 96c9368356SGlenn Hammond { 97c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 98c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 99c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 100c9368356SGlenn Hammond #endif 101c9368356SGlenn Hammond SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL); 102c9368356SGlenn Hammond } 103c9368356SGlenn Hammond 104c9368356SGlenn Hammond 105c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx) 1067cb011f5SBarry Smith { 1077cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1087cb011f5SBarry Smith void* ptr; 1093c2ee7eaSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr); 1107cb011f5SBarry Smith #endif 111c9368356SGlenn 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))); 1127cb011f5SBarry Smith } 1137cb011f5SBarry Smith 114*19caf8f3SSatish 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)) 1157cb011f5SBarry Smith { 1167cb011f5SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 1177cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1183c2ee7eaSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 1197cb011f5SBarry Smith #endif 1207cb011f5SBarry Smith SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 1217cb011f5SBarry Smith } 1227cb011f5SBarry Smith 1238e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 1248e27ec22SSatish Balay { 12589e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 12689e00c7dSSatish Balay void* ptr; 12789e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 12889e00c7dSSatish Balay #endif 12989e00c7dSSatish 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))); 1308e27ec22SSatish Balay } 131b8ebb45fSBarry Smith 13206ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1338e27ec22SSatish Balay { 134f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1357f7931b9SBarry Smith } 1367f7931b9SBarry Smith 1377f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1387f7931b9SBarry Smith { 139f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1408e27ec22SSatish Balay } 1418e27ec22SSatish Balay 142d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1438e27ec22SSatish Balay { 144d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1458e27ec22SSatish Balay } 146f6291634SJed Brown 147dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 148dfef22ccSBarry Smith { 149dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 150dfef22ccSBarry Smith } 151be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 15290b77ac2SPeter Brune { 153be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 15490b77ac2SPeter Brune } 1558e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1568e27ec22SSatish Balay { 157f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1588e27ec22SSatish Balay } 159c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1608e27ec22SSatish Balay { 161f6291634SJed Brown SNES snes = (SNES)*ctx; 162f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1638e27ec22SSatish Balay } 1648e27ec22SSatish Balay 1658e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1668e27ec22SSatish Balay /* 1678d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1688e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1698e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1708e27ec22SSatish Balay */ 171d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 172df66969eSBarry Smith { 173d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 174df66969eSBarry Smith } 175d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1768e27ec22SSatish Balay { 177d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1788e27ec22SSatish Balay } 179d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1808e27ec22SSatish Balay { 181d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1828e27ec22SSatish Balay } 1838e27ec22SSatish Balay 184*19caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 185*19caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 186f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1878e27ec22SSatish Balay { 188f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1898d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1908d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1918d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 192e025ade3SBarry Smith if (!ctx) { 193e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 194e025ade3SBarry Smith return; 195e025ade3SBarry Smith } 1968d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 197df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 198df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 1998e27ec22SSatish Balay } else { 200f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2010298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2028e27ec22SSatish Balay } 2038e27ec22SSatish Balay } 2048e27ec22SSatish Balay /* -------------------------------------------------------------*/ 2058e27ec22SSatish Balay 206*19caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2078e27ec22SSatish Balay { 2088e27ec22SSatish Balay const char *tname; 2098e27ec22SSatish Balay 2108e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2118e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 212d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2138e27ec22SSatish Balay } 2148e27ec22SSatish Balay 215*19caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2168e27ec22SSatish Balay { 2178e27ec22SSatish Balay const char *tname; 2188e27ec22SSatish Balay 2198e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2208e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2217c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2228e27ec22SSatish Balay } 223e3da1266SHong Zhang 2248e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2258e27ec22SSatish Balay 2268e27ec22SSatish Balay /* 2278e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2288e27ec22SSatish Balay to transparently set these monitors from .F code 2298e27ec22SSatish Balay */ 2308e27ec22SSatish Balay 231*19caf8f3SSatish 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)) 2328e27ec22SSatish Balay { 233aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 23489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 235aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 23689e00c7dSSatish Balay #endif 237aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2388e27ec22SSatish Balay } 239c79ef259SPeter Brune 240c79ef259SPeter Brune 241*19caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 242c79ef259SPeter Brune { 243aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 244aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 245c79ef259SPeter Brune } 246*19caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 247dfef22ccSBarry Smith { 248aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 249aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 250dfef22ccSBarry Smith } 2518e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2528e27ec22SSatish Balay 2538e27ec22SSatish Balay /* the func argument is ignored */ 254*19caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 2558e27ec22SSatish Balay { 2568e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2570298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 258146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 2590298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 2608e27ec22SSatish Balay } 261c79ef259SPeter Brune 262*19caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 263c79ef259SPeter Brune { 264be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 265c79ef259SPeter Brune } 266c79ef259SPeter Brune 2678e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2688e27ec22SSatish Balay 26969c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2703f149594SLisandro Dalcin { 2718d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 2723f149594SLisandro Dalcin } 2733f149594SLisandro Dalcin 274e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 2753f149594SLisandro Dalcin { 276e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 2773f149594SLisandro Dalcin } 2783f149594SLisandro Dalcin 279*19caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 2808e27ec22SSatish Balay { 2813f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2823f149594SLisandro Dalcin 2838d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 2848d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 285e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 286e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 2878e27ec22SSatish Balay } else { 288aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 289aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 290aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2918e27ec22SSatish Balay } 2928e27ec22SSatish Balay } 2938e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2948e27ec22SSatish Balay 295*19caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2968e27ec22SSatish Balay { 2978e27ec22SSatish Balay PetscViewer v; 2988e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2998e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3008e27ec22SSatish Balay } 3018e27ec22SSatish Balay 3028e27ec22SSatish Balay /* func is currently ignored from Fortran */ 303*19caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3048e27ec22SSatish Balay { 3058e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3068e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3078e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3080298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3090298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 310f2e0d3f1SJed Brown 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 313*19caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3148e27ec22SSatish Balay { 3150298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 318*19caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3198e27ec22SSatish Balay { 3208e27ec22SSatish Balay char *t; 3218e27ec22SSatish Balay 3228e27ec22SSatish Balay FIXCHAR(type,len,t); 323d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3248e27ec22SSatish Balay FREECHAR(type,t); 3258e27ec22SSatish Balay } 3268e27ec22SSatish Balay 327*19caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3288e27ec22SSatish Balay { 3298e27ec22SSatish Balay char *t; 3308e27ec22SSatish Balay 3318e27ec22SSatish Balay FIXCHAR(prefix,len,t); 332d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3338e27ec22SSatish Balay FREECHAR(prefix,t); 3348e27ec22SSatish Balay } 3358e27ec22SSatish Balay 336*19caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3378e27ec22SSatish Balay { 3388e27ec22SSatish Balay char *t; 3398e27ec22SSatish Balay 3408e27ec22SSatish Balay FIXCHAR(prefix,len,t); 341d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 3428e27ec22SSatish Balay FREECHAR(prefix,t); 3438e27ec22SSatish Balay } 3448e27ec22SSatish Balay 3458e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3468e27ec22SSatish Balay 3479611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3488e27ec22SSatish Balay { 3494619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3508e27ec22SSatish Balay } 3518e27ec22SSatish Balay 35252f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3538e27ec22SSatish Balay { 354410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 3558e27ec22SSatish Balay } 3568e27ec22SSatish Balay 35752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3588e27ec22SSatish Balay { 359410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 3608e27ec22SSatish Balay } 3618e27ec22SSatish Balay 36252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3638e27ec22SSatish Balay { 364410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 3658e27ec22SSatish Balay } 3668e27ec22SSatish Balay 3678e27ec22SSatish Balay 368*19caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3698e27ec22SSatish Balay { 370aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 371a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 3721cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 373a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 3741cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 375a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 3761cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 3774619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3783e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 3798e27ec22SSatish Balay } else { 380aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 381aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 382aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3838e27ec22SSatish Balay } 3848e27ec22SSatish Balay } 3858e27ec22SSatish Balay 386*19caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 387fe2efc57SMark { 388fe2efc57SMark char *t; 389fe2efc57SMark 390fe2efc57SMark FIXCHAR(type,len,t); 391fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 392fe2efc57SMark FREECHAR(type,t); 393fe2efc57SMark } 394