/* TAOCreate_BCG - Creates the data structure for the nonlinear BCG method and sets the function pointers for all the routines it needs to call (TAOSolve_BCG() etc.) It must be wrapped in EXTERN_C_BEGIN to be dynamically linkable in C++ */ EXTERN_C_BEGIN #undef __FUNC__ #define __FUNC__ "TaoCreate_BCG" int TaoCreate_BCG(TAO_SOLVER tao) { TAO_BCG *cg; int info; TaoFunctionBegin; cg = TaoNew(TAO_BCG);CHKPTRQ(cg); PLogObjectMemory(tao,sizeof(TAO_BCG)); info = TaoSetSolver(tao,TaoSetUp_BCG,TaoSetOptions_BCG,TaoSolve_BCG, TaoView_BCG,TaoDestroy_BCG,(void*)cg); CHKERRQ(info); info = TaoSetMaximumIterates(tao,2000); CHKERRQ(info); info = TaoSetTolerances(tao,1e-4,0,0,0); CHKERRQ(info); info = TaoSetMaximumFunctionEvaluations(tao,4000); CHKERRQ(info); info = TaoCreateProjectedLineSearch(tao); CHKERRQ(info); cg->eta = 100.0; cg->type = TAO_CG_PRplus; info = PetscObjectComposeFunctionDynamic((PetscObject)tao,"TaoBCGSetRestartTol_C", "TaoBCGSetRestartTol_TaoBCG", (void*)TaoBCGSetRestartTol_TaoBCG);CHKERRQ(info); TaoFunctionReturn(0); }
/* ---------------------------------------------------------- */ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_SSFLS" int TaoCreate_SSFLS(TAO_SOLVER tao) { TAO_SSLS *ssls; int info; TaoFunctionBegin; info = TaoNew(TAO_SSLS,&ssls); CHKERRQ(info); info = PetscLogObjectMemory(tao, sizeof(TAO_SSLS)); CHKERRQ(info); ssls->delta = 1e-10; ssls->rho = 2.1; info=TaoSetTaoSolveRoutine(tao,TaoSolve_SSFLS,(void*)ssls); CHKERRQ(info); info=TaoSetTaoSetUpDownRoutines(tao,TaoSetUp_SSLS,TaoSetDown_SSLS); CHKERRQ(info); info=TaoSetTaoOptionsRoutine(tao,TaoSetOptions_SSLS); CHKERRQ(info); info=TaoSetTaoViewRoutine(tao,TaoView_SSLS); CHKERRQ(info); info = TaoCreateProjectedArmijoLineSearch(tao); CHKERRQ(info); info = TaoSetMaximumIterates(tao,2000); CHKERRQ(info); info = TaoSetMaximumFunctionEvaluations(tao,4000); CHKERRQ(info); info = TaoSetTolerances(tao,0,0,0,0); CHKERRQ(info); info = TaoSetGradientTolerances(tao,1.0e-16,0.0,0.0); CHKERRQ(info); info = TaoSetFunctionLowerBound(tao,1.0e-8); CHKERRQ(info); TaoFunctionReturn(0); }
/*------------------------------------------------------------*/ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_GPCG" int TaoCreate_GPCG(TAO_SOLVER tao) { TAO_GPCG *gpcg; int info; TaoFunctionBegin; info = TaoNew(TAO_GPCG,&gpcg); CHKERRQ(info); info = PetscLogObjectMemory(tao,sizeof(TAO_GPCG)); CHKERRQ(info); info=TaoSetTaoSolveRoutine(tao,TaoSolve_GPCG,(void*)gpcg); CHKERRQ(info); info=TaoSetTaoSetUpDownRoutines(tao,TaoSetUp_GPCG,TaoSetDown_GPCG); CHKERRQ(info); info=TaoSetTaoOptionsRoutine(tao,TaoSetFromOptions_GPCG); CHKERRQ(info); info=TaoSetTaoViewRoutine(tao,TaoView_GPCG); CHKERRQ(info); info=TaoSetTaoDualVariablesRoutine(tao,TaoGetDualVariables_GPCG); CHKERRQ(info); info = TaoSetMaximumIterates(tao,500); CHKERRQ(info); info = TaoSetMaximumFunctionEvaluations(tao,100000); CHKERRQ(info); info = TaoSetTolerances(tao,1e-12,1e-12,0,0); CHKERRQ(info); /* Initialize pointers and variables */ gpcg->n=0; gpcg->maxgpits = 8; gpcg->pg_ftol = 0.1; gpcg->gp_iterates=0; /* Cumulative number */ gpcg->total_gp_its = 0; /* Initialize pointers and variables */ gpcg->n_bind=0; gpcg->n_free = 0; gpcg->n_upper=0; gpcg->n_lower=0; // info = TaoCreateProjectedLineSearch(tao); CHKERRQ(info); info = TaoGPCGCreateLineSearch(tao); CHKERRQ(info); TaoFunctionReturn(0); }
/*------------------------------------------------------------*/ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_BNLS" int TaoCreate_BNLS(TAO_SOLVER tao) { TAO_BNLS *bnls; int info; TaoFunctionBegin; info = TaoNew(TAO_BNLS,&bnls); CHKERRQ(info); info = PetscLogObjectMemory(tao,sizeof(TAO_BNLS)); CHKERRQ(info); info=TaoSetTaoSolveRoutine(tao,TaoSolve_BNLS,(void*)bnls); CHKERRQ(info); info=TaoSetTaoSetUpDownRoutines(tao,TaoSetUp_BNLS,TaoSetDown_BNLS); CHKERRQ(info); info=TaoSetTaoOptionsRoutine(tao,TaoSetOptions_BNLS); CHKERRQ(info); info=TaoSetTaoViewRoutine(tao,TaoView_BNLS); CHKERRQ(info); info=TaoSetTaoDualVariablesRoutine(tao,TaoGetDualVariables_BNLS); CHKERRQ(info); info = TaoSetMaximumIterates(tao,500); CHKERRQ(info); info = TaoSetTolerances(tao,1e-12,1e-12,0,0); CHKERRQ(info); /* Initialize pointers and variables */ bnls->gamma = 0.0; bnls->gamma_factor = 0.01; bnls->DX=0; bnls->DXFree=0; bnls->R=0; bnls->Work=0; bnls->FreeVariables=0; bnls->Hsub=0; bnls->M=0; info = TaoCreateMoreThuenteBoundLineSearch(tao,0,0.9); CHKERRQ(info); TaoFunctionReturn(0); }
int main(int argc,char **argv) { PetscErrorCode ierr; /* used to check for functions returning nonzeros */ PetscReal zero=0.0; Vec x; /* solution vector */ Mat H; Tao tao; /* Tao solver context */ PetscBool flg, test_lmvm = PETSC_FALSE; PetscMPIInt size,rank; /* number of processes running */ AppCtx user; /* user-defined application context */ TaoConvergedReason reason; PetscInt its, recycled_its=0, oneshot_its=0; /* Initialize TAO and PETSc */ ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (size >1) SETERRQ(PETSC_COMM_SELF,1,"Incorrect number of processors"); /* Initialize problem parameters */ user.n = 2; user.alpha = 99.0; user.chained = PETSC_FALSE; /* Check for command line arguments to override defaults */ ierr = PetscOptionsGetInt(NULL,NULL,"-n",&user.n,&flg);CHKERRQ(ierr); ierr = PetscOptionsGetReal(NULL,NULL,"-alpha",&user.alpha,&flg);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,NULL,"-chained",&user.chained,&flg);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,NULL,"-test_lmvm",&test_lmvm,&flg);CHKERRQ(ierr); /* Allocate vectors for the solution and gradient */ ierr = VecCreateSeq(PETSC_COMM_SELF,user.n,&x);CHKERRQ(ierr); ierr = MatCreateSeqBAIJ(PETSC_COMM_SELF,2,user.n,user.n,1,NULL,&H);CHKERRQ(ierr); /* The TAO code begins here */ /* Create TAO solver with desired solution method */ ierr = TaoCreate(PETSC_COMM_SELF,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOLMVM);CHKERRQ(ierr); /* Set solution vec and an initial guess */ ierr = VecSet(x, zero);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,x);CHKERRQ(ierr); /* Set routines for function, gradient, hessian evaluation */ ierr = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,&user);CHKERRQ(ierr); ierr = TaoSetHessianRoutine(tao,H,H,FormHessian,&user);CHKERRQ(ierr); /* Check for TAO command line options */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); /* Solve the problem */ ierr = TaoSetTolerances(tao, 1.e-5, 0.0, 0.0);CHKERRQ(ierr); ierr = TaoSetMaximumIterations(tao, 5);CHKERRQ(ierr); ierr = TaoLMVMRecycle(tao, PETSC_TRUE);CHKERRQ(ierr); reason = TAO_CONTINUE_ITERATING; while (reason != TAO_CONVERGED_GATOL) { ierr = TaoSolve(tao);CHKERRQ(ierr); ierr = TaoGetConvergedReason(tao, &reason);CHKERRQ(ierr); ierr = TaoGetIterationNumber(tao, &its);CHKERRQ(ierr); recycled_its += its; ierr = PetscPrintf(PETSC_COMM_SELF, "-----------------------\n");CHKERRQ(ierr); } /* Disable recycling and solve again! */ ierr = TaoSetMaximumIterations(tao, 100);CHKERRQ(ierr); ierr = TaoLMVMRecycle(tao, PETSC_FALSE);CHKERRQ(ierr); ierr = VecSet(x, zero);CHKERRQ(ierr); ierr = TaoSolve(tao);CHKERRQ(ierr); ierr = TaoGetConvergedReason(tao, &reason);CHKERRQ(ierr); if (reason != TAO_CONVERGED_GATOL) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_NOT_CONVERGED, "Solution failed to converge!"); ierr = TaoGetIterationNumber(tao, &oneshot_its);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF, "-----------------------\n");CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_SELF, "recycled its: %D | oneshot its: %D\n", recycled_its, oneshot_its);CHKERRQ(ierr); if (recycled_its != oneshot_its) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_NOT_CONVERGED, "LMVM recycling does not work!"); ierr = TaoDestroy(&tao);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = MatDestroy(&H);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
PetscErrorCode TaoPounders_solvequadratic(Tao tao,PetscReal *gnorm, PetscReal *qmin) { PetscErrorCode ierr; #if defined(PETSC_USE_REAL_SINGLE) PetscReal atol=1.0e-5; #else PetscReal atol=1.0e-10; #endif PetscInt info,its; TAO_POUNDERS *mfqP = (TAO_POUNDERS*)tao->data; PetscReal maxval; PetscInt i,j; PetscFunctionBegin; ierr = VecCopy(mfqP->Gres, mfqP->subb);CHKERRQ(ierr); ierr = VecSet(mfqP->subx,0.0);CHKERRQ(ierr); ierr = VecSet(mfqP->subndel,-mfqP->delta);CHKERRQ(ierr); ierr = VecSet(mfqP->subpdel,mfqP->delta);CHKERRQ(ierr); ierr = MatCopy(mfqP->Hres,mfqP->subH,SAME_NONZERO_PATTERN);CHKERRQ(ierr); ierr = TaoResetStatistics(mfqP->subtao);CHKERRQ(ierr); ierr = TaoSetTolerances(mfqP->subtao,NULL,NULL,*gnorm,*gnorm,NULL);CHKERRQ(ierr); /* enforce bound constraints -- experimental */ if (tao->XU && tao->XL) { ierr = VecCopy(tao->XU,mfqP->subxu);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subxu,-1.0,tao->solution);CHKERRQ(ierr); ierr = VecScale(mfqP->subxu,1.0/mfqP->delta);CHKERRQ(ierr); ierr = VecCopy(tao->XL,mfqP->subxl);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subxl,-1.0,tao->solution);CHKERRQ(ierr); ierr = VecScale(mfqP->subxl,1.0/mfqP->delta);CHKERRQ(ierr); ierr = VecPointwiseMin(mfqP->subxu,mfqP->subxu,mfqP->subpdel);CHKERRQ(ierr); ierr = VecPointwiseMax(mfqP->subxl,mfqP->subxl,mfqP->subndel);CHKERRQ(ierr); } else { ierr = VecCopy(mfqP->subpdel,mfqP->subxu);CHKERRQ(ierr); ierr = VecCopy(mfqP->subndel,mfqP->subxl);CHKERRQ(ierr); } /* Make sure xu > xl */ ierr = VecCopy(mfqP->subxl,mfqP->subpdel);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subpdel,-1.0,mfqP->subxu); CHKERRQ(ierr); ierr = VecMax(mfqP->subpdel,NULL,&maxval);CHKERRQ(ierr); if (maxval > 1e-10) { SETERRQ(PETSC_COMM_WORLD,1,"upper bound < lower bound in subproblem"); } /* Make sure xu > tao->solution > xl */ ierr = VecCopy(mfqP->subxl,mfqP->subpdel);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subpdel,-1.0,mfqP->subx); CHKERRQ(ierr); ierr = VecMax(mfqP->subpdel,NULL,&maxval);CHKERRQ(ierr); if (maxval > 1e-10) { SETERRQ(PETSC_COMM_WORLD,1,"initial guess < lower bound in subproblem"); } ierr = VecCopy(mfqP->subx,mfqP->subpdel);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subpdel,-1.0,mfqP->subxu); CHKERRQ(ierr); ierr = VecMax(mfqP->subpdel,NULL,&maxval);CHKERRQ(ierr); if (maxval > 1e-10) { SETERRQ(PETSC_COMM_WORLD,1,"initial guess > upper bound in subproblem"); } ierr = TaoSolve(mfqP->subtao);CHKERRQ(ierr); ierr = TaoGetSolutionStatus(mfqP->subtao,NULL,qmin,NULL,NULL,NULL,NULL);CHKERRQ(ierr); /* test bounds post-solution*/ ierr = VecCopy(mfqP->subxl,mfqP->subpdel);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subpdel,-1.0,mfqP->subx); CHKERRQ(ierr); ierr = VecMax(mfqP->subpdel,NULL,&maxval);CHKERRQ(ierr); if (maxval > 1e-5) { ierr = PetscInfo(tao,"subproblem solution < lower bound");CHKERRQ(ierr); tao->reason = TAO_DIVERGED_TR_REDUCTION; } ierr = VecCopy(mfqP->subx,mfqP->subpdel);CHKERRQ(ierr); ierr = VecAXPY(mfqP->subpdel,-1.0,mfqP->subxu); CHKERRQ(ierr); ierr = VecMax(mfqP->subpdel,NULL,&maxval);CHKERRQ(ierr); if (maxval > 1e-5) { ierr = PetscInfo(tao,"subproblem solution > upper bound"); tao->reason = TAO_DIVERGED_TR_REDUCTION; } *qmin *= -1; PetscFunctionReturn(0); }
PetscErrorCode main(int argc,char **argv) { PetscErrorCode ierr; /* used to check for functions returning nonzeros */ PetscMPIInt size; Vec x; /* solution */ KSP ksp; PC pc; Vec ceq,cin; PetscBool flg; /* A return value when checking for use options */ Tao tao; /* Tao solver context */ TaoConvergedReason reason; AppCtx user; /* application context */ /* Initialize TAO,PETSc */ ierr = PetscInitialize(&argc,&argv,(char *)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); /* Specify default parameters for the problem, check for command-line overrides */ ierr = PetscStrncpy(user.name,"HS21",8);CHKERRQ(ierr); ierr = PetscOptionsGetString(NULL,NULL,"-cutername",user.name,24,&flg);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"\n---- MAROS Problem %s -----\n",user.name);CHKERRQ(ierr); ierr = InitializeProblem(&user);CHKERRQ(ierr); ierr = VecDuplicate(user.d,&x);CHKERRQ(ierr); ierr = VecDuplicate(user.beq,&ceq);CHKERRQ(ierr); ierr = VecDuplicate(user.bin,&cin);CHKERRQ(ierr); ierr = VecSet(x,1.0);CHKERRQ(ierr); ierr = TaoCreate(PETSC_COMM_WORLD,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOIPM);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,x);CHKERRQ(ierr); ierr = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user);CHKERRQ(ierr); ierr = TaoSetEqualityConstraintsRoutine(tao,ceq,FormEqualityConstraints,(void*)&user);CHKERRQ(ierr); ierr = TaoSetInequalityConstraintsRoutine(tao,cin,FormInequalityConstraints,(void*)&user);CHKERRQ(ierr); ierr = TaoSetInequalityBounds(tao,user.bin,NULL);CHKERRQ(ierr); ierr = TaoSetJacobianEqualityRoutine(tao,user.Aeq,user.Aeq,FormEqualityJacobian,(void*)&user);CHKERRQ(ierr); ierr = TaoSetJacobianInequalityRoutine(tao,user.Ain,user.Ain,FormInequalityJacobian,(void*)&user);CHKERRQ(ierr); ierr = TaoSetHessianRoutine(tao,user.H,user.H,FormHessian,(void*)&user);CHKERRQ(ierr); ierr = TaoGetKSP(tao,&ksp);CHKERRQ(ierr); ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PCSetType(pc,PCLU);CHKERRQ(ierr); /* This algorithm produces matrices with zeros along the diagonal therefore we need to use SuperLU which does partial pivoting */ ierr = PCFactorSetMatSolverPackage(pc,MATSOLVERSUPERLU);CHKERRQ(ierr); ierr = KSPSetType(ksp,KSPPREONLY);CHKERRQ(ierr); ierr = TaoSetTolerances(tao,0,0,0);CHKERRQ(ierr); ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); ierr = TaoSolve(tao);CHKERRQ(ierr); ierr = TaoGetConvergedReason(tao,&reason);CHKERRQ(ierr); if (reason < 0) { ierr = PetscPrintf(MPI_COMM_WORLD, "TAO failed to converge due to %s.\n",TaoConvergedReasons[reason]);CHKERRQ(ierr); } else { ierr = PetscPrintf(MPI_COMM_WORLD, "Optimization completed with status %s.\n",TaoConvergedReasons[reason]);CHKERRQ(ierr); } ierr = DestroyProblem(&user);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = VecDestroy(&ceq);CHKERRQ(ierr); ierr = VecDestroy(&cin);CHKERRQ(ierr); ierr = TaoDestroy(&tao);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **argv) { Vec p; PetscScalar *x_ptr; PetscErrorCode ierr; PetscMPIInt size; AppCtx ctx; Vec lowerb,upperb; Tao tao; TaoConvergedReason reason; KSP ksp; PC pc; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialize program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ PetscInitialize(&argc,&argv,NULL,help); PetscFunctionBeginUser; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(PETSC_COMM_SELF,1,"This is a uniprocessor example only!"); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"Swing equation options","");CHKERRQ(ierr); { ctx.beta = 2; ctx.c = 10000.0; ctx.u_s = 1.0; ctx.omega_s = 1.0; ctx.omega_b = 120.0*PETSC_PI; ctx.H = 5.0; ierr = PetscOptionsScalar("-Inertia","","",ctx.H,&ctx.H,NULL);CHKERRQ(ierr); ctx.D = 5.0; ierr = PetscOptionsScalar("-D","","",ctx.D,&ctx.D,NULL);CHKERRQ(ierr); ctx.E = 1.1378; ctx.V = 1.0; ctx.X = 0.545; ctx.Pmax = ctx.E*ctx.V/ctx.X;; ierr = PetscOptionsScalar("-Pmax","","",ctx.Pmax,&ctx.Pmax,NULL);CHKERRQ(ierr); ctx.Pm = 0.4; ierr = PetscOptionsScalar("-Pm","","",ctx.Pm,&ctx.Pm,NULL);CHKERRQ(ierr); ctx.tf = 0.1; ctx.tcl = 0.2; ierr = PetscOptionsReal("-tf","Time to start fault","",ctx.tf,&ctx.tf,NULL);CHKERRQ(ierr); ierr = PetscOptionsReal("-tcl","Time to end fault","",ctx.tcl,&ctx.tcl,NULL);CHKERRQ(ierr); } ierr = PetscOptionsEnd();CHKERRQ(ierr); /* Create TAO solver and set desired solution method */ ierr = TaoCreate(PETSC_COMM_WORLD,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOBLMVM);CHKERRQ(ierr); /* Optimization starts */ /* Set initial solution guess */ ierr = VecCreateSeq(PETSC_COMM_WORLD,1,&p);CHKERRQ(ierr); ierr = VecGetArray(p,&x_ptr);CHKERRQ(ierr); x_ptr[0] = ctx.Pm; ierr = VecRestoreArray(p,&x_ptr);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,p);CHKERRQ(ierr); /* Set routine for function and gradient evaluation */ ierr = TaoSetObjectiveRoutine(tao,FormFunction,(void *)&ctx);CHKERRQ(ierr); ierr = TaoSetGradientRoutine(tao,TaoDefaultComputeGradient,(void *)&ctx);CHKERRQ(ierr); /* Set bounds for the optimization */ ierr = VecDuplicate(p,&lowerb);CHKERRQ(ierr); ierr = VecDuplicate(p,&upperb);CHKERRQ(ierr); ierr = VecGetArray(lowerb,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 0.; ierr = VecRestoreArray(lowerb,&x_ptr);CHKERRQ(ierr); ierr = VecGetArray(upperb,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 1.1;; ierr = VecRestoreArray(upperb,&x_ptr);CHKERRQ(ierr); ierr = TaoSetVariableBounds(tao,lowerb,upperb); /* Check for any TAO command line options */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); ierr = TaoGetKSP(tao,&ksp);CHKERRQ(ierr); if (ksp) { ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); } ierr = TaoSetTolerances(tao,1e-15,1e-15,1e-15,1e-15,1e-15); /* SOLVE THE APPLICATION */ ierr = TaoSolve(tao); CHKERRQ(ierr); /* Get information on termination */ ierr = TaoGetConvergedReason(tao,&reason);CHKERRQ(ierr); if (reason <= 0){ ierr=PetscPrintf(MPI_COMM_WORLD, "Try another method! \n");CHKERRQ(ierr); } ierr = VecView(p,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Free TAO data structures */ ierr = TaoDestroy(&tao);CHKERRQ(ierr); ierr = VecDestroy(&p);CHKERRQ(ierr); ierr = VecDestroy(&lowerb);CHKERRQ(ierr); ierr = VecDestroy(&upperb);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
int main(int argc,char **argv) { TS ts; /* nonlinear solver */ Vec ic; PetscBool monitor = PETSC_FALSE; PetscScalar *x_ptr; PetscMPIInt size; struct _n_User user; PetscErrorCode ierr; Tao tao; TaoConvergedReason reason; KSP ksp; PC pc; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initialize program - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ PetscInitialize(&argc,&argv,NULL,help); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(PETSC_COMM_SELF,1,"This is a uniprocessor example only!"); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ user.mu = 1.0; user.next_output = 0.0; user.steps = 0; user.ftime = 0.5; ierr = PetscOptionsGetReal(NULL,"-mu",&user.mu,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(NULL,"-monitor",&monitor,NULL);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create necessary matrix and vectors, solve same ODE on every process - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = MatCreate(PETSC_COMM_WORLD,&user.A);CHKERRQ(ierr); ierr = MatSetSizes(user.A,PETSC_DECIDE,PETSC_DECIDE,2,2);CHKERRQ(ierr); ierr = MatSetFromOptions(user.A);CHKERRQ(ierr); ierr = MatSetUp(user.A);CHKERRQ(ierr); ierr = MatCreateVecs(user.A,&user.x,NULL);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create timestepping solver context - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); ierr = TSSetType(ts,TSRK);CHKERRQ(ierr); ierr = TSSetRHSFunction(ts,NULL,RHSFunction,&user);CHKERRQ(ierr); ierr = TSSetDuration(ts,PETSC_DEFAULT,user.ftime);CHKERRQ(ierr); ierr = TSSetExactFinalTime(ts,TS_EXACTFINALTIME_MATCHSTEP);CHKERRQ(ierr); if (monitor) { ierr = TSMonitorSet(ts,Monitor,&user,NULL);CHKERRQ(ierr); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set initial conditions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = VecGetArray(user.x,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 2.0; x_ptr[1] = 0.66666654321; ierr = VecRestoreArray(user.x,&x_ptr);CHKERRQ(ierr); ierr = TSSetTime(ts,0.0);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"mu %g, steps %D, ftime %g\n",(double)user.mu,user.steps,(double)(user.ftime));CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Save trajectory of solution so that TSAdjointSolve() may be used - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetSaveTrajectory(ts);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Set runtime options - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSetFromOptions(ts);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solve nonlinear system - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = TSSolve(ts,user.x);CHKERRQ(ierr); ierr = TSGetSolveTime(ts,&(user.ftime));CHKERRQ(ierr); ierr = TSGetTimeStepNumber(ts,&user.steps);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"mu %g, steps %D, ftime %g\n",(double)user.mu,user.steps,(double)user.ftime);CHKERRQ(ierr); ierr = VecGetArray(user.x,&x_ptr);CHKERRQ(ierr); user.x_ob[0] = x_ptr[0]; user.x_ob[1] = x_ptr[1]; ierr = MatCreateVecs(user.A,&user.lambda[0],NULL);CHKERRQ(ierr); /* Create TAO solver and set desired solution method */ ierr = TaoCreate(PETSC_COMM_WORLD,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOCG);CHKERRQ(ierr); /* Set initial solution guess */ ierr = MatCreateVecs(user.A,&ic,NULL);CHKERRQ(ierr); ierr = VecGetArray(ic,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 2.1; x_ptr[1] = 0.7; ierr = VecRestoreArray(ic,&x_ptr);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,ic);CHKERRQ(ierr); /* Set routine for function and gradient evaluation */ ierr = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void *)&user);CHKERRQ(ierr); /* Check for any TAO command line options */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); ierr = TaoGetKSP(tao,&ksp);CHKERRQ(ierr); if (ksp) { ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); } ierr = TaoSetTolerances(tao,1e-10,1e-10,1e-10,PETSC_DEFAULT,PETSC_DEFAULT); /* SOLVE THE APPLICATION */ ierr = TaoSolve(tao); CHKERRQ(ierr); /* Get information on termination */ ierr = TaoGetConvergedReason(tao,&reason);CHKERRQ(ierr); if (reason <= 0){ ierr=PetscPrintf(MPI_COMM_WORLD, "Try another method! \n");CHKERRQ(ierr); } /* Free TAO data structures */ ierr = TaoDestroy(&tao);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Free work space. All PETSc objects should be destroyed when they are no longer needed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = MatDestroy(&user.A);CHKERRQ(ierr); ierr = VecDestroy(&user.x);CHKERRQ(ierr); ierr = VecDestroy(&user.lambda[0]);CHKERRQ(ierr); ierr = TSDestroy(&ts);CHKERRQ(ierr); ierr = VecDestroy(&ic);CHKERRQ(ierr); ierr = PetscFinalize(); PetscFunctionReturn(0); }
void TaoOptimizationSolver<T>::solve () { LOG_SCOPE("solve()", "TaoOptimizationSolver"); this->init (); this->system().solution->zero(); PetscMatrix<T> * hessian = cast_ptr<PetscMatrix<T> *>(this->system().matrix); // PetscVector<T> * gradient = cast_ptr<PetscVector<T> *>(this->system().rhs); PetscVector<T> * x = cast_ptr<PetscVector<T> *>(this->system().solution.get()); PetscVector<T> * ceq = cast_ptr<PetscVector<T> *>(this->system().C_eq.get()); PetscMatrix<T> * ceq_jac = cast_ptr<PetscMatrix<T> *>(this->system().C_eq_jac.get()); PetscVector<T> * cineq = cast_ptr<PetscVector<T> *>(this->system().C_ineq.get()); PetscMatrix<T> * cineq_jac = cast_ptr<PetscMatrix<T> *>(this->system().C_ineq_jac.get()); PetscVector<T> * lb = cast_ptr<PetscVector<T> *>(&this->system().get_vector("lower_bounds")); PetscVector<T> * ub = cast_ptr<PetscVector<T> *>(&this->system().get_vector("upper_bounds")); // Set the starting guess to zero. x->zero(); PetscErrorCode ierr = 0; // Workaround for bug where TaoSetFromOptions *reset* // programmatically set tolerance and max. function evaluation // values when "-tao_type ipm" was specified on the command line: we // call TaoSetFromOptions twice (both before and after setting // custom options programatically) ierr = TaoSetFromOptions(_tao); LIBMESH_CHKERR(ierr); // Set convergence tolerances // f(X) - f(X*) (estimated) <= fatol // |f(X) - f(X*)| (estimated) / |f(X)| <= frtol // ||g(X)|| <= gatol // ||g(X)|| / |f(X)| <= grtol // ||g(X)|| / ||g(X0)|| <= gttol // Command line equivalents: -tao_fatol, -tao_frtol, -tao_gatol, -tao_grtol, -tao_gttol ierr = TaoSetTolerances(_tao, #if PETSC_RELEASE_LESS_THAN(3,7,0) // Releases up to 3.X.Y had fatol and frtol, after that they were removed. // Hopefully we'll be able to know X and Y soon. Guessing at 3.7.0. /*fatol=*/PETSC_DEFAULT, /*frtol=*/PETSC_DEFAULT, #endif /*gatol=*/PETSC_DEFAULT, /*grtol=*/this->objective_function_relative_tolerance, /*gttol=*/PETSC_DEFAULT); LIBMESH_CHKERR(ierr); // Set the max-allowed number of objective function evaluations // Command line equivalent: -tao_max_funcs ierr = TaoSetMaximumFunctionEvaluations(_tao, this->max_objective_function_evaluations); LIBMESH_CHKERR(ierr); // Set the max-allowed number of optimization iterations. // Command line equivalent: -tao_max_it // Not implemented for now as it seems fairly similar to // ierr = TaoSetMaximumIterations(_tao, 4); // LIBMESH_CHKERR(ierr); // Set solution vec and an initial guess ierr = TaoSetInitialVector(_tao, x->vec()); LIBMESH_CHKERR(ierr); // We have to have an objective function libmesh_assert( this->objective_object ); // Set routines for objective, gradient, hessian evaluation ierr = TaoSetObjectiveRoutine(_tao, __libmesh_tao_objective, this); LIBMESH_CHKERR(ierr); if ( this->gradient_object ) { ierr = TaoSetGradientRoutine(_tao, __libmesh_tao_gradient, this); LIBMESH_CHKERR(ierr); } if ( this->hessian_object ) { ierr = TaoSetHessianRoutine(_tao, hessian->mat(), hessian->mat(), __libmesh_tao_hessian, this); LIBMESH_CHKERR(ierr); } if ( this->lower_and_upper_bounds_object ) { // Need to actually compute the bounds vectors first this->lower_and_upper_bounds_object->lower_and_upper_bounds(this->system()); ierr = TaoSetVariableBounds(_tao, lb->vec(), ub->vec()); LIBMESH_CHKERR(ierr); } if ( this->equality_constraints_object ) { ierr = TaoSetEqualityConstraintsRoutine(_tao, ceq->vec(), __libmesh_tao_equality_constraints, this); LIBMESH_CHKERR(ierr); } if ( this->equality_constraints_jacobian_object ) { ierr = TaoSetJacobianEqualityRoutine(_tao, ceq_jac->mat(), ceq_jac->mat(), __libmesh_tao_equality_constraints_jacobian, this); LIBMESH_CHKERR(ierr); } // Optionally set inequality constraints if ( this->inequality_constraints_object ) { ierr = TaoSetInequalityConstraintsRoutine(_tao, cineq->vec(), __libmesh_tao_inequality_constraints, this); LIBMESH_CHKERR(ierr); } // Optionally set inequality constraints Jacobian if ( this->inequality_constraints_jacobian_object ) { ierr = TaoSetJacobianInequalityRoutine(_tao, cineq_jac->mat(), cineq_jac->mat(), __libmesh_tao_inequality_constraints_jacobian, this); LIBMESH_CHKERR(ierr); } // Check for Tao command line options ierr = TaoSetFromOptions(_tao); LIBMESH_CHKERR(ierr); // Perform the optimization ierr = TaoSolve(_tao); LIBMESH_CHKERR(ierr); // Store the convergence/divergence reason ierr = TaoGetConvergedReason(_tao, &_reason); LIBMESH_CHKERR(ierr); }
int main(int argc,char **argv) { Userctx user; Vec p; PetscScalar *x_ptr; PetscErrorCode ierr; PetscMPIInt size; PetscInt i,numDataBuses; KSP ksp; PC pc; Tao tao; TaoConvergedReason reason; Vec lowerb,upperb; PetscViewer viewer; PetscScalar *proj_vec; //PetscLogDouble t0,t1; /* time the inversion process */ //ierr = PetscGetTime(&t0);CHKERRQ(ierr); ierr = PetscInitialize(&argc,&argv,"petscoptions",help);CHKERRQ(ierr); PetscFunctionBeginUser; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size > 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Only for sequential runs"); ierr = ModelSetup(&user);CHKERRQ(ierr); /* hard code the data projection here - for now assume data at all buses */ ierr = VecCreateSeq(PETSC_COMM_WORLD,nbus,&user.proj);CHKERRQ(ierr); /*ierr = VecCreateSeq(PETSC_COMM_WORLD,4,&user.proj);CHKERRQ(ierr);*/ ierr = VecGetArray(user.proj,&proj_vec);CHKERRQ(ierr); for(i=0; i<nbus; i++) { proj_vec[i]=i; } srand( time(NULL) + rand () ); //VecView(user.proj, PETSC_VIEWER_STDOUT_WORLD); /* -- 2 5 6 8 */ /* -- proj_vec[0]=1; proj_vec[1]=4; proj_vec[2]=5; proj_vec[3]=7; */ ierr = VecRestoreArray(user.proj,&proj_vec);CHKERRQ(ierr); /* allocate/set the prior mean and its standard deviation */ ierr = PetscMalloc(3*sizeof(PetscScalar), &user.prior_mean); ierr = PetscMalloc(3*sizeof(PetscScalar), &user.prior_stddev); /*{23.64,6.4,3.01};*/ user.prior_mean[0] = 24.0; user.prior_mean[1] = 6.0; user.prior_mean[2] = 3.1; for(i=0; i<3; i++) user.prior_stddev[i] = user.prior_mean[i]*user.prior_noise; /* Create matrix to store solution */ if(user.saveSol) { ierr = MatCreateSeqDense(PETSC_COMM_SELF, user.neqs_pgrid+1, (PetscInt) round((user.tfinal-user.t0)/user.dt+1), NULL, &user.Sol); CHKERRQ(ierr); } printf("Num cols=%d\n", (PetscInt) round((user.tfinal-user.t0)/user.dt+1)); /* ********************************* * Generate/load observations **********************************/ ierr = VecGetSize(user.proj, &numDataBuses);CHKERRQ(ierr); /* Create matrix to save solutions at each time step */ ierr = MatCreateSeqDense(PETSC_COMM_SELF, 2*numDataBuses, //(PetscInt) round((user.tfinal-user.tdisturb)/user.data_dt)+1, (PetscInt) round((user.tfinal-user.trestore)/user.data_dt)+1, NULL, &user.obs); CHKERRQ(ierr); ierr = InitializeData(H0, &user, user.data_noise, user.data_dt);CHKERRQ(ierr); if(0==strlen(user.loadObsFile)) { /* save observations */ ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,"obs-perturbed.bin",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); ierr = MatView(user.obs,viewer);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); printf("Observations generated.\n"); } if(user.saveSol) { ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,"out_pert.bin",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); ierr = MatView(user.Sol,viewer);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); ierr = MatDestroy(&user.Sol);CHKERRQ(ierr); CHKERRQ(ierr); } if(user.outputCov) { printf("The diagonal of the data noise covariance matrix (%g absolute noise) is:\n", user.data_noise); for(i=0; i<2*numDataBuses; i++) printf("%18.12f ", user.data_stddev[i]*user.data_stddev[i]); printf("\n"); printf("The prior mean is: "); for(i=0; i<3; i++) printf("%18.12f ", user.prior_mean[i]); printf("\n"); printf("The diagonal of the prior covariance matrix (%g relative noise) is:\n", user.prior_noise); for(i=0; i<3; i++) printf("%18.12f ", user.prior_stddev[i]*user.prior_stddev[i]); printf("\n"); goto finalize; } /* *************************************** * Optimization phase * ***************************************/ /* Create TAO solver and set desired solution method */ ierr = TaoCreate(PETSC_COMM_WORLD,&tao);CHKERRQ(ierr); ierr = TaoSetType(tao,TAOBLMVM);CHKERRQ(ierr); /* Optimization starts */ printf("Starting optimization...\n"); /* PetscScalar H_disturb[3]= {25.,6.4,3.01}; New inertia (after tdisturb) to be estimated */ /* Set initial solution guess */ ierr = VecCreateSeq(PETSC_COMM_WORLD,3,&p);CHKERRQ(ierr); ierr = VecGetArray(p,&x_ptr);CHKERRQ(ierr); //x_ptr[0] = H0[0]; x_ptr[1] = H0[1]; x_ptr[2] = H0[2]; x_ptr[0] = H0[0]*1.1; x_ptr[1] = H0[1]*1.1; x_ptr[2] = H0[2]*1.1; ierr = VecRestoreArray(p,&x_ptr);CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,p);CHKERRQ(ierr); /* Set routine for function and gradient evaluation */ //ierr = TaoSetObjectiveRoutine(tao,FormFunction,(void *)&user);CHKERRQ(ierr); //ierr = TaoSetGradientRoutine(tao,TaoDefaultComputeGradient,(void *)&user);CHKERRQ(ierr); /* Sets the cost and gradient evaluation routine for minimization */ ierr = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,&user);CHKERRQ(ierr); /* Set bounds for the optimization */ ierr = VecDuplicate(p,&lowerb);CHKERRQ(ierr); ierr = VecDuplicate(p,&upperb);CHKERRQ(ierr); ierr = VecGetArray(lowerb,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 20.64; x_ptr[1] = 5.4; x_ptr[2] = 2.01; ierr = VecRestoreArray(lowerb,&x_ptr);CHKERRQ(ierr); ierr = VecGetArray(upperb,&x_ptr);CHKERRQ(ierr); x_ptr[0] = 25.64; x_ptr[1] = 7.4; x_ptr[2] = 4.01; ierr = VecRestoreArray(upperb,&x_ptr);CHKERRQ(ierr); ierr = TaoSetVariableBounds(tao,lowerb,upperb); /* Check for any TAO command line options */ ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); ierr = TaoGetKSP(tao,&ksp);CHKERRQ(ierr); if (ksp) { ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PCSetType(pc,PCNONE);CHKERRQ(ierr); } //ierr = TaoSetTolerances(tao,1e-8,1e-6,1e-8,1e-6,1e-4); ierr = TaoSetTolerances(tao,1e-8,1e-8,1e-8,1e-8,1e-6); //ierr = TaoSetGradientTolerances(tao,1e-8, 1e-6, 1e-6); /* SOLVE the estimation problem */ ierr = TaoSolve(tao); CHKERRQ(ierr); /* Get information on termination */ printf("--- optimization done\n"); /* time the inversion process */ //ierr = PetscGetTime(&t1);CHKERRQ(ierr); //printf("elapsed_time %f seconds\n", t1 - t0); ierr = TaoGetConvergedReason(tao,&reason);CHKERRQ(ierr); if (reason <= 0){ ierr=PetscPrintf(MPI_COMM_WORLD, "Try another method! \n");CHKERRQ(ierr); } /*ierr = VecView(p,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);*/ ierr = VecGetArray(p,&x_ptr);CHKERRQ(ierr); printf("inertia-out: %.12f %.12f %.12f\n", x_ptr[0], x_ptr[1], x_ptr[2]); ierr = VecRestoreArray(p,&x_ptr);CHKERRQ(ierr); //ierr = EvaluateHessianFD(tao, p, &user);CHKERRQ(ierr); /* Free TAO data structures */ ierr = TaoDestroy(&tao);CHKERRQ(ierr); ierr = VecDestroy(&lowerb);CHKERRQ(ierr); ierr = VecDestroy(&upperb);CHKERRQ(ierr); finalize: ierr = MatDestroy(&user.obs);CHKERRQ(ierr); ierr = VecDestroy(&user.X0_disturb);CHKERRQ(ierr); ierr = PetscFree(user.data_stddev);CHKERRQ(ierr); PetscFree(user.prior_mean); PetscFree(user.prior_stddev); ierr = DMDestroy(&user.dmgen);CHKERRQ(ierr); ierr = DMDestroy(&user.dmnet);CHKERRQ(ierr); ierr = DMDestroy(&user.dmpgrid);CHKERRQ(ierr); ierr = ISDestroy(&user.is_diff);CHKERRQ(ierr); ierr = ISDestroy(&user.is_alg);CHKERRQ(ierr); ierr = MatDestroy(&user.J);CHKERRQ(ierr); ierr = MatDestroy(&user.Jacp);CHKERRQ(ierr); ierr = MatDestroy(&user.Ybus);CHKERRQ(ierr); ierr = VecDestroy(&user.V0);CHKERRQ(ierr); ierr = VecDestroy(&p);CHKERRQ(ierr); ierr = PetscFinalize(); return(0); }
PetscErrorCode main(int argc,char **argv) { PetscErrorCode ierr; /* used to check for functions returning nonzeros */ Tao tao; KSP ksp; PC pc; AppCtx user; /* application context */ ierr = PetscInitialize(&argc,&argv,(char *)0,help); CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"\n---- TOY Problem -----\n"); CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"Solution should be f(1,1)=-2\n"); CHKERRQ(ierr); ierr = InitializeProblem(&user); CHKERRQ(ierr); ierr = TaoCreate(PETSC_COMM_WORLD,&tao); CHKERRQ(ierr); ierr = TaoSetType(tao,TAOIPM); CHKERRQ(ierr); ierr = TaoSetInitialVector(tao,user.x); CHKERRQ(ierr); ierr = TaoSetVariableBounds(tao,user.xl,user.xu); CHKERRQ(ierr); ierr = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); CHKERRQ(ierr); ierr = TaoSetEqualityConstraintsRoutine(tao,user.ce,FormEqualityConstraints,(void*)&user); CHKERRQ(ierr); ierr = TaoSetInequalityConstraintsRoutine(tao,user.ci,FormInequalityConstraints,(void*)&user); CHKERRQ(ierr); ierr = TaoSetJacobianEqualityRoutine(tao,user.Ae,user.Ae,FormEqualityJacobian,(void*)&user); CHKERRQ(ierr); ierr = TaoSetJacobianInequalityRoutine(tao,user.Ai,user.Ai,FormInequalityJacobian,(void*)&user); CHKERRQ(ierr); ierr = TaoSetHessianRoutine(tao,user.H,user.H,FormHessian,(void*)&user); CHKERRQ(ierr); ierr = TaoSetTolerances(tao,0,0,0); CHKERRQ(ierr); ierr = TaoSetFromOptions(tao); CHKERRQ(ierr); ierr = TaoGetKSP(tao,&ksp); CHKERRQ(ierr); ierr = KSPGetPC(ksp,&pc); CHKERRQ(ierr); ierr = PCSetType(pc,PCLU); CHKERRQ(ierr); /* This algorithm produces matrices with zeros along the diagonal therefore we need to use SuperLU which does partial pivoting */ ierr = PCFactorSetMatSolverPackage(pc,MATSOLVERSUPERLU); CHKERRQ(ierr); ierr = KSPSetType(ksp,KSPPREONLY); CHKERRQ(ierr); ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr); ierr = TaoSetTolerances(tao,0,0,0); CHKERRQ(ierr); ierr = TaoSolve(tao); CHKERRQ(ierr); ierr = DestroyProblem(&user); CHKERRQ(ierr); ierr = TaoDestroy(&tao); CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }