Changeset 17905


Ignore:
Timestamp:
05/01/14 10:17:42 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added constraints on m1qn3 inversion

File:
1 edited

Legend:

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

    r17902 r17905  
    3535        IssmDouble  *X  = NULL;
    3636        IssmDouble  *G  = NULL;
    37         IssmDouble  *XL = NULL;
    38         IssmDouble  *XU = NULL;
    3937
    4038        /*Recover some parameters*/
     
    139137        femmodel->parameters->FindParam(&responses,&num_responses,InversionCostFunctionsEnum);
    140138
     139        /*Constrain input vector*/
     140        IssmDouble  *XL = NULL;
     141        IssmDouble  *XU = NULL;
     142        GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
     143        GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
     144        for(long i=0;i<*n;i++){
     145                if(X[i]>XU[i]) X[i]=XU[i];
     146                if(X[i]<XL[i]) X[i]=XL[i];
     147        }
     148
    141149        /*Update control input*/
    142150        SetControlInputsFromVectorx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);
     
    162170        _printf0_("\n");
    163171
    164         if(indic==0) return; /*dry run, no gradient required*/
     172        if(indic==0){
     173                /*dry run, no gradient required*/
     174                xDelete<int>(responses);
     175                xDelete<IssmDouble>(XU);
     176                xDelete<IssmDouble>(XL);
     177                return;
     178        }
    165179
    166180        /*Compute Adjoint*/
     
    172186        Gradjx(&G2,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
    173187        for(long i=0;i<*n;i++) G[i] = -G2[i];
     188        xDelete<IssmDouble>(G2);
     189
     190        /*Constrain Gradient*/
     191        for(long i=0;i<*n;i++){
     192                if(X[i]>=XU[i]) G[i]=0.;
     193                if(X[i]<=XL[i]) G[i]=0.;
     194        }
    174195
    175196        /*Clean-up and return*/
    176197        xDelete<int>(responses);
    177         xDelete<IssmDouble>(G2);
     198        xDelete<IssmDouble>(XU);
     199        xDelete<IssmDouble>(XL);
    178200}
    179201
Note: See TracChangeset for help on using the changeset viewer.