1c6db04a5SJed Brown #include <private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 38e27ec22SSatish Balay 48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 66ce558aeSBarry Smith #define snessolve_ SNESSOLVE 78e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 88e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 98e27ec22SSatish Balay #define snesdacomputejacobian_ SNESDACOMPUTEJACOBIAN 108e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR 118e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 128e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 138e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 148e27ec22SSatish Balay #define snesdaformfunction_ SNESDAFORMFUNCTION 158e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 168e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 178e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 183f149594SLisandro Dalcin #define snesdefaultconverged_ SNESDEFAULTCONVERGED 193f149594SLisandro Dalcin #define snesskipconverged_ SNESSKIPCONVERGED 208e27ec22SSatish Balay #define snesview_ SNESVIEW 218e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 228e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 238e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 248e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 258e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 26a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 27a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 28a6570f20SBarry Smith #define snesmonitorlg_ SNESMONITORLG 29a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 30a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 31e3da1266SHong Zhang #define snesgetapplicationcontext_ SNESGETAPPLICATIONCONTEXT 328e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 33df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 346ce558aeSBarry Smith #define snessolve_ snessolve 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 463f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 473f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 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 54a6570f20SBarry Smith #define snesmonitorlg_ snesmonitorlg 55a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 56a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 57a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 58a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 59e3da1266SHong Zhang #define snesgetapplicationcontext_ snesgetapplicationcontext 608e27ec22SSatish Balay #endif 618e27ec22SSatish Balay 628e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 638e27ec22SSatish Balay { 648e27ec22SSatish Balay PetscErrorCode ierr = 0; 65b8ebb45fSBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr); 668e27ec22SSatish Balay return 0; 678e27ec22SSatish Balay } 68b8ebb45fSBarry Smith 6906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 708e27ec22SSatish Balay { 718e27ec22SSatish Balay PetscErrorCode ierr = 0; 726895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 736895c445SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[1]))(&snes,&it,&a,&d,&c,reason,mctx,&ierr);CHKERRQ(ierr); 747f7931b9SBarry Smith return 0; 757f7931b9SBarry Smith } 767f7931b9SBarry Smith 777f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx) 787f7931b9SBarry Smith { 797f7931b9SBarry Smith PetscErrorCode ierr = 0; 807f7931b9SBarry Smith SNES snes = (SNES)ctx; 816895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 826895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr); 838e27ec22SSatish Balay return 0; 848e27ec22SSatish Balay } 858e27ec22SSatish Balay 868e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 878e27ec22SSatish Balay { 888e27ec22SSatish Balay PetscErrorCode ierr = 0; 89b8ebb45fSBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[2]))(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr); 908e27ec22SSatish Balay return 0; 918e27ec22SSatish Balay } 928e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 938e27ec22SSatish Balay { 948e27ec22SSatish Balay PetscErrorCode ierr = 0; 958e27ec22SSatish Balay 966895c445SBarry Smith void *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4]; 976895c445SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr); 988e27ec22SSatish Balay return 0; 998e27ec22SSatish Balay } 100*c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx) 1018e27ec22SSatish Balay { 1028e27ec22SSatish Balay PetscErrorCode ierr = 0; 103*c2efdce3SBarry Smith SNES snes = *(SNES*)ctx; 1046895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4]; 1056895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr); 1068e27ec22SSatish Balay return 0; 1078e27ec22SSatish Balay } 1088e27ec22SSatish Balay 1098e27ec22SSatish Balay EXTERN_C_BEGIN 1108e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1118e27ec22SSatish Balay /* 1128e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1138e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1148e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1158e27ec22SSatish Balay 1168e27ec22SSatish Balay functions, hence no STDCALL 1178e27ec22SSatish Balay */ 118df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 119df66969eSBarry Smith { 120df66969eSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx); 121df66969eSBarry Smith } 1228e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1238e27ec22SSatish Balay { 1248e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1258e27ec22SSatish Balay } 1268e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1278e27ec22SSatish Balay { 1288e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1298e27ec22SSatish Balay } 1308e27ec22SSatish Balay 1318e27ec22SSatish Balay void snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1328e27ec22SSatish Balay { 1338e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1348e27ec22SSatish Balay *ierr = 1; 1358e27ec22SSatish Balay } 1368e27ec22SSatish Balay 1378e27ec22SSatish Balay void snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1388e27ec22SSatish Balay { 1398e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1408e27ec22SSatish Balay *ierr = 1; 1418e27ec22SSatish Balay } 1428e27ec22SSatish Balay 1438e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1448e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1458e27ec22SSatish Balay { 1468e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 147f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1487f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 149f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1508e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 151f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1528e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 153f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) { 1548e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx); 155f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) { 1568e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx); 157df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 158df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 159f5b6597dSBarry Smith } else if (!func) { 160f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1618e27ec22SSatish Balay } else { 162b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func; 1638e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx); 1648e27ec22SSatish Balay } 1658e27ec22SSatish Balay } 1668e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1678e27ec22SSatish Balay 1686ce558aeSBarry Smith void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr ) 1696ce558aeSBarry Smith { 1706ce558aeSBarry Smith Vec B = *b; 1716ce558aeSBarry Smith if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL; 1726ce558aeSBarry Smith *__ierr = SNESSolve(*snes,B,*x); 1736ce558aeSBarry Smith } 1746ce558aeSBarry Smith 175e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1768e27ec22SSatish Balay { 1778e27ec22SSatish Balay const char *tname; 1788e27ec22SSatish Balay 1798e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1808e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1818e27ec22SSatish Balay } 1828e27ec22SSatish Balay 1837f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1848e27ec22SSatish Balay { 1858e27ec22SSatish Balay const char *tname; 1868e27ec22SSatish Balay 1878e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1888e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1897c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1908e27ec22SSatish Balay } 191e3da1266SHong Zhang 192e3da1266SHong Zhang void PETSC_STDCALL snesgetapplicationcontext_(SNES *snes,void **ctx,PetscErrorCode *ierr) 193e3da1266SHong Zhang { 1948c14c6fbSBarry Smith *ierr = SNESGetApplicationContext(*snes,ctx); 195e3da1266SHong Zhang } 1968e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1978e27ec22SSatish Balay 1988e27ec22SSatish Balay /* 1998e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2008e27ec22SSatish Balay to transparently set these monitors from .F code 2018e27ec22SSatish Balay 2028e27ec22SSatish Balay functions, hence no STDCALL 2038e27ec22SSatish Balay */ 2048e27ec22SSatish Balay void snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr) 2058e27ec22SSatish Balay { 2068e27ec22SSatish Balay *ierr = SNESDAFormFunction(*snes,*X,*F,ptr); 2078e27ec22SSatish Balay } 2088e27ec22SSatish Balay 2092613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 2108e27ec22SSatish Balay { 2118e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 2127f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 213f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 2148e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx); 2158e27ec22SSatish Balay } else { 216b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func; 2178e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx); 2188e27ec22SSatish Balay } 2198e27ec22SSatish Balay } 2208e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2218e27ec22SSatish Balay 2228e27ec22SSatish Balay /* the func argument is ignored */ 2238e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2248e27ec22SSatish Balay { 2258e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2268e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2278e27ec22SSatish Balay *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx); 2288e27ec22SSatish Balay } 2298e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2308e27ec22SSatish Balay 2317f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2323f149594SLisandro Dalcin { 2333f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2343f149594SLisandro Dalcin } 2353f149594SLisandro Dalcin 2363f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2373f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2383f149594SLisandro Dalcin { 2393f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2403f149594SLisandro Dalcin } 2413f149594SLisandro Dalcin 2427f7931b9SBarry Smith 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) 2438e27ec22SSatish Balay { 2448e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2453f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2467f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 2473f149594SLisandro Dalcin 2483f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){ 2497f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0); 2503f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){ 2517f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0); 2528e27ec22SSatish Balay } else { 253b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func; 2547f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx; 2553f22127dSBarry Smith if (!destroy) { 2567f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL); 2577f7931b9SBarry Smith } else { 2587f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy; 2597f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2607f7931b9SBarry Smith } 2618e27ec22SSatish Balay } 2628e27ec22SSatish Balay } 2638e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2648e27ec22SSatish Balay 2658e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2668e27ec22SSatish Balay { 2678e27ec22SSatish Balay PetscViewer v; 2688e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2698e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2708e27ec22SSatish Balay } 2718e27ec22SSatish Balay 2728e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2738e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2748e27ec22SSatish Balay { 2758e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2768e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2778e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2788e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2798e27ec22SSatish Balay } 2808e27ec22SSatish Balay 2818e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2828e27ec22SSatish Balay { 2838e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 2848e27ec22SSatish Balay } 2858e27ec22SSatish Balay 2867f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2878e27ec22SSatish Balay { 2888e27ec22SSatish Balay char *t; 2898e27ec22SSatish Balay 2908e27ec22SSatish Balay FIXCHAR(type,len,t); 2918e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2928e27ec22SSatish Balay FREECHAR(type,t); 2938e27ec22SSatish Balay } 2948e27ec22SSatish Balay 2957f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2968e27ec22SSatish Balay { 2978e27ec22SSatish Balay char *t; 2988e27ec22SSatish Balay 2998e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3008e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 3018e27ec22SSatish Balay FREECHAR(prefix,t); 3028e27ec22SSatish Balay } 3038e27ec22SSatish Balay 3047f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3058e27ec22SSatish Balay { 3068e27ec22SSatish Balay char *t; 3078e27ec22SSatish Balay 3088e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3098e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3108e27ec22SSatish Balay FREECHAR(prefix,t); 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 3138e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3148e27ec22SSatish Balay /* functions, hence no STDCALL */ 3158e27ec22SSatish Balay 316a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3178e27ec22SSatish Balay { 318a6570f20SBarry Smith *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy); 3198e27ec22SSatish Balay } 3208e27ec22SSatish Balay 321a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3228e27ec22SSatish Balay { 323a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3248e27ec22SSatish Balay } 3258e27ec22SSatish Balay 326a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3278e27ec22SSatish Balay { 328a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3298e27ec22SSatish Balay } 3308e27ec22SSatish Balay 331a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3328e27ec22SSatish Balay { 333a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3348e27ec22SSatish Balay } 3358e27ec22SSatish Balay 3368e27ec22SSatish Balay 3376895c445SBarry Smith 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) 3388e27ec22SSatish Balay { 3398e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 3407f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 341a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 342a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 343a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 344a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 345a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 346a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 347a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) { 348a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0); 3498e27ec22SSatish Balay } else { 350b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func; 351b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx; 352b8ebb45fSBarry Smith 3538e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 3547f7931b9SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL); 3558e27ec22SSatish Balay } else { 3565d4ebb51SBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 357b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy; 358b8ebb45fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3598e27ec22SSatish Balay } 3608e27ec22SSatish Balay } 3618e27ec22SSatish Balay } 3628e27ec22SSatish Balay 3638e27ec22SSatish Balay 3648e27ec22SSatish Balay 3658e27ec22SSatish Balay EXTERN_C_END 366