[23390] | 1 | Index: ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp (revision 23305)
|
---|
| 4 | +++ ../trunk-jpl/src/c/cores/controlm1qn3_core.cpp (revision 23306)
|
---|
| 5 | @@ -10,7 +10,7 @@
|
---|
| 6 | #include "../modules/modules.h"
|
---|
| 7 | #include "../solutionsequences/solutionsequences.h"
|
---|
| 8 |
|
---|
| 9 | -#if defined (_HAVE_M1QN3_) && !defined(_HAVE_AD_)
|
---|
| 10 | +#if defined (_HAVE_M1QN3_)
|
---|
| 11 | /*m1qn3 prototypes {{{*/
|
---|
| 12 | extern "C" void *ctonbe_; // DIS mode : Conversion
|
---|
| 13 | extern "C" void *ctcabe_; // DIS mode : Conversion
|
---|
| 14 | @@ -27,8 +27,8 @@
|
---|
| 15 |
|
---|
| 16 | /*Use struct to provide arguments*/
|
---|
| 17 | typedef struct{
|
---|
| 18 | - FemModel * femmodel;
|
---|
| 19 | - IssmDouble* Jlist;
|
---|
| 20 | + FemModel * femmodel;
|
---|
| 21 | + IssmPDouble* Jlist;
|
---|
| 22 | int M;
|
---|
| 23 | int N;
|
---|
| 24 | int* i;
|
---|
| 25 | @@ -43,8 +43,8 @@
|
---|
| 26 | int maxsteps,maxiter;
|
---|
| 27 | int intn,numberofvertices,num_controls,num_cost_functions,solution_type;
|
---|
| 28 | IssmDouble *scaling_factors = NULL;
|
---|
| 29 | - IssmDouble *X = NULL;
|
---|
| 30 | - IssmDouble *G = NULL;
|
---|
| 31 | + double *X = NULL;
|
---|
| 32 | + double *G = NULL;
|
---|
| 33 |
|
---|
| 34 | /*Recover some parameters*/
|
---|
| 35 | femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
|
---|
| 36 | @@ -52,8 +52,8 @@
|
---|
| 37 | femmodel->parameters->FindParam(&num_cost_functions,InversionNumCostFunctionsEnum);
|
---|
| 38 | femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum);
|
---|
| 39 | femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum);
|
---|
| 40 | - femmodel->parameters->FindParam(&dxmin,InversionDxminEnum);
|
---|
| 41 | - femmodel->parameters->FindParam(>tol,InversionGttolEnum);
|
---|
| 42 | + femmodel->parameters->FindParamAndMakePassive(&dxmin,InversionDxminEnum);
|
---|
| 43 | + femmodel->parameters->FindParamAndMakePassive(>tol,InversionGttolEnum);
|
---|
| 44 | femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
|
---|
| 45 | femmodel->parameters->SetParam(false,SaveResultsEnum);
|
---|
| 46 | numberofvertices=femmodel->vertices->NumberOfVertices();
|
---|
| 47 | @@ -77,8 +77,8 @@
|
---|
| 48 | long nsim = long(maxiter);/*Maximum number of function calls*/
|
---|
| 49 |
|
---|
| 50 | /*Get initial guess*/
|
---|
| 51 | - Vector<IssmDouble> *Xpetsc = NULL;
|
---|
| 52 | - GetVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
|
---|
| 53 | + Vector<double> *Xpetsc = NULL;
|
---|
| 54 | + GetPassiveVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
|
---|
| 55 | X = Xpetsc->ToMPISerial();
|
---|
| 56 | Xpetsc->GetSize(&intn);
|
---|
| 57 | delete Xpetsc;
|
---|
| 58 | @@ -92,7 +92,7 @@
|
---|
| 59 | for(int c=0;c<num_controls;c++){
|
---|
| 60 | for(int i=0;i<numberofvertices;i++){
|
---|
| 61 | int index = numberofvertices*c+i;
|
---|
| 62 | - X[index] = X[index]/scaling_factors[c];
|
---|
| 63 | + X[index] = X[index]/reCast<double>(scaling_factors[c]);
|
---|
| 64 | }
|
---|
| 65 | }
|
---|
| 66 |
|
---|
| 67 | @@ -111,7 +111,7 @@
|
---|
| 68 | mystruct.femmodel = femmodel;
|
---|
| 69 | mystruct.M = maxiter;
|
---|
| 70 | mystruct.N = num_cost_functions+1;
|
---|
| 71 | - mystruct.Jlist = xNewZeroInit<IssmDouble>(mystruct.M*mystruct.N);
|
---|
| 72 | + mystruct.Jlist = xNewZeroInit<IssmPDouble>(mystruct.M*mystruct.N);
|
---|
| 73 | mystruct.i = xNewZeroInit<int>(1);
|
---|
| 74 |
|
---|
| 75 | /*Initialize Gradient and cost function of M1QN3*/
|
---|
| 76 | @@ -140,20 +140,36 @@
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | /*Constrain solution vector*/
|
---|
| 80 | - IssmDouble *XL = NULL;
|
---|
| 81 | - IssmDouble *XU = NULL;
|
---|
| 82 | - GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
|
---|
| 83 | - GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
|
---|
| 84 | + double *XL = NULL;
|
---|
| 85 | + double *XU = NULL;
|
---|
| 86 | + GetPassiveVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
|
---|
| 87 | + GetPassiveVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
|
---|
| 88 | for(int c=0;c<num_controls;c++){
|
---|
| 89 | for(int i=0;i<numberofvertices;i++){
|
---|
| 90 | int index = numberofvertices*c+i;
|
---|
| 91 | - X[index] = X[index]*scaling_factors[c];
|
---|
| 92 | + X[index] = X[index]*reCast<double>(scaling_factors[c]);
|
---|
| 93 | if(X[index]>XU[index]) X[index]=XU[index];
|
---|
| 94 | if(X[index]<XL[index]) X[index]=XL[index];
|
---|
| 95 | }
|
---|
| 96 | }
|
---|
| 97 | +
|
---|
| 98 | + /*Set X as our new control (need to recast)*/
|
---|
| 99 | + #ifdef _HAVE_AD_
|
---|
| 100 | + IssmDouble* aX=xNew<IssmDouble>(intn);
|
---|
| 101 | + IssmDouble* aG=xNew<IssmDouble>(intn);
|
---|
| 102 | + for(int i=0;i<intn;i++) {
|
---|
| 103 | + aX[i] = reCast<IssmDouble>(X[i]);
|
---|
| 104 | + aG[i] = reCast<IssmDouble>(G[i]);
|
---|
| 105 | + }
|
---|
| 106 | + ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
|
---|
| 107 | + SetControlInputsFromVectorx(femmodel,aX);
|
---|
| 108 | + xDelete(aX);
|
---|
| 109 | + xDelete(aG);
|
---|
| 110 | + #else
|
---|
| 111 | SetControlInputsFromVectorx(femmodel,X);
|
---|
| 112 | ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G);
|
---|
| 113 | + #endif
|
---|
| 114 | +
|
---|
| 115 | femmodel->OutputControlsx(&femmodel->results);
|
---|
| 116 | femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,mystruct.Jlist,(*mystruct.i),mystruct.N,0,0));
|
---|
| 117 |
|
---|
| 118 | @@ -170,7 +186,7 @@
|
---|
| 119 | xDelete<double>(dz);
|
---|
| 120 | xDelete<double>(XU);
|
---|
| 121 | xDelete<double>(XL);
|
---|
| 122 | - xDelete<double>(scaling_factors);
|
---|
| 123 | + xDelete<IssmDouble>(scaling_factors);
|
---|
| 124 | xDelete<double>(mystruct.Jlist);
|
---|
| 125 | xDelete<int>(mystruct.i);
|
---|
| 126 | }/*}}}*/
|
---|
| 127 | @@ -179,7 +195,7 @@
|
---|
| 128 | /*Recover Arguments*/
|
---|
| 129 | m1qn3_struct *input_struct = (m1qn3_struct*)dzs;
|
---|
| 130 | FemModel *femmodel = input_struct->femmodel;
|
---|
| 131 | - IssmDouble *Jlist = input_struct->Jlist;
|
---|
| 132 | + IssmPDouble *Jlist = input_struct->Jlist;
|
---|
| 133 | int JlistM = input_struct->M;
|
---|
| 134 | int JlistN = input_struct->N;
|
---|
| 135 | int *Jlisti = input_struct->i;
|
---|
| 136 | @@ -194,19 +210,31 @@
|
---|
| 137 | numberofvertices=femmodel->vertices->NumberOfVertices();
|
---|
| 138 |
|
---|
| 139 | /*Constrain input vector and update controls*/
|
---|
| 140 | - IssmDouble *XL = NULL;
|
---|
| 141 | - IssmDouble *XU = NULL;
|
---|
| 142 | + double *XL = NULL;
|
---|
| 143 | + double *XU = NULL;
|
---|
| 144 | + #ifdef _HAVE_AD_
|
---|
| 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");
|
---|
| 147 | + #else
|
---|
| 148 | GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
|
---|
| 149 | GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
|
---|
| 150 | + #endif
|
---|
| 151 | for(int c=0;c<num_controls;c++){
|
---|
| 152 | for(int i=0;i<numberofvertices;i++){
|
---|
| 153 | int index = numberofvertices*c+i;
|
---|
| 154 | - X[index] = X[index]*scaling_factors[c];
|
---|
| 155 | + X[index] = X[index]*reCast<double>(scaling_factors[c]);
|
---|
| 156 | if(X[index]>XU[index]) X[index]=XU[index];
|
---|
| 157 | if(X[index]<XL[index]) X[index]=XL[index];
|
---|
| 158 | }
|
---|
| 159 | }
|
---|
| 160 | + #ifdef _HAVE_AD_
|
---|
| 161 | + IssmDouble* aX=xNew<IssmDouble>(*n);
|
---|
| 162 | + for(int i=0;i<*n;i++) aX[i] = reCast<IssmDouble>(X[i]);
|
---|
| 163 | + SetControlInputsFromVectorx(femmodel,aX);
|
---|
| 164 | + xDelete(aX);
|
---|
| 165 | + #else
|
---|
| 166 | SetControlInputsFromVectorx(femmodel,X);
|
---|
| 167 | + #endif
|
---|
| 168 |
|
---|
| 169 | /*Compute solution and adjoint*/
|
---|
| 170 | void (*solutioncore)(FemModel*)=NULL;
|
---|
| 171 | @@ -220,11 +248,13 @@
|
---|
| 172 |
|
---|
| 173 | /*Compute objective function*/
|
---|
| 174 | IssmDouble* Jtemp = NULL;
|
---|
| 175 | - femmodel->CostFunctionx(pf,&Jtemp,NULL);
|
---|
| 176 | + IssmDouble J;
|
---|
| 177 | + femmodel->CostFunctionx(&J,&Jtemp,NULL);
|
---|
| 178 | + *pf = reCast<double>(J);
|
---|
| 179 | _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | ");
|
---|
| 180 |
|
---|
| 181 | /*Record cost function values and delete Jtemp*/
|
---|
| 182 | - for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = Jtemp[i];
|
---|
| 183 | + for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = reCast<double>(Jtemp[i]);
|
---|
| 184 | Jlist[(*Jlisti)*JlistN+num_responses] = *pf;
|
---|
| 185 | xDelete<IssmDouble>(Jtemp);
|
---|
| 186 |
|
---|
| 187 | @@ -237,8 +267,8 @@
|
---|
| 188 | _printf0_("\n");
|
---|
| 189 |
|
---|
| 190 | *Jlisti = (*Jlisti) +1;
|
---|
| 191 | - xDelete<IssmDouble>(XU);
|
---|
| 192 | - xDelete<IssmDouble>(XL);
|
---|
| 193 | + xDelete<double>(XU);
|
---|
| 194 | + xDelete<double>(XL);
|
---|
| 195 | return;
|
---|
| 196 | }
|
---|
| 197 |
|
---|
| 198 | @@ -249,7 +279,7 @@
|
---|
| 199 | /*Compute gradient*/
|
---|
| 200 | IssmDouble* G2 = NULL;
|
---|
| 201 | Gradjx(&G2,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
|
---|
| 202 | - for(long i=0;i<*n;i++) G[i] = -G2[i];
|
---|
| 203 | + for(long i=0;i<*n;i++) G[i] = -reCast<double>(G2[i]);
|
---|
| 204 | xDelete<IssmDouble>(G2);
|
---|
| 205 |
|
---|
| 206 | /*Constrain Gradient*/
|
---|
| 207 | @@ -259,8 +289,8 @@
|
---|
| 208 | int index = numberofvertices*c+i;
|
---|
| 209 | if(X[index]>=XU[index]) G[index]=0.;
|
---|
| 210 | if(X[index]<=XL[index]) G[index]=0.;
|
---|
| 211 | - G[index] = G[index]*scaling_factors[c];
|
---|
| 212 | - X[index] = X[index]/scaling_factors[c];
|
---|
| 213 | + G[index] = G[index]*reCast<double>(scaling_factors[c]);
|
---|
| 214 | + X[index] = X[index]/reCast<double>(scaling_factors[c]);
|
---|
| 215 | Gnorm += G[index]*G[index];
|
---|
| 216 | }
|
---|
| 217 | }
|
---|
| 218 | @@ -273,11 +303,11 @@
|
---|
| 219 |
|
---|
| 220 | /*Clean-up and return*/
|
---|
| 221 | *Jlisti = (*Jlisti) +1;
|
---|
| 222 | - xDelete<IssmDouble>(XU);
|
---|
| 223 | - xDelete<IssmDouble>(XL);
|
---|
| 224 | + xDelete<double>(XU);
|
---|
| 225 | + xDelete<double>(XL);
|
---|
| 226 | xDelete<IssmDouble>(scaling_factors);
|
---|
| 227 | }/*}}}*/
|
---|
| 228 |
|
---|
| 229 | #else
|
---|
| 230 | -void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed (or you might have turned AD on)");}
|
---|
| 231 | +void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
|
---|
| 232 | #endif //_HAVE_M1QN3_
|
---|