xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision a7e14dcfba0d07adf6226a919460249440ec94c7)
1*a7e14dcfSSatish Balay #include "petsc-private/fortranimpl.h"
2*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h"
3*a7e14dcfSSatish Balay 
4*a7e14dcfSSatish Balay 
5*a7e14dcfSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
6*a7e14dcfSSatish Balay #define taosetobjectiveroutine_             TAOSETOBJECTIVEROUTINE
7*a7e14dcfSSatish Balay #define taosetgradientroutine_              TAOSETGRADIENTROUTINE
8*a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  TAOSETOBJECTIVEANDGRADIENTROUTINE
9*a7e14dcfSSatish Balay #define taosethessianroutine_               TAOSETHESSIANROUTINE
10*a7e14dcfSSatish Balay #define taosetseparableobjectiveroutine_    TAOSETSEPARABLEOBJECTIVEROUTINE
11*a7e14dcfSSatish Balay #define taosetjacobianroutine_              TAOSETJACOBIANROUTINE
12*a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         TAOSETJACOBIANSTATEROUTINE
13*a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        TAOSETJACOBIANDESIGNROUTINE
14*a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    TAOSETJACOBIANINEQUALITYROUTINE
15*a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      TAOSETJACOBIANEQUALITYROUTINE
16*a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ TAOSETINEQUALITYCONSTRAINTSROUTINE
17*a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   TAOSETEQUALITYCONSTRAINTSROUTINE
18*a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        TAOSETVARIABLEBOUNDSROUTINE
19*a7e14dcfSSatish Balay #define taosetconstraintsroutine_           TAOSETCONSTRAINTSROUTINE
20*a7e14dcfSSatish Balay #define taosetmonitor_                      TAOSETMONITOR
21*a7e14dcfSSatish Balay #define taosettype_                         TAOSETTYPE
22*a7e14dcfSSatish Balay #define taoview_                            TAOVIEW
23*a7e14dcfSSatish Balay #define taogethistory_                      TAOGETHISTORY
24*a7e14dcfSSatish Balay #define taosetconvergencetest_              TAOSETCONVERGENCETEST
25*a7e14dcfSSatish Balay #define taogetoptionsprefix_                TAOGETOPTIONSPREFIX
26*a7e14dcfSSatish Balay #define taosetoptionsprefix_                TAOSETOPTIONSPREFIX
27*a7e14dcfSSatish Balay #define taoappendoptionsprefix_             TAOAPPENDOPTIONSPREFIX
28*a7e14dcfSSatish Balay #define taogettype_                         TAOGETTYPE
29*a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
30*a7e14dcfSSatish Balay 
31*a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
32*a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
33*a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
34*a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
35*a7e14dcfSSatish Balay #define taosetseparableobjectiveroutine_    taosetseparableobjectiveroutine
36*a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
37*a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
38*a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
39*a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
40*a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
41*a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
42*a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
43*a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
44*a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
45*a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
46*a7e14dcfSSatish Balay #define taosettype_                         taosettype
47*a7e14dcfSSatish Balay #define taoview_                            taoview
48*a7e14dcfSSatish Balay #define taogethistory_                      taogethistory
49*a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
50*a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
51*a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
52*a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
53*a7e14dcfSSatish Balay #define taogettype_                         taogettype
54*a7e14dcfSSatish Balay #endif
55*a7e14dcfSSatish Balay 
56*a7e14dcfSSatish Balay static int OBJ=0;       /*  objective routine index */
57*a7e14dcfSSatish Balay static int GRAD=1;      /*  gradient routine index */
58*a7e14dcfSSatish Balay static int OBJGRAD=2;   /*  objective and gradient routine */
59*a7e14dcfSSatish Balay static int HESS=3;      /*  hessian routine index */
60*a7e14dcfSSatish Balay static int SEPOBJ=4;    /*  separable objective routine index */
61*a7e14dcfSSatish Balay static int JAC=5;       /*  jacobian routine index */
62*a7e14dcfSSatish Balay static int JACSTATE=6;  /*  jacobian state routine index */
63*a7e14dcfSSatish Balay static int JACDESIGN=7; /*  jacobian design routine index */
64*a7e14dcfSSatish Balay static int BOUNDS=8;
65*a7e14dcfSSatish Balay static int MON=9;       /*  monitor routine index */
66*a7e14dcfSSatish Balay static int MONCTX=10;       /*  monitor routine index */
67*a7e14dcfSSatish Balay static int MONDESTROY=11; /*  monitor destroy index */
68*a7e14dcfSSatish Balay static int CONVTEST=12;  /*  */
69*a7e14dcfSSatish Balay static int CONSTRAINTS=13;
70*a7e14dcfSSatish Balay static int JACINEQ=14;
71*a7e14dcfSSatish Balay static int JACEQ=15;
72*a7e14dcfSSatish Balay static int CONINEQ=16;
73*a7e14dcfSSatish Balay static int CONEQ=17;
74*a7e14dcfSSatish Balay static int NFUNCS=18;
75*a7e14dcfSSatish Balay 
76*a7e14dcfSSatish Balay static PetscErrorCode ourtaoobjectiveroutine(TaoSolver tao, Vec x, PetscReal *f, void *ctx)
77*a7e14dcfSSatish Balay {
78*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
79*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,PetscReal*,void*,PetscErrorCode*))
80*a7e14dcfSSatish Balay 	(((PetscObject)tao)->fortran_func_pointers[OBJ]))(&tao,&x,f,ctx,&ierr);
81*a7e14dcfSSatish Balay     CHKERRQ(ierr);
82*a7e14dcfSSatish Balay     return 0;
83*a7e14dcfSSatish Balay }
84*a7e14dcfSSatish Balay 
85*a7e14dcfSSatish Balay static PetscErrorCode ourtaogradientroutine(TaoSolver tao, Vec x, Vec g, void *ctx)
86*a7e14dcfSSatish Balay {
87*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
88*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
89*a7e14dcfSSatish Balay        (((PetscObject)tao)->fortran_func_pointers[GRAD]))(&tao,&x,&g,ctx,&ierr);
90*a7e14dcfSSatish Balay     CHKERRQ(ierr);
91*a7e14dcfSSatish Balay     return 0;
92*a7e14dcfSSatish Balay 
93*a7e14dcfSSatish Balay }
94*a7e14dcfSSatish Balay 
95*a7e14dcfSSatish Balay static PetscErrorCode ourtaoobjectiveandgradientroutine(TaoSolver tao, Vec x, PetscReal *f, Vec g, void* ctx)
96*a7e14dcfSSatish Balay {
97*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
98*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*))
99*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[OBJGRAD]))(&tao,&x,f,&g,ctx,&ierr);
100*a7e14dcfSSatish Balay     CHKERRQ(ierr);
101*a7e14dcfSSatish Balay     return 0;
102*a7e14dcfSSatish Balay }
103*a7e14dcfSSatish Balay 
104*a7e14dcfSSatish Balay static PetscErrorCode ourtaohessianroutine(TaoSolver tao, Vec x, Mat *H, Mat *Hpre, MatStructure *type, void *ctx)
105*a7e14dcfSSatish Balay {
106*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
107*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))
108*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[HESS]))(&tao,&x,H,Hpre,type,ctx,&ierr); CHKERRQ(ierr);
109*a7e14dcfSSatish Balay     return 0;
110*a7e14dcfSSatish Balay }
111*a7e14dcfSSatish Balay 
112*a7e14dcfSSatish Balay static PetscErrorCode ourtaojacobianroutine(TaoSolver tao, Vec x, Mat *H, Mat *Hpre, MatStructure *type, void *ctx)
113*a7e14dcfSSatish Balay {
114*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
115*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))
116*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[JAC]))(&tao,&x,H,Hpre,type,ctx,&ierr); CHKERRQ(ierr);
117*a7e14dcfSSatish Balay     return 0;
118*a7e14dcfSSatish Balay }
119*a7e14dcfSSatish Balay 
120*a7e14dcfSSatish Balay static PetscErrorCode ourtaojacobianstateroutine(TaoSolver tao, Vec x, Mat *H, Mat *Hpre, Mat *Hinv, MatStructure *type, void *ctx)
121*a7e14dcfSSatish Balay {
122*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
123*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))
124*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[JACSTATE]))(&tao,&x,H,Hpre,Hinv,type,ctx,&ierr); CHKERRQ(ierr);
125*a7e14dcfSSatish Balay     return 0;
126*a7e14dcfSSatish Balay }
127*a7e14dcfSSatish Balay 
128*a7e14dcfSSatish Balay static PetscErrorCode ourtaojacobiandesignroutine(TaoSolver tao, Vec x, Mat *H, void *ctx)
129*a7e14dcfSSatish Balay {
130*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
131*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,void*,PetscErrorCode*))
132*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[JACDESIGN]))(&tao,&x,H,ctx,&ierr); CHKERRQ(ierr);
133*a7e14dcfSSatish Balay     return 0;
134*a7e14dcfSSatish Balay }
135*a7e14dcfSSatish Balay 
136*a7e14dcfSSatish Balay static PetscErrorCode ourtaoboundsroutine(TaoSolver tao, Vec xl, Vec xu, void *ctx)
137*a7e14dcfSSatish Balay {
138*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
139*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
140*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[BOUNDS]))(&tao,&xl,&xu,ctx,&ierr); CHKERRQ(ierr);
141*a7e14dcfSSatish Balay     return 0;
142*a7e14dcfSSatish Balay }
143*a7e14dcfSSatish Balay static PetscErrorCode ourtaoseparableobjectiveroutine(TaoSolver tao, Vec x, Vec f, void *ctx)
144*a7e14dcfSSatish Balay {
145*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
146*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
147*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[SEPOBJ]))(&tao,&x,&f,ctx,&ierr);
148*a7e14dcfSSatish Balay     return 0;
149*a7e14dcfSSatish Balay }
150*a7e14dcfSSatish Balay 
151*a7e14dcfSSatish Balay static PetscErrorCode ourtaomonitor(TaoSolver tao, void *ctx)
152*a7e14dcfSSatish Balay {
153*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
154*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver *, void*, PetscErrorCode*))
155*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[MON]))(&tao,ctx,&ierr);
156*a7e14dcfSSatish Balay     CHKERRQ(ierr);
157*a7e14dcfSSatish Balay     return 0;
158*a7e14dcfSSatish Balay }
159*a7e14dcfSSatish Balay 
160*a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
161*a7e14dcfSSatish Balay {
162*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
163*a7e14dcfSSatish Balay     TaoSolver tao = *(TaoSolver*)ctx;
164*a7e14dcfSSatish Balay     void *mctx = (void*)((PetscObject)tao)->fortran_func_pointers[MONCTX];
165*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)tao)->fortran_func_pointers[MONDESTROY]))(mctx,&ierr); CHKERRQ(ierr);
166*a7e14dcfSSatish Balay     return 0;
167*a7e14dcfSSatish Balay }
168*a7e14dcfSSatish Balay static PetscErrorCode ourtaoconvergencetest(TaoSolver tao, void *ctx)
169*a7e14dcfSSatish Balay {
170*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
171*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver *, void*, PetscErrorCode*))
172*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[CONVTEST]))(&tao,ctx,&ierr);
173*a7e14dcfSSatish Balay     CHKERRQ(ierr);
174*a7e14dcfSSatish Balay     return 0;
175*a7e14dcfSSatish Balay }
176*a7e14dcfSSatish Balay 
177*a7e14dcfSSatish Balay 
178*a7e14dcfSSatish Balay static PetscErrorCode ourtaoconstraintsroutine(TaoSolver tao, Vec x, Vec c, void *ctx)
179*a7e14dcfSSatish Balay {
180*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
181*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
182*a7e14dcfSSatish Balay        (((PetscObject)tao)->fortran_func_pointers[CONSTRAINTS]))(&tao,&x,&c,ctx,&ierr);
183*a7e14dcfSSatish Balay     CHKERRQ(ierr);
184*a7e14dcfSSatish Balay     return 0;
185*a7e14dcfSSatish Balay 
186*a7e14dcfSSatish Balay }
187*a7e14dcfSSatish Balay 
188*a7e14dcfSSatish Balay static PetscErrorCode ourtaojacobianinequalityroutine(TaoSolver tao, Vec x, Mat *J, Mat *Jpre, MatStructure *type, void *ctx)
189*a7e14dcfSSatish Balay {
190*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
191*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))
192*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[JACINEQ]))(&tao,&x,J,Jpre,type,ctx,&ierr); CHKERRQ(ierr);
193*a7e14dcfSSatish Balay     return 0;
194*a7e14dcfSSatish Balay }
195*a7e14dcfSSatish Balay 
196*a7e14dcfSSatish Balay static PetscErrorCode ourtaojacobianequalityroutine(TaoSolver tao, Vec x, Mat *J, Mat *Jpre, MatStructure *type, void *ctx)
197*a7e14dcfSSatish Balay {
198*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
199*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))
200*a7e14dcfSSatish Balay      (((PetscObject)tao)->fortran_func_pointers[JACEQ]))(&tao,&x,J,Jpre,type,ctx,&ierr); CHKERRQ(ierr);
201*a7e14dcfSSatish Balay     return 0;
202*a7e14dcfSSatish Balay }
203*a7e14dcfSSatish Balay 
204*a7e14dcfSSatish Balay static PetscErrorCode ourtaoinequalityconstraintsroutine(TaoSolver tao, Vec x, Vec c, void *ctx)
205*a7e14dcfSSatish Balay {
206*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
207*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
208*a7e14dcfSSatish Balay        (((PetscObject)tao)->fortran_func_pointers[CONINEQ]))(&tao,&x,&c,ctx,&ierr);
209*a7e14dcfSSatish Balay     CHKERRQ(ierr);
210*a7e14dcfSSatish Balay     return 0;
211*a7e14dcfSSatish Balay 
212*a7e14dcfSSatish Balay }
213*a7e14dcfSSatish Balay 
214*a7e14dcfSSatish Balay static PetscErrorCode ourtaoequalityconstraintsroutine(TaoSolver tao, Vec x, Vec c, void *ctx)
215*a7e14dcfSSatish Balay {
216*a7e14dcfSSatish Balay     PetscErrorCode ierr = 0;
217*a7e14dcfSSatish Balay     (*(void (PETSC_STDCALL *)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*))
218*a7e14dcfSSatish Balay        (((PetscObject)tao)->fortran_func_pointers[CONEQ]))(&tao,&x,&c,ctx,&ierr);
219*a7e14dcfSSatish Balay     CHKERRQ(ierr);
220*a7e14dcfSSatish Balay     return 0;
221*a7e14dcfSSatish Balay 
222*a7e14dcfSSatish Balay }
223*a7e14dcfSSatish Balay 
224*a7e14dcfSSatish Balay 
225*a7e14dcfSSatish Balay EXTERN_C_BEGIN
226*a7e14dcfSSatish Balay 
227*a7e14dcfSSatish Balay 
228*a7e14dcfSSatish Balay void PETSC_STDCALL taosetobjectiveroutine_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
229*a7e14dcfSSatish Balay {
230*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
231*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
232*a7e14dcfSSatish Balay     if (!func) {
233*a7e14dcfSSatish Balay 	*ierr = TaoSetObjectiveRoutine(*tao,0,ctx);
234*a7e14dcfSSatish Balay     } else {
235*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[OBJ] = (PetscVoidFunction)func;
236*a7e14dcfSSatish Balay 	*ierr = TaoSetObjectiveRoutine(*tao, ourtaoobjectiveroutine,ctx);
237*a7e14dcfSSatish Balay     }
238*a7e14dcfSSatish Balay }
239*a7e14dcfSSatish Balay 
240*a7e14dcfSSatish Balay void PETSC_STDCALL taosetgradientroutine_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
241*a7e14dcfSSatish Balay {
242*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
243*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
244*a7e14dcfSSatish Balay     if (!func) {
245*a7e14dcfSSatish Balay 	*ierr = TaoSetGradientRoutine(*tao,0,ctx);
246*a7e14dcfSSatish Balay     } else {
247*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[GRAD] = (PetscVoidFunction)func;
248*a7e14dcfSSatish Balay 	*ierr = TaoSetGradientRoutine(*tao, ourtaogradientroutine,ctx);
249*a7e14dcfSSatish Balay     }
250*a7e14dcfSSatish Balay }
251*a7e14dcfSSatish Balay 
252*a7e14dcfSSatish Balay void PETSC_STDCALL taosetobjectiveandgradientroutine_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
253*a7e14dcfSSatish Balay {
254*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
255*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
256*a7e14dcfSSatish Balay     if (!func) {
257*a7e14dcfSSatish Balay 	*ierr = TaoSetObjectiveAndGradientRoutine(*tao,0,ctx);
258*a7e14dcfSSatish Balay     } else {
259*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[OBJGRAD] = (PetscVoidFunction)func;
260*a7e14dcfSSatish Balay 	*ierr = TaoSetObjectiveAndGradientRoutine(*tao, ourtaoobjectiveandgradientroutine,ctx);
261*a7e14dcfSSatish Balay     }
262*a7e14dcfSSatish Balay }
263*a7e14dcfSSatish Balay 
264*a7e14dcfSSatish Balay 
265*a7e14dcfSSatish Balay 
266*a7e14dcfSSatish Balay 
267*a7e14dcfSSatish Balay void PETSC_STDCALL taosetseparableobjectiveroutine_(TaoSolver *tao, Vec *F, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
268*a7e14dcfSSatish Balay {
269*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
270*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
271*a7e14dcfSSatish Balay     if (!func) {
272*a7e14dcfSSatish Balay 	*ierr = TaoSetSeparableObjectiveRoutine(*tao,*F,0,ctx);
273*a7e14dcfSSatish Balay     } else {
274*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[SEPOBJ] = (PetscVoidFunction)func;
275*a7e14dcfSSatish Balay 	*ierr = TaoSetSeparableObjectiveRoutine(*tao,*F, ourtaoseparableobjectiveroutine,ctx);
276*a7e14dcfSSatish Balay     }
277*a7e14dcfSSatish Balay }
278*a7e14dcfSSatish Balay 
279*a7e14dcfSSatish Balay 
280*a7e14dcfSSatish Balay 
281*a7e14dcfSSatish Balay void PETSC_STDCALL taosetjacobianroutine_(TaoSolver *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, Mat *, MatStructure *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
282*a7e14dcfSSatish Balay {
283*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
284*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
285*a7e14dcfSSatish Balay     if (!func) {
286*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,0,ctx);
287*a7e14dcfSSatish Balay     } else {
288*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[JAC] = (PetscVoidFunction)func;
289*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianRoutine(*tao,*J, *Jp, ourtaojacobianroutine,ctx);
290*a7e14dcfSSatish Balay     }
291*a7e14dcfSSatish Balay }
292*a7e14dcfSSatish Balay 
293*a7e14dcfSSatish Balay void PETSC_STDCALL taosetjacobianstateroutine_(TaoSolver *tao, Mat *J, Mat *Jp, Mat*Jinv, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, Mat *, Mat*, MatStructure *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
294*a7e14dcfSSatish Balay {
295*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
296*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
297*a7e14dcfSSatish Balay     if (!func) {
298*a7e14dcfSSatish Balay       *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,0,ctx);
299*a7e14dcfSSatish Balay     } else {
300*a7e14dcfSSatish Balay       ((PetscObject)*tao)->fortran_func_pointers[JACSTATE] = (PetscVoidFunction)func;
301*a7e14dcfSSatish Balay       *ierr = TaoSetJacobianStateRoutine(*tao,*J, *Jp, *Jinv, ourtaojacobianstateroutine,ctx);
302*a7e14dcfSSatish Balay     }
303*a7e14dcfSSatish Balay }
304*a7e14dcfSSatish Balay 
305*a7e14dcfSSatish Balay void PETSC_STDCALL taosetjacobiandesignroutine_(TaoSolver *tao, Mat *J, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
306*a7e14dcfSSatish Balay {
307*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
308*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
309*a7e14dcfSSatish Balay     if (!func) {
310*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianDesignRoutine(*tao,*J,0,ctx);
311*a7e14dcfSSatish Balay     } else {
312*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[JACDESIGN] = (PetscVoidFunction)func;
313*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianDesignRoutine(*tao,*J, ourtaojacobiandesignroutine,ctx);
314*a7e14dcfSSatish Balay     }
315*a7e14dcfSSatish Balay }
316*a7e14dcfSSatish Balay 
317*a7e14dcfSSatish Balay 
318*a7e14dcfSSatish Balay void PETSC_STDCALL taosethessianroutine_(TaoSolver *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, Mat *, MatStructure *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
319*a7e14dcfSSatish Balay {
320*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
321*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
322*a7e14dcfSSatish Balay     if (!func) {
323*a7e14dcfSSatish Balay 	*ierr = TaoSetHessianRoutine(*tao,*J,*Jp,0,ctx);
324*a7e14dcfSSatish Balay     } else {
325*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[HESS] = (PetscVoidFunction)func;
326*a7e14dcfSSatish Balay 	*ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
327*a7e14dcfSSatish Balay     }
328*a7e14dcfSSatish Balay }
329*a7e14dcfSSatish Balay 
330*a7e14dcfSSatish Balay void PETSC_STDCALL taosetvariableboundsroutine_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
331*a7e14dcfSSatish Balay {
332*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
333*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
334*a7e14dcfSSatish Balay     if (func) {
335*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[BOUNDS] = (PetscVoidFunction)func;
336*a7e14dcfSSatish Balay 	*ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
337*a7e14dcfSSatish Balay     } else {
338*a7e14dcfSSatish Balay 	*ierr = TaoSetVariableBoundsRoutine(*tao,0,ctx);
339*a7e14dcfSSatish Balay     }
340*a7e14dcfSSatish Balay 
341*a7e14dcfSSatish Balay }
342*a7e14dcfSSatish Balay void PETSC_STDCALL taosetmonitor_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*,void*,PetscErrorCode*),void *ctx, void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
343*a7e14dcfSSatish Balay {
344*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
345*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
346*a7e14dcfSSatish Balay     if (func) {
347*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[MON] = (PetscVoidFunction)func;
348*a7e14dcfSSatish Balay 	if (FORTRANNULLFUNCTION(mondestroy)){
349*a7e14dcfSSatish Balay 	  *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,PETSC_NULL);
350*a7e14dcfSSatish Balay 	} else {
351*a7e14dcfSSatish Balay 	  *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
352*a7e14dcfSSatish Balay 	}
353*a7e14dcfSSatish Balay     }
354*a7e14dcfSSatish Balay }
355*a7e14dcfSSatish Balay 
356*a7e14dcfSSatish Balay void PETSC_STDCALL taosetconvergencetest_(TaoSolver *tao, void (PETSC_STDCALL *func)(TaoSolver*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
357*a7e14dcfSSatish Balay {
358*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
359*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
360*a7e14dcfSSatish Balay     if (!func) {
361*a7e14dcfSSatish Balay 	*ierr = TaoSetConvergenceTest(*tao,0,ctx);
362*a7e14dcfSSatish Balay     } else {
363*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[CONVTEST] = (PetscVoidFunction)func;
364*a7e14dcfSSatish Balay 	*ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
365*a7e14dcfSSatish Balay     }
366*a7e14dcfSSatish Balay }
367*a7e14dcfSSatish Balay 
368*a7e14dcfSSatish Balay 
369*a7e14dcfSSatish Balay void PETSC_STDCALL taosetconstraintsroutine_(TaoSolver *tao, Vec *C, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
370*a7e14dcfSSatish Balay {
371*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
372*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
373*a7e14dcfSSatish Balay     if (!func) {
374*a7e14dcfSSatish Balay       *ierr = TaoSetConstraintsRoutine(*tao,*C,0,ctx);
375*a7e14dcfSSatish Balay     } else {
376*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[CONSTRAINTS] = (PetscVoidFunction)func;
377*a7e14dcfSSatish Balay 	*ierr = TaoSetConstraintsRoutine(*tao, *C, ourtaoconstraintsroutine,ctx);
378*a7e14dcfSSatish Balay     }
379*a7e14dcfSSatish Balay }
380*a7e14dcfSSatish Balay 
381*a7e14dcfSSatish Balay 
382*a7e14dcfSSatish Balay void PETSC_STDCALL taosettype_(TaoSolver *tao, CHAR type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
383*a7e14dcfSSatish Balay 
384*a7e14dcfSSatish Balay {
385*a7e14dcfSSatish Balay     char *t;
386*a7e14dcfSSatish Balay 
387*a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
388*a7e14dcfSSatish Balay     *ierr = TaoSetType(*tao,t);
389*a7e14dcfSSatish Balay     FREECHAR(type_name,t);
390*a7e14dcfSSatish Balay 
391*a7e14dcfSSatish Balay }
392*a7e14dcfSSatish Balay 
393*a7e14dcfSSatish Balay void PETSC_STDCALL taoview_(TaoSolver *tao, PetscViewer *viewer, PetscErrorCode *ierr)
394*a7e14dcfSSatish Balay {
395*a7e14dcfSSatish Balay     PetscViewer v;
396*a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
397*a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
398*a7e14dcfSSatish Balay }
399*a7e14dcfSSatish Balay 
400*a7e14dcfSSatish Balay void PETSC_STDCALL taogethistory_(TaoSolver *tao, PetscInt *nhist, PetscErrorCode *ierr)
401*a7e14dcfSSatish Balay {
402*a7e14dcfSSatish Balay   *nhist  = (*tao)->hist_len;
403*a7e14dcfSSatish Balay   *ierr = 0;
404*a7e14dcfSSatish Balay }
405*a7e14dcfSSatish Balay 
406*a7e14dcfSSatish Balay void PETSC_STDCALL taogetoptionsprefix_(TaoSolver *tao, CHAR prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
407*a7e14dcfSSatish Balay {
408*a7e14dcfSSatish Balay   const char *name;
409*a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
410*a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
411*a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
412*a7e14dcfSSatish Balay 
413*a7e14dcfSSatish Balay }
414*a7e14dcfSSatish Balay 
415*a7e14dcfSSatish Balay void PETSC_STDCALL taoappendoptionsprefix_(TaoSolver *tao, CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
416*a7e14dcfSSatish Balay {
417*a7e14dcfSSatish Balay   char *name;
418*a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
419*a7e14dcfSSatish Balay   *ierr = TaoAppendOptionsPrefix(*tao,name);
420*a7e14dcfSSatish Balay   FREECHAR(prefix,name);
421*a7e14dcfSSatish Balay }
422*a7e14dcfSSatish Balay 
423*a7e14dcfSSatish Balay void PETSC_STDCALL taosetoptionsprefix_(TaoSolver *tao, CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
424*a7e14dcfSSatish Balay {
425*a7e14dcfSSatish Balay   char *t;
426*a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
427*a7e14dcfSSatish Balay   *ierr = TaoSetOptionsPrefix(*tao,t);
428*a7e14dcfSSatish Balay   FREECHAR(prefix,t);
429*a7e14dcfSSatish Balay }
430*a7e14dcfSSatish Balay 
431*a7e14dcfSSatish Balay void PETSC_STDCALL taogettype_(TaoSolver *tao, CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr  PETSC_END_LEN(len))
432*a7e14dcfSSatish Balay {
433*a7e14dcfSSatish Balay   const char *tname;
434*a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
435*a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
436*a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
437*a7e14dcfSSatish Balay 
438*a7e14dcfSSatish Balay }
439*a7e14dcfSSatish Balay 
440*a7e14dcfSSatish Balay 
441*a7e14dcfSSatish Balay void PETSC_STDCALL taosetjacobianinequalityroutine_(TaoSolver *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, Mat *, MatStructure *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
442*a7e14dcfSSatish Balay {
443*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
444*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
445*a7e14dcfSSatish Balay     if (!func) {
446*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,0,ctx);
447*a7e14dcfSSatish Balay     } else {
448*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[JACINEQ] = (PetscVoidFunction)func;
449*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianInequalityRoutine(*tao,*J, *Jp, ourtaojacobianinequalityroutine,ctx);
450*a7e14dcfSSatish Balay     }
451*a7e14dcfSSatish Balay }
452*a7e14dcfSSatish Balay 
453*a7e14dcfSSatish Balay void PETSC_STDCALL taosetjacobianequalityroutine_(TaoSolver *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Mat *, Mat *, MatStructure *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
454*a7e14dcfSSatish Balay {
455*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
456*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
457*a7e14dcfSSatish Balay     if (!func) {
458*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,0,ctx);
459*a7e14dcfSSatish Balay     } else {
460*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[JACEQ] = (PetscVoidFunction)func;
461*a7e14dcfSSatish Balay 	*ierr = TaoSetJacobianEqualityRoutine(*tao,*J, *Jp, ourtaojacobianequalityroutine,ctx);
462*a7e14dcfSSatish Balay     }
463*a7e14dcfSSatish Balay }
464*a7e14dcfSSatish Balay 
465*a7e14dcfSSatish Balay 
466*a7e14dcfSSatish Balay void PETSC_STDCALL taosetinequalityconstraintsroutine_(TaoSolver *tao, Vec *C, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
467*a7e14dcfSSatish Balay {
468*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
469*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
470*a7e14dcfSSatish Balay     if (!func) {
471*a7e14dcfSSatish Balay       *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,0,ctx);
472*a7e14dcfSSatish Balay     } else {
473*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[CONINEQ] = (PetscVoidFunction)func;
474*a7e14dcfSSatish Balay 	*ierr = TaoSetInequalityConstraintsRoutine(*tao, *C, ourtaoinequalityconstraintsroutine,ctx);
475*a7e14dcfSSatish Balay     }
476*a7e14dcfSSatish Balay }
477*a7e14dcfSSatish Balay 
478*a7e14dcfSSatish Balay void PETSC_STDCALL taosetequalityconstraintsroutine_(TaoSolver *tao, Vec *C, void (PETSC_STDCALL *func)(TaoSolver*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
479*a7e14dcfSSatish Balay {
480*a7e14dcfSSatish Balay     CHKFORTRANNULLOBJECT(ctx);
481*a7e14dcfSSatish Balay     PetscObjectAllocateFortranPointers(*tao,NFUNCS);
482*a7e14dcfSSatish Balay     if (!func) {
483*a7e14dcfSSatish Balay       *ierr = TaoSetEqualityConstraintsRoutine(*tao,*C,0,ctx);
484*a7e14dcfSSatish Balay     } else {
485*a7e14dcfSSatish Balay 	((PetscObject)*tao)->fortran_func_pointers[CONEQ] = (PetscVoidFunction)func;
486*a7e14dcfSSatish Balay 	*ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
487*a7e14dcfSSatish Balay     }
488*a7e14dcfSSatish Balay }
489*a7e14dcfSSatish Balay 
490*a7e14dcfSSatish Balay 
491*a7e14dcfSSatish Balay EXTERN_C_END
492*a7e14dcfSSatish Balay 
493*a7e14dcfSSatish Balay 
494