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; }
int main(int argc,char **argv) { int info; /* used to check for functions returning nonzeros */ Vec x, f; /* solution, function */ Mat J; /* Jacobian of constraints function */ TAO_SOLVER tao; /* TAO_SOLVER solver context */ TAO_APPLICATION taoapp; /* the PETSc application */ int* matarray; TaoMethod method = "tao_nlsq"; /* minimization method */ int i; AppCtx user; /* application context */ /* Initialize TAO and PETSc */ PetscInitialize(&argc,&argv,(char *)0,help); TaoInitialize(&argc,&argv,(char *)0,help); /* Initialize application data -- user function */ info = AppCtxInitialize(&user); CHKERRQ(info); /* Allocate vectors */ info = VecCreateSeq(MPI_COMM_SELF,user.nvar,&x); CHKERRQ(info); info = VecCreateSeq(MPI_COMM_SELF,user.ncnst,&f); CHKERRQ(info); /* Create Jacobian matrix */ info = PetscMalloc(sizeof(int)*user.ncnst, (void*) &matarray);CHKERRQ(info); for(i=0; i< user.mdiv2;i++){ matarray[i]=6; matarray[i+user.mdiv2]=1; } info = MatCreateSeqAIJ(MPI_COMM_WORLD,user.ncnst,user.nvar,TAO_NULL,matarray,&J); CHKERRQ(info); /* TAO code begins here */ /* Create TAO solver */ info = TaoCreate(MPI_COMM_SELF,method,&tao);CHKERRQ(info); info = TaoPetscApplicationCreate(PETSC_COMM_SELF,&taoapp); CHKERRQ(info); /* Set the function and Jacobian routines. */ info = TaoSetPetscFunction(taoapp,x,TAO_NULL,TAO_NULL); CHKERRQ(info); info = TaoSetPetscJacobian(taoapp, J, EvaluateJacobian, (void*)&user); CHKERRQ(info); info = TaoSetPetscConstraintsFunction(taoapp, f, EvaluateConstraints,(void*) &user); CHKERRQ(info); /* Compute the standard starting point. */ info = FormStartingPoint(&user, x); CHKERRQ(info); info = TaoSetPetscInitialVector(taoapp,x); CHKERRQ(info); /* Now that the PETSc application is set, attach to TAO context */ info = TaoSetApplication(tao,taoapp); CHKERRQ(info); /* Check for any TAO command line arguments */ info = TaoSetFromOptions(tao); CHKERRQ(info); /* Perform the Solve */ info = TaoSolve(tao); CHKERRQ(info); /* Free TAO data structures */ info = TaoApplicationDestroy(taoapp); CHKERRQ(info); info = TaoDestroy(tao); CHKERRQ(info); /* Free PETSc data structures */ info = VecDestroy(x); CHKERRQ(info); info = VecDestroy(f); CHKERRQ(info); info = MatDestroy(J); CHKERRQ(info); /* Free user data structures */ info = AppCtxDestroy(&user); CHKERRQ(info); info = PetscFree(matarray);CHKERRQ(info); /* Finalize TAO */ PetscFinalize(); TaoFinalize(); return 0; }