1ce0a2cd1SBarry Smith #include "private/fortranimpl.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 30e3da1266SHong Zhang #define snesgetapplicationcontext_ SNESGETAPPLICATIONCONTEXT 318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 326ce558aeSBarry Smith #define snessolve_ snessolve 338e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 348e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 358e27ec22SSatish Balay #define snesdacomputejacobian_ snesdacomputejacobian 368e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor 378e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 388e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 398e27ec22SSatish Balay #define snesgettype_ snesgettype 408e27ec22SSatish Balay #define snesdaformfunction_ snesdaformfunction 418e27ec22SSatish Balay #define snessetfunction_ snessetfunction 428e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 438e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 443f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 453f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 468e27ec22SSatish Balay #define snesview_ snesview 478e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 488e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 498e27ec22SSatish Balay #define snessettype_ snessettype 508e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 518e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 52a6570f20SBarry Smith #define snesmonitorlg_ snesmonitorlg 53a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 54a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 55a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 56a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 57e3da1266SHong Zhang #define snesgetapplicationcontext_ snesgetapplicationcontext 588e27ec22SSatish Balay #endif 598e27ec22SSatish Balay 608e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 618e27ec22SSatish Balay { 628e27ec22SSatish Balay PetscErrorCode ierr = 0; 63b8ebb45fSBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr); 648e27ec22SSatish Balay return 0; 658e27ec22SSatish Balay } 66b8ebb45fSBarry Smith 6706ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 688e27ec22SSatish Balay { 698e27ec22SSatish Balay PetscErrorCode ierr = 0; 706895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 716895c445SBarry 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); 727f7931b9SBarry Smith return 0; 737f7931b9SBarry Smith } 747f7931b9SBarry Smith 757f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx) 767f7931b9SBarry Smith { 777f7931b9SBarry Smith PetscErrorCode ierr = 0; 787f7931b9SBarry Smith SNES snes = (SNES)ctx; 796895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 806895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr); 818e27ec22SSatish Balay return 0; 828e27ec22SSatish Balay } 838e27ec22SSatish Balay 848e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 858e27ec22SSatish Balay { 868e27ec22SSatish Balay PetscErrorCode ierr = 0; 87b8ebb45fSBarry 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); 888e27ec22SSatish Balay return 0; 898e27ec22SSatish Balay } 908e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 918e27ec22SSatish Balay { 928e27ec22SSatish Balay PetscErrorCode ierr = 0; 938e27ec22SSatish Balay 946895c445SBarry Smith void *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4]; 956895c445SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr); 968e27ec22SSatish Balay return 0; 978e27ec22SSatish Balay } 988e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx) 998e27ec22SSatish Balay { 1008e27ec22SSatish Balay PetscErrorCode ierr = 0; 101b8ebb45fSBarry Smith SNES snes = (SNES)ctx; 1026895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4]; 1036895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr); 1048e27ec22SSatish Balay return 0; 1058e27ec22SSatish Balay } 1068e27ec22SSatish Balay 1078e27ec22SSatish Balay EXTERN_C_BEGIN 1088e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1098e27ec22SSatish Balay /* 1108e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1118e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1128e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1138e27ec22SSatish Balay 1148e27ec22SSatish Balay functions, hence no STDCALL 1158e27ec22SSatish Balay */ 1168e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1178e27ec22SSatish Balay { 1188e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1198e27ec22SSatish Balay } 1208e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1218e27ec22SSatish Balay { 1228e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1238e27ec22SSatish Balay } 1248e27ec22SSatish Balay 1258e27ec22SSatish Balay void snesdacomputejacobianwithadifor_(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 snesdacomputejacobian_(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 PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1388e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1398e27ec22SSatish Balay { 1408e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 141f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1427f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 143f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1448e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 145f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1468e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 147f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) { 1488e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx); 149f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) { 1508e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx); 151f5b6597dSBarry Smith } else if (!func) { 152f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1538e27ec22SSatish Balay } else { 154b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func; 1558e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx); 1568e27ec22SSatish Balay } 1578e27ec22SSatish Balay } 1588e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1598e27ec22SSatish Balay 1606ce558aeSBarry Smith void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr ) 1616ce558aeSBarry Smith { 1626ce558aeSBarry Smith Vec B = *b; 1636ce558aeSBarry Smith if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL; 1646ce558aeSBarry Smith *__ierr = SNESSolve(*snes,B,*x); 1656ce558aeSBarry Smith } 1666ce558aeSBarry Smith 167e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1688e27ec22SSatish Balay { 1698e27ec22SSatish Balay const char *tname; 1708e27ec22SSatish Balay 1718e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1728e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1738e27ec22SSatish Balay } 1748e27ec22SSatish Balay 1757f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1768e27ec22SSatish Balay { 1778e27ec22SSatish Balay const char *tname; 1788e27ec22SSatish Balay 1798e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1808e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1817c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1828e27ec22SSatish Balay } 183e3da1266SHong Zhang 184e3da1266SHong Zhang void PETSC_STDCALL snesgetapplicationcontext_(SNES *snes,void **ctx,PetscErrorCode *ierr) 185e3da1266SHong Zhang { 1868c14c6fbSBarry Smith *ierr = SNESGetApplicationContext(*snes,ctx); 187e3da1266SHong Zhang } 1888e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1898e27ec22SSatish Balay 1908e27ec22SSatish Balay /* 1918e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1928e27ec22SSatish Balay to transparently set these monitors from .F code 1938e27ec22SSatish Balay 1948e27ec22SSatish Balay functions, hence no STDCALL 1958e27ec22SSatish Balay */ 1968e27ec22SSatish Balay void snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr) 1978e27ec22SSatish Balay { 1988e27ec22SSatish Balay *ierr = SNESDAFormFunction(*snes,*X,*F,ptr); 1998e27ec22SSatish Balay } 2008e27ec22SSatish Balay 2012613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 2028e27ec22SSatish Balay { 2038e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 2047f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 205f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 2068e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx); 2078e27ec22SSatish Balay } else { 208b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func; 2098e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx); 2108e27ec22SSatish Balay } 2118e27ec22SSatish Balay } 2128e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2138e27ec22SSatish Balay 2148e27ec22SSatish Balay /* the func argument is ignored */ 2158e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2168e27ec22SSatish Balay { 2178e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2188e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2198e27ec22SSatish Balay *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx); 2208e27ec22SSatish Balay } 2218e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2228e27ec22SSatish Balay 2237f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2243f149594SLisandro Dalcin { 2253f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2263f149594SLisandro Dalcin } 2273f149594SLisandro Dalcin 2283f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2293f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2303f149594SLisandro Dalcin { 2313f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2323f149594SLisandro Dalcin } 2333f149594SLisandro Dalcin 2347f7931b9SBarry 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) 2358e27ec22SSatish Balay { 2368e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 237*3f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2387f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 2393f149594SLisandro Dalcin 2403f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){ 2417f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0); 2423f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){ 2437f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0); 2448e27ec22SSatish Balay } else { 245b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func; 2467f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx; 247*3f22127dSBarry Smith if (!destroy) { 2487f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL); 2497f7931b9SBarry Smith } else { 2507f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy; 2517f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2527f7931b9SBarry Smith } 2538e27ec22SSatish Balay } 2548e27ec22SSatish Balay } 2558e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2568e27ec22SSatish Balay 2578e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2588e27ec22SSatish Balay { 2598e27ec22SSatish Balay PetscViewer v; 2608e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2618e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2628e27ec22SSatish Balay } 2638e27ec22SSatish Balay 2648e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2658e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2668e27ec22SSatish Balay { 2678e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2688e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2698e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2708e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2718e27ec22SSatish Balay } 2728e27ec22SSatish Balay 2738e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2748e27ec22SSatish Balay { 2758e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 2768e27ec22SSatish Balay } 2778e27ec22SSatish Balay 2787f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2798e27ec22SSatish Balay { 2808e27ec22SSatish Balay char *t; 2818e27ec22SSatish Balay 2828e27ec22SSatish Balay FIXCHAR(type,len,t); 2838e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2848e27ec22SSatish Balay FREECHAR(type,t); 2858e27ec22SSatish Balay } 2868e27ec22SSatish Balay 2877f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2888e27ec22SSatish Balay { 2898e27ec22SSatish Balay char *t; 2908e27ec22SSatish Balay 2918e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2928e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 2938e27ec22SSatish Balay FREECHAR(prefix,t); 2948e27ec22SSatish Balay } 2958e27ec22SSatish Balay 2967f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2978e27ec22SSatish Balay { 2988e27ec22SSatish Balay char *t; 2998e27ec22SSatish Balay 3008e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3018e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3028e27ec22SSatish Balay FREECHAR(prefix,t); 3038e27ec22SSatish Balay } 3048e27ec22SSatish Balay 3058e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3068e27ec22SSatish Balay /* functions, hence no STDCALL */ 3078e27ec22SSatish Balay 308a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3098e27ec22SSatish Balay { 310a6570f20SBarry Smith *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy); 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 313a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3148e27ec22SSatish Balay { 315a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 318a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3198e27ec22SSatish Balay { 320a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3218e27ec22SSatish Balay } 3228e27ec22SSatish Balay 323a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3248e27ec22SSatish Balay { 325a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3268e27ec22SSatish Balay } 3278e27ec22SSatish Balay 3288e27ec22SSatish Balay 3296895c445SBarry 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) 3308e27ec22SSatish Balay { 3318e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 3327f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 333a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 334a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 335a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 336a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 337a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 338a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 339a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) { 340a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0); 3418e27ec22SSatish Balay } else { 342b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func; 343b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx; 344b8ebb45fSBarry Smith 3458e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 3467f7931b9SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL); 3478e27ec22SSatish Balay } else { 348b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy; 349b8ebb45fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3508e27ec22SSatish Balay } 3518e27ec22SSatish Balay } 3528e27ec22SSatish Balay } 3538e27ec22SSatish Balay 3548e27ec22SSatish Balay 3558e27ec22SSatish Balay 3568e27ec22SSatish Balay EXTERN_C_END 357