xref: /petsc/src/tao/constrained/impls/admm/ftn-custom/zadmmf.c (revision 6285c0a3eab9179dbf0b284c36c7c0086124b8a4)
1*6285c0a3SHansol  Suh #include <petsc/private/fortranimpl.h>
2*6285c0a3SHansol  Suh #include <petsc/private/f90impl.h>
3*6285c0a3SHansol  Suh #include <petsc/private/taoimpl.h>
4*6285c0a3SHansol  Suh 
5*6285c0a3SHansol  Suh #if defined(PETSC_HAVE_FORTRAN_CAPS)
6*6285c0a3SHansol  Suh #define taoadmmsetmisfitobjectiveandgradientroutine_       TAOADMMSETMISFITOBJECTIVEANDGRADIENTROUTINE
7*6285c0a3SHansol  Suh #define taoadmmsetmisfithessianroutine_                    TAOADMMSETMISFITHESSIANROUTINE
8*6285c0a3SHansol  Suh #define taoadmmsetmisfitconstraintjacobian_                TAOADMMSETMISFITCONSTRAINTJACOBIAN
9*6285c0a3SHansol  Suh #define taoadmmsetregularizerobjectiveandgradientroutine_  TAOADMMSETREGULARIZEROBJECTIVEANDGRADIENTROUTINE
10*6285c0a3SHansol  Suh #define taoadmmsetregularizerhessianroutine_               TAOADMMSETREGULARIZERHESSIANROUTINE
11*6285c0a3SHansol  Suh #define taoadmmsetregularizerconstraintjacobian_           TAOADMMSETREGULARIZERCONSTRAINTJACOBIAN
12*6285c0a3SHansol  Suh #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
13*6285c0a3SHansol  Suh #define taoadmmsetmisfitobjectiveandgradientroutine_       taoadmmsetmisfitobjectiveandgradientroutine
14*6285c0a3SHansol  Suh #define taoadmmsetmisfithessianroutine_                    taoadmmsetmisfithessianroutine
15*6285c0a3SHansol  Suh #define taoadmmsetmisfitconstraintjacobian_                taoadmmsetmisfitconstraintjacobian
16*6285c0a3SHansol  Suh #define taoadmmsetregularizerobjectiveandgradientroutine_  taoadmmsetregularizerobjectiveandgradientroutine
17*6285c0a3SHansol  Suh #define taoadmmsetregularizerhessianroutine_               taoadmmsetregularizerhessianroutine
18*6285c0a3SHansol  Suh #define taoadmmsetregularizerconstraintjacobian_           taoadmmsetregularizerconstraintjacobian
19*6285c0a3SHansol  Suh #endif
20*6285c0a3SHansol  Suh 
21*6285c0a3SHansol  Suh static struct {
22*6285c0a3SHansol  Suh   PetscFortranCallbackId misfitobjgrad;
23*6285c0a3SHansol  Suh   PetscFortranCallbackId misfithess;
24*6285c0a3SHansol  Suh   PetscFortranCallbackId misfitjacobian;
25*6285c0a3SHansol  Suh   PetscFortranCallbackId regobjgrad;
26*6285c0a3SHansol  Suh   PetscFortranCallbackId reghess;
27*6285c0a3SHansol  Suh   PetscFortranCallbackId regjacobian;
28*6285c0a3SHansol  Suh } _cb;
29*6285c0a3SHansol  Suh 
30*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
31*6285c0a3SHansol  Suh {
32*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.misfitobjgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
33*6285c0a3SHansol  Suh }
34*6285c0a3SHansol  Suh 
35*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfithessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
36*6285c0a3SHansol  Suh {
37*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.misfithess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
38*6285c0a3SHansol  Suh }
39*6285c0a3SHansol  Suh 
40*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
41*6285c0a3SHansol  Suh {
42*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.misfitjacobian,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
43*6285c0a3SHansol  Suh }
44*6285c0a3SHansol  Suh 
45*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
46*6285c0a3SHansol  Suh {
47*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.regobjgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
48*6285c0a3SHansol  Suh }
49*6285c0a3SHansol  Suh 
50*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerhessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
51*6285c0a3SHansol  Suh {
52*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.reghess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
53*6285c0a3SHansol  Suh }
54*6285c0a3SHansol  Suh 
55*6285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
56*6285c0a3SHansol  Suh {
57*6285c0a3SHansol  Suh     PetscObjectUseFortranCallback(tao,_cb.regjacobian,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
58*6285c0a3SHansol  Suh }
59*6285c0a3SHansol  Suh 
60*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfitobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
61*6285c0a3SHansol  Suh {
62*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
63*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitobjgrad,(PetscVoidFunction)func,ctx);
64*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetMisfitObjectiveAndGradientRoutine(*tao,ourtaoadmmmisfitobjgradroutine,ctx);
65*6285c0a3SHansol  Suh }
66*6285c0a3SHansol  Suh 
67*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfithessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
68*6285c0a3SHansol  Suh {
69*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
70*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfithess,(PetscVoidFunction)func,ctx);
71*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetMisfitHessianRoutine(*tao,*H,*Hpre,ourtaoadmmmisfithessroutine,ctx);
72*6285c0a3SHansol  Suh }
73*6285c0a3SHansol  Suh 
74*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfitconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
75*6285c0a3SHansol  Suh {
76*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
77*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx);
78*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetMisfitConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmmisfitconstraintjacobian,ctx);
79*6285c0a3SHansol  Suh }
80*6285c0a3SHansol  Suh 
81*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
82*6285c0a3SHansol  Suh {
83*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
84*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.regobjgrad,(PetscVoidFunction)func,ctx);
85*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetRegularizerObjectiveAndGradientRoutine(*tao,ourtaoadmmregularizerobjgradroutine,ctx);
86*6285c0a3SHansol  Suh }
87*6285c0a3SHansol  Suh 
88*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerhessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
89*6285c0a3SHansol  Suh {
90*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
91*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.reghess,(PetscVoidFunction)func,ctx);
92*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetRegularizerHessianRoutine(*tao,*H,*Hpre, ourtaoadmmregularizerhessroutine,ctx);
93*6285c0a3SHansol  Suh }
94*6285c0a3SHansol  Suh 
95*6285c0a3SHansol  Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
96*6285c0a3SHansol  Suh {
97*6285c0a3SHansol  Suh     CHKFORTRANNULLFUNCTION(func);
98*6285c0a3SHansol  Suh     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx);
99*6285c0a3SHansol  Suh     if(!*ierr) *ierr = TaoADMMSetRegularizerConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmregularizerconstraintjacobian,ctx);
100*6285c0a3SHansol  Suh }
101