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