xref: /petsc/src/tao/constrained/impls/admm/ftn-custom/zadmmf.c (revision 8434afd195968570cfdb5bc7b9cfc0a316d974ae)
16285c0a3SHansol  Suh #include <petsc/private/fortranimpl.h>
26285c0a3SHansol  Suh #include <petsc/private/f90impl.h>
36285c0a3SHansol  Suh #include <petsc/private/taoimpl.h>
46285c0a3SHansol  Suh 
56285c0a3SHansol  Suh #if defined(PETSC_HAVE_FORTRAN_CAPS)
66285c0a3SHansol  Suh   #define taoadmmsetmisfitobjectiveandgradientroutine_      TAOADMMSETMISFITOBJECTIVEANDGRADIENTROUTINE
76285c0a3SHansol  Suh   #define taoadmmsetmisfithessianroutine_                   TAOADMMSETMISFITHESSIANROUTINE
86285c0a3SHansol  Suh   #define taoadmmsetmisfitconstraintjacobian_               TAOADMMSETMISFITCONSTRAINTJACOBIAN
96285c0a3SHansol  Suh   #define taoadmmsetregularizerobjectiveandgradientroutine_ TAOADMMSETREGULARIZEROBJECTIVEANDGRADIENTROUTINE
106285c0a3SHansol  Suh   #define taoadmmsetregularizerhessianroutine_              TAOADMMSETREGULARIZERHESSIANROUTINE
116285c0a3SHansol  Suh   #define taoadmmsetregularizerconstraintjacobian_          TAOADMMSETREGULARIZERCONSTRAINTJACOBIAN
126285c0a3SHansol  Suh #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
136285c0a3SHansol  Suh   #define taoadmmsetmisfitobjectiveandgradientroutine_      taoadmmsetmisfitobjectiveandgradientroutine
146285c0a3SHansol  Suh   #define taoadmmsetmisfithessianroutine_                   taoadmmsetmisfithessianroutine
156285c0a3SHansol  Suh   #define taoadmmsetmisfitconstraintjacobian_               taoadmmsetmisfitconstraintjacobian
166285c0a3SHansol  Suh   #define taoadmmsetregularizerobjectiveandgradientroutine_ taoadmmsetregularizerobjectiveandgradientroutine
176285c0a3SHansol  Suh   #define taoadmmsetregularizerhessianroutine_              taoadmmsetregularizerhessianroutine
186285c0a3SHansol  Suh   #define taoadmmsetregularizerconstraintjacobian_          taoadmmsetregularizerconstraintjacobian
196285c0a3SHansol  Suh #endif
206285c0a3SHansol  Suh 
216285c0a3SHansol  Suh static struct {
226285c0a3SHansol  Suh   PetscFortranCallbackId misfitobjgrad;
236285c0a3SHansol  Suh   PetscFortranCallbackId misfithess;
246285c0a3SHansol  Suh   PetscFortranCallbackId misfitjacobian;
256285c0a3SHansol  Suh   PetscFortranCallbackId regobjgrad;
266285c0a3SHansol  Suh   PetscFortranCallbackId reghess;
276285c0a3SHansol  Suh   PetscFortranCallbackId regjacobian;
286285c0a3SHansol  Suh } _cb;
296285c0a3SHansol  Suh 
306285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void *ctx)
316285c0a3SHansol  Suh {
326285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfitobjgrad, (Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), (&tao, &x, f, &g, _ctx, &ierr));
336285c0a3SHansol  Suh }
346285c0a3SHansol  Suh 
356285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfithessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
366285c0a3SHansol  Suh {
376285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfithess, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
386285c0a3SHansol  Suh }
396285c0a3SHansol  Suh 
406285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmmisfitconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
416285c0a3SHansol  Suh {
426285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.misfitjacobian, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
436285c0a3SHansol  Suh }
446285c0a3SHansol  Suh 
456285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void *ctx)
466285c0a3SHansol  Suh {
476285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.regobjgrad, (Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), (&tao, &x, f, &g, _ctx, &ierr));
486285c0a3SHansol  Suh }
496285c0a3SHansol  Suh 
506285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerhessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
516285c0a3SHansol  Suh {
526285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.reghess, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
536285c0a3SHansol  Suh }
546285c0a3SHansol  Suh 
556285c0a3SHansol  Suh static PetscErrorCode ourtaoadmmregularizerconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
566285c0a3SHansol  Suh {
576285c0a3SHansol  Suh   PetscObjectUseFortranCallback(tao, _cb.regjacobian, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
586285c0a3SHansol  Suh }
596285c0a3SHansol  Suh 
6019caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfitobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
616285c0a3SHansol  Suh {
626285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
63*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitobjgrad, (PetscVoidFn *)func, ctx);
646285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitObjectiveAndGradientRoutine(*tao, ourtaoadmmmisfitobjgradroutine, ctx);
656285c0a3SHansol  Suh }
666285c0a3SHansol  Suh 
6719caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfithessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
686285c0a3SHansol  Suh {
696285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
70*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfithess, (PetscVoidFn *)func, ctx);
716285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitHessianRoutine(*tao, *H, *Hpre, ourtaoadmmmisfithessroutine, ctx);
726285c0a3SHansol  Suh }
736285c0a3SHansol  Suh 
7419caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetmisfitconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
756285c0a3SHansol  Suh {
766285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
77*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitjacobian, (PetscVoidFn *)func, ctx);
786285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetMisfitConstraintJacobian(*tao, *J, *Jpre, ourtaoadmmmisfitconstraintjacobian, ctx);
796285c0a3SHansol  Suh }
806285c0a3SHansol  Suh 
8119caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
826285c0a3SHansol  Suh {
836285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
84*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.regobjgrad, (PetscVoidFn *)func, ctx);
856285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerObjectiveAndGradientRoutine(*tao, ourtaoadmmregularizerobjgradroutine, ctx);
866285c0a3SHansol  Suh }
876285c0a3SHansol  Suh 
8819caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerhessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
896285c0a3SHansol  Suh {
906285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
91*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.reghess, (PetscVoidFn *)func, ctx);
926285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerHessianRoutine(*tao, *H, *Hpre, ourtaoadmmregularizerhessroutine, ctx);
936285c0a3SHansol  Suh }
946285c0a3SHansol  Suh 
9519caf8f3SSatish Balay PETSC_EXTERN void taoadmmsetregularizerconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
966285c0a3SHansol  Suh {
976285c0a3SHansol  Suh   CHKFORTRANNULLFUNCTION(func);
98*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.misfitjacobian, (PetscVoidFn *)func, ctx);
996285c0a3SHansol  Suh   if (!*ierr) *ierr = TaoADMMSetRegularizerConstraintJacobian(*tao, *J, *Jpre, ourtaoadmmregularizerconstraintjacobian, ctx);
1006285c0a3SHansol  Suh }
101