Changeset 11297
- Timestamp:
- 02/01/12 16:21:31 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r11289 r11297 25 25 26 26 /*TAO*/ 27 int i,n,info; 27 int ierr,numberofvertices; 28 AppCtx user; 28 29 TaoSolver tao; 29 Vec initial_solution = NULL; 30 AppCtx user; 30 Vec X = NULL; 31 Vec XL = NULL; 32 Vec XU = NULL; 31 33 32 34 /*Initialize TAO*/ 33 int argc; char **args; PetscGetArgs(&argc,&args); 34 int ierr=TaoInitialize(&argc,&args,(char*)0,""); 35 int argc; char **args=NULL; 36 PetscGetArgs(&argc,&args); 37 ierr = TaoInitialize(&argc,&args,(char*)0,""); 35 38 if(ierr) _error_("Could not initialize Tao"); 36 39 37 info = PetscOptionsSetValue("-tao_monitor",""); if(info) _error_("STOP"); 40 /*Initialize TAO*/ 41 TaoCreate(PETSC_COMM_WORLD,&tao); 42 PetscOptionsSetValue("-tao_monitor",""); 43 TaoSetFromOptions(tao); 44 TaoSetType(tao,"tao_blmvm"); 38 45 39 /*Initialize argument*/ 40 user.femmodel=femmodel; 46 /*Prepare all TAO parameters*/ 47 TaoSetMaximumFunctionEvaluations(tao,50); 48 TaoSetMaximumIterations(tao,10); 49 TaoSetTolerances(tao,10e-28,0.0000,0.0000,0.0000,10e-28); 41 50 42 /*Set up and solve TAO*/ 43 info = TaoCreate(PETSC_COMM_WORLD,&tao); if(info) _error_("STOP"); 44 info = TaoSetType(tao,"tao_blmvm"); if(info) _error_("STOP"); 45 //info = TaoSetType(tao,"tao_cg"); if(info) _error_("STOP"); 46 TaoSetMaximumFunctionEvaluations(tao,10); 47 TaoSetMaximumIterations(tao,3); 48 49 int size=femmodel->vertices->NumberOfVertices(); 50 Vec XL=NULL; 51 Vec XU=NULL; 52 VecCreate(PETSC_COMM_WORLD,&XL); VecCreate(PETSC_COMM_WORLD,&XU); 53 VecSetSizes(XL,PetscDetermineLocalSize(size),PETSC_DECIDE); VecSetSizes(XU,PetscDetermineLocalSize(size),PETSC_DECIDE); 54 VecSetFromOptions(XL); VecSetFromOptions(XU); 55 VecSet(XL,1); VecSet(XU,200.); 51 numberofvertices = femmodel->vertices->NumberOfVertices(); 52 XL=NewVec(numberofvertices); VecSet(XL,1.); 53 XU=NewVec(numberofvertices); VecSet(XU,200.); 56 54 TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU); 57 55 58 GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,FrictionCoefficientEnum,VertexEnum); 59 info = TaoSetInitialVector(tao,initial_solution); if(info) _error_("STOP"); 60 VecFree(&initial_solution); 56 GetVectorFromInputsx(&X,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum,VertexEnum); 57 TaoSetInitialVector(tao,X); 61 58 62 info = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); if(info) _error_("STOP"); 63 info = TaoSetFromOptions(tao); if(info) _error_("STOP"); 64 /* http://www.mcs.anl.gov/research/projects/tao/docs/manpages/taosolver/TaoSetTolerances.html*/ 65 /* fatol ,frtol ,gatol ,grtol ,gttol*/ 66 info = TaoSetTolerances(tao,10e-28,0.0000,0.0000,0.0000,10e-28); if(info) _error_("STOP"); 67 info = TaoSolve(tao); if(info) _error_("STOP"); 59 user.femmodel=femmodel; 60 TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); 68 61 69 /* Get solution status*/70 info = TaoView(tao,PETSC_VIEWER_STDOUT_WORLD); if(info) _error_("STOP");71 72 /*Clean up*/73 info = TaoDestroy(&tao); if(info) _error_("STOP");62 /*Solver optimization problem*/ 63 TaoSolve(tao); 64 TaoView(tao,PETSC_VIEWER_STDOUT_WORLD); 65 TaoGetSolutionVector(tao,&X); 66 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,FrictionCoefficientEnum,VertexEnum); 74 67 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum); 75 68 76 /* Finalize TAO */ 69 /*Clean up and return*/ 70 VecFree(&X); 71 TaoDestroy(&tao); 77 72 TaoFinalize(); 78 73 } … … 86 81 int costfunction=SurfaceAbsVelMisfitEnum; 87 82 femmodel->parameters->SetParam(&costfunction,1,1,StepResponsesEnum); 88 //InputUpdateFromVectorx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials,femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum);83 //InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum); 89 84 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,FrictionCoefficientEnum,VertexEnum); 90 85 adjointdiagnostic_core(user->femmodel); 91 //Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,MaterialsRheologyBbarEnum);92 Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum);86 //Gradjx(&gradient,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,MaterialsRheologyBbarEnum); 87 Gradjx(&gradient,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum); 93 88 VecScale(gradient,-1.); 94 89 VecCopy(gradient,G); 95 90 VecFree(&gradient); 96 CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 97 _printf_(true,"f(x)=%g\n",*fcn); 91 CostFunctionx(fcn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 98 92 return 0; 99 93 }
Note:
See TracChangeset
for help on using the changeset viewer.