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 3841ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ SNESNEWTONTRDCSETPRECHECK 3941ba4c6cSHeeho 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 7441ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_ snesnewtontrdcsetprecheck 7541ba4c6cSHeeho 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 11641ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 11741ba4c6cSHeeho Park { 11841ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 11941ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 12041ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return; 12141ba4c6cSHeeho Park #endif 12241ba4c6cSHeeho Park SNESNewtonTRDCSetPreCheck(*snes,ourtrprecheckfunction,NULL); 12341ba4c6cSHeeho Park } 12441ba4c6cSHeeho 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 14341ba4c6cSHeeho 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)) 14441ba4c6cSHeeho Park { 14541ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return; 14641ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG) 14741ba4c6cSHeeho Park *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return; 14841ba4c6cSHeeho Park #endif 14941ba4c6cSHeeho Park SNESNewtonTRDCSetPostCheck(*snes,ourtrpostcheckfunction,NULL); 15041ba4c6cSHeeho Park } 15141ba4c6cSHeeho 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 /* 1958d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1968e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1978e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1988e27ec22SSatish Balay */ 199d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 200df66969eSBarry Smith { 201d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 202df66969eSBarry Smith } 203d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2048e27ec22SSatish Balay { 205d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 2068e27ec22SSatish Balay } 207d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 2088e27ec22SSatish Balay { 209d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 2108e27ec22SSatish Balay } 2118e27ec22SSatish Balay 21219caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B, 21319caf8f3SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 214f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 2158e27ec22SSatish Balay { 216f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 2178d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 2188d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 2198d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 220e025ade3SBarry Smith if (!ctx) { 221e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 222e025ade3SBarry Smith return; 223e025ade3SBarry Smith } 2248d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 225df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 226df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 2278e27ec22SSatish Balay } else { 228f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 2290298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 2308e27ec22SSatish Balay } 2318e27ec22SSatish Balay } 23217a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B, 23317a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 23417a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 23517a42bb7SSatish Balay { 23617a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 23717a42bb7SSatish Balay } 23817a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B, 23917a42bb7SSatish Balay void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 24017a42bb7SSatish Balay void *ctx,PetscErrorCode *ierr) 24117a42bb7SSatish Balay { 24217a42bb7SSatish Balay snessetjacobian_(snes,A,B,func,ctx,ierr); 24317a42bb7SSatish Balay } 244*f6dfbefdSBarry Smith 245df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx) 246df2570feSBarry Smith { 247df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 248df2570feSBarry Smith void* ptr; 249df2570feSBarry Smith PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 250df2570feSBarry Smith #endif 251df2570feSBarry 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))); 252df2570feSBarry Smith } 253df2570feSBarry Smith 254df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 255df2570feSBarry Smith { 256df2570feSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 257df2570feSBarry Smith } 258df2570feSBarry Smith 259df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B, 260df2570feSBarry Smith PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 261df2570feSBarry Smith { 262df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx); 263df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 264df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 265df2570feSBarry Smith #endif 266df2570feSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx); 267df2570feSBarry Smith if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL); 268df2570feSBarry Smith } 2698e27ec22SSatish Balay 27019caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2718e27ec22SSatish Balay { 2728e27ec22SSatish Balay const char *tname; 2738e27ec22SSatish Balay 2748e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 2758e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 276d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 2778e27ec22SSatish Balay } 2788e27ec22SSatish Balay 27919caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2808e27ec22SSatish Balay { 2818e27ec22SSatish Balay const char *tname; 2828e27ec22SSatish Balay 2838e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 2848e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 2857c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 2868e27ec22SSatish Balay } 287e3da1266SHong Zhang 2888e27ec22SSatish Balay /* 2898e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 2908e27ec22SSatish Balay to transparently set these monitors from .F code 2918e27ec22SSatish Balay */ 2928e27ec22SSatish Balay 29319caf8f3SSatish 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)) 2948e27ec22SSatish Balay { 295aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 29689e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 297aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 29889e00c7dSSatish Balay #endif 299aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 3008e27ec22SSatish Balay } 301c79ef259SPeter Brune 30219caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 303c79ef259SPeter Brune { 304aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 305aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 306c79ef259SPeter Brune } 30719caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 308dfef22ccSBarry Smith { 309aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 310aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 311dfef22ccSBarry Smith } 3128e27ec22SSatish Balay 3138e27ec22SSatish Balay /* the func argument is ignored */ 31419caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 3158e27ec22SSatish Balay { 3168e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 3170298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 318146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 3190298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 3208e27ec22SSatish Balay } 321c79ef259SPeter Brune 32219caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 323c79ef259SPeter Brune { 324be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 325c79ef259SPeter Brune } 326c79ef259SPeter Brune 32769c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 3283f149594SLisandro Dalcin { 3298d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 3303f149594SLisandro Dalcin } 3313f149594SLisandro Dalcin 332e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 3333f149594SLisandro Dalcin { 334e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 3353f149594SLisandro Dalcin } 3363f149594SLisandro Dalcin 33719caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr) 3388e27ec22SSatish Balay { 3393f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 3403f149594SLisandro Dalcin 3418d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 3428d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 343e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 344e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 3458e27ec22SSatish Balay } else { 346aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 347aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 348aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 3498e27ec22SSatish Balay } 3508e27ec22SSatish Balay } 3518e27ec22SSatish Balay 35219caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 3538e27ec22SSatish Balay { 3548e27ec22SSatish Balay PetscViewer v; 3558e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 3568e27ec22SSatish Balay *ierr = SNESView(*snes,v); 3578e27ec22SSatish Balay } 3588e27ec22SSatish Balay 3598e27ec22SSatish Balay /* func is currently ignored from Fortran */ 36019caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 3618e27ec22SSatish Balay { 3628e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 3638e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 3648e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 3650298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 3660298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 367f2e0d3f1SJed Brown 3688e27ec22SSatish Balay } 3698e27ec22SSatish Balay 37019caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3718e27ec22SSatish Balay { 3720298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 3738e27ec22SSatish Balay } 3748e27ec22SSatish Balay 37519caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3768e27ec22SSatish Balay { 3778e27ec22SSatish Balay char *t; 3788e27ec22SSatish Balay 3798e27ec22SSatish Balay FIXCHAR(type,len,t); 380d49bb8f9SBarry Smith *ierr = SNESSetType(*snes,t);if (*ierr) return; 3818e27ec22SSatish Balay FREECHAR(type,t); 3828e27ec22SSatish Balay } 3838e27ec22SSatish Balay 38419caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3858e27ec22SSatish Balay { 3868e27ec22SSatish Balay char *t; 3878e27ec22SSatish Balay 3888e27ec22SSatish Balay FIXCHAR(prefix,len,t); 389d49bb8f9SBarry Smith *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return; 3908e27ec22SSatish Balay FREECHAR(prefix,t); 3918e27ec22SSatish Balay } 3928e27ec22SSatish Balay 39319caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 3948e27ec22SSatish Balay { 3958e27ec22SSatish Balay char *t; 3968e27ec22SSatish Balay 3978e27ec22SSatish Balay FIXCHAR(prefix,len,t); 398d49bb8f9SBarry Smith *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return; 3998e27ec22SSatish Balay FREECHAR(prefix,t); 4008e27ec22SSatish Balay } 4018e27ec22SSatish Balay 40252f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4038e27ec22SSatish Balay { 404410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 4058e27ec22SSatish Balay } 4068e27ec22SSatish Balay 40752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4088e27ec22SSatish Balay { 409410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 4108e27ec22SSatish Balay } 4118e27ec22SSatish Balay 41252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 4138e27ec22SSatish Balay { 414410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 4158e27ec22SSatish Balay } 4168e27ec22SSatish Balay 41719caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 4188e27ec22SSatish Balay { 419aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 420a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 4211cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 422a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 4231cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 424a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 4251cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 4268e27ec22SSatish Balay } else { 427aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 428aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 429aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 4308e27ec22SSatish Balay } 4318e27ec22SSatish Balay } 4328e27ec22SSatish Balay 43319caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 434fe2efc57SMark { 435fe2efc57SMark char *t; 436fe2efc57SMark 437fe2efc57SMark FIXCHAR(type,len,t); 438b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 439fe2efc57SMark *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return; 440fe2efc57SMark FREECHAR(type,t); 441fe2efc57SMark } 44291f3e32bSBarry Smith 44391f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 44491f3e32bSBarry Smith { 44591f3e32bSBarry Smith PetscViewer v; 44691f3e32bSBarry Smith PetscPatchDefaultViewers_Fortran(viewer,v); 44791f3e32bSBarry Smith *ierr = SNESConvergedReasonView(*snes,v); 44891f3e32bSBarry Smith } 449c4421ceaSFande Kong 450c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 451c4421ceaSFande Kong { 452c4421ceaSFande Kong const char *tstrreason; 453c4421ceaSFande Kong *ierr = SNESGetConvergedReasonString(*snes,&tstrreason); 454c4421ceaSFande Kong *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return; 455c4421ceaSFande Kong FIXRETURNCHAR(PETSC_TRUE,strreason,len); 456c4421ceaSFande Kong } 457