PETSC_EXTERN void PETSC_STDCALL taosetseparableobjectiveroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) { PetscObjectAllocateFortranPointers(*tao,NFUNCS); if (!func) { *ierr = TaoSetSeparableObjectiveRoutine(*tao,*F,0,ctx); } else { ((PetscObject)*tao)->fortran_func_pointers[SEPOBJ] = (PetscVoidFunction)func; *ierr = TaoSetSeparableObjectiveRoutine(*tao,*F, ourtaoseparableobjectiveroutine,ctx); } }
int main(int argc,char **argv) { PetscErrorCode ierr; /* used to check for functions returning nonzeros */ Vec x, f; /* solution, function */ Mat J; /* Jacobian matrix */ Tao tao; /* Tao solver context */ PetscInt i; /* iteration information */ PetscReal hist[100],resid[100]; PetscInt lits[100]; AppCtx user; /* user-defined work context */ PetscInitialize(&argc,&argv,(char *)0,help); /* Allocate vectors */ ierr = VecCreateSeq(MPI_COMM_SELF,NPARAMETERS,&x);CHKERRQ(ierr); ierr = VecCreateSeq(MPI_COMM_SELF,NOBSERVATIONS,&f);CHKERRQ(ierr); /* Create the Jacobian matrix. */ ierr = MatCreateSeqDense(MPI_COMM_SELF,NOBSERVATIONS,NPARAMETERS,NULL,&J);CHKERRQ(ierr); for (i=0;i<NOBSERVATIONS;i++) user.idm[i] = i; for (i=0;i<NPARAMETERS;i++) user.idn[i] = i; /* Create TAO solver and set desired solution method */ ierr = TaoCreate(PETSC_COMM_SELF,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOPOUNDERS);CHKERRQ(ierr); /* Set the function and Jacobian routines. */ ierr = InitializeData(&user);CHKERRQ(ierr); ierr = FormStartingPoint(x);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,x);CHKERRQ(ierr); ierr = TaoSetSeparableObjectiveRoutine(tao,f,EvaluateFunction,(void*)&user);CHKERRQ(ierr); ierr = TaoSetJacobianRoutine(tao, J, J, EvaluateJacobian, (void*)&user);CHKERRQ(ierr); /* Check for any TAO command line arguments */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); ierr = TaoSetConvergenceHistory(tao,hist,resid,0,lits,100,PETSC_TRUE);CHKERRQ(ierr); /* Perform the Solve */ ierr = TaoSolve(tao);CHKERRQ(ierr); ierr = TaoView(tao,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); /* Free TAO data structures */ ierr = TaoDestroy(&tao);CHKERRQ(ierr); /* Free PETSc data structures */ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&f);CHKERRQ(ierr); ierr = MatDestroy(&J);CHKERRQ(ierr); PetscFinalize(); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; /* used to check for functions returning nonzeros */ Vec x, f; /* solution, function */ Tao tao; /* Tao solver context */ AppCtx user; /* user-defined work context */ /* Initialize TAO and PETSc */ PetscInitialize(&argc,&argv,(char *)0,help); MPI_Comm_size(MPI_COMM_WORLD,&user.size); MPI_Comm_rank(MPI_COMM_WORLD,&user.rank); ierr = InitializeData(&user);CHKERRQ(ierr); /* Run optimization on rank 0 */ if (user.rank == 0) { /* Allocate vectors */ ierr = VecCreateSeq(PETSC_COMM_SELF,NPARAMETERS,&x);CHKERRQ(ierr); ierr = VecCreateSeq(PETSC_COMM_SELF,NOBSERVATIONS,&f);CHKERRQ(ierr); /* TAO code begins here */ /* Create TAO solver and set desired solution method */ ierr = TaoCreate(PETSC_COMM_SELF,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOPOUNDERS);CHKERRQ(ierr); /* Set the function and Jacobian routines. */ ierr = FormStartingPoint(x);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,x);CHKERRQ(ierr); ierr = TaoSetSeparableObjectiveRoutine(tao,f,EvaluateFunction,(void*)&user);CHKERRQ(ierr); /* Check for any TAO command line arguments */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); /* Perform the Solve */ ierr = TaoSolve(tao);CHKERRQ(ierr); /* Free TAO data structures */ ierr = TaoDestroy(&tao);CHKERRQ(ierr); /* Free PETSc data structures */ ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&f);CHKERRQ(ierr); StopWorkers(&user); } else { TaskWorker(&user); } PetscFinalize(); return 0; }