1*a7e14dcfSSatish Balay #include "petsc-private/fortranimpl.h" 2*a7e14dcfSSatish Balay #include "tao-private/taolinesearch_impl.h" 3*a7e14dcfSSatish Balay 4*a7e14dcfSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveroutine_ TAOLINESEARCHSETOBJECTIVEROUTINE 6*a7e14dcfSSatish Balay #define taolinesearchsetgradientroutine_ TAOLINESEARCHSETGRADIENTROUTINE 7*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgradientroutine_ TAOLINESEARCHSETOBJECTIVEANDGRADIENTROUTINE 8*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgtsroutine_ TAOLINESEARCHSETOBJECTIVEANDGTSROUTINE 9*a7e14dcfSSatish Balay #define taolinesearchview_ TAOLINESEARCHVIEW 10*a7e14dcfSSatish Balay #define taolinesearchsettype_ TAOLINESEARCHSETTYPE 11*a7e14dcfSSatish Balay 12*a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 13*a7e14dcfSSatish Balay 14*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveroutine_ taolinesearchsetobjectiveroutine 15*a7e14dcfSSatish Balay #define taolinesearchsetgradientroutine_ taolinesearchsetgradientroutine 16*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgradientroutine_ taolinesearchsetobjectiveandgradientroutine 17*a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgtsroutine_ taolinesearchsetobjectiveandgtsroutine 18*a7e14dcfSSatish Balay #define taolinesearchview_ taolinesearchview 19*a7e14dcfSSatish Balay #define taolinesearchsettype_ taolinesearchsettype 20*a7e14dcfSSatish Balay 21*a7e14dcfSSatish Balay #endif 22*a7e14dcfSSatish Balay 23*a7e14dcfSSatish Balay static int OBJ=0; 24*a7e14dcfSSatish Balay static int GRAD=1; 25*a7e14dcfSSatish Balay static int OBJGRAD=2; 26*a7e14dcfSSatish Balay static int OBJGTS=3; 27*a7e14dcfSSatish Balay static int NFUNCS=4; 28*a7e14dcfSSatish Balay 29*a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveroutine(TaoLineSearch ls, Vec x, PetscReal *f, void *ctx) 30*a7e14dcfSSatish Balay { 31*a7e14dcfSSatish Balay PetscErrorCode ierr = 0; 32*a7e14dcfSSatish Balay (*(void (PETSC_STDCALL *)(TaoLineSearch*,Vec*,PetscReal*,void*,PetscErrorCode*)) 33*a7e14dcfSSatish Balay (((PetscObject)ls)->fortran_func_pointers[OBJ]))(&ls,&x,f,ctx,&ierr); 34*a7e14dcfSSatish Balay CHKERRQ(ierr); 35*a7e14dcfSSatish Balay return 0; 36*a7e14dcfSSatish Balay } 37*a7e14dcfSSatish Balay 38*a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchgradientroutine(TaoLineSearch ls, Vec x, Vec g, void *ctx) 39*a7e14dcfSSatish Balay { 40*a7e14dcfSSatish Balay PetscErrorCode ierr = 0; 41*a7e14dcfSSatish Balay (*(void (PETSC_STDCALL *)(TaoLineSearch*,Vec*,Vec*,void*,PetscErrorCode*)) 42*a7e14dcfSSatish Balay (((PetscObject)ls)->fortran_func_pointers[GRAD]))(&ls,&x,&g,ctx,&ierr); 43*a7e14dcfSSatish Balay CHKERRQ(ierr); 44*a7e14dcfSSatish Balay return 0; 45*a7e14dcfSSatish Balay 46*a7e14dcfSSatish Balay } 47*a7e14dcfSSatish Balay 48*a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveandgradientroutine(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, void* ctx) 49*a7e14dcfSSatish Balay { 50*a7e14dcfSSatish Balay PetscErrorCode ierr = 0; 51*a7e14dcfSSatish Balay (*(void (PETSC_STDCALL *)(TaoLineSearch*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*)) 52*a7e14dcfSSatish Balay (((PetscObject)ls)->fortran_func_pointers[OBJGRAD]))(&ls,&x,f,&g,ctx,&ierr); 53*a7e14dcfSSatish Balay CHKERRQ(ierr); 54*a7e14dcfSSatish Balay return 0; 55*a7e14dcfSSatish Balay } 56*a7e14dcfSSatish Balay 57*a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveandgtsroutine(TaoLineSearch ls, Vec x, Vec s, PetscReal *f, PetscReal *gts, void* ctx) 58*a7e14dcfSSatish Balay { 59*a7e14dcfSSatish Balay PetscErrorCode ierr = 0; 60*a7e14dcfSSatish Balay (*(void (PETSC_STDCALL *)(TaoLineSearch*,Vec*,Vec*,PetscReal*,PetscReal*,void*,PetscErrorCode*)) 61*a7e14dcfSSatish Balay (((PetscObject)ls)->fortran_func_pointers[OBJGTS]))(&ls,&x,&s,f,gts,ctx,&ierr); 62*a7e14dcfSSatish Balay CHKERRQ(ierr); 63*a7e14dcfSSatish Balay return 0; 64*a7e14dcfSSatish Balay } 65*a7e14dcfSSatish Balay 66*a7e14dcfSSatish Balay EXTERN_C_BEGIN 67*a7e14dcfSSatish Balay 68*a7e14dcfSSatish Balay 69*a7e14dcfSSatish Balay 70*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsetobjectiveroutine_(TaoLineSearch *ls, void (PETSC_STDCALL *func)(TaoLineSearch*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 71*a7e14dcfSSatish Balay { 72*a7e14dcfSSatish Balay CHKFORTRANNULLOBJECT(ctx); 73*a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls,NFUNCS); 74*a7e14dcfSSatish Balay if (!func) { 75*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveRoutine(*ls,0,ctx); 76*a7e14dcfSSatish Balay } else { 77*a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJ] = (PetscVoidFunction)func; 78*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveRoutine(*ls, ourtaolinesearchobjectiveroutine,ctx); 79*a7e14dcfSSatish Balay } 80*a7e14dcfSSatish Balay } 81*a7e14dcfSSatish Balay 82*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsetgradientroutine_(TaoLineSearch *ls, void (PETSC_STDCALL *func)(TaoLineSearch*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 83*a7e14dcfSSatish Balay { 84*a7e14dcfSSatish Balay CHKFORTRANNULLOBJECT(ctx); 85*a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls,NFUNCS); 86*a7e14dcfSSatish Balay if (!func) { 87*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetGradientRoutine(*ls,0,ctx); 88*a7e14dcfSSatish Balay } else { 89*a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[GRAD] = (PetscVoidFunction)func; 90*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetGradientRoutine(*ls, ourtaolinesearchgradientroutine,ctx); 91*a7e14dcfSSatish Balay } 92*a7e14dcfSSatish Balay } 93*a7e14dcfSSatish Balay 94*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsetobjectiveandgradientroutine_(TaoLineSearch *ls, void (PETSC_STDCALL *func)(TaoLineSearch*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 95*a7e14dcfSSatish Balay { 96*a7e14dcfSSatish Balay CHKFORTRANNULLOBJECT(ctx); 97*a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls,NFUNCS); 98*a7e14dcfSSatish Balay if (!func) { 99*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGradientRoutine(*ls,0,ctx); 100*a7e14dcfSSatish Balay } else { 101*a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJGRAD] = (PetscVoidFunction)func; 102*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGradientRoutine(*ls, ourtaolinesearchobjectiveandgradientroutine,ctx); 103*a7e14dcfSSatish Balay } 104*a7e14dcfSSatish Balay } 105*a7e14dcfSSatish Balay 106*a7e14dcfSSatish Balay 107*a7e14dcfSSatish Balay 108*a7e14dcfSSatish Balay 109*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsetobjectiveandgtsroutine_(TaoLineSearch *ls, void (PETSC_STDCALL *func)(TaoLineSearch*, Vec *, Vec *, PetscReal*, PetscReal*,void*, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 110*a7e14dcfSSatish Balay { 111*a7e14dcfSSatish Balay CHKFORTRANNULLOBJECT(ctx); 112*a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls,NFUNCS); 113*a7e14dcfSSatish Balay if (!func) { 114*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls,0,ctx); 115*a7e14dcfSSatish Balay } else { 116*a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJGTS] = (PetscVoidFunction)func; 117*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls, ourtaolinesearchobjectiveandgtsroutine,ctx); 118*a7e14dcfSSatish Balay } 119*a7e14dcfSSatish Balay } 120*a7e14dcfSSatish Balay 121*a7e14dcfSSatish Balay 122*a7e14dcfSSatish Balay 123*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsettype_(TaoLineSearch *ls, CHAR type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 124*a7e14dcfSSatish Balay 125*a7e14dcfSSatish Balay { 126*a7e14dcfSSatish Balay char *t; 127*a7e14dcfSSatish Balay 128*a7e14dcfSSatish Balay FIXCHAR(type_name,len,t); 129*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetType(*ls,t); 130*a7e14dcfSSatish Balay FREECHAR(type_name,t); 131*a7e14dcfSSatish Balay 132*a7e14dcfSSatish Balay } 133*a7e14dcfSSatish Balay 134*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchview_(TaoLineSearch *ls, PetscViewer *viewer, PetscErrorCode *ierr) 135*a7e14dcfSSatish Balay { 136*a7e14dcfSSatish Balay PetscViewer v; 137*a7e14dcfSSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 138*a7e14dcfSSatish Balay *ierr = TaoLineSearchView(*ls,v); 139*a7e14dcfSSatish Balay } 140*a7e14dcfSSatish Balay 141*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchgetoptionsprefix_(TaoLineSearch *ls, CHAR prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 142*a7e14dcfSSatish Balay { 143*a7e14dcfSSatish Balay const char *name; 144*a7e14dcfSSatish Balay *ierr = TaoLineSearchGetOptionsPrefix(*ls,&name); 145*a7e14dcfSSatish Balay *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return; 146*a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,prefix,len); 147*a7e14dcfSSatish Balay 148*a7e14dcfSSatish Balay } 149*a7e14dcfSSatish Balay 150*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchappendoptionsprefix_(TaoLineSearch *ls, CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 151*a7e14dcfSSatish Balay { 152*a7e14dcfSSatish Balay char *name; 153*a7e14dcfSSatish Balay FIXCHAR(prefix,len,name); 154*a7e14dcfSSatish Balay *ierr = TaoLineSearchAppendOptionsPrefix(*ls,name); 155*a7e14dcfSSatish Balay FREECHAR(prefix,name); 156*a7e14dcfSSatish Balay } 157*a7e14dcfSSatish Balay 158*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchsetoptionsprefix_(TaoLineSearch *ls, CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 159*a7e14dcfSSatish Balay { 160*a7e14dcfSSatish Balay char *t; 161*a7e14dcfSSatish Balay FIXCHAR(prefix,len,t); 162*a7e14dcfSSatish Balay *ierr = TaoLineSearchSetOptionsPrefix(*ls,t); 163*a7e14dcfSSatish Balay FREECHAR(prefix,t); 164*a7e14dcfSSatish Balay } 165*a7e14dcfSSatish Balay 166*a7e14dcfSSatish Balay void PETSC_STDCALL taolinesearchgettype_(TaoLineSearch *ls, CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 167*a7e14dcfSSatish Balay { 168*a7e14dcfSSatish Balay const char *tname; 169*a7e14dcfSSatish Balay *ierr = TaoLineSearchGetType(*ls,&tname); 170*a7e14dcfSSatish Balay *ierr = PetscStrncpy(name,tname,len); if (*ierr) return; 171*a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,name,len); 172*a7e14dcfSSatish Balay 173*a7e14dcfSSatish Balay } 174*a7e14dcfSSatish Balay EXTERN_C_END 175