Changeset 11306


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

improving CM algorithm

Location:
issm/trunk-jpl/src
Files:
5 edited

Legend:

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

    r11302 r11306  
    3434               
    3535        /*intermediary: */
    36         double  search_scalar=0;
     36        double  search_scalar=1;
    3737        OptArgs optargs;
    3838        OptPars optpars;
     
    8484                femmodel->parameters->SetParam(step_responses,1,num_responses,StepResponsesEnum);
    8585               
    86                 /*In case we are running a steady state control method, compute new temperature field using new parameter distribution: */
     86                /*In steady state inversion, compute new temperature field now*/
    8787                if(solution_type==SteadystateSolutionEnum) solutioncore(femmodel);
    8888
    8989                _printf_(VerboseControl(),"%s\n","   compute adjoint state:");
    9090                adjointcore(femmodel);
    91                 gradient_core(femmodel,n,search_scalar);
     91                gradient_core(femmodel,n,search_scalar==0);
    9292
    9393                /*Return gradient if asked: */
     
    100100                optpars.maxiter=(int)maxiter[n]; optpars.cm_jump=cm_jump[n];
    101101                BrentSearch(&search_scalar,J+n,&optpars,&objectivefunctionC,&optargs);
    102                 //OptimalSearch(&search_scalar,J+n,&optpars,&objectivefunctionC,&optargs);
    103102
    104103                _printf_(VerboseControl(),"%s\n","   updating parameter using optimized search scalar"); //true means update save controls
     
    116115                for(i=0;i<num_controls;i++) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i]);
    117116                femmodel->results->AddObject(new DoubleVecExternalResult(femmodel->results->Size()+1,JEnum,J,nsteps,1,0));
    118                 //femmodel->results->AddObject(new StringExternalResult(femmodel->results->Size()+1,InversionControlParametersEnum,EnumToStringx(control_type),1,0));
    119117        }
    120118
  • issm/trunk-jpl/src/c/solutions/gradient_core.cpp

    r11303 r11306  
    1313#include "../solvers/solvers.h"
    1414
    15 
    16 void gradient_core(FemModel* femmodel,int step, double search_scalar){ //step defaults to 0, search_scalar defaults to 0
     15void gradient_core(FemModel* femmodel,int step,bool orthogonalize){
    1716       
    1817        /*parameters: */
     
    4039                Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, control_type[i]);
    4140
    42                 if (step>0 && search_scalar==0){
     41                if (orthogonalize){
    4342                        _printf_(VerboseControl(),"   orthogonalization\n");
    4443                        ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,control_type[i]);
     
    5352                if(norm_grad<=0)    _error_("||∂J/∂α||∞ = 0    gradient norm of J with respect to %s is zero",EnumToStringx(control_type[i]));
    5453                if(isnan(norm_grad))_error_("||∂J/∂α||∞ = NaN  gradient norm of J with respect to %s is NaN" ,EnumToStringx(control_type[i]));
    55                 if(i==0 || (optscal_list[num_controls*step+i]/norm_grad)<optscal) optscal=optscal_list[num_controls*step+i]/norm_grad;
     54                optscal=optscal_list[num_controls*step+i]/norm_grad;
    5655
    5756                /*plug back into inputs: */
  • issm/trunk-jpl/src/c/solutions/solutions.h

    r11286 r11306  
    1515void adjointdiagnostic_core(FemModel* femmodel);
    1616void adjointbalancethickness_core(FemModel* femmodel);
    17 void gradient_core(FemModel* femmodel,int step=0, double search_scalar=0);
     17void gradient_core(FemModel* femmodel,int n=0,bool orthogonalize=false);
    1818void diagnostic_core(FemModel* femmodel);
    1919void hydrology_core(FemModel* femmodel);
  • issm/trunk-jpl/src/m/solutions/control_core.m

    r11302 r11306  
    2525        %Initialize misfits with a vector of zeros
    2626        J=zeros(nsteps,1);
    27         search_scalar=0;
     27        search_scalar=1;
    2828
    2929        %Get core from solution type
     
    4242                femmodel.parameters.StepResponses=responses(n,:);
    4343
    44                 %In case we are running a steady state control method, compute new temperature field using new parameter distribution:
     44                %In steady state inversion, compute new temperature field now
    4545                if (solution_type==SteadystateSolutionEnum)
    4646                        femmodel=steadystate_core(femmodel);
     
    5050                eval(['femmodel=' adjointcore '(femmodel);']);
    5151
    52                 femmodel=gradient_core(femmodel,n,search_scalar);
     52                femmodel=gradient_core(femmodel,n,search_scalar==0);
    5353
    5454                %Return gradient if asked
  • issm/trunk-jpl/src/m/solutions/gradient_core.m

    r11303 r11306  
    1111if nargin==3,
    1212        step=varargin{1};
    13         search_scalar=varargin{2};
     13        orthogonalize=varargin{2};
    1414elseif nargin==1
    1515        step=0;
    16         search_scalar=0;;
     16        orthogonalize=false;
    1717else
    1818        help gradient_core
     
    3131                grad=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,control_type(i));
    3232
    33                 if (step>1 && search_scalar==0),
     33                if orthogonalize,
    3434                        issmprintf(VerboseControl,'%s',['   orthogonalization']);
    3535                        old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters,control_type(i));
     
    4343                 if(norm_grad<=0),     error(['||∂J/∂α||∞ = 0   gradient norm of J with respect to ' EnumToString(control_type(i))  ' is zero']); end
    4444                 if(isnan(norm_grad)), error(['||∂J/∂α||∞ = NaN gradient norm of J with respect to ' EnumToString(control_type(i))  ' is NaN' ]); end
    45                  if(i==1 | (gradient_scaling_list(step,i)/norm_grad)<gradient_scaling) gradient_scaling=gradient_scaling_list(step,i)/norm_grad; end
     45                 gradient_scaling=gradient_scaling_list(step,i)/norm_grad;
    4646
    4747                %plug back into inputs:
Note: See TracChangeset for help on using the changeset viewer.