Changeset 23306
- Timestamp:
- 09/18/18 09:14:11 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
r23286 r23306 11 11 #include "../solutionsequences/solutionsequences.h" 12 12 13 #if defined (_HAVE_M1QN3_) && !defined(_HAVE_AD_)13 #if defined (_HAVE_M1QN3_) 14 14 /*m1qn3 prototypes {{{*/ 15 15 extern "C" void *ctonbe_; // DIS mode : Conversion … … 28 28 /*Use struct to provide arguments*/ 29 29 typedef struct{ 30 FemModel * femmodel;31 Issm Double* Jlist;30 FemModel * femmodel; 31 IssmPDouble* Jlist; 32 32 int M; 33 33 int N; … … 44 44 int intn,numberofvertices,num_controls,num_cost_functions,solution_type; 45 45 IssmDouble *scaling_factors = NULL; 46 IssmDouble*X = NULL;47 IssmDouble*G = NULL;46 double *X = NULL; 47 double *G = NULL; 48 48 49 49 /*Recover some parameters*/ … … 53 53 femmodel->parameters->FindParam(&maxsteps,InversionMaxstepsEnum); 54 54 femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum); 55 femmodel->parameters->FindParam (&dxmin,InversionDxminEnum);56 femmodel->parameters->FindParam (>tol,InversionGttolEnum);55 femmodel->parameters->FindParamAndMakePassive(&dxmin,InversionDxminEnum); 56 femmodel->parameters->FindParamAndMakePassive(>tol,InversionGttolEnum); 57 57 femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 58 58 femmodel->parameters->SetParam(false,SaveResultsEnum); … … 78 78 79 79 /*Get initial guess*/ 80 Vector< IssmDouble> *Xpetsc = NULL;81 Get VectorFromControlInputsx(&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"); 82 82 X = Xpetsc->ToMPISerial(); 83 83 Xpetsc->GetSize(&intn); … … 93 93 for(int i=0;i<numberofvertices;i++){ 94 94 int index = numberofvertices*c+i; 95 X[index] = X[index]/ scaling_factors[c];95 X[index] = X[index]/reCast<double>(scaling_factors[c]); 96 96 } 97 97 } … … 112 112 mystruct.M = maxiter; 113 113 mystruct.N = num_cost_functions+1; 114 mystruct.Jlist = xNewZeroInit<Issm Double>(mystruct.M*mystruct.N);114 mystruct.Jlist = xNewZeroInit<IssmPDouble>(mystruct.M*mystruct.N); 115 115 mystruct.i = xNewZeroInit<int>(1); 116 116 … … 141 141 142 142 /*Constrain solution vector*/ 143 IssmDouble *XL = NULL;144 IssmDouble *XU = NULL;145 Get VectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");146 Get VectorFromControlInputsx(&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"); 147 147 for(int c=0;c<num_controls;c++){ 148 148 for(int i=0;i<numberofvertices;i++){ 149 149 int index = numberofvertices*c+i; 150 X[index] = X[index]* scaling_factors[c];150 X[index] = X[index]*reCast<double>(scaling_factors[c]); 151 151 if(X[index]>XU[index]) X[index]=XU[index]; 152 152 if(X[index]<XL[index]) X[index]=XL[index]; 153 153 } 154 154 } 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 155 169 SetControlInputsFromVectorx(femmodel,X); 156 170 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G); 171 #endif 172 157 173 femmodel->OutputControlsx(&femmodel->results); 158 174 femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,mystruct.Jlist,(*mystruct.i),mystruct.N,0,0)); … … 171 187 xDelete<double>(XU); 172 188 xDelete<double>(XL); 173 xDelete< double>(scaling_factors);189 xDelete<IssmDouble>(scaling_factors); 174 190 xDelete<double>(mystruct.Jlist); 175 191 xDelete<int>(mystruct.i); … … 180 196 m1qn3_struct *input_struct = (m1qn3_struct*)dzs; 181 197 FemModel *femmodel = input_struct->femmodel; 182 Issm Double*Jlist = input_struct->Jlist;198 IssmPDouble *Jlist = input_struct->Jlist; 183 199 int JlistM = input_struct->M; 184 200 int JlistN = input_struct->N; … … 195 211 196 212 /*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 199 219 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 200 220 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 221 #endif 201 222 for(int c=0;c<num_controls;c++){ 202 223 for(int i=0;i<numberofvertices;i++){ 203 224 int index = numberofvertices*c+i; 204 X[index] = X[index]* scaling_factors[c];225 X[index] = X[index]*reCast<double>(scaling_factors[c]); 205 226 if(X[index]>XU[index]) X[index]=XU[index]; 206 227 if(X[index]<XL[index]) X[index]=XL[index]; 207 228 } 208 229 } 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 209 236 SetControlInputsFromVectorx(femmodel,X); 237 #endif 210 238 211 239 /*Compute solution and adjoint*/ … … 221 249 /*Compute objective function*/ 222 250 IssmDouble* Jtemp = NULL; 223 femmodel->CostFunctionx(pf,&Jtemp,NULL); 251 IssmDouble J; 252 femmodel->CostFunctionx(&J,&Jtemp,NULL); 253 *pf = reCast<double>(J); 224 254 _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | "); 225 255 226 256 /*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]); 228 258 Jlist[(*Jlisti)*JlistN+num_responses] = *pf; 229 259 xDelete<IssmDouble>(Jtemp); … … 238 268 239 269 *Jlisti = (*Jlisti) +1; 240 xDelete< IssmDouble>(XU);241 xDelete< IssmDouble>(XL);270 xDelete<double>(XU); 271 xDelete<double>(XL); 242 272 return; 243 273 } … … 250 280 IssmDouble* G2 = NULL; 251 281 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]); 253 283 xDelete<IssmDouble>(G2); 254 284 … … 260 290 if(X[index]>=XU[index]) G[index]=0.; 261 291 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]); 264 294 Gnorm += G[index]*G[index]; 265 295 } … … 274 304 /*Clean-up and return*/ 275 305 *Jlisti = (*Jlisti) +1; 276 xDelete< IssmDouble>(XU);277 xDelete< IssmDouble>(XL);306 xDelete<double>(XU); 307 xDelete<double>(XL); 278 308 xDelete<IssmDouble>(scaling_factors); 279 309 }/*}}}*/ 280 310 281 311 #else 282 void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed (or you might have turned AD on)");}312 void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");} 283 313 #endif //_HAVE_M1QN3_
Note:
See TracChangeset
for help on using the changeset viewer.