xref: /petsc/src/tao/linesearch/interface/ftn-custom/ztaolinesearchf.c (revision dfef5ea798a36ccc664ca1bbe435d183ec21e5c1)
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