xref: /petsc/src/tao/constrained/impls/admm/ftn-custom/zadmmf.c (revision 5ebfa9e9f88b822c006efbb9b0cb198b91a2e84d)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
26285c0a3SHansol  Suh #include <petsc/private/taoimpl.h>
36285c0a3SHansol  Suh 
46285c0a3SHansol  Suh #if defined(PETSC_HAVE_FORTRAN_CAPS)
56285c0a3SHansol  Suh   #define taoadmmsetmisfitobjectiveandgradientroutine_      TAOADMMSETMISFITOBJECTIVEANDGRADIENTROUTINE
66285c0a3SHansol  Suh   #define taoadmmsetmisfithessianroutine_                   TAOADMMSETMISFITHESSIANROUTINE
76285c0a3SHansol  Suh   #define taoadmmsetmisfitconstraintjacobian_               TAOADMMSETMISFITCONSTRAINTJACOBIAN
86285c0a3SHansol  Suh   #define taoadmmsetregularizerobjectiveandgradientroutine_ TAOADMMSETREGULARIZEROBJECTIVEANDGRADIENTROUTINE
96285c0a3SHansol  Suh   #define taoadmmsetregularizerhessianroutine_              TAOADMMSETREGULARIZERHESSIANROUTINE
106285c0a3SHansol  Suh   #define taoadmmsetregularizerconstraintjacobian_          TAOADMMSETREGULARIZERCONSTRAINTJACOBIAN
116285c0a3SHansol  Suh #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
126285c0a3SHansol  Suh   #define taoadmmsetmisfitobjectiveandgradientroutine_      taoadmmsetmisfitobjectiveandgradientroutine
136285c0a3SHansol  Suh   #define taoadmmsetmisfithessianroutine_                   taoadmmsetmisfithessianroutine
146285c0a3SHansol  Suh   #define taoadmmsetmisfitconstraintjacobian_               taoadmmsetmisfitconstraintjacobian
156285c0a3SHansol  Suh   #define taoadmmsetregularizerobjectiveandgradientroutine_ taoadmmsetregularizerobjectiveandgradientroutine
166285c0a3SHansol  Suh   #define taoadmmsetregularizerhessianroutine_              taoadmmsetregularizerhessianroutine
176285c0a3SHansol  Suh   #define taoadmmsetregularizerconstraintjacobian_          taoadmmsetregularizerconstraintjacobian
186285c0a3SHansol  Suh #endif
196285c0a3SHansol  Suh 
206285c0a3SHansol  Suh static struct {
216285c0a3SHansol  Suh   PetscFortranCallbackId misfitobjgrad;
226285c0a3SHansol  Suh   PetscFortranCallbackId misfithess;
236285c0a3SHansol  Suh   PetscFortranCallbackId misfitjacobian;
246285c0a3SHansol  Suh   PetscFortranCallbackId regobjgrad;
256285c0a3SHansol  Suh   PetscFortranCallbackId reghess;
266285c0a3SHansol  Suh   PetscFortranCallbackId regjacobian;
276285c0a3SHansol  Suh } _cb;
286285c0a3SHansol  Suh 
296285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void *ctx)
306285c0a3SHansol  Suh {
316285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfitobjgrad, (Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), (&tao, &x, f, &g, _ctx, &ierr));
326285c0a3SHansol  Suh }
336285c0a3SHansol  Suh 
346285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfithessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
356285c0a3SHansol  Suh {
366285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfithess, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
376285c0a3SHansol  Suh }
386285c0a3SHansol  Suh 
396285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
406285c0a3SHansol  Suh {
416285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfitjacobian, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
426285c0a3SHansol  Suh }
436285c0a3SHansol  Suh 
446285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void *ctx)
456285c0a3SHansol  Suh {
466285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.regobjgrad, (Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), (&tao, &x, f, &g, _ctx, &ierr));
476285c0a3SHansol  Suh }
486285c0a3SHansol  Suh 
496285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerhessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
506285c0a3SHansol  Suh {
516285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.reghess, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
526285c0a3SHansol  Suh }
536285c0a3SHansol  Suh 
546285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
556285c0a3SHansol  Suh {
566285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.regjacobian, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
576285c0a3SHansol  Suh }
586285c0a3SHansol  Suh 
5919caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfitobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
606285c0a3SHansol  Suh {
616285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
62*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitobjgrad, (PetscFortranCallbackFn *)func, ctx);
636285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitObjectiveAndGradientRoutine(*tao, ourtaoadmmmisfitobjgradroutine, ctx);
646285c0a3SHansol  Suh }
656285c0a3SHansol  Suh 
6619caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfithessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
676285c0a3SHansol  Suh {
686285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
69*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfithess, (PetscFortranCallbackFn *)func, ctx);
706285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitHessianRoutine(*tao, *H, *Hpre, ourtaoadmmmisfithessroutine, ctx);
716285c0a3SHansol  Suh }
726285c0a3SHansol  Suh 
7319caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfitconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
746285c0a3SHansol  Suh {
756285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
76*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitjacobian, (PetscFortranCallbackFn *)func, ctx);
776285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitConstraintJacobian(*tao, *J, *Jpre, ourtaoadmmmisfitconstraintjacobian, ctx);
786285c0a3SHansol  Suh }
796285c0a3SHansol  Suh 
8019caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
816285c0a3SHansol  Suh {
826285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
83*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.regobjgrad, (PetscFortranCallbackFn *)func, ctx);
846285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerObjectiveAndGradientRoutine(*tao, ourtaoadmmregularizerobjgradroutine, ctx);
856285c0a3SHansol  Suh }
866285c0a3SHansol  Suh 
8719caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerhessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
886285c0a3SHansol  Suh {
896285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
90*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.reghess, (PetscFortranCallbackFn *)func, ctx);
916285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerHessianRoutine(*tao, *H, *Hpre, ourtaoadmmregularizerhessroutine, ctx);
926285c0a3SHansol  Suh }
936285c0a3SHansol  Suh 
9419caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
956285c0a3SHansol  Suh {
966285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
97*5ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitjacobian, (PetscFortranCallbackFn *)func, ctx);
986285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerConstraintJacobian(*tao, *J, *Jpre, ourtaoadmmregularizerconstraintjacobian, ctx);
996285c0a3SHansol  Suh }
100