source: issm/oecreview/Archive/23185-23389/ISSM-23305-23306.diff@ 23390

Last change on this file since 23390 was 23390, checked in by Mathieu Morlighem, 6 years ago

CHG: added Archive/23185-23389

File size: 9.0 KB
  • ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp

     
    1010#include "../modules/modules.h"
    1111#include "../solutionsequences/solutionsequences.h"
    1212
    13 #if defined (_HAVE_M1QN3_) && !defined(_HAVE_AD_)
     13#if defined (_HAVE_M1QN3_)
    1414/*m1qn3 prototypes {{{*/
    1515extern "C" void *ctonbe_; // DIS mode : Conversion
    1616extern "C" void *ctcabe_; // DIS mode : Conversion
     
    2727
    2828/*Use struct to provide arguments*/
    2929typedef struct{
    30         FemModel  * femmodel;
    31         IssmDouble* Jlist;
     30        FemModel   * femmodel;
     31        IssmPDouble* Jlist;
    3232        int         M;
    3333        int         N;
    3434        int*        i;
     
    4343        int          maxsteps,maxiter;
    4444        int          intn,numberofvertices,num_controls,num_cost_functions,solution_type;
    4545        IssmDouble  *scaling_factors = NULL;
    46         IssmDouble  *X  = NULL;
    47         IssmDouble  *G  = NULL;
     46        double      *X  = NULL;
     47        double      *G  = NULL;
    4848
    4949        /*Recover some parameters*/
    5050        femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
     
    5252        femmodel->parameters->FindParam(&num_cost_functions,InversionNumCostFunctionsEnum);
    5353        femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
    5454        femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
    55         femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
    56         femmodel->parameters->FindParam(&gttol,InversionGttolEnum);
     55        femmodel->parameters->FindParamAndMakePassive(&dxmin,InversionDxminEnum);
     56        femmodel->parameters->FindParamAndMakePassive(&gttol,InversionGttolEnum);
    5757        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    5858        femmodel->parameters->SetParam(false,SaveResultsEnum);
    5959        numberofvertices=femmodel->vertices->NumberOfVertices();
     
    7777        long nsim  = long(maxiter);/*Maximum number of function calls*/
    7878
    7979        /*Get initial guess*/
    80         Vector<IssmDouble> *Xpetsc = NULL;
    81         GetVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
     80        Vector<double> *Xpetsc = NULL;
     81        GetPassiveVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
    8282        X = Xpetsc->ToMPISerial();
    8383        Xpetsc->GetSize(&intn);
    8484        delete Xpetsc;
     
    9292        for(int c=0;c<num_controls;c++){
    9393                for(int i=0;i<numberofvertices;i++){
    9494                        int index = numberofvertices*c+i;
    95                         X[index] = X[index]/scaling_factors[c];
     95                        X[index] = X[index]/reCast<double>(scaling_factors[c]);
    9696                }
    9797        }
    9898
     
    111111        mystruct.femmodel = femmodel;
    112112        mystruct.M        = maxiter;
    113113        mystruct.N        = num_cost_functions+1;
    114         mystruct.Jlist    = xNewZeroInit<IssmDouble>(mystruct.M*mystruct.N);
     114        mystruct.Jlist    = xNewZeroInit<IssmPDouble>(mystruct.M*mystruct.N);
    115115        mystruct.i        = xNewZeroInit<int>(1);
    116116
    117117        /*Initialize Gradient and cost function of M1QN3*/
     
    140140        }
    141141
    142142        /*Constrain solution vector*/
    143         IssmDouble  *XL = NULL;
    144         IssmDouble  *XU = NULL;
    145         GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
    146         GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
     143        double  *XL = NULL;
     144        double  *XU = NULL;
     145        GetPassiveVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
     146        GetPassiveVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
    147147        for(int c=0;c<num_controls;c++){
    148148                for(int i=0;i<numberofvertices;i++){
    149149                        int index = numberofvertices*c+i;
    150                         X[index] = X[index]*scaling_factors[c];
     150                        X[index] = X[index]*reCast<double>(scaling_factors[c]);
    151151                        if(X[index]>XU[index]) X[index]=XU[index];
    152152                        if(X[index]<XL[index]) X[index]=XL[index];
    153153                }
    154154        }
     155
     156        /*Set X as our new control (need to recast)*/
     157        #ifdef _HAVE_AD_
     158        IssmDouble* aX=xNew<IssmDouble>(intn);
     159        IssmDouble* aG=xNew<IssmDouble>(intn);
     160        for(int i=0;i<intn;i++) {
     161                aX[i] = reCast<IssmDouble>(X[i]);
     162                aG[i] = reCast<IssmDouble>(G[i]);
     163        }
     164        ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
     165        SetControlInputsFromVectorx(femmodel,aX);
     166        xDelete(aX);
     167        xDelete(aG);
     168        #else
    155169        SetControlInputsFromVectorx(femmodel,X);
    156170        ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
     171        #endif
     172
    157173        femmodel->OutputControlsx(&femmodel->results);
    158174        femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,mystruct.Jlist,(*mystruct.i),mystruct.N,0,0));
    159175
     
    170186        xDelete<double>(dz);
    171187        xDelete<double>(XU);
    172188        xDelete<double>(XL);
    173         xDelete<double>(scaling_factors);
     189        xDelete<IssmDouble>(scaling_factors);
    174190        xDelete<double>(mystruct.Jlist);
    175191        xDelete<int>(mystruct.i);
    176192}/*}}}*/
     
    179195        /*Recover Arguments*/
    180196        m1qn3_struct *input_struct = (m1qn3_struct*)dzs;
    181197        FemModel     *femmodel     = input_struct->femmodel;
    182         IssmDouble   *Jlist        = input_struct->Jlist;
     198        IssmPDouble  *Jlist        = input_struct->Jlist;
    183199        int           JlistM       = input_struct->M;
    184200        int           JlistN       = input_struct->N;
    185201        int          *Jlisti       = input_struct->i;
     
    194210        numberofvertices=femmodel->vertices->NumberOfVertices();
    195211
    196212        /*Constrain input vector and update controls*/
    197         IssmDouble  *XL = NULL;
    198         IssmDouble  *XU = NULL;
     213        double *XL = NULL;
     214        double *XU = NULL;
     215        #ifdef _HAVE_AD_
     216        GetPassiveVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
     217        GetPassiveVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
     218        #else
    199219        GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
    200220        GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
     221        #endif
    201222        for(int c=0;c<num_controls;c++){
    202223                for(int i=0;i<numberofvertices;i++){
    203224                        int index = numberofvertices*c+i;
    204                         X[index] = X[index]*scaling_factors[c];
     225                        X[index] = X[index]*reCast<double>(scaling_factors[c]);
    205226                        if(X[index]>XU[index]) X[index]=XU[index];
    206227                        if(X[index]<XL[index]) X[index]=XL[index];
    207228                }
    208229        }
     230        #ifdef _HAVE_AD_
     231        IssmDouble* aX=xNew<IssmDouble>(*n);
     232        for(int i=0;i<*n;i++) aX[i] = reCast<IssmDouble>(X[i]);
     233        SetControlInputsFromVectorx(femmodel,aX);
     234        xDelete(aX);
     235        #else
    209236        SetControlInputsFromVectorx(femmodel,X);
     237        #endif
    210238
    211239        /*Compute solution and adjoint*/
    212240        void (*solutioncore)(FemModel*)=NULL;
     
    220248
    221249        /*Compute objective function*/
    222250        IssmDouble* Jtemp = NULL;
    223         femmodel->CostFunctionx(pf,&Jtemp,NULL);
     251        IssmDouble  J;
     252        femmodel->CostFunctionx(&J,&Jtemp,NULL);
     253        *pf = reCast<double>(J);
    224254        _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
    225255
    226256        /*Record cost function values and delete Jtemp*/
    227         for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = Jtemp[i];
     257        for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = reCast<double>(Jtemp[i]);
    228258        Jlist[(*Jlisti)*JlistN+num_responses] = *pf;
    229259        xDelete<IssmDouble>(Jtemp);
    230260
     
    237267                _printf0_("\n");
    238268
    239269                *Jlisti = (*Jlisti) +1;
    240                 xDelete<IssmDouble>(XU);
    241                 xDelete<IssmDouble>(XL);
     270                xDelete<double>(XU);
     271                xDelete<double>(XL);
    242272                return;
    243273        }
    244274
     
    249279        /*Compute gradient*/
    250280        IssmDouble* G2 = NULL;
    251281        Gradjx(&G2,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
    252         for(long i=0;i<*n;i++) G[i] = -G2[i];
     282        for(long i=0;i<*n;i++) G[i] = -reCast<double>(G2[i]);
    253283        xDelete<IssmDouble>(G2);
    254284
    255285        /*Constrain Gradient*/
     
    259289                        int index = numberofvertices*c+i;
    260290                        if(X[index]>=XU[index]) G[index]=0.;
    261291                        if(X[index]<=XL[index]) G[index]=0.;
    262                         G[index] = G[index]*scaling_factors[c];
    263                         X[index] = X[index]/scaling_factors[c];
     292                        G[index] = G[index]*reCast<double>(scaling_factors[c]);
     293                        X[index] = X[index]/reCast<double>(scaling_factors[c]);
    264294                        Gnorm += G[index]*G[index];
    265295                }
    266296        }
     
    273303
    274304        /*Clean-up and return*/
    275305        *Jlisti = (*Jlisti) +1;
    276         xDelete<IssmDouble>(XU);
    277         xDelete<IssmDouble>(XL);
     306        xDelete<double>(XU);
     307        xDelete<double>(XL);
    278308        xDelete<IssmDouble>(scaling_factors);
    279309}/*}}}*/
    280310
    281311#else
    282 void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed (or you might have turned AD on)");}
     312void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
    283313#endif //_HAVE_M1QN3_
Note: See TracBrowser for help on using the repository browser.