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