Changeset 11317 for issm/trunk-jpl/src/c/solutions/controltao_core.cpp
- Timestamp:
- 02/03/12 13:50:06 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r11313 r11317 25 25 26 26 /*TAO*/ 27 int ierr,numberofvertices; 28 AppCtx user; 29 TaoSolver tao; 30 Vec X = NULL; 31 Vec XL = NULL; 32 Vec XU = NULL; 27 int ierr,numberofvertices; 28 int num_controls; 29 AppCtx user; 30 TaoSolver tao; 31 int *control_list = NULL; 32 Vec X = NULL; 33 Vec XL = NULL; 34 Vec XU = NULL; 33 35 34 36 /*Initialize TAO*/ … … 37 39 ierr = TaoInitialize(&argc,&args,(char*)0,""); 38 40 if(ierr) _error_("Could not initialize Tao"); 41 42 /*Recover some parameters*/ 43 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 44 femmodel->parameters->FindParam(&control_list,NULL,InversionControlParametersEnum); 39 45 40 46 /*Initialize TAO*/ … … 52 58 XL=NewVec(numberofvertices); VecSet(XL,1.); 53 59 XU=NewVec(numberofvertices); VecSet(XU,200.); 54 TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU);60 //TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU); 55 61 56 GetVectorFrom Inputsx(&X,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum,VertexEnum);62 GetVectorFromControlInputsx(&X,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 57 63 TaoSetInitialVector(tao,X); 58 64 … … 64 70 TaoView(tao,PETSC_VIEWER_STDOUT_WORLD); 65 71 TaoGetSolutionVector(tao,&X); 66 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,FrictionCoefficientEnum,VertexEnum); 67 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,FrictionCoefficientEnum); 72 SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X); 73 for(int i=0;i<num_controls;i++){ 74 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_list[i]); 75 } 68 76 69 77 /*Clean up and return*/ 78 xfree((void**)&control_list); 70 79 VecFree(&X); 71 80 TaoDestroy(&tao); … … 75 84 76 85 /*Retreive arguments*/ 77 AppCtx *user = (AppCtx*)userCtx; 78 FemModel *femmodel = user->femmodel; 79 Vec gradient = NULL; 86 int solution_type,num_cost_functions; 87 AppCtx *user = (AppCtx *)userCtx; 88 FemModel *femmodel = user->femmodel; 89 int *cost_functions = NULL; 90 double *cost_functionsd= NULL; 91 Vec gradient = NULL; 80 92 81 int costfunction=SurfaceAbsVelMisfitEnum; 82 femmodel->parameters->SetParam(&costfunction,1,1,StepResponsesEnum); 83 //InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,MaterialsRheologyBbarEnum,VertexEnum); 84 InputUpdateFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X,FrictionCoefficientEnum,VertexEnum); 85 adjointdiagnostic_core(user->femmodel); 86 //Gradjx(&gradient,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,MaterialsRheologyBbarEnum); 93 /*Set new variable*/ 94 SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X); 95 96 /*Recover some parameters*/ 97 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 98 femmodel->parameters->FindParam(&num_cost_functions,InversionNumCostFunctionsEnum); 99 femmodel->parameters->FindParam(&cost_functionsd,NULL,NULL,InversionCostFunctionsEnum); 100 101 /*Prepare objective function*/ 102 cost_functions=(int*)xmalloc(num_cost_functions*sizeof(int)); 103 for(int i=0;i<num_cost_functions;i++) cost_functions[i]=(int)cost_functionsd[i]; //FIXME 104 femmodel->parameters->SetParam(cost_functions,1,num_cost_functions,StepResponsesEnum); 105 106 /*Compute solution and adjoint*/ 107 void (*solutioncore)(FemModel*)=NULL; 108 void (*adjointcore)(FemModel*)=NULL; 109 CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type); 110 AdjointCorePointerFromSolutionEnum(&adjointcore,solution_type); 111 solutioncore(femmodel); 112 adjointcore(femmodel); 113 114 /*Compute objective function*/ 115 CostFunctionx(fcn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 116 117 /*Compute gradient*/ 87 118 Gradjx(&gradient,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 88 VecScale(gradient,-1.); 89 VecCopy(gradient,G); 90 VecFree(&gradient); 91 CostFunctionx(fcn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 119 VecCopy(gradient,G); VecFree(&gradient); 120 VecScale(G,-1.); 121 122 /*Clean-up and return*/ 123 xfree((void**)&cost_functions); 124 xfree((void**)&cost_functionsd); 92 125 return 0; 93 126 }
Note:
See TracChangeset
for help on using the changeset viewer.