1*7c363081SBarry Smith #include "private/zpetsc.h" 28e27ec22SSatish Balay #include "petscsnes.h" 38e27ec22SSatish Balay 48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 56ce558aeSBarry Smith #define snessolve_ SNESSOLVE 68e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 78e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 88e27ec22SSatish Balay #define snesdacomputejacobian_ SNESDACOMPUTEJACOBIAN 98e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR 108e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 118e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 128e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 138e27ec22SSatish Balay #define snesdaformfunction_ SNESDAFORMFUNCTION 148e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 158e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 168e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 173f149594SLisandro Dalcin #define snesdefaultconverged_ SNESDEFAULTCONVERGED 183f149594SLisandro Dalcin #define snesskipconverged_ SNESSKIPCONVERGED 198e27ec22SSatish Balay #define snesview_ SNESVIEW 208e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 218e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 228e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 238e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 248e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 25a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 26a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 27a6570f20SBarry Smith #define snesmonitorlg_ SNESMONITORLG 28a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 29a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 308e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 316ce558aeSBarry Smith #define snessolve_ snessolve 328e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 338e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 348e27ec22SSatish Balay #define snesdacomputejacobian_ snesdacomputejacobian 358e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor 368e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 378e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 388e27ec22SSatish Balay #define snesgettype_ snesgettype 398e27ec22SSatish Balay #define snesdaformfunction_ snesdaformfunction 408e27ec22SSatish Balay #define snessetfunction_ snessetfunction 418e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 428e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 433f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 443f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 458e27ec22SSatish Balay #define snesview_ snesview 468e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 478e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 488e27ec22SSatish Balay #define snessettype_ snessettype 498e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 508e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 51a6570f20SBarry Smith #define snesmonitorlg_ snesmonitorlg 52a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 53a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 54a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 55a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 568e27ec22SSatish Balay #endif 578e27ec22SSatish Balay 588e27ec22SSatish Balay EXTERN_C_BEGIN 598e27ec22SSatish Balay static void (PETSC_STDCALL *f3)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 608e27ec22SSatish Balay static void (PETSC_STDCALL *f2)(SNES*,Vec*,Vec*,void*,PetscErrorCode*); 6106ee9f85SBarry Smith static void (PETSC_STDCALL *f8)(SNES*,PetscInt *,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*); 628e27ec22SSatish Balay static void (PETSC_STDCALL *f7)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*); 638e27ec22SSatish Balay static void (PETSC_STDCALL *f71)(void*,PetscErrorCode*); 648e27ec22SSatish Balay EXTERN_C_END 658e27ec22SSatish Balay 668e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 678e27ec22SSatish Balay { 688e27ec22SSatish Balay PetscErrorCode ierr = 0; 698e27ec22SSatish Balay (*f2)(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr); 708e27ec22SSatish Balay return 0; 718e27ec22SSatish Balay } 7206ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 738e27ec22SSatish Balay { 748e27ec22SSatish Balay PetscErrorCode ierr = 0; 758e27ec22SSatish Balay 7606ee9f85SBarry Smith (*f8)(&snes,&it,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr); 778e27ec22SSatish Balay return 0; 788e27ec22SSatish Balay } 798e27ec22SSatish Balay 808e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 818e27ec22SSatish Balay { 828e27ec22SSatish Balay PetscErrorCode ierr = 0; 838e27ec22SSatish Balay (*f3)(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr); 848e27ec22SSatish Balay return 0; 858e27ec22SSatish Balay } 868e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 878e27ec22SSatish Balay { 888e27ec22SSatish Balay PetscErrorCode ierr = 0; 898e27ec22SSatish Balay 908e27ec22SSatish Balay (*f7)(&snes,&i,&d,ctx,&ierr);CHKERRQ(ierr); 918e27ec22SSatish Balay return 0; 928e27ec22SSatish Balay } 938e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx) 948e27ec22SSatish Balay { 958e27ec22SSatish Balay PetscErrorCode ierr = 0; 968e27ec22SSatish Balay 978e27ec22SSatish Balay (*f71)(ctx,&ierr);CHKERRQ(ierr); 988e27ec22SSatish Balay return 0; 998e27ec22SSatish Balay } 1008e27ec22SSatish Balay 1018e27ec22SSatish Balay EXTERN_C_BEGIN 1028e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1038e27ec22SSatish Balay /* 1048e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1058e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1068e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1078e27ec22SSatish Balay 1088e27ec22SSatish Balay functions, hence no STDCALL 1098e27ec22SSatish Balay */ 1108e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1118e27ec22SSatish Balay { 1128e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1138e27ec22SSatish Balay } 1148e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1158e27ec22SSatish Balay { 1168e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1178e27ec22SSatish Balay } 1188e27ec22SSatish Balay 1198e27ec22SSatish Balay void snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1208e27ec22SSatish Balay { 1218e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1228e27ec22SSatish Balay *ierr = 1; 1238e27ec22SSatish Balay } 1248e27ec22SSatish Balay 1258e27ec22SSatish Balay void snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1268e27ec22SSatish Balay { 1278e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1288e27ec22SSatish Balay *ierr = 1; 1298e27ec22SSatish Balay } 1308e27ec22SSatish Balay 1318e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1328e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1338e27ec22SSatish Balay { 1348e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 135f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1368e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 137f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1388e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 139f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) { 1408e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx); 141f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) { 1428e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx); 1438e27ec22SSatish Balay } else { 1448e27ec22SSatish Balay f3 = func; 1458e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx); 1468e27ec22SSatish Balay } 1478e27ec22SSatish Balay } 1488e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1498e27ec22SSatish Balay 1506ce558aeSBarry Smith void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr ) 1516ce558aeSBarry Smith { 1526ce558aeSBarry Smith Vec B = *b; 1536ce558aeSBarry Smith if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL; 1546ce558aeSBarry Smith *__ierr = SNESSolve(*snes,B,*x); 1556ce558aeSBarry Smith } 1566ce558aeSBarry Smith 1578e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 1588e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 1598e27ec22SSatish Balay { 1608e27ec22SSatish Balay const char *tname; 1618e27ec22SSatish Balay 1628e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1638e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD) 1648e27ec22SSatish Balay { 1658e27ec22SSatish Balay char *t = _fcdtocp(prefix); int len1 = _fcdlen(prefix); 1668e27ec22SSatish Balay *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return; 1678e27ec22SSatish Balay } 1688e27ec22SSatish Balay #else 1698e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1708e27ec22SSatish Balay #endif 1718e27ec22SSatish Balay } 1728e27ec22SSatish Balay 1738e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), 1748e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 1758e27ec22SSatish Balay { 1768e27ec22SSatish Balay const char *tname; 1778e27ec22SSatish Balay 1788e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1798e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD) 1808e27ec22SSatish Balay { 1818e27ec22SSatish Balay char *t = _fcdtocp(name); int len1 = _fcdlen(name); 1828e27ec22SSatish Balay *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return; 1838e27ec22SSatish Balay } 1848e27ec22SSatish Balay #else 1858e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1868e27ec22SSatish Balay #endif 187*7c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1888e27ec22SSatish Balay } 1898e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1908e27ec22SSatish Balay 1918e27ec22SSatish Balay /* 1928e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1938e27ec22SSatish Balay to transparently set these monitors from .F code 1948e27ec22SSatish Balay 1958e27ec22SSatish Balay functions, hence no STDCALL 1968e27ec22SSatish Balay */ 1978e27ec22SSatish Balay void snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr) 1988e27ec22SSatish Balay { 1998e27ec22SSatish Balay *ierr = SNESDAFormFunction(*snes,*X,*F,ptr); 2008e27ec22SSatish Balay } 2018e27ec22SSatish Balay 2028e27ec22SSatish Balay void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), 2038e27ec22SSatish Balay void *ctx,PetscErrorCode *ierr) 2048e27ec22SSatish Balay { 2058e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 2068e27ec22SSatish Balay f2 = func; 207f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 2088e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx); 2098e27ec22SSatish Balay } else { 2108e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx); 2118e27ec22SSatish Balay } 2128e27ec22SSatish Balay } 2138e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2148e27ec22SSatish Balay 2158e27ec22SSatish Balay /* the func argument is ignored */ 2168e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2178e27ec22SSatish Balay { 2188e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2198e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2208e27ec22SSatish Balay *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx); 2218e27ec22SSatish Balay } 2228e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2238e27ec22SSatish Balay 2243f149594SLisandro Dalcin void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2253f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2263f149594SLisandro Dalcin { 2273f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2283f149594SLisandro Dalcin } 2293f149594SLisandro Dalcin 2303f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2313f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2323f149594SLisandro Dalcin { 2333f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2343f149594SLisandro Dalcin } 2353f149594SLisandro Dalcin 2368e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes, 23706ee9f85SBarry Smith void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), 2388e27ec22SSatish Balay void *cctx,PetscErrorCode *ierr) 2398e27ec22SSatish Balay { 2408e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2413f149594SLisandro Dalcin 2423f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){ 2433f149594SLisandro Dalcin *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0); 2443f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){ 2453f149594SLisandro Dalcin *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0); 2468e27ec22SSatish Balay } else { 2478e27ec22SSatish Balay f8 = func; 2488e27ec22SSatish Balay *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx); 2498e27ec22SSatish Balay } 2508e27ec22SSatish Balay } 2518e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2528e27ec22SSatish Balay 2538e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2548e27ec22SSatish Balay { 2558e27ec22SSatish Balay PetscViewer v; 2568e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2578e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2588e27ec22SSatish Balay } 2598e27ec22SSatish Balay 2608e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2618e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2628e27ec22SSatish Balay { 2638e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2648e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2658e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2668e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2678e27ec22SSatish Balay } 2688e27ec22SSatish Balay 2698e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2708e27ec22SSatish Balay { 2718e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 2728e27ec22SSatish Balay } 2738e27ec22SSatish Balay 2748e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len), 2758e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2768e27ec22SSatish Balay { 2778e27ec22SSatish Balay char *t; 2788e27ec22SSatish Balay 2798e27ec22SSatish Balay FIXCHAR(type,len,t); 2808e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2818e27ec22SSatish Balay FREECHAR(type,t); 2828e27ec22SSatish Balay } 2838e27ec22SSatish Balay 2848e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 2858e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2868e27ec22SSatish Balay { 2878e27ec22SSatish Balay char *t; 2888e27ec22SSatish Balay 2898e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2908e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 2918e27ec22SSatish Balay FREECHAR(prefix,t); 2928e27ec22SSatish Balay } 2938e27ec22SSatish Balay 2948e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len), 2958e27ec22SSatish Balay PetscErrorCode *ierr PETSC_END_LEN(len)) 2968e27ec22SSatish Balay { 2978e27ec22SSatish Balay char *t; 2988e27ec22SSatish Balay 2998e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3008e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3018e27ec22SSatish Balay FREECHAR(prefix,t); 3028e27ec22SSatish Balay } 3038e27ec22SSatish Balay 3048e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3058e27ec22SSatish Balay /* functions, hence no STDCALL */ 3068e27ec22SSatish Balay 307a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3088e27ec22SSatish Balay { 309a6570f20SBarry Smith *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy); 3108e27ec22SSatish Balay } 3118e27ec22SSatish Balay 312a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3138e27ec22SSatish Balay { 314a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3158e27ec22SSatish Balay } 3168e27ec22SSatish Balay 317a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3188e27ec22SSatish Balay { 319a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3208e27ec22SSatish Balay } 3218e27ec22SSatish Balay 322a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3238e27ec22SSatish Balay { 324a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3258e27ec22SSatish Balay } 3268e27ec22SSatish Balay 3278e27ec22SSatish Balay 328a6570f20SBarry Smith void PETSC_STDCALL snesmonitorset_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*), 3298e27ec22SSatish Balay void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3308e27ec22SSatish Balay { 3318e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 332a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 333a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 334a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 335a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 336a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 337a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 338a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) { 339a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0); 3408e27ec22SSatish Balay } else { 3418e27ec22SSatish Balay f7 = func; 3428e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 343a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,mctx,0); 3448e27ec22SSatish Balay } else { 3458e27ec22SSatish Balay f71 = mondestroy; 346a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,mctx,ourmondestroy); 3478e27ec22SSatish Balay } 3488e27ec22SSatish Balay } 3498e27ec22SSatish Balay } 3508e27ec22SSatish Balay 3518e27ec22SSatish Balay 3528e27ec22SSatish Balay 3538e27ec22SSatish Balay EXTERN_C_END 354