Changeset 22829
- Timestamp:
- 06/06/18 12:03:23 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
r22801 r22829 30 30 int N; 31 31 int* i; 32 IssmPDouble* X_best; 33 IssmPDouble* G_best; 34 IssmPDouble* J_best; 32 35 } m1qn3_struct; 33 36 … … 77 80 } 78 81 79 IssmPDouble *Jlist = input_struct->Jlist;82 IssmPDouble* Jlist = input_struct->Jlist; 80 83 int JlistM = input_struct->M; 81 84 int JlistN = input_struct->N; 82 int *Jlisti = input_struct->i; 85 int* Jlisti = input_struct->i; 86 IssmPDouble* J_best = input_struct->J_best; 87 IssmPDouble* X_best = input_struct->X_best; 88 IssmPDouble* G_best = input_struct->G_best; 83 89 int intn = (int)*n; 84 90 … … 292 298 Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J); 293 299 300 301 if(*J_best<0 || J<*J_best){ 302 *J_best = reCast<IssmPDouble>(J); 303 for(int i=0;i<intn;i++){ 304 X_best[i] = reCast<IssmPDouble>(X[i]); 305 G_best[i] = reCast<IssmPDouble>(G[i]); 306 } 307 } 308 309 /* 310 IssmDouble* test = xNew<IssmDouble>(intn); 311 femmodel->parameters->FindParam(&test,NULL,InversionXBestEnum); 312 for(int i=0;i<10;i++)_printf_("X "<<test[i]<<"\n"); 313 xDelete<IssmDouble>(intn); 314 */ 294 315 if(*indic==0){ 295 316 /*dry run, no gradient required*/ … … 413 434 long ndz = 4*n+m*(2*n+1); 414 435 double* dz = xNew<double>(ndz); 415 436 IssmDouble J_best = -10.; 416 437 if(VerboseControl())_printf0_(" Computing initial solution\n"); 417 438 _printf0_("\n"); … … 426 447 mystruct.Jlist = xNewZeroInit<IssmPDouble>(mystruct.M*mystruct.N); 427 448 mystruct.i = xNewZeroInit<int>(1); 449 mystruct.J_best = xNewZeroInit<IssmPDouble>(1); 450 mystruct.X_best = xNewZeroInit<IssmPDouble>(intn); 451 mystruct.G_best = xNewZeroInit<IssmPDouble>(intn); 428 452 /*Initialize Gradient and cost function of M1QN3*/ 429 453 indic = 4; /*gradient required*/ … … 465 489 N_add +=N[c]; 466 490 } 467 491 492 IssmDouble* aX_best = NULL; 493 IssmDouble* aG_best = NULL; 494 495 femmodel->parameters->FindParam(&aX_best,NULL,InversionXBestEnum); 496 femmodel->parameters->FindParam(&aG_best,NULL,InversionGBestEnum); 497 468 498 /*Set X as our new control*/ 469 499 IssmDouble* aX=xNew<IssmDouble>(intn); 500 IssmDouble* aG=xNew<IssmDouble>(intn); 501 double* X_best = xNew<double>(intn); 502 double* G_best = xNew<double>(intn); 503 470 504 for(int i=0;i<intn;i++) { 471 505 aX[i] = reCast<IssmDouble>(X[i]); 472 } 506 aG[i] = reCast<IssmDouble>(G[i]); 507 X_best[i] = reCast<double>(aX_best[i]); 508 G_best[i] = reCast<double>(aG_best[i]); 509 } 510 511 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG); 473 512 SetControlInputsFromVectorx(femmodel,aX); 513 474 514 xDelete(aX); 475 515 476 /*Set final gradient in inputs*/477 IssmDouble* aG=xNew<IssmDouble>(intn);478 for(int i=0;i<intn;i++) {479 aG[i] = reCast<IssmDouble>(G[i]);480 }481 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);482 516 483 517 if (solution_type == TransientSolutionEnum){ … … 493 527 GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i],numberofvertices,1,0.); 494 528 529 GenericExternalResult<IssmPDouble*>* Gbest_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Outputdefinition90Enum+i,&G_best[offset],N[i],numberofvertices,1,0.); 530 GenericExternalResult<IssmPDouble*>* Xbest_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Outputdefinition80Enum+i,&X_best[offset],N[i],numberofvertices,1,0.); 531 495 532 /*transpose for consistency with MATLAB's formating*/ 496 533 G_output->Transpose(); 497 534 X_output->Transpose(); 535 Gbest_output->Transpose(); 536 Xbest_output->Transpose(); 498 537 499 538 /*Add to results*/ 500 539 femmodel->results->AddObject(G_output); 501 540 femmodel->results->AddObject(X_output); 502 541 femmodel->results->AddObject(Gbest_output); 542 femmodel->results->AddObject(Xbest_output); 543 503 544 offset += N[i]*numberofvertices; 504 545 } … … 524 565 xDelete<double>(G); 525 566 xDelete<double>(X); 567 xDelete<double>(X_best); 568 xDelete<double>(G_best); 526 569 xDelete<double>(dz); 527 570 xDelete<double>(XU);
Note:
See TracChangeset
for help on using the changeset viewer.