xref: /petsc/src/tao/constrained/impls/admm/ftn-custom/zadmmf.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
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