18e27ec22SSatish Balay #include "zpetsc.h" 28e27ec22SSatish Balay #include "petscsnes.h" 38e27ec22SSatish Balay 48e27ec22SSatish Balay #ifdef PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE 58e27ec22SSatish Balay #define snesconverged_tr_ snesconverged_tr__ 68e27ec22SSatish Balay #define snesconverged_ls_ snesconverged_ls__ 78e27ec22SSatish Balay #endif 88e27ec22SSatish Balay 98e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 108e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 118e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 128e27ec22SSatish Balay #define snesdacomputejacobian_ SNESDACOMPUTEJACOBIAN 138e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR 148e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 158e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 168e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 178e27ec22SSatish Balay #define snesdaformfunction_ SNESDAFORMFUNCTION 188e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 198e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 208e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 218e27ec22SSatish Balay #define snesconverged_tr_ SNESCONVERGED_TR 228e27ec22SSatish Balay #define snesconverged_ls_ SNESCONVERGED_LS 238e27ec22SSatish Balay #define snesview_ SNESVIEW 248e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 258e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 268e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 278e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 288e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 298e27ec22SSatish Balay #define snesdefaultmonitor_ SNESDEFAULTMONITOR 308e27ec22SSatish Balay #define snesvecviewmonitor_ SNESVECVIEWMONITOR 318e27ec22SSatish Balay #define sneslgmonitor_ SNESLGMONITOR 328e27ec22SSatish Balay #define snesvecviewupdatemonitor_ SNESVECVIEWUPDATEMONITOR 338e27ec22SSatish Balay #define snessetmonitor_ SNESSETMONITOR 348e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 358e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 368e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 378e27ec22SSatish Balay #define snesdacomputejacobian_ snesdacomputejacobian 388e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor 398e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 408e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 418e27ec22SSatish Balay #define snesgettype_ snesgettype 428e27ec22SSatish Balay #define snesdaformfunction_ snesdaformfunction 438e27ec22SSatish Balay #define snessetfunction_ snessetfunction 448e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 458e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 468e27ec22SSatish Balay #define snesconverged_tr_ snesconverged_tr 478e27ec22SSatish Balay #define snesconverged_ls_ snesconverged_ls 488e27ec22SSatish Balay #define snesview_ snesview 498e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 508e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 518e27ec22SSatish Balay #define snessettype_ snessettype 528e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 538e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 548e27ec22SSatish Balay #define sneslgmonitor_ sneslgmonitor 558e27ec22SSatish Balay #define snesdefaultmonitor_ snesdefaultmonitor 568e27ec22SSatish Balay #define snesvecviewmonitor_ snesvecviewmonitor 578e27ec22SSatish Balay #define snesvecviewupdatemonitor_ snesvecviewupdatemonitor 588e27ec22SSatish Balay #define snessetmonitor_ snessetmonitor 598e27ec22SSatish Balay #endif 608e27ec22SSatish Balay 618e27ec22SSatish Balay EXTERN_C_BEGIN 628e27ec22SSatish Balay static void (PETSC_STDCALL *f3)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 638e27ec22SSatish Balay static void (PETSC_STDCALL *f2)(SNES*,Vec*,Vec*,void*,PetscErrorCode*); 648e27ec22SSatish Balay static void (PETSC_STDCALL *f8)(SNES*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*); 658e27ec22SSatish Balay static void (PETSC_STDCALL *f7)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*); 668e27ec22SSatish Balay static void (PETSC_STDCALL *f71)(void*,PetscErrorCode*); 678e27ec22SSatish Balay EXTERN_C_END 688e27ec22SSatish Balay 698e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 708e27ec22SSatish Balay { 718e27ec22SSatish Balay PetscErrorCode ierr = 0; 728e27ec22SSatish Balay (*f2)(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr); 738e27ec22SSatish Balay return 0; 748e27ec22SSatish Balay } 758e27ec22SSatish Balay static PetscErrorCode oursnestest(SNES snes,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 768e27ec22SSatish Balay { 778e27ec22SSatish Balay PetscErrorCode ierr = 0; 788e27ec22SSatish Balay 798e27ec22SSatish Balay (*f8)(&snes,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr); 808e27ec22SSatish Balay return 0; 818e27ec22SSatish Balay } 828e27ec22SSatish Balay 838e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 848e27ec22SSatish Balay { 858e27ec22SSatish Balay PetscErrorCode ierr = 0; 868e27ec22SSatish Balay (*f3)(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr); 878e27ec22SSatish Balay return 0; 888e27ec22SSatish Balay } 898e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 908e27ec22SSatish Balay { 918e27ec22SSatish Balay PetscErrorCode ierr = 0; 928e27ec22SSatish Balay 938e27ec22SSatish Balay (*f7)(&snes,&i,&d,ctx,&ierr);CHKERRQ(ierr); 948e27ec22SSatish Balay return 0; 958e27ec22SSatish Balay } 968e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx) 978e27ec22SSatish Balay { 988e27ec22SSatish Balay PetscErrorCode ierr = 0; 998e27ec22SSatish Balay 1008e27ec22SSatish Balay (*f71)(ctx,&ierr);CHKERRQ(ierr); 1018e27ec22SSatish Balay return 0; 1028e27ec22SSatish Balay } 1038e27ec22SSatish Balay 1048e27ec22SSatish Balay EXTERN_C_BEGIN 1058e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1068e27ec22SSatish Balay /* 1078e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1088e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1098e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1108e27ec22SSatish Balay 1118e27ec22SSatish Balay functions, hence no STDCALL 1128e27ec22SSatish Balay */ 1138e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1148e27ec22SSatish Balay { 1158e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1168e27ec22SSatish Balay } 1178e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1188e27ec22SSatish Balay { 1198e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1208e27ec22SSatish Balay } 1218e27ec22SSatish Balay 1228e27ec22SSatish Balay void snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1238e27ec22SSatish Balay { 1248e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1258e27ec22SSatish Balay *ierr = 1; 1268e27ec22SSatish Balay } 1278e27ec22SSatish Balay 1288e27ec22SSatish Balay void snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1298e27ec22SSatish Balay { 1308e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1318e27ec22SSatish Balay *ierr = 1; 1328e27ec22SSatish Balay } 1338e27ec22SSatish Balay 1348e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1358e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1368e27ec22SSatish Balay { 1378e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 138*f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1398e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 140*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1418e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 142*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) { 1438e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx); 144*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) { 1458e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx); 1468e27ec22SSatish Balay } else { 1478e27ec22SSatish Balay f3 = func; 1488e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx); 1498e27ec22SSatish Balay } 1508e27ec22SSatish Balay } 1518e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1528e27ec22SSatish Balay 1538e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 1548e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 1558e27ec22SSatish Balay { 1568e27ec22SSatish Balay const char *tname; 1578e27ec22SSatish Balay 1588e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1598e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD) 1608e27ec22SSatish Balay { 1618e27ec22SSatish Balay char *t = _fcdtocp(prefix); int len1 = _fcdlen(prefix); 1628e27ec22SSatish Balay *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return; 1638e27ec22SSatish Balay } 1648e27ec22SSatish Balay #else 1658e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1668e27ec22SSatish Balay #endif 1678e27ec22SSatish Balay } 1688e27ec22SSatish Balay 1698e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), 1708e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 1718e27ec22SSatish Balay { 1728e27ec22SSatish Balay const char *tname; 1738e27ec22SSatish Balay 1748e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1758e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD) 1768e27ec22SSatish Balay { 1778e27ec22SSatish Balay char *t = _fcdtocp(name); int len1 = _fcdlen(name); 1788e27ec22SSatish Balay *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return; 1798e27ec22SSatish Balay } 1808e27ec22SSatish Balay #else 1818e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1828e27ec22SSatish Balay #endif 1838e27ec22SSatish Balay FIXRETURNCHAR(name,len); 1848e27ec22SSatish Balay } 1858e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1868e27ec22SSatish Balay 1878e27ec22SSatish Balay /* 1888e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1898e27ec22SSatish Balay to transparently set these monitors from .F code 1908e27ec22SSatish Balay 1918e27ec22SSatish Balay functions, hence no STDCALL 1928e27ec22SSatish Balay */ 1938e27ec22SSatish Balay void snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr) 1948e27ec22SSatish Balay { 1958e27ec22SSatish Balay *ierr = SNESDAFormFunction(*snes,*X,*F,ptr); 1968e27ec22SSatish Balay } 1978e27ec22SSatish Balay 1988e27ec22SSatish Balay void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), 1998e27ec22SSatish Balay void *ctx,PetscErrorCode *ierr) 2008e27ec22SSatish Balay { 2018e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 2028e27ec22SSatish Balay f2 = func; 203*f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 2048e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx); 2058e27ec22SSatish Balay } else { 2068e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx); 2078e27ec22SSatish Balay } 2088e27ec22SSatish Balay } 2098e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2108e27ec22SSatish Balay 2118e27ec22SSatish Balay /* the func argument is ignored */ 2128e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2138e27ec22SSatish Balay { 2148e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2158e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2168e27ec22SSatish Balay *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx); 2178e27ec22SSatish Balay } 2188e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2198e27ec22SSatish Balay 2208e27ec22SSatish Balay void snesconverged_tr_(SNES *snes,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2218e27ec22SSatish Balay void *ct,PetscErrorCode *ierr) 2228e27ec22SSatish Balay { 2238e27ec22SSatish Balay *ierr = SNESConverged_TR(*snes,*a,*b,*c,r,ct); 2248e27ec22SSatish Balay } 2258e27ec22SSatish Balay 2268e27ec22SSatish Balay void snesconverged_ls_(SNES *snes,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2278e27ec22SSatish Balay void *ct,PetscErrorCode *ierr) 2288e27ec22SSatish Balay { 2298e27ec22SSatish Balay *ierr = SNESConverged_LS(*snes,*a,*b,*c,r,ct); 2308e27ec22SSatish Balay } 2318e27ec22SSatish Balay 2328e27ec22SSatish Balay 2338e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes, 2348e27ec22SSatish Balay void (PETSC_STDCALL *func)(SNES*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), 2358e27ec22SSatish Balay void *cctx,PetscErrorCode *ierr) 2368e27ec22SSatish Balay { 2378e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 238*f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_ls_){ 2398e27ec22SSatish Balay *ierr = SNESSetConvergenceTest(*snes,SNESConverged_LS,0); 240*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_tr_){ 2418e27ec22SSatish Balay *ierr = SNESSetConvergenceTest(*snes,SNESConverged_TR,0); 2428e27ec22SSatish Balay } else { 2438e27ec22SSatish Balay f8 = func; 2448e27ec22SSatish Balay *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx); 2458e27ec22SSatish Balay } 2468e27ec22SSatish Balay } 2478e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2488e27ec22SSatish Balay 2498e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2508e27ec22SSatish Balay { 2518e27ec22SSatish Balay PetscViewer v; 2528e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2538e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2548e27ec22SSatish Balay } 2558e27ec22SSatish Balay 2568e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2578e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2588e27ec22SSatish Balay { 2598e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2608e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2618e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2628e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2638e27ec22SSatish Balay } 2648e27ec22SSatish Balay 2658e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2668e27ec22SSatish Balay { 2678e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 2688e27ec22SSatish Balay } 2698e27ec22SSatish Balay 2708e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len), 2718e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2728e27ec22SSatish Balay { 2738e27ec22SSatish Balay char *t; 2748e27ec22SSatish Balay 2758e27ec22SSatish Balay FIXCHAR(type,len,t); 2768e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2778e27ec22SSatish Balay FREECHAR(type,t); 2788e27ec22SSatish Balay } 2798e27ec22SSatish Balay 2808e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 2818e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2828e27ec22SSatish Balay { 2838e27ec22SSatish Balay char *t; 2848e27ec22SSatish Balay 2858e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2868e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 2878e27ec22SSatish Balay FREECHAR(prefix,t); 2888e27ec22SSatish Balay } 2898e27ec22SSatish Balay 2908e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 2918e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2928e27ec22SSatish Balay { 2938e27ec22SSatish Balay char *t; 2948e27ec22SSatish Balay 2958e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2968e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 2978e27ec22SSatish Balay FREECHAR(prefix,t); 2988e27ec22SSatish Balay } 2998e27ec22SSatish Balay 3008e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3018e27ec22SSatish Balay /* functions, hence no STDCALL */ 3028e27ec22SSatish Balay 3038e27ec22SSatish Balay void sneslgmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3048e27ec22SSatish Balay { 3058e27ec22SSatish Balay *ierr = SNESLGMonitor(*snes,*its,*fgnorm,dummy); 3068e27ec22SSatish Balay } 3078e27ec22SSatish Balay 3088e27ec22SSatish Balay void snesdefaultmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3098e27ec22SSatish Balay { 3108e27ec22SSatish Balay *ierr = SNESDefaultMonitor(*snes,*its,*fgnorm,dummy); 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 3138e27ec22SSatish Balay void snesvecviewmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3148e27ec22SSatish Balay { 3158e27ec22SSatish Balay *ierr = SNESVecViewMonitor(*snes,*its,*fgnorm,dummy); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 3188e27ec22SSatish Balay void snesvecviewupdatemonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3198e27ec22SSatish Balay { 3208e27ec22SSatish Balay *ierr = SNESVecViewUpdateMonitor(*snes,*its,*fgnorm,dummy); 3218e27ec22SSatish Balay } 3228e27ec22SSatish Balay 3238e27ec22SSatish Balay 3248e27ec22SSatish Balay void PETSC_STDCALL snessetmonitor_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*), 3258e27ec22SSatish Balay void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3268e27ec22SSatish Balay { 3278e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 328*f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultmonitor_) { 3298e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,SNESDefaultMonitor,0,0); 330*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesvecviewmonitor_) { 3318e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,SNESVecViewMonitor,0,0); 332*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesvecviewupdatemonitor_) { 3338e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,SNESVecViewUpdateMonitor,0,0); 334*f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)sneslgmonitor_) { 3358e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,SNESLGMonitor,0,0); 3368e27ec22SSatish Balay } else { 3378e27ec22SSatish Balay f7 = func; 3388e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 3398e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,0); 3408e27ec22SSatish Balay } else { 3418e27ec22SSatish Balay f71 = mondestroy; 3428e27ec22SSatish Balay *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,ourmondestroy); 3438e27ec22SSatish Balay } 3448e27ec22SSatish Balay } 3458e27ec22SSatish Balay } 3468e27ec22SSatish Balay 3478e27ec22SSatish Balay 3488e27ec22SSatish Balay 3498e27ec22SSatish Balay EXTERN_C_END 350