xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 8e27ec22c2bf3ca2ab9510c404d8602b09c0b2df)
1*8e27ec22SSatish Balay #include "zpetsc.h"
2*8e27ec22SSatish Balay #include "petscsnes.h"
3*8e27ec22SSatish Balay 
4*8e27ec22SSatish Balay #ifdef PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE
5*8e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr__
6*8e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls__
7*8e27ec22SSatish Balay #endif
8*8e27ec22SSatish Balay 
9*8e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
10*8e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
11*8e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
12*8e27ec22SSatish Balay #define snesdacomputejacobian_           SNESDACOMPUTEJACOBIAN
13*8e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR
14*8e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
15*8e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
16*8e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
17*8e27ec22SSatish Balay #define snesdaformfunction_              SNESDAFORMFUNCTION
18*8e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
19*8e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
20*8e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
21*8e27ec22SSatish Balay #define snesconverged_tr_                SNESCONVERGED_TR
22*8e27ec22SSatish Balay #define snesconverged_ls_                SNESCONVERGED_LS
23*8e27ec22SSatish Balay #define snesview_                        SNESVIEW
24*8e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
25*8e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
26*8e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
27*8e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
28*8e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
29*8e27ec22SSatish Balay #define snesdefaultmonitor_              SNESDEFAULTMONITOR
30*8e27ec22SSatish Balay #define snesvecviewmonitor_              SNESVECVIEWMONITOR
31*8e27ec22SSatish Balay #define sneslgmonitor_                   SNESLGMONITOR
32*8e27ec22SSatish Balay #define snesvecviewupdatemonitor_        SNESVECVIEWUPDATEMONITOR
33*8e27ec22SSatish Balay #define snessetmonitor_                  SNESSETMONITOR
34*8e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
35*8e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
36*8e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
37*8e27ec22SSatish Balay #define snesdacomputejacobian_           snesdacomputejacobian
38*8e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor
39*8e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
40*8e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
41*8e27ec22SSatish Balay #define snesgettype_                     snesgettype
42*8e27ec22SSatish Balay #define snesdaformfunction_              snesdaformfunction
43*8e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
44*8e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
45*8e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
46*8e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr
47*8e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls
48*8e27ec22SSatish Balay #define snesview_                        snesview
49*8e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
50*8e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
51*8e27ec22SSatish Balay #define snessettype_                     snessettype
52*8e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
53*8e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
54*8e27ec22SSatish Balay #define sneslgmonitor_                   sneslgmonitor
55*8e27ec22SSatish Balay #define snesdefaultmonitor_              snesdefaultmonitor
56*8e27ec22SSatish Balay #define snesvecviewmonitor_              snesvecviewmonitor
57*8e27ec22SSatish Balay #define snesvecviewupdatemonitor_        snesvecviewupdatemonitor
58*8e27ec22SSatish Balay #define snessetmonitor_                  snessetmonitor
59*8e27ec22SSatish Balay #endif
60*8e27ec22SSatish Balay 
61*8e27ec22SSatish Balay EXTERN_C_BEGIN
62*8e27ec22SSatish Balay static void (PETSC_STDCALL *f3)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*);
63*8e27ec22SSatish Balay static void (PETSC_STDCALL *f2)(SNES*,Vec*,Vec*,void*,PetscErrorCode*);
64*8e27ec22SSatish Balay static void (PETSC_STDCALL *f8)(SNES*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*);
65*8e27ec22SSatish Balay static void (PETSC_STDCALL *f7)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*);
66*8e27ec22SSatish Balay static void (PETSC_STDCALL *f71)(void*,PetscErrorCode*);
67*8e27ec22SSatish Balay EXTERN_C_END
68*8e27ec22SSatish Balay 
69*8e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
70*8e27ec22SSatish Balay {
71*8e27ec22SSatish Balay   PetscErrorCode ierr = 0;
72*8e27ec22SSatish Balay   (*f2)(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
73*8e27ec22SSatish Balay   return 0;
74*8e27ec22SSatish Balay }
75*8e27ec22SSatish Balay static PetscErrorCode oursnestest(SNES snes,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
76*8e27ec22SSatish Balay {
77*8e27ec22SSatish Balay   PetscErrorCode ierr = 0;
78*8e27ec22SSatish Balay 
79*8e27ec22SSatish Balay   (*f8)(&snes,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr);
80*8e27ec22SSatish Balay   return 0;
81*8e27ec22SSatish Balay }
82*8e27ec22SSatish Balay 
83*8e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
84*8e27ec22SSatish Balay {
85*8e27ec22SSatish Balay   PetscErrorCode ierr = 0;
86*8e27ec22SSatish Balay   (*f3)(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr);
87*8e27ec22SSatish Balay   return 0;
88*8e27ec22SSatish Balay }
89*8e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
90*8e27ec22SSatish Balay {
91*8e27ec22SSatish Balay   PetscErrorCode ierr = 0;
92*8e27ec22SSatish Balay 
93*8e27ec22SSatish Balay   (*f7)(&snes,&i,&d,ctx,&ierr);CHKERRQ(ierr);
94*8e27ec22SSatish Balay   return 0;
95*8e27ec22SSatish Balay }
96*8e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx)
97*8e27ec22SSatish Balay {
98*8e27ec22SSatish Balay   PetscErrorCode ierr = 0;
99*8e27ec22SSatish Balay 
100*8e27ec22SSatish Balay   (*f71)(ctx,&ierr);CHKERRQ(ierr);
101*8e27ec22SSatish Balay   return 0;
102*8e27ec22SSatish Balay }
103*8e27ec22SSatish Balay 
104*8e27ec22SSatish Balay EXTERN_C_BEGIN
105*8e27ec22SSatish Balay /* ---------------------------------------------------------*/
106*8e27ec22SSatish Balay /*
107*8e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
108*8e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
109*8e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
110*8e27ec22SSatish Balay 
111*8e27ec22SSatish Balay   functions, hence no STDCALL
112*8e27ec22SSatish Balay */
113*8e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
114*8e27ec22SSatish Balay {
115*8e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
116*8e27ec22SSatish Balay }
117*8e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
118*8e27ec22SSatish Balay {
119*8e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
120*8e27ec22SSatish Balay }
121*8e27ec22SSatish Balay 
122*8e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
123*8e27ec22SSatish Balay {
124*8e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
125*8e27ec22SSatish Balay   *ierr = 1;
126*8e27ec22SSatish Balay }
127*8e27ec22SSatish Balay 
128*8e27ec22SSatish Balay void  snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
129*8e27ec22SSatish Balay {
130*8e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
131*8e27ec22SSatish Balay   *ierr = 1;
132*8e27ec22SSatish Balay }
133*8e27ec22SSatish Balay 
134*8e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
135*8e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
136*8e27ec22SSatish Balay {
137*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
138*8e27ec22SSatish Balay   if ((FCNVOID)func == (FCNVOID)snesdefaultcomputejacobian_) {
139*8e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
140*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesdefaultcomputejacobiancolor_) {
141*8e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
142*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesdacomputejacobianwithadifor_) {
143*8e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
144*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesdacomputejacobian_) {
145*8e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
146*8e27ec22SSatish Balay   } else {
147*8e27ec22SSatish Balay     f3 = func;
148*8e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
149*8e27ec22SSatish Balay   }
150*8e27ec22SSatish Balay }
151*8e27ec22SSatish Balay /* -------------------------------------------------------------*/
152*8e27ec22SSatish Balay 
153*8e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
154*8e27ec22SSatish Balay                                          PetscErrorCode *ierr PETSC_END_LEN(len))
155*8e27ec22SSatish Balay {
156*8e27ec22SSatish Balay   const char *tname;
157*8e27ec22SSatish Balay 
158*8e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
159*8e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
160*8e27ec22SSatish Balay   {
161*8e27ec22SSatish Balay     char *t = _fcdtocp(prefix); int len1 = _fcdlen(prefix);
162*8e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
163*8e27ec22SSatish Balay   }
164*8e27ec22SSatish Balay #else
165*8e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
166*8e27ec22SSatish Balay #endif
167*8e27ec22SSatish Balay }
168*8e27ec22SSatish Balay 
169*8e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len),
170*8e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
171*8e27ec22SSatish Balay {
172*8e27ec22SSatish Balay   const char *tname;
173*8e27ec22SSatish Balay 
174*8e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
175*8e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
176*8e27ec22SSatish Balay   {
177*8e27ec22SSatish Balay     char *t = _fcdtocp(name); int len1 = _fcdlen(name);
178*8e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
179*8e27ec22SSatish Balay   }
180*8e27ec22SSatish Balay #else
181*8e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
182*8e27ec22SSatish Balay #endif
183*8e27ec22SSatish Balay   FIXRETURNCHAR(name,len);
184*8e27ec22SSatish Balay }
185*8e27ec22SSatish Balay /* ---------------------------------------------------------*/
186*8e27ec22SSatish Balay 
187*8e27ec22SSatish Balay /*
188*8e27ec22SSatish Balay         These are not usually called from Fortran but allow Fortran users
189*8e27ec22SSatish Balay    to transparently set these monitors from .F code
190*8e27ec22SSatish Balay 
191*8e27ec22SSatish Balay    functions, hence no STDCALL
192*8e27ec22SSatish Balay */
193*8e27ec22SSatish Balay void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
194*8e27ec22SSatish Balay {
195*8e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
196*8e27ec22SSatish Balay }
197*8e27ec22SSatish Balay 
198*8e27ec22SSatish Balay void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),
199*8e27ec22SSatish Balay                       void *ctx,PetscErrorCode *ierr)
200*8e27ec22SSatish Balay {
201*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
202*8e27ec22SSatish Balay   f2 = func;
203*8e27ec22SSatish Balay   if ((FCNVOID)func == (FCNVOID)snesdaformfunction_) {
204*8e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
205*8e27ec22SSatish Balay   } else {
206*8e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
207*8e27ec22SSatish Balay   }
208*8e27ec22SSatish Balay }
209*8e27ec22SSatish Balay /* ---------------------------------------------------------*/
210*8e27ec22SSatish Balay 
211*8e27ec22SSatish Balay /* the func argument is ignored */
212*8e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
213*8e27ec22SSatish Balay {
214*8e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
215*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
216*8e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
217*8e27ec22SSatish Balay }
218*8e27ec22SSatish Balay /*----------------------------------------------------------------------*/
219*8e27ec22SSatish Balay 
220*8e27ec22SSatish Balay void snesconverged_tr_(SNES *snes,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
221*8e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
222*8e27ec22SSatish Balay {
223*8e27ec22SSatish Balay   *ierr = SNESConverged_TR(*snes,*a,*b,*c,r,ct);
224*8e27ec22SSatish Balay }
225*8e27ec22SSatish Balay 
226*8e27ec22SSatish Balay void snesconverged_ls_(SNES *snes,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
227*8e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
228*8e27ec22SSatish Balay {
229*8e27ec22SSatish Balay   *ierr = SNESConverged_LS(*snes,*a,*b,*c,r,ct);
230*8e27ec22SSatish Balay }
231*8e27ec22SSatish Balay 
232*8e27ec22SSatish Balay 
233*8e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes,
234*8e27ec22SSatish Balay        void (PETSC_STDCALL *func)(SNES*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),
235*8e27ec22SSatish Balay        void *cctx,PetscErrorCode *ierr)
236*8e27ec22SSatish Balay {
237*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
238*8e27ec22SSatish Balay   if ((FCNVOID)func == (FCNVOID)snesconverged_ls_){
239*8e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_LS,0);
240*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesconverged_tr_){
241*8e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_TR,0);
242*8e27ec22SSatish Balay   } else {
243*8e27ec22SSatish Balay     f8 = func;
244*8e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx);
245*8e27ec22SSatish Balay   }
246*8e27ec22SSatish Balay }
247*8e27ec22SSatish Balay /*----------------------------------------------------------------------*/
248*8e27ec22SSatish Balay 
249*8e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
250*8e27ec22SSatish Balay {
251*8e27ec22SSatish Balay   PetscViewer v;
252*8e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
253*8e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
254*8e27ec22SSatish Balay }
255*8e27ec22SSatish Balay 
256*8e27ec22SSatish Balay /*  func is currently ignored from Fortran */
257*8e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
258*8e27ec22SSatish Balay {
259*8e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
260*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
261*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
262*8e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
263*8e27ec22SSatish Balay }
264*8e27ec22SSatish Balay 
265*8e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
266*8e27ec22SSatish Balay {
267*8e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
268*8e27ec22SSatish Balay }
269*8e27ec22SSatish Balay 
270*8e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),
271*8e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
272*8e27ec22SSatish Balay {
273*8e27ec22SSatish Balay   char *t;
274*8e27ec22SSatish Balay 
275*8e27ec22SSatish Balay   FIXCHAR(type,len,t);
276*8e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
277*8e27ec22SSatish Balay   FREECHAR(type,t);
278*8e27ec22SSatish Balay }
279*8e27ec22SSatish Balay 
280*8e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
281*8e27ec22SSatish Balay                                             PetscErrorCode *ierr PETSC_END_LEN(len))
282*8e27ec22SSatish Balay {
283*8e27ec22SSatish Balay   char *t;
284*8e27ec22SSatish Balay 
285*8e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
286*8e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
287*8e27ec22SSatish Balay   FREECHAR(prefix,t);
288*8e27ec22SSatish Balay }
289*8e27ec22SSatish Balay 
290*8e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
291*8e27ec22SSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
292*8e27ec22SSatish Balay {
293*8e27ec22SSatish Balay   char *t;
294*8e27ec22SSatish Balay 
295*8e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
296*8e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
297*8e27ec22SSatish Balay   FREECHAR(prefix,t);
298*8e27ec22SSatish Balay }
299*8e27ec22SSatish Balay 
300*8e27ec22SSatish Balay /*----------------------------------------------------------------------*/
301*8e27ec22SSatish Balay /* functions, hence no STDCALL */
302*8e27ec22SSatish Balay 
303*8e27ec22SSatish Balay void sneslgmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
304*8e27ec22SSatish Balay {
305*8e27ec22SSatish Balay   *ierr = SNESLGMonitor(*snes,*its,*fgnorm,dummy);
306*8e27ec22SSatish Balay }
307*8e27ec22SSatish Balay 
308*8e27ec22SSatish Balay void snesdefaultmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
309*8e27ec22SSatish Balay {
310*8e27ec22SSatish Balay   *ierr = SNESDefaultMonitor(*snes,*its,*fgnorm,dummy);
311*8e27ec22SSatish Balay }
312*8e27ec22SSatish Balay 
313*8e27ec22SSatish Balay void snesvecviewmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
314*8e27ec22SSatish Balay {
315*8e27ec22SSatish Balay   *ierr = SNESVecViewMonitor(*snes,*its,*fgnorm,dummy);
316*8e27ec22SSatish Balay }
317*8e27ec22SSatish Balay 
318*8e27ec22SSatish Balay void snesvecviewupdatemonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
319*8e27ec22SSatish Balay {
320*8e27ec22SSatish Balay   *ierr = SNESVecViewUpdateMonitor(*snes,*its,*fgnorm,dummy);
321*8e27ec22SSatish Balay }
322*8e27ec22SSatish Balay 
323*8e27ec22SSatish Balay 
324*8e27ec22SSatish Balay void PETSC_STDCALL snessetmonitor_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),
325*8e27ec22SSatish Balay                     void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
326*8e27ec22SSatish Balay {
327*8e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
328*8e27ec22SSatish Balay   if ((FCNVOID)func == (FCNVOID)snesdefaultmonitor_) {
329*8e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESDefaultMonitor,0,0);
330*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesvecviewmonitor_) {
331*8e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESVecViewMonitor,0,0);
332*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)snesvecviewupdatemonitor_) {
333*8e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESVecViewUpdateMonitor,0,0);
334*8e27ec22SSatish Balay   } else if ((FCNVOID)func == (FCNVOID)sneslgmonitor_) {
335*8e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESLGMonitor,0,0);
336*8e27ec22SSatish Balay   } else {
337*8e27ec22SSatish Balay     f7 = func;
338*8e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
339*8e27ec22SSatish Balay       *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,0);
340*8e27ec22SSatish Balay     } else {
341*8e27ec22SSatish Balay       f71 = mondestroy;
342*8e27ec22SSatish Balay       *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,ourmondestroy);
343*8e27ec22SSatish Balay     }
344*8e27ec22SSatish Balay   }
345*8e27ec22SSatish Balay }
346*8e27ec22SSatish Balay 
347*8e27ec22SSatish Balay 
348*8e27ec22SSatish Balay 
349*8e27ec22SSatish Balay EXTERN_C_END
350