source:
issm/oecreview/Archive/18296-19100/ISSM-18615-18616.diff
Last change on this file was 19102, checked in by , 10 years ago | |
---|---|
File size: 5.8 KB |
-
../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
12 12 bool control_analysis; 13 13 int inversiontype; 14 14 int nsteps; 15 int num_control _type;16 int num_c m_responses;15 int num_controls; 16 int num_costfunc; 17 17 int *control_type = NULL; 18 18 int *maxiter = NULL; 19 19 int *cm_responses = NULL; 20 20 IssmDouble *cm_jump = NULL; 21 21 IssmDouble *optscal = NULL; 22 IssmDouble *control_scaling_factors = NULL; 22 23 23 24 /*retrieve some parameters: */ 24 25 iomodel->Constant(&control_analysis,InversionIscontrolEnum); … … 40 41 } 41 42 42 43 /*Now, recover fit, optscal and maxiter as vectors: */ 43 iomodel->FetchData(&control_type,NULL,&num_control _type,InversionControlParametersEnum);44 iomodel->FetchData(&cm_responses,NULL,&num_c m_responses,InversionCostFunctionsEnum);45 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_control _type));46 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_c m_responses));44 iomodel->FetchData(&control_type,NULL,&num_controls,InversionControlParametersEnum); 45 iomodel->FetchData(&cm_responses,NULL,&num_costfunc,InversionCostFunctionsEnum); 46 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_type,num_controls)); 47 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,cm_responses,num_costfunc)); 47 48 48 49 /*Inversion type specifics*/ 49 50 switch(inversiontype){ … … 53 54 iomodel->FetchData(&cm_jump,&nsteps,NULL,InversionStepThresholdEnum); 54 55 iomodel->FetchData(&optscal,NULL,NULL,InversionGradientScalingEnum); 55 56 iomodel->FetchData(&maxiter,NULL,NULL,InversionMaxiterPerStepEnum); 56 parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_control _type));57 parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_controls)); 57 58 parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps)); 58 59 parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps)); 59 60 break; … … 72 73 parameters->AddObject(iomodel->CopyConstantObject(InversionGttolEnum)); 73 74 parameters->AddObject(iomodel->CopyConstantObject(InversionMaxstepsEnum)); 74 75 parameters->AddObject(iomodel->CopyConstantObject(InversionMaxiterEnum)); 76 iomodel->FetchData(&control_scaling_factors,NULL,NULL,InversionControlScalingFactorsEnum); 77 parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls)); 75 78 break; 76 79 case 3:/*Validation*/ 77 80 break; -
../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
32 32 double f,dxmin,gttol; 33 33 int maxsteps,maxiter; 34 34 int intn,num_controls,solution_type; 35 IssmDouble *scaling_factors = NULL; 35 36 IssmDouble *X = NULL; 36 37 IssmDouble *G = NULL; 37 38 … … 42 43 femmodel->parameters->FindParam(&maxiter,InversionMaxiterEnum); 43 44 femmodel->parameters->FindParam(&dxmin,InversionDxminEnum); 44 45 femmodel->parameters->FindParam(>tol,InversionGttolEnum); 46 femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 45 47 femmodel->parameters->SetParam(false,SaveResultsEnum); 46 48 47 49 /*Initialize M1QN3 parameters*/ … … 73 75 long n = long(intn); 74 76 G = xNew<double>(n); 75 77 78 /*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]; 82 } 83 76 84 /*Allocate m1qn3 working arrays (see doc)*/ 77 85 long m = 100; 78 86 long ndz = 4*n+m*(2*n+1); … … 131 139 FemModel *femmodel = (FemModel*)dzs; 132 140 133 141 /*Recover number of cost functions responses*/ 134 int num_responses; 142 int num_responses; 143 int num_controls; 144 IssmDouble* scaling_factors = NULL; 135 145 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 146 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 147 femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum); 136 148 137 149 /*Constrain input vector*/ 138 150 IssmDouble *XL = NULL; 139 151 IssmDouble *XU = NULL; 140 152 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 141 153 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 154 if(num_controls!=1) _error_("not supported yet"); 142 155 for(long i=0;i<*n;i++){ 156 X[i] = X[i]*scaling_factors[0]; 143 157 if(X[i]>XU[i]) X[i]=XU[i]; 144 158 if(X[i]<XL[i]) X[i]=XL[i]; 145 159 } … … 161 175 femmodel->CostFunctionx(pf,&Jlist,NULL); 162 176 _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | "); 163 177 164 165 166 178 if(indic==0){ 167 179 /*dry run, no gradient required*/ 168 180 … … 189 201 190 202 /*Constrain Gradient*/ 191 203 IssmDouble Gnorm = 0.; 204 if(num_controls!=1) _error_("not supported yet"); 192 205 for(long i=0;i<*n;i++){ 193 206 if(X[i]>=XU[i]) G[i]=0.; 194 207 if(X[i]<=XL[i]) G[i]=0.; 208 G[i] = G[i]*scaling_factors[0]; 209 X[i] = X[i]/scaling_factors[0]; 195 210 Gnorm += G[i]*G[i]; 196 211 } 197 212 Gnorm = sqrt(Gnorm); … … 202 217 _printf0_("\n"); 203 218 204 219 /*Clean-up and return*/ 205 220 xDelete<IssmDouble>(Jlist); 206 221 xDelete<IssmDouble>(XU); 207 222 xDelete<IssmDouble>(XL); 208 223 }
Note:
See TracBrowser
for help on using the repository browser.