1*6285c0a3SHansol Suh #include <petsc/private/fortranimpl.h> 2*6285c0a3SHansol Suh #include <petsc/private/f90impl.h> 3*6285c0a3SHansol Suh #include <petsc/private/taoimpl.h> 4*6285c0a3SHansol Suh 5*6285c0a3SHansol Suh #if defined(PETSC_HAVE_FORTRAN_CAPS) 6*6285c0a3SHansol Suh #define taoadmmsetmisfitobjectiveandgradientroutine_ TAOADMMSETMISFITOBJECTIVEANDGRADIENTROUTINE 7*6285c0a3SHansol Suh #define taoadmmsetmisfithessianroutine_ TAOADMMSETMISFITHESSIANROUTINE 8*6285c0a3SHansol Suh #define taoadmmsetmisfitconstraintjacobian_ TAOADMMSETMISFITCONSTRAINTJACOBIAN 9*6285c0a3SHansol Suh #define taoadmmsetregularizerobjectiveandgradientroutine_ TAOADMMSETREGULARIZEROBJECTIVEANDGRADIENTROUTINE 10*6285c0a3SHansol Suh #define taoadmmsetregularizerhessianroutine_ TAOADMMSETREGULARIZERHESSIANROUTINE 11*6285c0a3SHansol Suh #define taoadmmsetregularizerconstraintjacobian_ TAOADMMSETREGULARIZERCONSTRAINTJACOBIAN 12*6285c0a3SHansol Suh #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 13*6285c0a3SHansol Suh #define taoadmmsetmisfitobjectiveandgradientroutine_ taoadmmsetmisfitobjectiveandgradientroutine 14*6285c0a3SHansol Suh #define taoadmmsetmisfithessianroutine_ taoadmmsetmisfithessianroutine 15*6285c0a3SHansol Suh #define taoadmmsetmisfitconstraintjacobian_ taoadmmsetmisfitconstraintjacobian 16*6285c0a3SHansol Suh #define taoadmmsetregularizerobjectiveandgradientroutine_ taoadmmsetregularizerobjectiveandgradientroutine 17*6285c0a3SHansol Suh #define taoadmmsetregularizerhessianroutine_ taoadmmsetregularizerhessianroutine 18*6285c0a3SHansol Suh #define taoadmmsetregularizerconstraintjacobian_ taoadmmsetregularizerconstraintjacobian 19*6285c0a3SHansol Suh #endif 20*6285c0a3SHansol Suh 21*6285c0a3SHansol Suh static struct { 22*6285c0a3SHansol Suh PetscFortranCallbackId misfitobjgrad; 23*6285c0a3SHansol Suh PetscFortranCallbackId misfithess; 24*6285c0a3SHansol Suh PetscFortranCallbackId misfitjacobian; 25*6285c0a3SHansol Suh PetscFortranCallbackId regobjgrad; 26*6285c0a3SHansol Suh PetscFortranCallbackId reghess; 27*6285c0a3SHansol Suh PetscFortranCallbackId regjacobian; 28*6285c0a3SHansol Suh } _cb; 29*6285c0a3SHansol Suh 30*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmmisfitobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx) 31*6285c0a3SHansol Suh { 32*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.misfitobjgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr)); 33*6285c0a3SHansol Suh } 34*6285c0a3SHansol Suh 35*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmmisfithessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 36*6285c0a3SHansol Suh { 37*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.misfithess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 38*6285c0a3SHansol Suh } 39*6285c0a3SHansol Suh 40*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmmisfitconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 41*6285c0a3SHansol Suh { 42*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.misfitjacobian,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 43*6285c0a3SHansol Suh } 44*6285c0a3SHansol Suh 45*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmregularizerobjgradroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx) 46*6285c0a3SHansol Suh { 47*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.regobjgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr)); 48*6285c0a3SHansol Suh } 49*6285c0a3SHansol Suh 50*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmregularizerhessroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 51*6285c0a3SHansol Suh { 52*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.reghess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 53*6285c0a3SHansol Suh } 54*6285c0a3SHansol Suh 55*6285c0a3SHansol Suh static PetscErrorCode ourtaoadmmregularizerconstraintjacobian(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 56*6285c0a3SHansol Suh { 57*6285c0a3SHansol Suh PetscObjectUseFortranCallback(tao,_cb.regjacobian,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 58*6285c0a3SHansol Suh } 59*6285c0a3SHansol Suh 60*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfitobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 61*6285c0a3SHansol Suh { 62*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 63*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitobjgrad,(PetscVoidFunction)func,ctx); 64*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitObjectiveAndGradientRoutine(*tao,ourtaoadmmmisfitobjgradroutine,ctx); 65*6285c0a3SHansol Suh } 66*6285c0a3SHansol Suh 67*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfithessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 68*6285c0a3SHansol Suh { 69*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 70*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfithess,(PetscVoidFunction)func,ctx); 71*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitHessianRoutine(*tao,*H,*Hpre,ourtaoadmmmisfithessroutine,ctx); 72*6285c0a3SHansol Suh } 73*6285c0a3SHansol Suh 74*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetmisfitconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 75*6285c0a3SHansol Suh { 76*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 77*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx); 78*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetMisfitConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmmisfitconstraintjacobian,ctx); 79*6285c0a3SHansol Suh } 80*6285c0a3SHansol Suh 81*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 82*6285c0a3SHansol Suh { 83*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 84*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.regobjgrad,(PetscVoidFunction)func,ctx); 85*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerObjectiveAndGradientRoutine(*tao,ourtaoadmmregularizerobjgradroutine,ctx); 86*6285c0a3SHansol Suh } 87*6285c0a3SHansol Suh 88*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerhessianroutine_(Tao *tao, Mat *H, Mat *Hpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 89*6285c0a3SHansol Suh { 90*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 91*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.reghess,(PetscVoidFunction)func,ctx); 92*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerHessianRoutine(*tao,*H,*Hpre, ourtaoadmmregularizerhessroutine,ctx); 93*6285c0a3SHansol Suh } 94*6285c0a3SHansol Suh 95*6285c0a3SHansol Suh PETSC_EXTERN void PETSC_STDCALL taoadmmsetregularizerconstraintjacobian_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 96*6285c0a3SHansol Suh { 97*6285c0a3SHansol Suh CHKFORTRANNULLFUNCTION(func); 98*6285c0a3SHansol Suh *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.misfitjacobian,(PetscVoidFunction)func,ctx); 99*6285c0a3SHansol Suh if(!*ierr) *ierr = TaoADMMSetRegularizerConstraintJacobian(*tao,*J,*Jpre, ourtaoadmmregularizerconstraintjacobian,ctx); 100*6285c0a3SHansol Suh } 101