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) 791f3e32bSBarry Smith #define snesconvergedreasonview_ SNESCONVERGEDREASONVIEW 8df2570feSBarry Smith #define snessetpicard_ SNESSETPICARD 9df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 106ce558aeSBarry Smith #define snessolve_ SNESSOLVE 118d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 128d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 138e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 1417a42bb7SSatish Balay #define snessetjacobian1_ SNESSETJACOBIAN1 1517a42bb7SSatish Balay #define snessetjacobian2_ SNESSETJACOBIAN2 168e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 178e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 188e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 19be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 20dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 218e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 22be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 238e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 248d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 25e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 268e27ec22SSatish Balay #define snesview_ SNESVIEW 278e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 288e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 298e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 308e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 318e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 32a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 33a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 34a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 35a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 36c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ SNESNEWTONTRSETPRECHECK 373b42469aSBarry Smith #define snesnewtontrsetpostcheck_ SNESNEWTONTRSETPOSTCHECK 38*41ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ SNESNEWTONTRDCSETPRECHECK 39*41ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_ SNESNEWTONTRDCSETPOSTCHECK 40fe2efc57SMark #define snesviewfromoptions_ SNESVIEWFROMOPTIONS 41c4421ceaSFande Kong #define snesgetconvergedreasonstring_ SNESGETCONVERGEDREASONSTRING 424e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 4391f3e32bSBarry Smith #define snesconvergedreasonview_ snesconvergedreasonview 44df2570feSBarry Smith #define snessetpicard_ snessetpicard 45df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 466ce558aeSBarry Smith #define snessolve_ snessolve 478d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 488d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 498e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 5017a42bb7SSatish Balay #define snessetjacobian1_ snessetjacobian1 5117a42bb7SSatish Balay #define snessetjacobian2_ snessetjacobian2 528e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 538e27ec22SSatish Balay #define snesgettype_ snesgettype 548e27ec22SSatish Balay #define snessetfunction_ snessetfunction 55be95d8f1SBarry Smith #define snessetngs_ snessetngs 56dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 578e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 58be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 598e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 608d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 61e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 628e27ec22SSatish Balay #define snesview_ snesview 638e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 648e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 658e27ec22SSatish Balay #define snessettype_ snessettype 668e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 678e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 68a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 69a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 70a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 71a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 72c9368356SGlenn Hammond #define snesnewtontrsetprecheck_ snesnewtontrsetprecheck 733b42469aSBarry Smith #define snesnewtontrsetpostcheck_ snesnewtontrsetpostcheck 74*41ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ snesnewtontrdcsetprecheck 75*41ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_ snesnewtontrdcsetpostcheck 76fe2efc57SMark #define snesviewfromoptions_ snesviewfromoptions 77c4421ceaSFande Kong #define snesgetconvergedreasonstring_ snesgetconvergedreasonstring 788e27ec22SSatish Balay #endif 798e27ec22SSatish Balay 80f6291634SJed Brown static struct { 81f6291634SJed Brown PetscFortranCallbackId function; 82f6291634SJed Brown PetscFortranCallbackId test; 83f6291634SJed Brown PetscFortranCallbackId destroy; 84f6291634SJed Brown PetscFortranCallbackId jacobian; 85f6291634SJed Brown PetscFortranCallbackId monitor; 86f6291634SJed Brown PetscFortranCallbackId mondestroy; 87be95d8f1SBarry Smith PetscFortranCallbackId ngs; 88dfef22ccSBarry Smith PetscFortranCallbackId update; 89c9368356SGlenn Hammond PetscFortranCallbackId trprecheck; 907cb011f5SBarry Smith PetscFortranCallbackId trpostcheck; 9189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 9289e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 93c9368356SGlenn Hammond PetscFortranCallbackId trprecheck_pgiptr; 943c2ee7eaSBarry Smith PetscFortranCallbackId trpostcheck_pgiptr; 9589e00c7dSSatish Balay #endif 96f6291634SJed Brown } _cb; 9790b77ac2SPeter Brune 98c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx) 99c9368356SGlenn Hammond { 100c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 101c9368356SGlenn Hammond void* ptr; 102c9368356SGlenn Hammond PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr); 103c9368356SGlenn Hammond #endif 104c9368356SGlenn 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))); 105c9368356SGlenn Hammond } 106c9368356SGlenn Hammond 10719caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 108c9368356SGlenn Hammond { 109c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 110c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG) 111c9368356SGlenn Hammond *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 112c9368356SGlenn Hammond #endif 113c9368356SGlenn Hammond SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL); 114c9368356SGlenn Hammond } 115c9368356SGlenn Hammond 116*41ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 117*41ba4c6cSHeeho Park { 118*41ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 119*41ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 120*41ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 121*41ba4c6cSHeeho Park #endif 122*41ba4c6cSHeeho Park SNESNewtonTRDCSetPreCheck(*snes,ourtrprecheckfunction,NULL); 123*41ba4c6cSHeeho Park } 124*41ba4c6cSHeeho Park 125c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx) 1267cb011f5SBarry Smith { 1277cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1287cb011f5SBarry Smith void* ptr; 1293c2ee7eaSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr); 1307cb011f5SBarry Smith #endif 131c9368356SGlenn 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))); 1327cb011f5SBarry Smith } 1337cb011f5SBarry Smith 13419caf8f3SSatish 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)) 1357cb011f5SBarry Smith { 1367cb011f5SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 1377cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 1383c2ee7eaSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 1397cb011f5SBarry Smith #endif 1407cb011f5SBarry Smith SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 1417cb011f5SBarry Smith } 1427cb011f5SBarry Smith 143*41ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetpostcheck_(SNES *snes, void (*func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 144*41ba4c6cSHeeho Park { 145*41ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 146*41ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 147*41ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 148*41ba4c6cSHeeho Park #endif 149*41ba4c6cSHeeho Park SNESNewtonTRDCSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 150*41ba4c6cSHeeho Park } 151*41ba4c6cSHeeho Park 1528e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 1538e27ec22SSatish Balay { 15489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 15589e00c7dSSatish Balay void* ptr; 15689e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 15789e00c7dSSatish Balay #endif 15889e00c7dSSatish 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))); 1598e27ec22SSatish Balay } 160b8ebb45fSBarry Smith 16106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 1628e27ec22SSatish Balay { 163f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 1647f7931b9SBarry Smith } 1657f7931b9SBarry Smith 1667f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 1677f7931b9SBarry Smith { 168f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1698e27ec22SSatish Balay } 1708e27ec22SSatish Balay 171d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 1728e27ec22SSatish Balay { 173d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 1748e27ec22SSatish Balay } 175f6291634SJed Brown 176dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 177dfef22ccSBarry Smith { 178dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 179dfef22ccSBarry Smith } 180be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 18190b77ac2SPeter Brune { 182be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 18390b77ac2SPeter Brune } 1848e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1858e27ec22SSatish Balay { 186f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1878e27ec22SSatish Balay } 188c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1898e27ec22SSatish Balay { 190f6291634SJed Brown SNES snes = (SNES)*ctx; 191f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1928e27ec22SSatish Balay } 1938e27ec22SSatish Balay 1948e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1958e27ec22SSatish Balay /* 1968d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1978e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1988e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1998e27ec22SSatish Balay */ 200d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 201df66969eSBarry Smith { 202d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 203df66969eSBarry Smith } 204d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2058e27ec22SSatish Balay { 206d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 2078e27ec22SSatish Balay } 208d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2098e27ec22SSatish Balay { 210d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 2118e27ec22SSatish Balay } 2128e27ec22SSatish Balay 21319caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 21419caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 215f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 2168e27ec22SSatish Balay { 217f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 2188d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 2198d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 2208d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 221e025ade3SBarry Smith if (!ctx) { 222e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 223e025ade3SBarry Smith return; 224e025ade3SBarry Smith } 2258d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 226df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 227df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2288e27ec22SSatish Balay } else { 229f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2300298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2318e27ec22SSatish Balay } 2328e27ec22SSatish Balay } 23317a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 23417a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 23517a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 23617a42bb7SSatish Balay { 23717a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 23817a42bb7SSatish Balay } 23917a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 24017a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 24117a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 24217a42bb7SSatish Balay { 24317a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 24417a42bb7SSatish Balay } 2458e27ec22SSatish Balay /* -------------------------------------------------------------*/ 246df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx) 247df2570feSBarry Smith { 248df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 249df2570feSBarry Smith void* ptr; 250df2570feSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 251df2570feSBarry Smith #endif 252df2570feSBarry 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))); 253df2570feSBarry Smith } 254df2570feSBarry Smith 255df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 256df2570feSBarry Smith { 257df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 258df2570feSBarry Smith } 259df2570feSBarry Smith 260df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B, 261df2570feSBarry Smith PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 262df2570feSBarry Smith { 263df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 264df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 265df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 266df2570feSBarry Smith #endif 267df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx); 268df2570feSBarry Smith if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL); 269df2570feSBarry Smith } 270df2570feSBarry Smith /* -------------------------------------------------------------*/ 2718e27ec22SSatish Balay 27219caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2738e27ec22SSatish Balay { 2748e27ec22SSatish Balay const char *tname; 2758e27ec22SSatish Balay 2768e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2778e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 278d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2798e27ec22SSatish Balay } 2808e27ec22SSatish Balay 28119caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2828e27ec22SSatish Balay { 2838e27ec22SSatish Balay const char *tname; 2848e27ec22SSatish Balay 2858e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2868e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2877c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2888e27ec22SSatish Balay } 289e3da1266SHong Zhang 2908e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2918e27ec22SSatish Balay 2928e27ec22SSatish Balay /* 2938e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2948e27ec22SSatish Balay to transparently set these monitors from .F code 2958e27ec22SSatish Balay */ 2968e27ec22SSatish Balay 29719caf8f3SSatish 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)) 2988e27ec22SSatish Balay { 299aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 30089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 301aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 30289e00c7dSSatish Balay #endif 303aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 3048e27ec22SSatish Balay } 305c79ef259SPeter Brune 30619caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 307c79ef259SPeter Brune { 308aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 309aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 310c79ef259SPeter Brune } 31119caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 312dfef22ccSBarry Smith { 313aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 314aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 315dfef22ccSBarry Smith } 3168e27ec22SSatish Balay /* ---------------------------------------------------------*/ 3178e27ec22SSatish Balay 3188e27ec22SSatish Balay /* the func argument is ignored */ 31919caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 3208e27ec22SSatish Balay { 3218e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 3220298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 323146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 3240298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 3258e27ec22SSatish Balay } 326c79ef259SPeter Brune 32719caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 328c79ef259SPeter Brune { 329be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 330c79ef259SPeter Brune } 331c79ef259SPeter Brune 3328e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3338e27ec22SSatish Balay 33469c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 3353f149594SLisandro Dalcin { 3368d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 3373f149594SLisandro Dalcin } 3383f149594SLisandro Dalcin 339e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 3403f149594SLisandro Dalcin { 341e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 3423f149594SLisandro Dalcin } 3433f149594SLisandro Dalcin 34419caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 3458e27ec22SSatish Balay { 3463f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 3473f149594SLisandro Dalcin 3488d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3498d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 350e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 351e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3528e27ec22SSatish Balay } else { 353aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 354aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 355aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3568e27ec22SSatish Balay } 3578e27ec22SSatish Balay } 3588e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3598e27ec22SSatish Balay 36019caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3618e27ec22SSatish Balay { 3628e27ec22SSatish Balay PetscViewer v; 3638e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3648e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3658e27ec22SSatish Balay } 3668e27ec22SSatish Balay 3678e27ec22SSatish Balay /* func is currently ignored from Fortran */ 36819caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3698e27ec22SSatish Balay { 3708e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3718e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3728e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3730298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3740298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 375f2e0d3f1SJed Brown 3768e27ec22SSatish Balay } 3778e27ec22SSatish Balay 37819caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3798e27ec22SSatish Balay { 3800298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3818e27ec22SSatish Balay } 3828e27ec22SSatish Balay 38319caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3848e27ec22SSatish Balay { 3858e27ec22SSatish Balay char *t; 3868e27ec22SSatish Balay 3878e27ec22SSatish Balay FIXCHAR(type,len,t); 388d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3898e27ec22SSatish Balay FREECHAR(type,t); 3908e27ec22SSatish Balay } 3918e27ec22SSatish Balay 39219caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3938e27ec22SSatish Balay { 3948e27ec22SSatish Balay char *t; 3958e27ec22SSatish Balay 3968e27ec22SSatish Balay FIXCHAR(prefix,len,t); 397d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3988e27ec22SSatish Balay FREECHAR(prefix,t); 3998e27ec22SSatish Balay } 4008e27ec22SSatish Balay 40119caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 4028e27ec22SSatish Balay { 4038e27ec22SSatish Balay char *t; 4048e27ec22SSatish Balay 4058e27ec22SSatish Balay FIXCHAR(prefix,len,t); 406d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 4078e27ec22SSatish Balay FREECHAR(prefix,t); 4088e27ec22SSatish Balay } 4098e27ec22SSatish Balay 4108e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 4118e27ec22SSatish Balay 41252f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4138e27ec22SSatish Balay { 414410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 4158e27ec22SSatish Balay } 4168e27ec22SSatish Balay 41752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4188e27ec22SSatish Balay { 419410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 4208e27ec22SSatish Balay } 4218e27ec22SSatish Balay 42252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4238e27ec22SSatish Balay { 424410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 4258e27ec22SSatish Balay } 4268e27ec22SSatish Balay 42719caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 4288e27ec22SSatish Balay { 429aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 430a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 4311cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 432a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 4331cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 434a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 4351cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 4368e27ec22SSatish Balay } else { 437aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 438aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 439aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 4408e27ec22SSatish Balay } 4418e27ec22SSatish Balay } 4428e27ec22SSatish Balay 44319caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 444fe2efc57SMark { 445fe2efc57SMark char *t; 446fe2efc57SMark 447fe2efc57SMark FIXCHAR(type,len,t); 448b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 449fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 450fe2efc57SMark FREECHAR(type,t); 451fe2efc57SMark } 45291f3e32bSBarry Smith 45391f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 45491f3e32bSBarry Smith { 45591f3e32bSBarry Smith PetscViewer v; 45691f3e32bSBarry Smith PetscPatchDefaultViewers_Fortran(viewer,v); 45791f3e32bSBarry Smith *ierr = SNESConvergedReasonView(*snes,v); 45891f3e32bSBarry Smith } 459c4421ceaSFande Kong 460c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 461c4421ceaSFande Kong { 462c4421ceaSFande Kong const char *tstrreason; 463c4421ceaSFande Kong *ierr = SNESGetConvergedReasonString(*snes,&tstrreason); 464c4421ceaSFande Kong *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return; 465c4421ceaSFande Kong FIXRETURNCHAR(PETSC_TRUE,strreason,len); 466c4421ceaSFande Kong } 467