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 60*19caf8f3SSatish 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); 636285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitobjgrad,(PetscVoidFunction)func,ctx); 646285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitObjectiveAndGradientRoutine(*tao,ourtaoadmmmisfitobjgradroutine,ctx); 656285c0a3SHansol Suh } 666285c0a3SHansol Suh 67*19caf8f3SSatish 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); 706285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfithess,(PetscVoidFunction)func,ctx); 716285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitHessianRoutine(*tao,*H,*Hpre,ourtaoadmmmisfithessroutine,ctx); 726285c0a3SHansol Suh } 736285c0a3SHansol Suh 74*19caf8f3SSatish 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); 776285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx); 786285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmmisfitconstraintjacobian,ctx); 796285c0a3SHansol Suh } 806285c0a3SHansol Suh 81*19caf8f3SSatish 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); 846285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.regobjgrad,(PetscVoidFunction)func,ctx); 856285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerObjectiveAndGradientRoutine(*tao,ourtaoadmmregularizerobjgradroutine,ctx); 866285c0a3SHansol Suh } 876285c0a3SHansol Suh 88*19caf8f3SSatish 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); 916285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.reghess,(PetscVoidFunction)func,ctx); 926285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerHessianRoutine(*tao,*H,*Hpre, ourtaoadmmregularizerhessroutine,ctx); 936285c0a3SHansol Suh } 946285c0a3SHansol Suh 95*19caf8f3SSatish 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); 986285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx); 996285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmregularizerconstraintjacobian,ctx); 1006285c0a3SHansol Suh } 101