1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 48ad9143bSBarry Smith #include <petsc/private/f90impl.h> 58e27ec22SSatish Balay 68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 7*df2570feSBarry Smith #define snessetpicard_ SNESSETPICARD 8df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 96ce558aeSBarry Smith #define snessolve_ SNESSOLVE 108d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 118d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 128e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 1317a42bb7SSatish Balay #define snessetjacobian1_ SNESSETJACOBIAN1 1417a42bb7SSatish Balay #define snessetjacobian2_ SNESSETJACOBIAN2 158e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 168e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 178e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 18be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 19dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 208e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 21be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 228e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 238d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 24e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 258e27ec22SSatish Balay #define snesview_ SNESVIEW 268e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 278e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 288e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 298e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 308e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 31a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 32a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 334619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 34a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 35a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 36c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 373b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 38fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 394e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 40*df2570feSBarry Smith #define snessetpicard_ snessetpicard 41df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 426ce558aeSBarry Smith #define snessolve_ snessolve 438d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 448d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 458e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 4617a42bb7SSatish Balay #define snessetjacobian1_ snessetjacobian1 4717a42bb7SSatish Balay #define snessetjacobian2_ snessetjacobian2 488e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 498e27ec22SSatish Balay #define snesgettype_ snesgettype 508e27ec22SSatish Balay #define snessetfunction_ snessetfunction 51be95d8f1SBarry Smith #define snessetngs_ snessetngs 52dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 538e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 54be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 558e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 568d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 57e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 588e27ec22SSatish Balay #define snesview_ snesview 598e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 608e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 618e27ec22SSatish Balay #define snessettype_ snessettype 628e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 638e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 644619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 65a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 66a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 67a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 68a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 69c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 703b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 71fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 728e27ec22SSatish Balay #endif 738e27ec22SSatish Balay 74f6291634SJed Brown static struct { 75f6291634SJed Brown PetscFortranCallbackId function; 76f6291634SJed Brown PetscFortranCallbackId test; 77f6291634SJed Brown PetscFortranCallbackId destroy; 78f6291634SJed Brown PetscFortranCallbackId jacobian; 79f6291634SJed Brown PetscFortranCallbackId monitor; 80f6291634SJed Brown PetscFortranCallbackId mondestroy; 81be95d8f1SBarry Smith PetscFortranCallbackId ngs; 82dfef22ccSBarry Smith PetscFortranCallbackId update; 83c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 847cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 8589e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 8689e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 87c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 883c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 8989e00c7dSSatish Balay #endif 90f6291634SJed Brown } _cb; 9190b77ac2SPeter Brune 92c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx) 93c9368356SGlenn Hammond { 94c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 95c9368356SGlenn Hammond void* ptr; 96c9368356SGlenn Hammond PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr); 97c9368356SGlenn Hammond #endif 98c9368356SGlenn Hammond PetscObjectUseFortranCallback(snes,_cb.trprecheck,(SNES*,Vec*,Vec*,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,changed_y,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr))); 99c9368356SGlenn Hammond } 100c9368356SGlenn Hammond 10119caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 102c9368356SGlenn Hammond { 103c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 104c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 105c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 106c9368356SGlenn Hammond #endif 107c9368356SGlenn Hammond SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL); 108c9368356SGlenn Hammond } 109c9368356SGlenn Hammond 110c9368356SGlenn Hammond 111c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx) 1127cb011f5SBarry Smith { 1137cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1147cb011f5SBarry Smith void* ptr; 1153c2ee7eaSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr); 1167cb011f5SBarry Smith #endif 117c9368356SGlenn Hammond PetscObjectUseFortranCallback(snes,_cb.trpostcheck,(SNES*,Vec*,Vec*,Vec *,PetscBool *,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,&w,changed_y,changed_w,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr))); 1187cb011f5SBarry Smith } 1197cb011f5SBarry Smith 12019caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetpostcheck_(SNES *snes, void (*func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 1217cb011f5SBarry Smith { 1227cb011f5SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 1237cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1243c2ee7eaSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 1257cb011f5SBarry Smith #endif 1267cb011f5SBarry Smith SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 1277cb011f5SBarry Smith } 1287cb011f5SBarry Smith 1298e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 1308e27ec22SSatish Balay { 13189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 13289e00c7dSSatish Balay void* ptr; 13389e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 13489e00c7dSSatish Balay #endif 13589e00c7dSSatish Balay PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&f,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr))); 1368e27ec22SSatish Balay } 137b8ebb45fSBarry Smith 13806ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1398e27ec22SSatish Balay { 140f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1417f7931b9SBarry Smith } 1427f7931b9SBarry Smith 1437f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1447f7931b9SBarry Smith { 145f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1468e27ec22SSatish Balay } 1478e27ec22SSatish Balay 148d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1498e27ec22SSatish Balay { 150d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1518e27ec22SSatish Balay } 152f6291634SJed Brown 153dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 154dfef22ccSBarry Smith { 155dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 156dfef22ccSBarry Smith } 157be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 15890b77ac2SPeter Brune { 159be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 16090b77ac2SPeter Brune } 1618e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1628e27ec22SSatish Balay { 163f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1648e27ec22SSatish Balay } 165c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1668e27ec22SSatish Balay { 167f6291634SJed Brown SNES snes = (SNES)*ctx; 168f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1698e27ec22SSatish Balay } 1708e27ec22SSatish Balay 1718e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1728e27ec22SSatish Balay /* 1738d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1748e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1758e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1768e27ec22SSatish Balay */ 177d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 178df66969eSBarry Smith { 179d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 180df66969eSBarry Smith } 181d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1828e27ec22SSatish Balay { 183d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1848e27ec22SSatish Balay } 185d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1868e27ec22SSatish Balay { 187d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1888e27ec22SSatish Balay } 1898e27ec22SSatish Balay 19019caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 19119caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 192f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1938e27ec22SSatish Balay { 194f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1958d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1968d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1978d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 198e025ade3SBarry Smith if (!ctx) { 199e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 200e025ade3SBarry Smith return; 201e025ade3SBarry Smith } 2028d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 203df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 204df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2058e27ec22SSatish Balay } else { 206f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2070298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2088e27ec22SSatish Balay } 2098e27ec22SSatish Balay } 21017a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 21117a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 21217a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 21317a42bb7SSatish Balay { 21417a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 21517a42bb7SSatish Balay } 21617a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 21717a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 21817a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 21917a42bb7SSatish Balay { 22017a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 22117a42bb7SSatish Balay } 2228e27ec22SSatish Balay /* -------------------------------------------------------------*/ 223*df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx) 224*df2570feSBarry Smith { 225*df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 226*df2570feSBarry Smith void* ptr; 227*df2570feSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 228*df2570feSBarry Smith #endif 229*df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&f,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr))); 230*df2570feSBarry Smith } 231*df2570feSBarry Smith 232*df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 233*df2570feSBarry Smith { 234*df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 235*df2570feSBarry Smith } 236*df2570feSBarry Smith 237*df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B, 238*df2570feSBarry Smith PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 239*df2570feSBarry Smith { 240*df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 241*df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 242*df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 243*df2570feSBarry Smith #endif 244*df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx); 245*df2570feSBarry Smith if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL); 246*df2570feSBarry Smith } 247*df2570feSBarry Smith /* -------------------------------------------------------------*/ 2488e27ec22SSatish Balay 24919caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2508e27ec22SSatish Balay { 2518e27ec22SSatish Balay const char *tname; 2528e27ec22SSatish Balay 2538e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2548e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 255d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2568e27ec22SSatish Balay } 2578e27ec22SSatish Balay 25819caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2598e27ec22SSatish Balay { 2608e27ec22SSatish Balay const char *tname; 2618e27ec22SSatish Balay 2628e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2638e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2647c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2658e27ec22SSatish Balay } 266e3da1266SHong Zhang 2678e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2688e27ec22SSatish Balay 2698e27ec22SSatish Balay /* 2708e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2718e27ec22SSatish Balay to transparently set these monitors from .F code 2728e27ec22SSatish Balay */ 2738e27ec22SSatish Balay 27419caf8f3SSatish Balay PETSC_EXTERN void snessetfunction_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 2758e27ec22SSatish Balay { 276aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 27789e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 278aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 27989e00c7dSSatish Balay #endif 280aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2818e27ec22SSatish Balay } 282c79ef259SPeter Brune 283c79ef259SPeter Brune 28419caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 285c79ef259SPeter Brune { 286aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 287aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 288c79ef259SPeter Brune } 28919caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 290dfef22ccSBarry Smith { 291aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 292aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 293dfef22ccSBarry Smith } 2948e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2958e27ec22SSatish Balay 2968e27ec22SSatish Balay /* the func argument is ignored */ 29719caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 2988e27ec22SSatish Balay { 2998e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 3000298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 301146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 3020298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 3038e27ec22SSatish Balay } 304c79ef259SPeter Brune 30519caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 306c79ef259SPeter Brune { 307be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 308c79ef259SPeter Brune } 309c79ef259SPeter Brune 3108e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3118e27ec22SSatish Balay 31269c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 3133f149594SLisandro Dalcin { 3148d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 3153f149594SLisandro Dalcin } 3163f149594SLisandro Dalcin 317e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 3183f149594SLisandro Dalcin { 319e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 3203f149594SLisandro Dalcin } 3213f149594SLisandro Dalcin 32219caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 3238e27ec22SSatish Balay { 3243f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 3253f149594SLisandro Dalcin 3268d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3278d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 328e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 329e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3308e27ec22SSatish Balay } else { 331aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 332aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 333aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3348e27ec22SSatish Balay } 3358e27ec22SSatish Balay } 3368e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3378e27ec22SSatish Balay 33819caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3398e27ec22SSatish Balay { 3408e27ec22SSatish Balay PetscViewer v; 3418e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3428e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3438e27ec22SSatish Balay } 3448e27ec22SSatish Balay 3458e27ec22SSatish Balay /* func is currently ignored from Fortran */ 34619caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3478e27ec22SSatish Balay { 3488e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3498e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3508e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3510298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3520298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 353f2e0d3f1SJed Brown 3548e27ec22SSatish Balay } 3558e27ec22SSatish Balay 35619caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3578e27ec22SSatish Balay { 3580298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3598e27ec22SSatish Balay } 3608e27ec22SSatish Balay 36119caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3628e27ec22SSatish Balay { 3638e27ec22SSatish Balay char *t; 3648e27ec22SSatish Balay 3658e27ec22SSatish Balay FIXCHAR(type,len,t); 366d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3678e27ec22SSatish Balay FREECHAR(type,t); 3688e27ec22SSatish Balay } 3698e27ec22SSatish Balay 37019caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3718e27ec22SSatish Balay { 3728e27ec22SSatish Balay char *t; 3738e27ec22SSatish Balay 3748e27ec22SSatish Balay FIXCHAR(prefix,len,t); 375d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3768e27ec22SSatish Balay FREECHAR(prefix,t); 3778e27ec22SSatish Balay } 3788e27ec22SSatish Balay 37919caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3808e27ec22SSatish Balay { 3818e27ec22SSatish Balay char *t; 3828e27ec22SSatish Balay 3838e27ec22SSatish Balay FIXCHAR(prefix,len,t); 384d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 3858e27ec22SSatish Balay FREECHAR(prefix,t); 3868e27ec22SSatish Balay } 3878e27ec22SSatish Balay 3888e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3898e27ec22SSatish Balay 3909611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3918e27ec22SSatish Balay { 3924619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3938e27ec22SSatish Balay } 3948e27ec22SSatish Balay 39552f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3968e27ec22SSatish Balay { 397410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 3988e27ec22SSatish Balay } 3998e27ec22SSatish Balay 40052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4018e27ec22SSatish Balay { 402410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 4038e27ec22SSatish Balay } 4048e27ec22SSatish Balay 40552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4068e27ec22SSatish Balay { 407410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 4088e27ec22SSatish Balay } 4098e27ec22SSatish Balay 4108e27ec22SSatish Balay 41119caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 4128e27ec22SSatish Balay { 413aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 414a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 4151cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 416a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 4171cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 418a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 4191cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 4204619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 4213e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 4228e27ec22SSatish Balay } else { 423aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 424aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 425aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 4268e27ec22SSatish Balay } 4278e27ec22SSatish Balay } 4288e27ec22SSatish Balay 42919caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 430fe2efc57SMark { 431fe2efc57SMark char *t; 432fe2efc57SMark 433fe2efc57SMark FIXCHAR(type,len,t); 434fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 435fe2efc57SMark FREECHAR(type,t); 436fe2efc57SMark } 437