Index: /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/issm.cpp =================================================================== --- /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/issm.cpp (revision 11266) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/issm.cpp (revision 11267) @@ -95,7 +95,11 @@ } else if(control_analysis){ #ifdef _HAVE_CONTROL_ + #ifdef _HAVE_TAO_ + controltao_core(femmodel); + #else control_core(femmodel); + #endif #else _error_("ISSM was not compiled with control support, cannot carry out dakota analysis!"); #endif Index: /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/controltao_core.cpp =================================================================== --- /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/controltao_core.cpp (revision 11266) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/controltao_core.cpp (revision 11267) @@ -12,12 +12,11 @@ #include "../include/include.h" #include "../solvers/solvers.h" +#if defined (_HAVE_TAO_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ == 2) +#include -#if defined (_HAVE_TAO_) && (_PETSC_MAJOR_ < 3 || (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ < 2)) -#include "tao.h" - /*Local prototype*/ -int FormFunctionGradient(TAO_APPLICATION,Vec,double *,Vec,void*); +int FormFunctionGradient(TaoSolver tao,Vec,double *,Vec,void*); typedef struct { FemModel* femmodel; } AppCtx; @@ -25,17 +24,13 @@ void controltao_core(FemModel* femmodel){ /*TAO*/ - int i,n,info; - //TaoMethod method = "tao_blmvm"; - //TaoMethod method = "tao_lmvm"; - TaoMethod method = "tao_cg"; - TaoTerminateReason reason; - TAO_SOLVER tao; - TAO_APPLICATION controlapp; - Vec initial_solution = NULL; - AppCtx user; - PetscInt iter; - double ff,gnorm; + int i,n,info; + TaoSolverTerminationReason reason; + TaoSolver tao; + Vec initial_solution = NULL; + AppCtx user; + PetscInt iter; + double ff ,gnorm; /*Initialize TAO*/ int argc; char **args; PetscGetArgs(&argc,&args); @@ -61,21 +56,17 @@ /*Set up and solve TAO*/ GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,MaterialsRheologyBbarEnum,VertexEnum); - info = TaoCreate(PETSC_COMM_WORLD,method,&tao); if(info) _error_("STOP"); - info = TaoApplicationCreate(PETSC_COMM_WORLD,&controlapp); if(info) _error_("STOP"); - info = TaoAppSetInitialSolutionVec(controlapp,initial_solution); if(info) _error_("STOP"); - info = TaoAppSetObjectiveAndGradientRoutine(controlapp,FormFunctionGradient,(void*)&user); if(info) _error_("STOP"); - info = TaoSetOptions(controlapp,tao); if(info) _error_("STOP"); - info = TaoSolveApplication(controlapp,tao); //if(info) _error_("STOP"); + info = TaoCreate(PETSC_COMM_WORLD,&tao); if(info) _error_("STOP"); + info = TaoSetType(tao,"tao_cg"); if(info) _error_("STOP"); + info = TaoSetInitialVector(tao,initial_solution); if(info) _error_("STOP"); + info = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); if(info) _error_("STOP"); + info = TaoSetFromOptions(tao); if(info) _error_("STOP"); + info = TaoSolve(tao); //if(info) _error_("STOP"); /*Get solution status*/ info = TaoGetSolutionStatus(tao,&iter,&ff,&gnorm,0,0,&reason); //CHKERRQ(info); - switch(reason){ /*http://www.mcs.anl.gov/research/projects/tao/docs/manualpages/solver/TaoGetTerminationReason.html*/ - case TAO_CONVERGED_ATOL: _printf_(true,"TAO_CONVERGED_ATOL (res <= atol)\n"); break; - case TAO_CONVERGED_RTOL: _printf_(true,"TAO_CONVERGED_RTOL (res/res0 <= rtol)\n"); break; - case TAO_CONVERGED_TRTOL: _printf_(true,"TAO_CONVERGED_TRTOL (xdiff <= trtol) \n"); break; - case TAO_CONVERGED_MINF: _printf_(true,"TAO_CONVERGED_MINF (f <= fmin)\n"); break; - case TAO_CONVERGED_USER: _printf_(true,"TAO_CONVERGED_USER (user defined)\n"); break; + switch(reason){ + /*http://www.mcs.anl.gov/research/projects/tao/docs/manpages/taosolver/TaoGetTerminationReason.html*/ case TAO_DIVERGED_MAXITS: _printf_(true,"TAO_DIVERGED_MAXITS (its>maxits)\n"); break; case TAO_DIVERGED_NAN: _printf_(true,"TAO_DIVERGED_NAN (Numerical problems)\n"); break; case TAO_DIVERGED_MAXFCN: _printf_(true,"TAO_DIVERGED_MAXFCN (nfunc > maxnfuncts)\n"); break; @@ -91,18 +82,17 @@ else{ _printf_(true,"TAO found a solution"); } - info = TaoView(tao); if(info) _error_("STOP"); + info = TaoView(tao,PETSC_VIEWER_STDOUT_SELF); if(info) _error_("STOP"); /*Clean up*/ - info = TaoDestroy(tao); if(info) _error_("STOP"); - info = TaoAppDestroy(controlapp); if(info) _error_("STOP"); + info = TaoDestroy(&tao); if(info) _error_("STOP"); VecFree(&initial_solution); /* Finalize TAO */ TaoFinalize(); } -int FormFunctionGradient(TAO_APPLICATION taoapp, Vec X, double *fcn,Vec G,void *userCtx){ +int FormFunctionGradient(TaoSolver tao, Vec X, double *fcn,Vec G,void *userCtx){ /*Retreive arguments*/ AppCtx *user = (AppCtx*)userCtx;