Ignore:
Timestamp:
02/03/12 13:50:06 (13 years ago)
Author:
Mathieu Morlighem
Message:

Added 2 modules to make TAO work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/solutions/controltao_core.cpp

    r11313 r11317  
    2525
    2626        /*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;
    3335
    3436        /*Initialize TAO*/
     
    3739        ierr = TaoInitialize(&argc,&args,(char*)0,"");
    3840        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);
    3945
    4046        /*Initialize TAO*/
     
    5258        XL=NewVec(numberofvertices); VecSet(XL,1.);
    5359        XU=NewVec(numberofvertices); VecSet(XU,200.);
    54         TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU);
     60        //TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU);
    5561
    56         GetVectorFromInputsx(&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);
    5763        TaoSetInitialVector(tao,X);
    5864
     
    6470        TaoView(tao,PETSC_VIEWER_STDOUT_WORLD);
    6571        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        }
    6876
    6977        /*Clean up and return*/
     78        xfree((void**)&control_list);
    7079        VecFree(&X);
    7180        TaoDestroy(&tao);
     
    7584
    7685        /*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;
    8092
    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*/
    87118        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);
    92125        return 0;
    93126}
Note: See TracChangeset for help on using the changeset viewer.