xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision c93683566a9f093a797b09ebeb4ca4f8a209c4a3)
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
33*c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
343b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
354e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
36df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
376ce558aeSBarry Smith #define snessolve_                       snessolve
388d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
398d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
408e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
418e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
428e27ec22SSatish Balay #define snesgettype_                     snesgettype
438e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
44be95d8f1SBarry Smith #define snessetngs_                       snessetngs
45dfef22ccSBarry Smith #define snessetupdate_                    snessetupdate
468e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
47be95d8f1SBarry Smith #define snesgetngs_                       snesgetngs
488e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
498d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
50e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
518e27ec22SSatish Balay #define snesview_                        snesview
528e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
538e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
548e27ec22SSatish Balay #define snessettype_                     snessettype
558e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
568e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
574619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
58a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
59a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
60a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
61a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
62*c9368356SGlenn Hammond #define snesnewtontrsetprecheck_        snesnewtontrsetprecheck
633b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
648e27ec22SSatish Balay #endif
658e27ec22SSatish Balay 
66f6291634SJed Brown static struct {
67f6291634SJed Brown   PetscFortranCallbackId function;
68f6291634SJed Brown   PetscFortranCallbackId test;
69f6291634SJed Brown   PetscFortranCallbackId destroy;
70f6291634SJed Brown   PetscFortranCallbackId jacobian;
71f6291634SJed Brown   PetscFortranCallbackId monitor;
72f6291634SJed Brown   PetscFortranCallbackId mondestroy;
73be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
74dfef22ccSBarry Smith   PetscFortranCallbackId update;
75*c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
767cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
7789e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
7889e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
79*c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
803c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
8189e00c7dSSatish Balay #endif
82f6291634SJed Brown } _cb;
8390b77ac2SPeter Brune 
84*c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
85*c9368356SGlenn Hammond {
86*c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
87*c9368356SGlenn Hammond   void* ptr;
88*c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
89*c9368356SGlenn Hammond #endif
90*c9368356SGlenn 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)));
91*c9368356SGlenn Hammond }
92*c9368356SGlenn Hammond 
93*c9368356SGlenn Hammond PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetprecheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
94*c9368356SGlenn Hammond {
95*c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
96*c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
97*c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
98*c9368356SGlenn Hammond #endif
99*c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
100*c9368356SGlenn Hammond }
101*c9368356SGlenn Hammond 
102*c9368356SGlenn Hammond 
103*c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1047cb011f5SBarry Smith {
1057cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1067cb011f5SBarry Smith   void* ptr;
1073c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1087cb011f5SBarry Smith #endif
109*c9368356SGlenn 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)));
1107cb011f5SBarry Smith }
1117cb011f5SBarry Smith 
112*c9368356SGlenn Hammond PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetpostcheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
1137cb011f5SBarry Smith {
1147cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1157cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1163c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1177cb011f5SBarry Smith #endif
1187cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1197cb011f5SBarry Smith }
1207cb011f5SBarry Smith 
1218e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1228e27ec22SSatish Balay {
12389e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
12489e00c7dSSatish Balay   void* ptr;
12589e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
12689e00c7dSSatish Balay #endif
12789e00c7dSSatish 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)));
1288e27ec22SSatish Balay }
129b8ebb45fSBarry Smith 
13006ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1318e27ec22SSatish Balay {
132f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1337f7931b9SBarry Smith }
1347f7931b9SBarry Smith 
1357f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1367f7931b9SBarry Smith {
137f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1388e27ec22SSatish Balay }
1398e27ec22SSatish Balay 
140d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1418e27ec22SSatish Balay {
142d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1438e27ec22SSatish Balay }
144f6291634SJed Brown 
145dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
146dfef22ccSBarry Smith {
147dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
148dfef22ccSBarry Smith }
149be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
15090b77ac2SPeter Brune {
151be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
15290b77ac2SPeter Brune }
1538e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1548e27ec22SSatish Balay {
155f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1568e27ec22SSatish Balay }
157c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1588e27ec22SSatish Balay {
159f6291634SJed Brown   SNES snes = (SNES)*ctx;
160f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1618e27ec22SSatish Balay }
1628e27ec22SSatish Balay 
1638e27ec22SSatish Balay /* ---------------------------------------------------------*/
1648e27ec22SSatish Balay /*
1658d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1668e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1678e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1688e27ec22SSatish Balay 
1698e27ec22SSatish Balay   functions, hence no STDCALL
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 
1848cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
185d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *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 
206390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(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 
215390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(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    functions, hence no STDCALL
2318e27ec22SSatish Balay */
2328e27ec22SSatish Balay 
23389e00c7dSSatish 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))
2348e27ec22SSatish Balay {
235aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
23689e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
237aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
23889e00c7dSSatish Balay #endif
239aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2408e27ec22SSatish Balay }
241c79ef259SPeter Brune 
242c79ef259SPeter Brune 
243be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
244c79ef259SPeter Brune {
245aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
246aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
247c79ef259SPeter Brune }
248dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
249dfef22ccSBarry Smith {
250aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
251aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
252dfef22ccSBarry Smith }
2538e27ec22SSatish Balay /* ---------------------------------------------------------*/
2548e27ec22SSatish Balay 
2558e27ec22SSatish Balay /* the func argument is ignored */
256146935d7SSatish Balay PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2578e27ec22SSatish Balay {
2588e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2590298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
260146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
2610298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2628e27ec22SSatish Balay }
263c79ef259SPeter Brune 
264be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
265c79ef259SPeter Brune {
266be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
267c79ef259SPeter Brune }
268c79ef259SPeter Brune 
2698e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2708e27ec22SSatish Balay 
27169c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2723f149594SLisandro Dalcin {
2738d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2743f149594SLisandro Dalcin }
2753f149594SLisandro Dalcin 
276e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2773f149594SLisandro Dalcin {
278e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2793f149594SLisandro Dalcin }
2803f149594SLisandro Dalcin 
2818cc058d9SJed 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)
2828e27ec22SSatish Balay {
2833f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2843f149594SLisandro Dalcin 
2858d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2868d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
287e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
288e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2898e27ec22SSatish Balay   } else {
290aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
291aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
292aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2938e27ec22SSatish Balay   }
2948e27ec22SSatish Balay }
2958e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2968e27ec22SSatish Balay 
2978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2988e27ec22SSatish Balay {
2998e27ec22SSatish Balay   PetscViewer v;
3008e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3018e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3028e27ec22SSatish Balay }
3038e27ec22SSatish Balay 
3048e27ec22SSatish Balay /*  func is currently ignored from Fortran */
3058cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3068e27ec22SSatish Balay {
3078e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3088e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3098e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3100298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3110298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
312f2e0d3f1SJed Brown 
3138e27ec22SSatish Balay }
3148e27ec22SSatish Balay 
3158cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3168e27ec22SSatish Balay {
3170298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3188e27ec22SSatish Balay }
3198e27ec22SSatish Balay 
320390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3218e27ec22SSatish Balay {
3228e27ec22SSatish Balay   char *t;
3238e27ec22SSatish Balay 
3248e27ec22SSatish Balay   FIXCHAR(type,len,t);
325d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3268e27ec22SSatish Balay   FREECHAR(type,t);
3278e27ec22SSatish Balay }
3288e27ec22SSatish Balay 
329390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3308e27ec22SSatish Balay {
3318e27ec22SSatish Balay   char *t;
3328e27ec22SSatish Balay 
3338e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
334d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3358e27ec22SSatish Balay   FREECHAR(prefix,t);
3368e27ec22SSatish Balay }
3378e27ec22SSatish Balay 
338390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3398e27ec22SSatish Balay {
3408e27ec22SSatish Balay   char *t;
3418e27ec22SSatish Balay 
3428e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
343d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3448e27ec22SSatish Balay   FREECHAR(prefix,t);
3458e27ec22SSatish Balay }
3468e27ec22SSatish Balay 
3478e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3488e27ec22SSatish Balay /* functions, hence no STDCALL */
3498e27ec22SSatish Balay 
3509611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3518e27ec22SSatish Balay {
3524619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3538e27ec22SSatish Balay }
3548e27ec22SSatish Balay 
35552f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3568e27ec22SSatish Balay {
357410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3588e27ec22SSatish Balay }
3598e27ec22SSatish Balay 
36052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3618e27ec22SSatish Balay {
362410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3638e27ec22SSatish Balay }
3648e27ec22SSatish Balay 
36552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3668e27ec22SSatish Balay {
367410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3688e27ec22SSatish Balay }
3698e27ec22SSatish Balay 
3708e27ec22SSatish Balay 
3718cc058d9SJed 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)
3728e27ec22SSatish Balay {
373aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
374a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3751cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
376a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3771cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
378a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3791cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3804619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3813e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3828e27ec22SSatish Balay   } else {
383aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
384aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
385aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3868e27ec22SSatish Balay   }
3878e27ec22SSatish Balay }
3888e27ec22SSatish Balay 
389