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
ourtaoadmmmisfitobjgradroutine(Tao tao,Vec x,PetscReal * f,Vec g,PetscCtx ctx)29*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmmisfitobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, PetscCtx 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
ourtaoadmmmisfithessroutine(Tao tao,Vec x,Mat H,Mat Hpre,PetscCtx ctx)34*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmmisfithessroutine(Tao tao, Vec x, Mat H, Mat Hpre, PetscCtx 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
ourtaoadmmmisfitconstraintjacobian(Tao tao,Vec x,Mat J,Mat Jpre,PetscCtx ctx)39*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmmisfitconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, PetscCtx 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
ourtaoadmmregularizerobjgradroutine(Tao tao,Vec x,PetscReal * f,Vec g,PetscCtx ctx)44*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmregularizerobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, PetscCtx 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
ourtaoadmmregularizerhessroutine(Tao tao,Vec x,Mat H,Mat Hpre,PetscCtx ctx)49*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmregularizerhessroutine(Tao tao, Vec x, Mat H, Mat Hpre, PetscCtx 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
ourtaoadmmregularizerconstraintjacobian(Tao tao,Vec x,Mat J,Mat Jpre,PetscCtx ctx)54*2a8381b2SBarry Smith static PetscErrorCode ourtaoadmmregularizerconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, PetscCtx 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
taoadmmsetmisfitobjectiveandgradientroutine_(Tao * tao,void (* func)(Tao *,Vec *,PetscReal *,Vec *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)59*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetmisfitobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
606285c0a3SHansol Suh {
616285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
625ebfa9e9SBarry 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
taoadmmsetmisfithessianroutine_(Tao * tao,Mat * H,Mat * Hpre,void (* func)(Tao *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)66*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetmisfithessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
676285c0a3SHansol Suh {
686285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
695ebfa9e9SBarry 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
taoadmmsetmisfitconstraintjacobian_(Tao * tao,Mat * J,Mat * Jpre,void (* func)(Tao *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)73*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetmisfitconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
746285c0a3SHansol Suh {
756285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
765ebfa9e9SBarry 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
taoadmmsetregularizerobjectiveandgradientroutine_(Tao * tao,void (* func)(Tao *,Vec *,PetscReal *,Vec *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)80*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetregularizerobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
816285c0a3SHansol Suh {
826285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
835ebfa9e9SBarry 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
taoadmmsetregularizerhessianroutine_(Tao * tao,Mat * H,Mat * Hpre,void (* func)(Tao *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)87*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetregularizerhessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
886285c0a3SHansol Suh {
896285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
905ebfa9e9SBarry 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
taoadmmsetregularizerconstraintjacobian_(Tao * tao,Mat * J,Mat * Jpre,void (* func)(Tao *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)94*2a8381b2SBarry Smith PETSC_EXTERN void taoadmmsetregularizerconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
956285c0a3SHansol Suh {
966285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func);
975ebfa9e9SBarry 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