Changeset 25330
- Timestamp:
- 07/31/20 21:56:02 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/cores
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
r24099 r25330 197 197 198 198 /*Recover some parameters*/ 199 IssmDouble *scaling_factors = NULL; 200 int *N = NULL; 201 int *control_enum = NULL; 199 double *scaling_factors = NULL; 200 int *M = NULL; 201 int *N = NULL; 202 int *control_enum = NULL; 202 203 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 203 204 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 204 femmodel->parameters->FindParam (&scaling_factors,NULL,InversionControlScalingFactorsEnum);205 femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 205 206 femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 207 femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 206 208 femmodel->parameters->FindParam(&control_enum,NULL,InversionControlParametersEnum); 207 int numberofvertices=femmodel->vertices->NumberOfVertices();208 209 209 210 /*Constrain input vector and update controls*/ … … 213 214 GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 214 215 215 int N_add= 0;216 int offset = 0; 216 217 for (int c=0;c<num_controls;c++){ 217 for(int i=0;i< numberofvertices*N[c];i++){218 int index = N_add*numberofvertices+i;219 X[index] = X[index]* reCast<double>(scaling_factors[c]);218 for(int i=0;i<M[c]*N[c];i++){ 219 int index = offset+i; 220 X[index] = X[index]*scaling_factors[c]; 220 221 if(X[index]>XU[index]) X[index]=XU[index]; 221 222 if(X[index]<XL[index]) X[index]=XL[index]; 222 223 } 223 N_add+=N[c];224 offset += M[c]*N[c]; 224 225 } 225 226 … … 439 440 /*Constrain Gradient*/ 440 441 IssmDouble Gnorm = 0.; 441 N_add= 0;442 for 443 for(int i=0;i< numberofvertices*N[c];i++){444 int index = N_add*numberofvertices+i;442 offset = 0; 443 for(int c=0;c<num_controls;c++){ 444 for(int i=0;i<M[c]*N[c];i++){ 445 int index = offset+i; 445 446 if(X[index]>=XU[index]) G[index]=0.; 446 447 if(X[index]<=XL[index]) G[index]=0.; 447 G[index] = G[index]* reCast<double>(scaling_factors[c]);448 X[index] = X[index]/ reCast<double>(scaling_factors[c]);448 G[index] = G[index]*scaling_factors[c]; 449 X[index] = X[index]/scaling_factors[c]; 449 450 Gnorm += G[index]*G[index]; 450 451 } 451 N_add+=N[c];452 offset += M[c]*N[c]; 452 453 } 453 454 Gnorm = sqrt(Gnorm); … … 464 465 xDelete<int>(control_enum); 465 466 xDelete<int>(N); 466 xDelete< IssmDouble>(scaling_factors);467 xDelete<double>(scaling_factors); 467 468 xDelete<IssmPDouble>(totalgradient); 468 469 }/*}}}*/ … … 474 475 double dxmin,gttol; 475 476 int maxsteps,maxiter; 476 int intn,num berofvertices,num_controls,num_cost_functions,solution_type;477 IssmDouble *scaling_factors = NULL;477 int intn,num_controls,num_cost_functions,solution_type; 478 double* scaling_factors = NULL; 478 479 double *X = NULL; 479 480 double *G = NULL; 480 481 int* N = NULL; 481 int offset = 0; 482 int N_add; 482 int* M = NULL; 483 483 int* control_enum; 484 484 … … 491 491 femmodel->parameters->FindParamAndMakePassive(&dxmin,InversionDxminEnum); 492 492 femmodel->parameters->FindParamAndMakePassive(>tol,InversionGttolEnum); 493 femmodel->parameters->FindParam (&scaling_factors,NULL,InversionControlScalingFactorsEnum);493 femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 494 494 femmodel->parameters->FindParam(&control_enum,NULL,InversionControlParametersEnum); 495 495 femmodel->parameters->SetParam(false,SaveResultsEnum); 496 496 femmodel->parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 497 numberofvertices=femmodel->vertices->NumberOfVertices();497 femmodel->parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 498 498 499 499 /*Initialize M1QN3 parameters*/ … … 517 517 /*Get initial guess*/ 518 518 GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 519 //_assert_(intn==numberofvertices*num_controls);520 519 521 520 /*Get problem dimension and initialize gradient and initial guess*/ … … 524 523 525 524 /*Scale control for M1QN3*/ 526 N_add= 0;527 for(int c=0;c<num_controls;c++){528 for(int i=0;i<numberofvertices*N[c];i++){529 int index = N_add*numberofvertices+i;530 X[index] = X[index]/reCast<IssmPDouble>(scaling_factors[c]);531 532 N_add+=N[c];533 525 int offset = 0; 526 for(int c=0;c<num_controls;c++){ 527 for(int i=0;i<M[c]*N[c];i++){ 528 int index = offset+i; 529 X[index] = X[index]/scaling_factors[c]; 530 } 531 offset += M[c]*N[c]; 532 } 534 533 535 534 /*Allocate m1qn3 working arrays (see documentation)*/ … … 578 577 GetPassiveVectorFromControlInputsx(&XU,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 579 578 580 N_add= 0;581 582 for(int i=0;i<numberofvertices*N[c];i++){583 int index = N_add*numberofvertices+i;584 X[index] = X[index]*reCast<double>(scaling_factors[c]);585 586 587 588 N_add +=N[c];589 579 offset = 0; 580 for (int c=0;c<num_controls;c++){ 581 for(int i=0;i<M[c]*N[c];i++){ 582 int index = offset+i; 583 X[index] = X[index]*scaling_factors[c]; 584 if(X[index]>XU[index]) X[index]=XU[index]; 585 if(X[index]<XL[index]) X[index]=XL[index]; 586 } 587 offset += M[c]*N[c]; 588 } 590 589 591 590 /*Set X as our new control*/ … … 612 611 613 612 /*Disect results*/ 614 GenericExternalResult<IssmPDouble*>* G_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Gradient1Enum+i,&G[offset],N[i], numberofvertices,1,0.);615 GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i], numberofvertices,1,0.);613 GenericExternalResult<IssmPDouble*>* G_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Gradient1Enum+i,&G[offset],N[i],M[i],1,0.); 614 GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i],M[i],1,0.); 616 615 617 616 /*transpose for consistency with MATLAB's formating*/ … … 623 622 femmodel->results->AddObject(X_output); 624 623 625 offset += N[i]* numberofvertices;624 offset += N[i]*M[i]; 626 625 } 627 626 } … … 649 648 xDelete<double>(XU); 650 649 xDelete<double>(XL); 651 xDelete< IssmDouble>(scaling_factors);650 xDelete<double>(scaling_factors); 652 651 xDelete<IssmPDouble>(mystruct.Jlist); 653 652 xDelete<int>(mystruct.i); -
issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
r25317 r25330 42 42 double f,dxmin,gttol; 43 43 int maxsteps,maxiter; 44 int intn,num berofvertices,num_controls,num_cost_functions,solution_type;44 int intn,num_controls,num_cost_functions,solution_type; 45 45 double *scaling_factors = NULL; 46 46 double *X = NULL; … … 63 63 femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 64 64 femmodel->parameters->SetParam(false,SaveResultsEnum); 65 numberofvertices=femmodel->vertices->NumberOfVertices();66 65 67 66 /*Initialize M1QN3 parameters*/ … … 211 210 212 211 /*Recover some parameters*/ 213 int num_responses,num_controls, numberofvertices,solution_type;212 int num_responses,num_controls,solution_type; 214 213 double* scaling_factors = NULL; 215 214 int* M = NULL; … … 221 220 femmodel->parameters->FindParamAndMakePassive(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 222 221 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 223 numberofvertices=femmodel->vertices->NumberOfVertices();224 222 225 223 /*Constrain input vector and update controls*/
Note:
See TracChangeset
for help on using the changeset viewer.