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