Changeset 18714
- Timestamp:
- 10/30/14 15:04:40 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
r18650 r18714 32 32 double f,dxmin,gttol; 33 33 int maxsteps,maxiter; 34 int intn,num _controls,solution_type;34 int intn,numberofvertices,num_controls,solution_type; 35 35 IssmDouble *scaling_factors = NULL; 36 36 IssmDouble *X = NULL; … … 46 46 femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 47 47 femmodel->parameters->SetParam(false,SaveResultsEnum); 48 numberofvertices=femmodel->vertices->NumberOfVertices(); 48 49 49 50 /*Initialize M1QN3 parameters*/ … … 62 63 63 64 /*Optimization criterions*/ 64 long niter= long(maxsteps); /*Maximum number of iterations*/65 long nsim= long(maxiter);/*Maximum number of function calls*/65 long niter = long(maxsteps); /*Maximum number of iterations*/ 66 long nsim = long(maxiter);/*Maximum number of function calls*/ 66 67 67 68 /*Get initial guess*/ … … 71 72 Xpetsc->GetSize(&intn); 72 73 delete Xpetsc; 74 _assert_(intn==numberofvertices*num_controls); 73 75 74 76 /*Get problem dimension and initialize gradient and initial guess*/ … … 77 79 78 80 /*Scale control for M1QN3*/ 79 if(num_controls!=1) _error_("not supported yet..."); 80 for(long i=0;i<n;i++){ 81 X[i] = X[i]/scaling_factors[0]; 81 for(int i=0;i<numberofvertices;i++){ 82 for(int c=0;c<num_controls;c++){ 83 int index = num_controls*i+c; 84 X[index] = X[index]/scaling_factors[c]; 85 } 82 86 } 83 87 … … 118 122 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 119 123 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 120 if(num_controls!=1) _error_("not supported yet"); 121 for(long i=0;i<n;i++){ 122 X[i] = X[i]*scaling_factors[0]; 123 if(X[i]>XU[i]) X[i]=XU[i]; 124 if(X[i]<XL[i]) X[i]=XL[i]; 124 for(int i=0;i<numberofvertices;i++){ 125 for(int c=0;c<num_controls;c++){ 126 int index = num_controls*i+c; 127 X[index] = X[index]*scaling_factors[c]; 128 if(X[index]>XU[index]) X[index]=XU[index]; 129 if(X[index]<XL[index]) X[index]=XL[index]; 130 } 125 131 } 126 132 SetControlInputsFromVectorx(femmodel,X); … … 152 158 153 159 /*Recover number of cost functions responses*/ 154 int num_responses; 155 int num_controls; 160 int num_responses,num_controls,numberofvertices; 156 161 IssmDouble* scaling_factors = NULL; 157 162 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 158 163 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 159 164 femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 165 numberofvertices=femmodel->vertices->NumberOfVertices(); 160 166 161 167 /*Constrain input vector*/ … … 164 170 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 165 171 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 166 if(num_controls!=1) _error_("not supported yet"); 167 for(long i=0;i<*n;i++){ 168 X[i] = X[i]*scaling_factors[0]; 169 if(X[i]>XU[i]) X[i]=XU[i]; 170 if(X[i]<XL[i]) X[i]=XL[i]; 172 for(int i=0;i<numberofvertices;i++){ 173 for(int c=0;c<num_controls;c++){ 174 int index = num_controls*i+c; 175 X[index] = X[index]*scaling_factors[c]; 176 if(X[index]>XU[index]) X[index]=XU[index]; 177 if(X[index]<XL[index]) X[index]=XL[index]; 178 } 171 179 } 172 180 … … 214 222 /*Constrain Gradient*/ 215 223 IssmDouble Gnorm = 0.; 216 if(num_controls!=1) _error_("not supported yet"); 217 for(long i=0;i<*n;i++){ 218 if(X[i]>=XU[i]) G[i]=0.; 219 if(X[i]<=XL[i]) G[i]=0.; 220 G[i] = G[i]*scaling_factors[0]; 221 X[i] = X[i]/scaling_factors[0]; 222 Gnorm += G[i]*G[i]; 224 for(int i=0;i<numberofvertices;i++){ 225 for(int c=0;c<num_controls;c++){ 226 int index = num_controls*i+c; 227 if(X[index]>=XU[index]) G[index]=0.; 228 if(X[index]<=XL[index]) G[index]=0.; 229 G[index] = G[index]*scaling_factors[c]; 230 X[index] = X[index]/scaling_factors[c]; 231 Gnorm += G[index]*G[index]; 232 } 223 233 } 224 234 Gnorm = sqrt(Gnorm);
Note:
See TracChangeset
for help on using the changeset viewer.