Changeset 18617


Ignore:
Timestamp:
10/10/14 15:05:23 (10 years ago)
Author:
Mathieu Morlighem
Message:

CHG: use scaling factor for inversion validation

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

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp

    r18604 r18617  
    1515        IssmDouble  j0,j,yts;
    1616        IssmDouble  Ialpha,exponent,alpha;
     17        IssmDouble* scaling_factors = NULL;
    1718        IssmDouble* jlist = NULL;
    1819        IssmDouble *G = NULL;
     
    2930        femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
    3031        femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
     32        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    3133
    3234        /*Get initial guess*/
     
    5153        if(VerboseControl()) _printf0_("   Compute Initial cost function\n");
    5254        femmodel->CostFunctionx(&j0,&jlist,NULL);
    53         _printf0_("Initial J(x+dk)      |  List of contributions\n");
    54         _printf0_("_____________________________________________\n");
    55         _printf0_("J(x) = "<<setw(12)<<setprecision(7)<<j0<<"  |  ");
    56         for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<jlist[i]);
    57         _printf0_("\n");
     55        _printf0_("Initial cost function J(x) = "<<setw(12)<<setprecision(7)<<j0<<"\n");
    5856        xDelete<IssmDouble>(jlist);
    5957
     
    6260        for(int i=0;i<n;i++) G[i] = -G[i];
    6361
    64         /*Range of tests*/
    65         IssmDouble exp0 = 0.;
    66         IssmDouble incr = -0.2;
    67         IssmDouble exp1 = -18.;
    68         int        num  = reCast<int,IssmDouble>((exp1-exp0)/incr);
    69 
    7062        /*Allocate output*/
     63        int num = 26;
    7164        IssmDouble* output = xNew<IssmDouble>(2*num);
    7265
     
    7669        for(int m=0;m<num;m++){
    7770
    78                 /*Calculate alpha = 10^-exponent*/
    79                 exponent = exp0+m*incr;
    80                 alpha    = pow(10.,exponent);
    81 
    8271                /*Create new vector*/
     72                alpha    = pow(2.,-m);
    8373                for(int i=0;i<n;i++) X[i] = X0[i] + alpha;
    8474
     
    8979
    9080                IssmDouble Den = 0.;
    91                 for(int i=0;i<n;i++) Den += alpha* G[i] * 1.;
     81                for(int i=0;i<n;i++) Den += alpha* G[i] * scaling_factors[0];
    9282                Ialpha = fabs((j - j0)/Den - 1.);
    9383
  • TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r18616 r18617  
    7878                                break;
    7979                        case 3:/*Validation*/
     80                                iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
     81                                parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
    8082                                break;
    8183                        default:
  • TabularUnified issm/trunk-jpl/src/m/classes/inversionvalidation.m

    r18605 r18617  
    99                incomplete_adjoint          = 0
    1010                control_parameters          = NaN
     11                control_scaling_factors     = NaN
    1112                cost_functions              = NaN
    1213                cost_functions_coefficients = NaN
     
    4041                        self.control_parameters={'FrictionCoefficient'};
    4142
     43                        %Scaling factor for each control
     44                        self.control_scaling_factors=1;
     45
    4246                        %several responses can be used:
    4347                        self.cost_functions=101;
     
    5660                                {'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'DamageDbar' 'Vx' 'Vy' 'Thickness',...
    5761                                'BalancethicknessOmega' 'BalancethicknessApparentMassbalance'});
     62                        md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1);
    5863                        md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',[101:105 201 501:506 601:604]);
    5964                        md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
     
    7782                        fielddisplay(obj,'incomplete_adjoint','1: linear viscosity, 0: non-linear viscosity');
    7883                        fielddisplay(obj,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
     84                        fielddisplay(obj,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
    7985                        fielddisplay(obj,'cost_functions','indicate the type of response for each optimization step');
    8086                        fielddisplay(obj,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
     
    105111                        if ~obj.iscontrol, return; end
    106112                        WriteData(fid,'object',obj,'class','inversion','fieldname','incomplete_adjoint','format','Boolean');
     113                        WriteData(fid,'object',obj,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
    107114                        WriteData(fid,'object',obj,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
    108115                        WriteData(fid,'object',obj,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
Note: See TracChangeset for help on using the changeset viewer.