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