Ignore:
Timestamp:
02/03/12 07:55:52 (13 years ago)
Author:
Mathieu Morlighem
Message:

Objective function gradient is now ONE unique vector

File:
1 edited

Legend:

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

    r11310 r11313  
    1414
    1515void gradient_core(FemModel* femmodel,int step,bool orthogonalize){
    16        
    17         /*parameters: */
    18         bool    control_steady;
    19         int     num_controls;
    20         int    *control_type   = NULL;
    21         double *optscal_list   = NULL;
    22         double  optscal=1.e+100,norm_grad;
    2316
    2417        /*Intermediaries*/
    25         Vec new_gradient=NULL;
    26         Vec gradient=NULL;
    27         Vec old_gradient=NULL;
     18        double  norm_inf;
     19        double *norm_list    = NULL;
     20        Vec     new_gradient = NULL;
     21        Vec     gradient     = NULL;
     22        Vec     old_gradient = NULL;
    2823
    29         /*retrieve parameters:*/
    30         femmodel->parameters->FindParam(&control_steady,ControlSteadyEnum);
    31         femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
    32         femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
    33         femmodel->parameters->FindParam(&optscal_list,NULL,NULL,InversionGradientScalingEnum);
     24        /*Compute gradient*/
     25        _printf_(VerboseControl(),"   compute cost function gradient\n");
     26        Gradjx(&gradient,&norm_list,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters);
    3427
    35         /*Compute and norm gradient of all controls*/
    36         for (int i=0;i<num_controls;i++){
    37 
    38                 _printf_(VerboseControl(),"   compute gradient of J with respect to %s\n",EnumToStringx(control_type[i]));
    39                 Gradjx(&gradient,&norm_grad,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,i);
    40 
    41                 if (orthogonalize){
    42                         _printf_(VerboseControl(),"   orthogonalization\n");
    43                         ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,control_type[i]);
    44                         Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient);
    45                 }
    46                 else{
    47                         new_gradient=gradient;
    48                 }
    49 
    50                 /*Get scaling factor of current control:*/
    51                 VecNorm(new_gradient,NORM_INFINITY,&norm_grad);
    52                 if(norm_grad<=0)    _error_("||∂J/∂α||∞ = 0    gradient norm of J with respect to %s is zero",EnumToStringx(control_type[i]));
    53                 if(isnan(norm_grad))_error_("||∂J/∂α||∞ = NaN  gradient norm of J with respect to %s is NaN" ,EnumToStringx(control_type[i]));
    54                 optscal=min(optscal,optscal_list[num_controls*step+i]/norm_grad);
    55 
    56                 /*plug back into inputs: */
    57                 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],new_gradient);
    58                 VecFree(&new_gradient);
     28        if (orthogonalize){
     29                _printf_(VerboseControl(),"   orthogonalization\n");
     30                ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters);
     31                Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient);
     32        }
     33        else{
     34                new_gradient=gradient;
    5935        }
    6036
     37        /*Check that gradient is clean*/
     38        VecNorm(new_gradient,NORM_INFINITY,&norm_inf);
     39        if(norm_inf<=0)    _error_("||∂J/∂α||∞ = 0    gradient norm is zero");
     40        if(isnan(norm_inf))_error_("||∂J/∂α||∞ = NaN  gradient norm is NaN");
     41
     42        /*plug back into inputs: */
     43        ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,new_gradient);
     44        VecFree(&new_gradient);
     45
    6146        /*Scale Gradients*/
    62         for (int i=0;i<num_controls;i++) ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],optscal);
     47        ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,norm_list,step);
    6348
    6449        /*Clean up and return*/
    65         xfree((void**)&control_type);
    66         xfree((void**)&optscal_list);
     50        xfree((void**)&norm_list);
    6751}
Note: See TracChangeset for help on using the changeset viewer.