Changeset 18616


Ignore:
Timestamp:
10/10/14 14:51:26 (10 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added scaling for each control

Location:
issm/trunk-jpl/src/c
Files:
2 edited

Legend:

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

    r18571 r18616  
    3333        int          maxsteps,maxiter;
    3434        int          intn,num_controls,solution_type;
     35        IssmDouble  *scaling_factors = NULL;
    3536        IssmDouble  *X  = NULL;
    3637        IssmDouble  *G  = NULL;
     
    4344        femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
    4445        femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
     46        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    4547        femmodel->parameters->SetParam(false,SaveResultsEnum);
    4648
     
    7476        G = xNew<double>(n);
    7577
     78        /*Scale control for M1QN3*/
     79        if(num_controls!=1) _error_("not supported yet...");
     80        for(long i=0;i<n;i++){
     81                X[i] = X[i]/scaling_factors[0];
     82        }
     83
    7684        /*Allocate m1qn3 working arrays (see doc)*/
    7785        long      m   = 100;
     
    132140
    133141        /*Recover number of cost functions responses*/
    134         int num_responses;
     142        int         num_responses;
     143        int         num_controls;
     144        IssmDouble* scaling_factors = NULL;
    135145        femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
     146        femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
     147        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    136148
    137149        /*Constrain input vector*/
     
    140152        GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
    141153        GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
     154        if(num_controls!=1) _error_("not supported yet");
    142155        for(long i=0;i<*n;i++){
     156                X[i] = X[i]*scaling_factors[0];
    143157                if(X[i]>XU[i]) X[i]=XU[i];
    144158                if(X[i]<XL[i]) X[i]=XL[i];
     
    162176        _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
    163177
    164 
    165 
    166178        if(indic==0){
    167179                /*dry run, no gradient required*/
     
    190202        /*Constrain Gradient*/
    191203        IssmDouble  Gnorm = 0.;
     204        if(num_controls!=1) _error_("not supported yet");
    192205        for(long i=0;i<*n;i++){
    193206                if(X[i]>=XU[i]) G[i]=0.;
    194207                if(X[i]<=XL[i]) G[i]=0.;
     208                G[i] = G[i]*scaling_factors[0];
     209                X[i] = X[i]/scaling_factors[0];
    195210                Gnorm += G[i]*G[i];
    196211        }
     
    203218
    204219        /*Clean-up and return*/
    205                 xDelete<IssmDouble>(Jlist);
     220        xDelete<IssmDouble>(Jlist);
    206221        xDelete<IssmDouble>(XU);
    207222        xDelete<IssmDouble>(XL);
  • TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r18128 r18616  
    1313        int         inversiontype;
    1414        int         nsteps;
    15         int         num_control_type;
    16         int         num_cm_responses;
     15        int         num_controls;
     16        int         num_costfunc;
    1717        int        *control_type     = NULL;
    1818        int        *maxiter          = NULL;
     
    2020        IssmDouble *cm_jump          = NULL;
    2121        IssmDouble *optscal          = NULL;
     22        IssmDouble *control_scaling_factors = NULL;
    2223
    2324        /*retrieve some parameters: */
     
    4142
    4243                /*Now, recover fit, optscal and maxiter as vectors: */
    43                 iomodel->FetchData(&control_type,NULL,&num_control_type,InversionControlParametersEnum);
    44                 iomodel->FetchData(&cm_responses,NULL,&num_cm_responses,InversionCostFunctionsEnum);
    45                 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_control_type));
    46                 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_cm_responses));
     44                iomodel->FetchData(&control_type,NULL,&num_controls,InversionControlParametersEnum);
     45                iomodel->FetchData(&cm_responses,NULL,&num_costfunc,InversionCostFunctionsEnum);
     46                parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_controls));
     47                parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_costfunc));
    4748
    4849                /*Inversion type specifics*/
     
    5455                                iomodel->FetchData(&optscal,NULL,NULL,InversionGradientScalingEnum);
    5556                                iomodel->FetchData(&maxiter,NULL,NULL,InversionMaxiterPerStepEnum);
    56                                 parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_control_type));
     57                                parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_controls));
    5758                                parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps));
    5859                                parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));
     
    7374                                parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum));
    7475                                parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum));
     76                                iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum);
     77                                parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
    7578                                break;
    7679                        case 3:/*Validation*/
Note: See TracChangeset for help on using the changeset viewer.