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 11702) +++ /proj/ice/larour/issm-uci-clean/trunk-jpl/src/c/solutions/controltao_core.cpp (revision 11703) @@ -12,7 +12,7 @@ #include "../include/include.h" #include "../solvers/solvers.h" -#if defined (_HAVE_TAO_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ == 2) +#if defined (_HAVE_TAO_) && defined (_HAVE_PETSC_) && (_PETSC_MAJOR_ == 3 && _PETSC_MINOR_ == 2) #include /*Local prototype*/ @@ -32,9 +32,9 @@ TaoSolver tao; double *dummy = NULL; int *control_list = NULL; - Vec X = NULL; - Vec XL = NULL; - Vec XU = NULL; + Vector *X = NULL; + Vector *XL = NULL; + Vector *XU = NULL; /*Initialize TAO*/ int argc; char **args=NULL; @@ -67,10 +67,10 @@ GetVectorFromControlInputsx(&X, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); - TaoSetInitialVector(tao,X); - TaoSetVariableBounds(tao,XL,XU); - VecFree(&XL); - VecFree(&XU); + TaoSetInitialVector(tao,X->vector); + TaoSetVariableBounds(tao,XL->vector,XU->vector); + xdelete(&XL); + xdelete(&XU); user.femmodel=femmodel; TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); @@ -79,7 +79,7 @@ _printf_(VerboseControl(),"%s\n"," Starting optimization"); TaoSolve(tao); TaoView(tao,PETSC_VIEWER_STDOUT_WORLD); - TaoGetSolutionVector(tao,&X); + TaoGetSolutionVector(tao,&X->vector); SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X); for(int i=0;ielements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_list[i]); @@ -94,11 +94,11 @@ /*Clean up and return*/ xfree((void**)&control_list); - VecFree(&X); + xdelete(&X); TaoDestroy(&tao); TaoFinalize(); } -int FormFunctionGradient(TaoSolver tao, Vec X, double *fcn,Vec G,void *userCtx){ +int FormFunctionGradient(TaoSolver tao, Vec Xpetsc, double *fcn,Vec G,void *userCtx){ /*Retreive arguments*/ int solution_type,num_cost_functions; @@ -106,8 +106,12 @@ FemModel *femmodel = user->femmodel; int *cost_functions = NULL; double *cost_functionsd= NULL; - Vec gradient = NULL; + Vector *gradient = NULL; + Vector *X = NULL; + /*Convert input to Vec*/ + X=new Vector(Xpetsc); + /*Set new variable*/ //VecView(X,PETSC_VIEWER_STDOUT_WORLD); SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X); @@ -135,7 +139,7 @@ /*Compute gradient*/ Gradjx(&gradient,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); - VecCopy(gradient,G); VecFree(&gradient); + VecCopy(gradient->vector,G); xdelete(&gradient); VecScale(G,-1.); /*Clean-up and return*/