Changeset 11283


Ignore:
Timestamp:
02/01/12 11:04:08 (13 years ago)
Author:
Mathieu Morlighem
Message:

Fixed tao, now working smoothly

File:
1 edited

Legend:

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

    r11275 r11283  
    1717
    1818/*Local prototype*/
    19 int FormFunction(TaoSolver tao,Vec,double *,void*);
    20 int FormFunctionGradient(TaoSolver tao,Vec,double *,Vec,void*);
     19int FormFunctionGradient(TaoSolver tao,Vec,double*,Vec,void*);
    2120typedef struct {
    2221        FemModel* femmodel;
     
    2625
    2726        /*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;
    3531
    3632        /*Initialize TAO*/
     
    4036
    4137        /*Line search options*/
    42         //info = PetscOptionsSetValue("-tao_ls_stepmax","10e11"); if(info) _error_("STOP"); //does not work
    43         //info = PetscOptionsSetValue("-tao_ls_stepmin","10e5"); if(info) _error_("STOP");    //does not work
    44         info = PetscOptionsSetValue("-tao_ls_maxfev","3"); if(info) _error_("STOP");
    4538        /*TAO options: http://www.mcs.anl.gov/research/projects/tao/docs/manualpages/solver/TaoSetFromOptions.html*/
    4639        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");
    5242
    5343        /*Initialize argument*/
     
    5545
    5646        /*Set up and solve TAO*/
    57         GetVectorFromInputsx(&initial_solution,femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,MaterialsRheologyBbarEnum,VertexEnum);
    5847        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);
    6161        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
    6364        info = TaoSetObjectiveAndGradientRoutine(tao,FormFunctionGradient,(void*)&user);  if(info) _error_("STOP");
    6465        info = TaoSetFromOptions(tao);  if(info) _error_("STOP");
    6566        /* 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");
    6869        info = TaoSolve(tao); if(info) _error_("STOP");
    6970
    7071        /*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");
    9073
    9174        /*Clean up*/
    9275        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);
    9477
    9578        /* Finalize TAO */
    9679        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;
    11080}
    11181int FormFunctionGradient(TaoSolver tao, Vec X, double *fcn,Vec G,void *userCtx){
     
    11888        int costfunction=SurfaceAbsVelMisfitEnum;
    11989        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);
    12192        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.);
    12596        VecCopy(gradient,G);
     97        VecFree(&gradient);
    12698        CostFunctionx(fcn, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);
    127 
    128         printf("f2(x) = %g\n",*fcn);
    12999        return 0;
    130100}
     101
    131102#else
    132103void controltao_core(FemModel* femmodel){
Note: See TracChangeset for help on using the changeset viewer.