Changeset 11283
- Timestamp:
- 02/01/12 11:04:08 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r11275 r11283 17 17 18 18 /*Local prototype*/ 19 int FormFunction(TaoSolver tao,Vec,double *,void*); 20 int FormFunctionGradient(TaoSolver tao,Vec,double *,Vec,void*); 19 int FormFunctionGradient(TaoSolver tao,Vec,double*,Vec,void*); 21 20 typedef struct { 22 21 FemModel* femmodel; … … 26 25 27 26 /*TAO*/ 28 int i,n,info; 29 TaoSolverTerminationReason reason; 30 TaoSolver tao; 31 Vec initial_solution = NULL; 32 AppCtx user; 33 PetscInt iter; 34 double ff ,gnorm; 27 int i,n,info; 28 TaoSolver tao; 29 Vec initial_solution = NULL; 30 AppCtx user; 35 31 36 32 /*Initialize TAO*/ … … 40 36 41 37 /*Line search options*/ 42 //info = PetscOptionsSetValue("-tao_ls_stepmax","10e11"); if(info) _error_("STOP"); //does not work43 //info = PetscOptionsSetValue("-tao_ls_stepmin","10e5"); if(info) _error_("STOP"); //does not work44 info = PetscOptionsSetValue("-tao_ls_maxfev","3"); if(info) _error_("STOP");45 38 /*TAO options: http://www.mcs.anl.gov/research/projects/tao/docs/manualpages/solver/TaoSetFromOptions.html*/ 46 39 info = PetscOptionsSetValue("-tao_monitor",""); if(info) _error_("STOP"); 47 info = PetscOptionsSetValue("-tao_max_its","10"); if(info) _error_("STOP"); 48 info = PetscOptionsSetValue("-tao_max_funcs","30"); if(info) _error_("STOP"); 49 50 /*Additional options*/ 51 //info = PetscOptionsSetValue("-info","/u/astrid-r1b/morlighe/svn/issm/trunk/test/NightlyRun/taolog.txt"); if(info) _error_("STOP"); 40 info = PetscOptionsSetValue("-tao_max_its","20"); if(info) _error_("STOP"); 41 info = PetscOptionsSetValue("-tao_max_funcs","50"); if(info) _error_("STOP"); 52 42 53 43 /*Initialize argument*/ … … 55 45 56 46 /*Set up and solve TAO*/ 57 GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,MaterialsRheologyBbarEnum,VertexEnum);58 47 info = TaoCreate(PETSC_COMM_WORLD,&tao); if(info) _error_("STOP"); 59 //info = TaoSetType(tao,"tao_blmvm"); if(info) _error_("STOP"); 60 info = TaoSetType(tao,"tao_cg"); if(info) _error_("STOP"); 48 info = TaoSetType(tao,"tao_blmvm"); if(info) _error_("STOP"); 49 //info = TaoSetType(tao,"tao_cg"); if(info) _error_("STOP"); 50 51 int size=femmodel->vertices->NumberOfVertices(); 52 Vec XL=NULL; 53 Vec XU=NULL; 54 VecCreate(PETSC_COMM_WORLD,&XL); VecCreate(PETSC_COMM_WORLD,&XU); 55 VecSetSizes(XL,PetscDetermineLocalSize(size),PETSC_DECIDE); VecSetSizes(XU,PetscDetermineLocalSize(size),PETSC_DECIDE); 56 VecSetFromOptions(XL); VecSetFromOptions(XU); 57 VecSet(XL,1); VecSet(XU,200.); 58 TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU); 59 60 GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,FrictionCoefficientEnum,VertexEnum); 61 61 info = TaoSetInitialVector(tao,initial_solution); if(info) _error_("STOP"); 62 info = TaoSetObjectiveRoutine(tao,FormFunction,(void*)&user); if(info) _error_("STOP"); 62 VecFree(&initial_solution); 63 63 64 info = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user); if(info) _error_("STOP"); 64 65 info = TaoSetFromOptions(tao); if(info) _error_("STOP"); 65 66 /* http://www.mcs.anl.gov/research/projects/tao/docs/manpages/taosolver/TaoSetTolerances.html*/ 66 /* fatol , frtol, gatol, grtol,gttol*/67 info = TaoSetTolerances(tao,10e- 18,10e-18,10e-18,10e-18,10e-18); if(info) _error_("STOP");67 /* fatol ,frtol ,gatol ,grtol ,gttol*/ 68 info = TaoSetTolerances(tao,10e-28,0.0000,0.0000,0.0000,10e-28); if(info) _error_("STOP"); 68 69 info = TaoSolve(tao); if(info) _error_("STOP"); 69 70 70 71 /*Get solution status*/ 71 info = TaoGetSolutionStatus(tao,&iter,&ff,&gnorm,0,0,&reason); //CHKERRQ(info); 72 switch(reason){ 73 /*http://www.mcs.anl.gov/research/projects/tao/docs/manpages/taosolver/TaoGetTerminationReason.html*/ 74 case TAO_DIVERGED_MAXITS: _printf_(true,"TAO_DIVERGED_MAXITS (its>maxits)\n"); break; 75 case TAO_DIVERGED_NAN: _printf_(true,"TAO_DIVERGED_NAN (Numerical problems)\n"); break; 76 case TAO_DIVERGED_MAXFCN: _printf_(true,"TAO_DIVERGED_MAXFCN (nfunc > maxnfuncts)\n"); break; 77 case TAO_DIVERGED_LS_FAILURE: _printf_(true,"TAO_DIVERGED_LS_FAILURE (line search failure)\n"); break; 78 case TAO_DIVERGED_TR_REDUCTION:_printf_(true,"TAO_DIVERGED_TR_REDUCTION \n"); break; 79 case TAO_DIVERGED_USER: _printf_(true,"TAO_DIVERGED_USER (user defined)\n"); break; 80 default: _printf_(true,"unknown reason"); 81 } 82 if (reason<=0){ 83 _printf_(true,"Try a different TAO method, adjust some parameters, or check the function evaluation routines\n"); 84 _printf_(true," Iterations: %d, Function Value: %4.2e, Residual: %4.2e \n",iter,ff,gnorm); 85 } 86 else{ 87 _printf_(true,"TAO found a solution"); 88 } 89 info = TaoView(tao,PETSC_VIEWER_STDOUT_SELF); if(info) _error_("STOP"); 72 info = TaoView(tao,PETSC_VIEWER_STDOUT_WORLD); if(info) _error_("STOP"); 90 73 91 74 /*Clean up*/ 92 75 info = TaoDestroy(&tao); if(info) _error_("STOP"); 93 VecFree(&initial_solution);76 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum); 94 77 95 78 /* Finalize TAO */ 96 79 TaoFinalize(); 97 }98 99 int FormFunction(TaoSolver tao, Vec X, double *fcn,void *userCtx){100 AppCtx *user = (AppCtx*)userCtx;101 FemModel *femmodel = user->femmodel;102 103 int costfunction=SurfaceAbsVelMisfitEnum;104 femmodel->parameters->SetParam(&costfunction,1,1,StepResponsesEnum);105 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum);106 diagnostic_core(user->femmodel);107 CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);108 printf("f(x) = %g\n",*fcn);109 return 0;110 80 } 111 81 int FormFunctionGradient(TaoSolver tao, Vec X, double *fcn,Vec G,void *userCtx){ … … 118 88 int costfunction=SurfaceAbsVelMisfitEnum; 119 89 femmodel->parameters->SetParam(&costfunction,1,1,StepResponsesEnum); 120 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum); 90 //InputUpdateFromVectorx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum); 91 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,FrictionCoefficientEnum,VertexEnum); 121 92 adjointdiagnostic_core(user->femmodel); 122 Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, MaterialsRheologyBbarEnum);123 VecScale(gradient,-10e7);124 //VecScale(gradient,-1.);93 //Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, MaterialsRheologyBbarEnum); 94 Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,FrictionCoefficientEnum); 95 VecScale(gradient,-1.); 125 96 VecCopy(gradient,G); 97 VecFree(&gradient); 126 98 CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 127 128 printf("f2(x) = %g\n",*fcn);129 99 return 0; 130 100 } 101 131 102 #else 132 103 void controltao_core(FemModel* femmodel){
Note:
See TracChangeset
for help on using the changeset viewer.