Changeset 18714


Ignore:
Timestamp:
10/30/14 15:04:40 (10 years ago)
Author:
Mathieu Morlighem
Message:

NEW: enable multi-parametric optimization with m1qn3

File:
1 edited

Legend:

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

    r18650 r18714  
    3232        double       f,dxmin,gttol;
    3333        int          maxsteps,maxiter;
    34         int          intn,num_controls,solution_type;
     34        int          intn,numberofvertices,num_controls,solution_type;
    3535        IssmDouble  *scaling_factors = NULL;
    3636        IssmDouble  *X  = NULL;
     
    4646        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    4747        femmodel->parameters->SetParam(false,SaveResultsEnum);
     48        numberofvertices=femmodel->vertices->NumberOfVertices();
    4849
    4950        /*Initialize M1QN3 parameters*/
     
    6263
    6364        /*Optimization criterions*/
    64         long      niter        = long(maxsteps); /*Maximum number of iterations*/
    65         long      nsim         = long(maxiter);/*Maximum number of function calls*/
     65        long niter = long(maxsteps); /*Maximum number of iterations*/
     66        long nsim  = long(maxiter);/*Maximum number of function calls*/
    6667
    6768        /*Get initial guess*/
     
    7172        Xpetsc->GetSize(&intn);
    7273        delete Xpetsc;
     74        _assert_(intn==numberofvertices*num_controls);
    7375
    7476        /*Get problem dimension and initialize gradient and initial guess*/
     
    7779
    7880        /*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];
     81        for(int i=0;i<numberofvertices;i++){
     82                for(int c=0;c<num_controls;c++){
     83                        int index = num_controls*i+c;
     84                        X[index] = X[index]/scaling_factors[c];
     85                }
    8286        }
    8387
     
    118122        GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
    119123        GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
    120         if(num_controls!=1) _error_("not supported yet");
    121         for(long i=0;i<n;i++){
    122                 X[i] = X[i]*scaling_factors[0];
    123                 if(X[i]>XU[i]) X[i]=XU[i];
    124                 if(X[i]<XL[i]) X[i]=XL[i];
     124        for(int i=0;i<numberofvertices;i++){
     125                for(int c=0;c<num_controls;c++){
     126                        int index = num_controls*i+c;
     127                        X[index] = X[index]*scaling_factors[c];
     128                        if(X[index]>XU[index]) X[index]=XU[index];
     129                        if(X[index]<XL[index]) X[index]=XL[index];
     130                }
    125131        }
    126132        SetControlInputsFromVectorx(femmodel,X);
     
    152158
    153159        /*Recover number of cost functions responses*/
    154         int         num_responses;
    155         int         num_controls;
     160        int num_responses,num_controls,numberofvertices;
    156161        IssmDouble* scaling_factors = NULL;
    157162        femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
    158163        femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
    159164        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
     165        numberofvertices=femmodel->vertices->NumberOfVertices();
    160166
    161167        /*Constrain input vector*/
     
    164170        GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
    165171        GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
    166         if(num_controls!=1) _error_("not supported yet");
    167         for(long i=0;i<*n;i++){
    168                 X[i] = X[i]*scaling_factors[0];
    169                 if(X[i]>XU[i]) X[i]=XU[i];
    170                 if(X[i]<XL[i]) X[i]=XL[i];
     172        for(int i=0;i<numberofvertices;i++){
     173                for(int c=0;c<num_controls;c++){
     174                        int index = num_controls*i+c;
     175                        X[index] = X[index]*scaling_factors[c];
     176                        if(X[index]>XU[index]) X[index]=XU[index];
     177                        if(X[index]<XL[index]) X[index]=XL[index];
     178                }
    171179        }
    172180
     
    214222        /*Constrain Gradient*/
    215223        IssmDouble  Gnorm = 0.;
    216         if(num_controls!=1) _error_("not supported yet");
    217         for(long i=0;i<*n;i++){
    218                 if(X[i]>=XU[i]) G[i]=0.;
    219                 if(X[i]<=XL[i]) G[i]=0.;
    220                 G[i] = G[i]*scaling_factors[0];
    221                 X[i] = X[i]/scaling_factors[0];
    222                 Gnorm += G[i]*G[i];
     224        for(int i=0;i<numberofvertices;i++){
     225                for(int c=0;c<num_controls;c++){
     226                        int index = num_controls*i+c;
     227                        if(X[index]>=XU[index]) G[index]=0.;
     228                        if(X[index]<=XL[index]) G[index]=0.;
     229                        G[index] = G[index]*scaling_factors[c];
     230                        X[index] = X[index]/scaling_factors[c];
     231                        Gnorm += G[index]*G[index];
     232                }
    223233        }
    224234        Gnorm = sqrt(Gnorm);
Note: See TracChangeset for help on using the changeset viewer.