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