1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2af0996ceSBarry Smith #include <petsc/private/taolinesearchimpl.h> 3a7e14dcfSSatish Balay 4a7e14dcfSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5a7e14dcfSSatish Balay #define taolinesearchsetobjectiveroutine_ TAOLINESEARCHSETOBJECTIVEROUTINE 6a7e14dcfSSatish Balay #define taolinesearchsetgradientroutine_ TAOLINESEARCHSETGRADIENTROUTINE 7a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgradientroutine_ TAOLINESEARCHSETOBJECTIVEANDGRADIENTROUTINE 8a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgtsroutine_ TAOLINESEARCHSETOBJECTIVEANDGTSROUTINE 9a7e14dcfSSatish Balay #define taolinesearchview_ TAOLINESEARCHVIEW 10a7e14dcfSSatish Balay #define taolinesearchsettype_ TAOLINESEARCHSETTYPE 11fe2efc57SMark #define taolinesearchviewfromoptions_ TAOLINESEARCHVIEWFROMOPTIONS 12a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 13a7e14dcfSSatish Balay 14a7e14dcfSSatish Balay #define taolinesearchsetobjectiveroutine_ taolinesearchsetobjectiveroutine 15a7e14dcfSSatish Balay #define taolinesearchsetgradientroutine_ taolinesearchsetgradientroutine 16a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgradientroutine_ taolinesearchsetobjectiveandgradientroutine 17a7e14dcfSSatish Balay #define taolinesearchsetobjectiveandgtsroutine_ taolinesearchsetobjectiveandgtsroutine 18a7e14dcfSSatish Balay #define taolinesearchview_ taolinesearchview 19a7e14dcfSSatish Balay #define taolinesearchsettype_ taolinesearchsettype 20fe2efc57SMark #define taolinesearchviewfromoptions_ taolinesearchviewfromoptions 21a7e14dcfSSatish Balay #endif 22a7e14dcfSSatish Balay 23a7e14dcfSSatish Balay static int OBJ = 0; 24a7e14dcfSSatish Balay static int GRAD = 1; 25a7e14dcfSSatish Balay static int OBJGRAD = 2; 26a7e14dcfSSatish Balay static int OBJGTS = 3; 27e0cd13aeSBarry Smith static size_t NFUNCS = 4; 28a7e14dcfSSatish Balay 29a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveroutine(TaoLineSearch ls, Vec x, PetscReal *f, void *ctx) 30a7e14dcfSSatish Balay { 319566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(TaoLineSearch *, Vec *, PetscReal *, void *, PetscErrorCode *))(((PetscObject)ls)->fortran_func_pointers[OBJ]))(&ls, &x, f, ctx, &ierr)); 323ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 33a7e14dcfSSatish Balay } 34a7e14dcfSSatish Balay 35a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchgradientroutine(TaoLineSearch ls, Vec x, Vec g, void *ctx) 36a7e14dcfSSatish Balay { 379566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(TaoLineSearch *, Vec *, Vec *, void *, PetscErrorCode *))(((PetscObject)ls)->fortran_func_pointers[GRAD]))(&ls, &x, &g, ctx, &ierr)); 383ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 39a7e14dcfSSatish Balay } 40a7e14dcfSSatish Balay 41a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveandgradientroutine(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, void *ctx) 42a7e14dcfSSatish Balay { 439566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(TaoLineSearch *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *))(((PetscObject)ls)->fortran_func_pointers[OBJGRAD]))(&ls, &x, f, &g, ctx, &ierr)); 443ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 45a7e14dcfSSatish Balay } 46a7e14dcfSSatish Balay 47a7e14dcfSSatish Balay static PetscErrorCode ourtaolinesearchobjectiveandgtsroutine(TaoLineSearch ls, Vec x, Vec s, PetscReal *f, PetscReal *gts, void *ctx) 48a7e14dcfSSatish Balay { 499566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(TaoLineSearch *, Vec *, Vec *, PetscReal *, PetscReal *, void *, PetscErrorCode *))(((PetscObject)ls)->fortran_func_pointers[OBJGTS]))(&ls, &x, &s, f, gts, ctx, &ierr)); 503ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 51a7e14dcfSSatish Balay } 52a7e14dcfSSatish Balay 5319caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsetobjectiveroutine_(TaoLineSearch *ls, void (*func)(TaoLineSearch *, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 54a7e14dcfSSatish Balay { 55a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls, NFUNCS); 56a7e14dcfSSatish Balay if (!func) { 57*dfef5ea7SSatish Balay *ierr = TaoLineSearchSetObjectiveRoutine(*ls, NULL, ctx); 58a7e14dcfSSatish Balay } else { 59a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJ] = (PetscVoidFunction)func; 60a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveRoutine(*ls, ourtaolinesearchobjectiveroutine, ctx); 61a7e14dcfSSatish Balay } 62a7e14dcfSSatish Balay } 63a7e14dcfSSatish Balay 6419caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsetgradientroutine_(TaoLineSearch *ls, void (*func)(TaoLineSearch *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 65a7e14dcfSSatish Balay { 66a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls, NFUNCS); 67a7e14dcfSSatish Balay if (!func) { 68*dfef5ea7SSatish Balay *ierr = TaoLineSearchSetGradientRoutine(*ls, NULL, ctx); 69a7e14dcfSSatish Balay } else { 70a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[GRAD] = (PetscVoidFunction)func; 71a7e14dcfSSatish Balay *ierr = TaoLineSearchSetGradientRoutine(*ls, ourtaolinesearchgradientroutine, ctx); 72a7e14dcfSSatish Balay } 73a7e14dcfSSatish Balay } 74a7e14dcfSSatish Balay 7519caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsetobjectiveandgradientroutine_(TaoLineSearch *ls, void (*func)(TaoLineSearch *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 76a7e14dcfSSatish Balay { 77a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls, NFUNCS); 78a7e14dcfSSatish Balay if (!func) { 79*dfef5ea7SSatish Balay *ierr = TaoLineSearchSetObjectiveAndGradientRoutine(*ls, NULL, ctx); 80a7e14dcfSSatish Balay } else { 81a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJGRAD] = (PetscVoidFunction)func; 82a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGradientRoutine(*ls, ourtaolinesearchobjectiveandgradientroutine, ctx); 83a7e14dcfSSatish Balay } 84a7e14dcfSSatish Balay } 85a7e14dcfSSatish Balay 8619caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsetobjectiveandgtsroutine_(TaoLineSearch *ls, void (*func)(TaoLineSearch *, Vec *, Vec *, PetscReal *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 87a7e14dcfSSatish Balay { 88a7e14dcfSSatish Balay PetscObjectAllocateFortranPointers(*ls, NFUNCS); 89a7e14dcfSSatish Balay if (!func) { 90*dfef5ea7SSatish Balay *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls, NULL, ctx); 91a7e14dcfSSatish Balay } else { 92a7e14dcfSSatish Balay ((PetscObject)*ls)->fortran_func_pointers[OBJGTS] = (PetscVoidFunction)func; 93a7e14dcfSSatish Balay *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls, ourtaolinesearchobjectiveandgtsroutine, ctx); 94a7e14dcfSSatish Balay } 95a7e14dcfSSatish Balay } 96a7e14dcfSSatish Balay 9719caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsettype_(TaoLineSearch *ls, char *type_name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 98a7e14dcfSSatish Balay 99a7e14dcfSSatish Balay { 100a7e14dcfSSatish Balay char *t; 101a7e14dcfSSatish Balay 102a7e14dcfSSatish Balay FIXCHAR(type_name, len, t); 1035975b3b6SBarry Smith *ierr = TaoLineSearchSetType(*ls, t); 1045975b3b6SBarry Smith if (*ierr) return; 105a7e14dcfSSatish Balay FREECHAR(type_name, t); 106a7e14dcfSSatish Balay } 107a7e14dcfSSatish Balay 10819caf8f3SSatish Balay PETSC_EXTERN void taolinesearchview_(TaoLineSearch *ls, PetscViewer *viewer, PetscErrorCode *ierr) 109a7e14dcfSSatish Balay { 110a7e14dcfSSatish Balay PetscViewer v; 111a7e14dcfSSatish Balay PetscPatchDefaultViewers_Fortran(viewer, v); 112a7e14dcfSSatish Balay *ierr = TaoLineSearchView(*ls, v); 113a7e14dcfSSatish Balay } 114a7e14dcfSSatish Balay 11519caf8f3SSatish Balay PETSC_EXTERN void taolinesearchgetoptionsprefix_(TaoLineSearch *ls, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 116a7e14dcfSSatish Balay { 117a7e14dcfSSatish Balay const char *name; 118a7e14dcfSSatish Balay *ierr = TaoLineSearchGetOptionsPrefix(*ls, &name); 1195975b3b6SBarry Smith *ierr = PetscStrncpy(prefix, name, len); 1205975b3b6SBarry Smith if (*ierr) return; 121a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE, prefix, len); 122a7e14dcfSSatish Balay } 123a7e14dcfSSatish Balay 12419caf8f3SSatish Balay PETSC_EXTERN void taolinesearchappendoptionsprefix_(TaoLineSearch *ls, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 125a7e14dcfSSatish Balay { 126a7e14dcfSSatish Balay char *name; 127a7e14dcfSSatish Balay FIXCHAR(prefix, len, name); 1285975b3b6SBarry Smith *ierr = TaoLineSearchAppendOptionsPrefix(*ls, name); 1295975b3b6SBarry Smith if (*ierr) return; 130a7e14dcfSSatish Balay FREECHAR(prefix, name); 131a7e14dcfSSatish Balay } 132a7e14dcfSSatish Balay 13319caf8f3SSatish Balay PETSC_EXTERN void taolinesearchsetoptionsprefix_(TaoLineSearch *ls, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 134a7e14dcfSSatish Balay { 135a7e14dcfSSatish Balay char *t; 136a7e14dcfSSatish Balay FIXCHAR(prefix, len, t); 1375975b3b6SBarry Smith *ierr = TaoLineSearchSetOptionsPrefix(*ls, t); 1385975b3b6SBarry Smith if (*ierr) return; 139a7e14dcfSSatish Balay FREECHAR(prefix, t); 140a7e14dcfSSatish Balay } 141a7e14dcfSSatish Balay 14219caf8f3SSatish Balay PETSC_EXTERN void taolinesearchgettype_(TaoLineSearch *ls, char *name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 143a7e14dcfSSatish Balay { 144a7e14dcfSSatish Balay const char *tname; 145a7e14dcfSSatish Balay *ierr = TaoLineSearchGetType(*ls, &tname); 1465975b3b6SBarry Smith *ierr = PetscStrncpy(name, tname, len); 1475975b3b6SBarry Smith if (*ierr) return; 148a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE, name, len); 149a7e14dcfSSatish Balay } 15019caf8f3SSatish Balay PETSC_EXTERN void taolinesearchviewfromoptions_(TaoLineSearch *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 151fe2efc57SMark { 152fe2efc57SMark char *t; 153fe2efc57SMark 154fe2efc57SMark FIXCHAR(type, len, t); 155b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 1565975b3b6SBarry Smith *ierr = TaoLineSearchViewFromOptions(*ao, obj, t); 1575975b3b6SBarry Smith if (*ierr) return; 158fe2efc57SMark FREECHAR(type, t); 159fe2efc57SMark } 160