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