Changeset 18128
- Timestamp:
- 06/10/14 10:18:16 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 14 edited
-
c/classes/Elements/Penta.cpp (modified) (4 diffs)
-
c/classes/Elements/Tria.cpp (modified) (1 diff)
-
c/cores/control_core.cpp (modified) (8 diffs)
-
c/cores/controlm1qn3_core.cpp (modified) (5 diffs)
-
c/cores/controltao_core.cpp (modified) (3 diffs)
-
c/cores/controlvalidation_core.cpp (modified) (1 diff)
-
c/modules/Gradjx/Gradjx.cpp (modified) (1 diff)
-
c/modules/ModelProcessorx/Control/CreateParametersControl.cpp (modified) (3 diffs)
-
c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp (modified) (3 diffs)
-
c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h (modified) (1 diff)
-
c/shared/Numerics/BrentSearch.cpp (modified) (2 diffs)
-
c/shared/Numerics/OptPars.h (modified) (1 diff)
-
c/shared/Numerics/numerics.h (modified) (1 diff)
-
m/classes/inversion.m (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r18104 r18128 2851 2851 2852 2852 /*Get input (either in element or material)*/ 2853 if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum; 2853 2854 Input* input=inputs->GetInput(control_enum); 2854 2855 if(!input) _error_("Input " << EnumToStringx(control_enum) << " not found in element"); … … 2865 2866 2866 2867 IssmDouble values[NUMVERTICES]; 2867 int vertexpidlist[NUMVERTICES]; 2868 Input *input = NULL; 2869 Input *new_input = NULL; 2868 int vertexpidlist[NUMVERTICES],control_init; 2869 Input *input = NULL; 2870 Input *new_input = NULL; 2871 2872 /*Specific case for depth averaged quantities*/ 2873 control_init=control_enum; 2874 if(control_enum==MaterialsRheologyBbarEnum){ 2875 control_enum=MaterialsRheologyBEnum; 2876 if(!IsOnBase()) return; 2877 } 2878 if(control_enum==DamageDbarEnum){ 2879 control_enum=DamageDEnum; 2880 if(!IsOnBase()) return; 2881 } 2870 2882 2871 2883 /*Get out if this is not an element input*/ … … 2876 2888 2877 2889 /*Get values on vertices*/ 2878 for (int i=0;i<NUMVERTICES;i++){2890 for(int i=0;i<NUMVERTICES;i++){ 2879 2891 values[i]=vector[vertexpidlist[i]]; 2880 2892 } … … 2887 2899 2888 2900 ((ControlInput*)input)->SetInput(new_input); 2901 2902 if(control_init==MaterialsRheologyBbarEnum){ 2903 this->InputExtrude(control_enum); 2904 } 2905 if(control_init==DamageDbarEnum){ 2906 this->InputExtrude(control_enum); 2907 } 2889 2908 } 2890 2909 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18104 r18128 983 983 this->inputs->AddInput(new IntInput(ApproximationEnum,reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[index]))); 984 984 } 985 986 985 987 986 /*Control Inputs*/ -
issm/trunk-jpl/src/c/cores/control_core.cpp
r18003 r18128 11 11 12 12 /*Local prototypes*/ 13 bool controlconvergence(IssmDouble J, IssmDouble tol_cm); 14 IssmDouble objectivefunction(IssmDouble search_scalar,void* optargs); 13 IssmDouble FormFunction(IssmDouble* X,void* usr); 14 IssmDouble FormFunctionGradient(IssmDouble** pG,IssmDouble* X,void* usr); 15 typedef struct { 16 FemModel* femmodel; 17 int nsize; 18 } AppCtx; 15 19 16 20 void control_core(FemModel* femmodel){ … … 19 23 20 24 /*parameters: */ 21 int num_controls ;25 int num_controls,nsize; 22 26 int nsteps; 23 27 IssmDouble tol_cm; … … 27 31 28 32 int *control_type = NULL; 29 IssmDouble *maxiter = NULL;33 int* maxiter = NULL; 30 34 IssmDouble *cm_jump = NULL; 31 35 32 36 /*intermediary: */ 33 IssmDouble search_scalar = 1.;34 37 OptPars optpars; 35 38 … … 61 64 if(isFS) solutioncore(femmodel); 62 65 63 /*Initialize cost function: */ 64 J=xNew<IssmDouble>(nsteps); 66 /*Get initial guess*/ 67 Vector<IssmDouble> *Xpetsc = NULL; 68 GetVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 69 IssmDouble* X0 = Xpetsc->ToMPISerial(); 70 Xpetsc->GetSize(&nsize); 71 delete Xpetsc; 65 72 66 73 /*Initialize some of the BrentSearch arguments: */ 67 optpars.xmin=0; optpars.xmax=1; 68 69 /*Start looping: */ 70 for(int n=0;n<nsteps;n++){ 71 72 /*Display info*/ 73 if(VerboseControl()) _printf0_("\n" << " control method step " << n+1 << "/" << nsteps << "\n"); 74 75 76 /*In steady state inversion, compute new temperature field now*/ 77 if(solution_type==SteadystateSolutionEnum) solutioncore(femmodel); 78 79 if(VerboseControl()) _printf0_(" compute adjoint state:\n"); 80 adjointcore(femmodel); 81 gradient_core(femmodel,n,search_scalar==0.); 82 83 if(VerboseControl()) _printf0_(" optimizing along gradient direction\n"); 84 optpars.maxiter=reCast<int,IssmDouble>(maxiter[n]); optpars.cm_jump=cm_jump[n]; 85 BrentSearch(&search_scalar,J+n,&optpars,&objectivefunction,(void*)femmodel); 86 87 if(VerboseControl()) _printf0_(" updating parameter using optimized search scalar\n"); //true means update save controls 88 InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,true); 89 90 if(controlconvergence(J[n],tol_cm)) break; 91 } 74 optpars.xmin = 0; 75 optpars.xmax = 1; 76 optpars.nsteps = nsteps; 77 optpars.nsize = nsize; 78 optpars.maxiter = maxiter; 79 optpars.cm_jump = cm_jump; 80 81 /*Initialize function argument*/ 82 AppCtx usr; 83 usr.femmodel = femmodel; 84 usr.nsize = nsize; 85 86 /*Call Brent optimization*/ 87 BrentSearch(&J,optpars,X0,&FormFunction,&FormFunctionGradient,(void*)&usr); 92 88 93 89 if(VerboseControl()) _printf0_(" preparing final solution\n"); 90 IssmDouble *XL = NULL; 91 IssmDouble *XU = NULL; 92 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 93 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 94 for(long i=0;i<nsize;i++){ 95 if(X0[i]>XU[i]) X0[i]=XU[i]; 96 if(X0[i]<XL[i]) X0[i]=XL[i]; 97 } 98 xDelete<IssmDouble>(XU); 99 xDelete<IssmDouble>(XL); 100 SetControlInputsFromVectorx(femmodel,X0); 94 101 femmodel->parameters->SetParam(true,SaveResultsEnum); 95 102 solutioncore(femmodel); … … 111 118 /*Free ressources: */ 112 119 xDelete<int>(control_type); 113 xDelete< IssmDouble>(maxiter);120 xDelete<int>(maxiter); 114 121 xDelete<IssmDouble>(cm_jump); 115 122 xDelete<IssmDouble>(J); 123 xDelete<IssmDouble>(X0); 116 124 } 117 bool controlconvergence(IssmDouble J, IssmDouble tol_cm){ 118 119 bool converged=false; 120 121 /*Has convergence been reached?*/ 122 if (!xIsNan<IssmDouble>(tol_cm) && J<tol_cm){ 123 converged=true; 124 if(VerboseConvergence()) _printf0_(" Convergence criterion reached: J = " << J << " < " << tol_cm); 125 } 126 127 return converged; 128 } 129 130 IssmDouble objectivefunction(IssmDouble search_scalar,void* optargs){ 125 126 IssmDouble FormFunction(IssmDouble* X,void* usrvoid){ 131 127 132 128 /*output: */ … … 134 130 135 131 /*parameters: */ 136 int solution_type,analysis_type ;137 bool isFS = false;132 int solution_type,analysis_type,num_responses; 133 bool isFS = false; 138 134 bool conserve_loads = true; 139 FemModel *femmodel = (FemModel*)optargs; 135 AppCtx* usr = (AppCtx*)usrvoid; 136 FemModel *femmodel = usr->femmodel; 137 int nsize = usr->nsize; 140 138 141 139 /*Recover parameters: */ … … 143 141 femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum); 144 142 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 145 146 /*set analysis type to compute velocity: */ 143 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 144 145 /*Constrain input vector*/ 146 IssmDouble *XL = NULL; 147 IssmDouble *XU = NULL; 148 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 149 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 150 for(long i=0;i<nsize;i++){ 151 if(X[i]>XU[i]) X[i]=XU[i]; 152 if(X[i]<XL[i]) X[i]=XL[i]; 153 } 154 155 /*Update control input*/ 156 SetControlInputsFromVectorx(femmodel,X); 157 158 /*solve forward: */ 147 159 switch(solution_type){ 148 160 case SteadystateSolutionEnum: 161 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 162 stressbalance_core(femmodel); //We need a 3D velocity!! (vz is required for the next thermal run) 163 break; 149 164 case StressbalanceSolutionEnum: 150 165 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 166 solutionsequence_nonlinear(femmodel,conserve_loads); 151 167 break; 152 168 case BalancethicknessSolutionEnum: 153 169 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum); 170 solutionsequence_linear(femmodel); 154 171 break; 155 172 case BalancethicknessSoftSolutionEnum: 156 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);173 /*NOTHING*/ 157 174 break; 158 175 case Balancethickness2SolutionEnum: 159 176 femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum); 177 solutionsequence_linear(femmodel); 160 178 break; 161 179 default: … … 163 181 } 164 182 165 /*update parameter according to scalar: */ //false means: do not save control166 InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,false);167 168 /*Run stressbalance with updated inputs: */169 if (solution_type==SteadystateSolutionEnum){170 stressbalance_core(femmodel); //We need a 3D velocity!! (vz is required for the next thermal run)171 }172 else if (solution_type==StressbalanceSolutionEnum){173 solutionsequence_nonlinear(femmodel,conserve_loads);174 }175 else if (solution_type==BalancethicknessSolutionEnum){176 solutionsequence_linear(femmodel);177 }178 else if (solution_type==Balancethickness2SolutionEnum){179 solutionsequence_linear(femmodel);180 }181 else if (solution_type==BalancethicknessSoftSolutionEnum){182 /*Don't do anything*/183 }184 else{185 _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");186 }187 188 183 /*Compute misfit for this velocity field.*/ 189 femmodel->CostFunctionx(&J,NULL,NULL); 184 IssmDouble* Jlist = NULL; 185 femmodel->CostFunctionx(&J,&Jlist,NULL); 186 //_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | "); 187 188 /*Retrieve objective functions independently*/ 189 //for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]); 190 //_printf0_("\n"); 190 191 191 192 /*Free ressources:*/ 193 xDelete<IssmDouble>(XU); 194 xDelete<IssmDouble>(XL); 195 xDelete<IssmDouble>(Jlist); 192 196 return J; 193 197 } 198 IssmDouble FormFunctionGradient(IssmDouble** pG,IssmDouble* X,void* usrvoid){ 199 200 /*output: */ 201 IssmDouble J; 202 203 /*parameters: */ 204 void (*adjointcore)(FemModel*)=NULL; 205 int solution_type,analysis_type,num_responses,num_controls,numvertices; 206 bool isFS = false; 207 bool conserve_loads = true; 208 IssmDouble *scalar_list = NULL; 209 IssmDouble *Jlist = NULL; 210 IssmDouble *G = NULL; 211 IssmDouble *norm_list = NULL; 212 AppCtx *usr = (AppCtx*)usrvoid; 213 FemModel *femmodel = usr->femmodel; 214 int nsize = usr->nsize; 215 216 /*Recover parameters: */ 217 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 218 femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum); 219 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 220 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 221 femmodel->parameters->FindParam(&scalar_list,NULL,NULL,InversionGradientScalingEnum); 222 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); _assert_(num_controls); 223 numvertices=femmodel->vertices->NumberOfVertices(); 224 225 /*Constrain input vector*/ 226 IssmDouble *XL = NULL; 227 IssmDouble *XU = NULL; 228 GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound"); 229 GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound"); 230 for(long i=0;i<nsize;i++){ 231 if(X[i]>XU[i]) X[i]=XU[i]; 232 if(X[i]<XL[i]) X[i]=XL[i]; 233 } 234 235 /*Update control input*/ 236 SetControlInputsFromVectorx(femmodel,X); 237 238 /*Compute Adjoint*/ 239 AdjointCorePointerFromSolutionEnum(&adjointcore,solution_type); 240 adjointcore(femmodel); 241 242 /*Compute gradient*/ 243 Gradjx(&G,&norm_list,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 244 245 /*Compute scaling factor*/ 246 IssmDouble scalar = scalar_list[0]/norm_list[0]; 247 for(int i=1;i<num_controls;i++) scalar=min(scalar,scalar_list[i]/norm_list[i]); 248 249 /*Constrain Gradient*/ 250 for(int i=0;i<num_controls;i++){ 251 for(int j=0;j<numvertices;j++){ 252 G[i*numvertices+j] = scalar*G[i*numvertices+j]; 253 } 254 } 255 256 /*Needed for output results (FIXME: should be placed 6 lines below)*/ 257 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G); 258 259 for(long i=0;i<nsize;i++){ 260 if(X[i]>=XU[i]) G[i]=0.; 261 if(X[i]<=XL[i]) G[i]=0.; 262 } 263 264 /*solve forward: (FIXME: not needed actually...)*/ 265 switch(solution_type){ 266 case SteadystateSolutionEnum: 267 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 268 stressbalance_core(femmodel); //We need a 3D velocity!! (vz is required for the next thermal run) 269 break; 270 case StressbalanceSolutionEnum: 271 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 272 solutionsequence_nonlinear(femmodel,conserve_loads); 273 break; 274 case BalancethicknessSolutionEnum: 275 femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum); 276 solutionsequence_linear(femmodel); 277 break; 278 case BalancethicknessSoftSolutionEnum: 279 /*NOTHING*/ 280 break; 281 case Balancethickness2SolutionEnum: 282 femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum); 283 solutionsequence_linear(femmodel); 284 break; 285 default: 286 _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet"); 287 } 288 289 /*Compute misfit for this velocity field.*/ 290 femmodel->CostFunctionx(&J,&Jlist,NULL); 291 //_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | "); 292 //for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]); 293 //_printf0_("\n"); 294 295 /*Clean-up and return*/ 296 xDelete<IssmDouble>(XU); 297 xDelete<IssmDouble>(XL); 298 xDelete<IssmDouble>(norm_list); 299 xDelete<IssmDouble>(scalar_list); 300 xDelete<IssmDouble>(Jlist); 301 *pG = G; 302 return J; 303 } -
issm/trunk-jpl/src/c/cores/controlm1qn3_core.cpp
r17924 r18128 106 106 107 107 /*Get solution*/ 108 SetControlInputsFromVectorx(femmodel ->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);108 SetControlInputsFromVectorx(femmodel,X); 109 109 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G); 110 110 femmodel->OutputControlsx(&femmodel->results); … … 131 131 FemModel *femmodel = (FemModel*)dzs; 132 132 133 /*Recover responses*/ 134 int num_responses; 135 int *responses = NULL; 136 femmodel->parameters->FindParam(&responses,&num_responses,InversionCostFunctionsEnum); 133 /*Recover number of cost functions responses*/ 134 int num_responses; 135 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 137 136 138 137 /*Constrain input vector*/ … … 147 146 148 147 /*Update control input*/ 149 SetControlInputsFromVectorx(femmodel ->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);148 SetControlInputsFromVectorx(femmodel,X); 150 149 151 150 /*Recover some parameters*/ … … 170 169 if(indic==0){ 171 170 /*dry run, no gradient required*/ 172 xDelete<int>(responses);173 171 xDelete<IssmDouble>(XU); 174 172 xDelete<IssmDouble>(XL); … … 193 191 194 192 /*Clean-up and return*/ 195 xDelete<int>(responses);196 193 xDelete<IssmDouble>(XU); 197 194 xDelete<IssmDouble>(XL); -
issm/trunk-jpl/src/c/cores/controltao_core.cpp
r17918 r18128 93 93 G=new Vector<IssmDouble>(0); VecFree(&G->pvector->vector); 94 94 TaoGetGradientVector(tao,&G->pvector->vector); 95 SetControlInputsFromVectorx(femmodel ->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);95 SetControlInputsFromVectorx(femmodel,X); 96 96 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,G); 97 97 femmodel->OutputControlsx(&femmodel->results); … … 113 113 TaoFinalize(); 114 114 } 115 int FormFunctionGradient(TaoSolver tao, Vec Xpetsc, IssmDouble *fcn,Vec G,void *user Ctx){115 int FormFunctionGradient(TaoSolver tao, Vec Xpetsc, IssmDouble *fcn,Vec G,void *uservoid){ 116 116 117 117 /*Retreive arguments*/ 118 118 int solution_type; 119 AppCtx *user = (AppCtx *)user Ctx;119 AppCtx *user = (AppCtx *)uservoid; 120 120 FemModel *femmodel = user->femmodel; 121 121 Vector<IssmDouble> *gradient = NULL; … … 127 127 /*Set new variable*/ 128 128 //VecView(X,PETSC_VIEWER_STDOUT_WORLD); 129 SetControlInputsFromVectorx(femmodel ->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);129 SetControlInputsFromVectorx(femmodel,X); 130 130 delete X; 131 131 -
issm/trunk-jpl/src/c/cores/controlvalidation_core.cpp
r18030 r18128 73 73 74 74 /*Calculate j(k+alpha delta k) */ 75 SetControlInputsFromVectorx(femmodel ->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,X);75 SetControlInputsFromVectorx(femmodel,X); 76 76 solutioncore(femmodel); 77 77 femmodel->CostFunctionx(&j,NULL,NULL); -
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
r18060 r18128 50 50 delete gradient_list[i]; 51 51 } 52 //gradient->Echo(); 53 //_error_("S"); 52 54 53 55 /*Check that gradient is clean*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
r18009 r18128 16 16 int num_cm_responses; 17 17 int *control_type = NULL; 18 int *maxiter = NULL; 18 19 int *cm_responses = NULL; 19 20 IssmDouble *cm_jump = NULL; 20 21 IssmDouble *optscal = NULL; 21 IssmDouble *maxiter = NULL;22 22 23 23 /*retrieve some parameters: */ … … 56 56 parameters->AddObject(new DoubleMatParam(InversionGradientScalingEnum,optscal,nsteps,num_control_type)); 57 57 parameters->AddObject(new DoubleVecParam(InversionStepThresholdEnum,cm_jump,nsteps)); 58 parameters->AddObject(new DoubleVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps));58 parameters->AddObject(new IntVecParam(InversionMaxiterPerStepEnum,maxiter,nsteps)); 59 59 break; 60 60 case 1:/*TAO*/ … … 83 83 xDelete<int>(control_type); 84 84 xDelete<int>(cm_responses); 85 xDelete<int>(maxiter); 85 86 iomodel->DeleteData(cm_jump,InversionStepThresholdEnum); 86 87 iomodel->DeleteData(optscal,InversionGradientScalingEnum); 87 iomodel->DeleteData(maxiter,InversionMaxiterPerStepEnum);88 88 } 89 89 } -
issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
r14999 r18128 7 7 #include "../../toolkits/toolkits.h" 8 8 9 void SetControlInputsFromVectorx( Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* vector){9 void SetControlInputsFromVectorx(FemModel* femmodel,IssmDouble* vector){ 10 10 11 11 int num_controls; … … 13 13 14 14 /*Retrieve some parameters*/ 15 parameters->FindParam(&num_controls,InversionNumControlParametersEnum);16 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);15 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 16 femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 17 17 18 18 for(int i=0;i<num_controls;i++){ 19 for(int j=0;j< elements->Size();j++){20 Element* element=(Element*) elements->GetObjectByOffset(j);19 for(int j=0;j<femmodel->elements->Size();j++){ 20 Element* element=(Element*)femmodel->elements->GetObjectByOffset(j); 21 21 element->SetControlInputsFromVector(vector,control_type[i],i); 22 22 } … … 26 26 } 27 27 28 void SetControlInputsFromVectorx( Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Vector<IssmDouble>* vector){28 void SetControlInputsFromVectorx(FemModel* femmodel,Vector<IssmDouble>* vector){ 29 29 30 IssmDouble* serial_vector=NULL; 31 32 serial_vector=vector->ToMPISerial(); 33 34 SetControlInputsFromVectorx(elements,nodes, vertices, loads, materials, parameters,serial_vector); 35 36 /*Free ressources:*/ 30 IssmDouble* serial_vector=vector->ToMPISerial(); 31 SetControlInputsFromVectorx(femmodel,serial_vector); 37 32 xDelete<IssmDouble>(serial_vector); 38 33 } -
issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h
r15000 r18128 8 8 9 9 /* local prototypes: */ 10 void SetControlInputsFromVectorx( Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters,Vector<IssmDouble>* vector);11 void SetControlInputsFromVectorx( Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* vector);10 void SetControlInputsFromVectorx(FemModel* femmodel,Vector<IssmDouble>* vector); 11 void SetControlInputsFromVectorx(FemModel* femmodel,IssmDouble* vector); 12 12 13 13 #endif -
issm/trunk-jpl/src/c/shared/Numerics/BrentSearch.cpp
r17907 r18128 20 20 #include "./isnan.h" 21 21 22 void BrentSearch(IssmDouble* psearch_scalar,IssmDouble* pJ,OptPars* optpars,IssmDouble (*f)(IssmDouble,void*),void* optargs){22 void BrentSearch(IssmDouble** pJ,OptPars optpars,IssmDouble* X0,IssmDouble (*f)(IssmDouble*,void*),IssmDouble (*g)(IssmDouble**,IssmDouble*,void*),void* usr){ 23 23 24 24 /* This routine is optimizing a given function using Brent's method … … 26 26 27 27 /*Intermediary*/ 28 int iter; 28 29 IssmDouble si,gold,intervalgold,oldintervalgold; 29 IssmDouble parab_num,parab_den; 30 IssmDouble distance,cm_jump; 30 IssmDouble parab_num,parab_den,distance; 31 31 IssmDouble fxmax,fxmin,fxbest; 32 32 IssmDouble fx,fx1,fx2; 33 IssmDouble xmax,xmin,xbest; 34 IssmDouble x,x1,x2,xm; 33 IssmDouble x,x1,x2,xm,xbest; 35 34 IssmDouble tol1,tol2,seps; 36 35 IssmDouble tolerance = 1.e-4; 37 int maxiter ,iter;38 bool loop= true,goldenflag;39 36 40 37 /*Recover parameters:*/ 41 xmin=optpars->xmin; 42 xmax=optpars->xmax; 43 maxiter=optpars->maxiter; 44 cm_jump=optpars->cm_jump; 45 46 /*initialize counter and get response at the boundaries*/ 47 iter=0; 48 fxmin = (*f)(xmin,optargs); 49 if (xIsNan<IssmDouble>(fxmin)) _error_("Function evaluation returned NaN"); 50 cout<<setprecision(5); 51 if(VerboseControl()) _printf0_("\n"); 52 if(VerboseControl()) _printf0_(" Iteration x f(x) Tolerance Procedure\n"); 53 if(VerboseControl()) _printf0_("\n"); 54 if(VerboseControl()) _printf0_(" N/A "<<setw(12)<<xmin<<" "<<setw(12)<<fxmin<<" N/A boundary\n"); 55 fxmax = (*f)(xmax,optargs); 56 if (xIsNan<IssmDouble>(fxmax)) _error_("Function evaluation returned NaN"); 57 if(VerboseControl()) _printf0_(" N/A "<<setw(12)<<xmax<<" "<<setw(12)<<fxmax<<" N/A boundary\n"); 58 59 /*test if jump option activated and xmin==0*/ 60 if (!xIsNan<IssmDouble>(cm_jump) && (xmin==0) && (fxmax/fxmin)<cm_jump){ 61 *psearch_scalar=xmax; 62 *pJ=fxmax; 63 return; 38 int nsteps = optpars.nsteps; 39 int nsize = optpars.nsize; 40 IssmDouble xmin = optpars.xmin; 41 IssmDouble xmax = optpars.xmax; 42 int *maxiter = optpars.maxiter; 43 IssmDouble *cm_jump = optpars.cm_jump; 44 45 /*Initialize gradient and controls*/ 46 IssmDouble* G = NULL; 47 IssmDouble* J = xNew<IssmDouble>(nsteps); 48 IssmDouble* X = xNew<IssmDouble>(nsize); 49 50 /*start iterations*/ 51 for(int n=0;n<nsteps;n++){ 52 53 /*Reset some variables*/ 54 iter = 0; 55 xmin = 0.; 56 xmax = 1.; 57 bool loop = true; 58 cout<<setprecision(5); 59 60 /*Get current Gradient at xmin=0*/ 61 if(VerboseControl()) _printf0_("\n" << " step " << n+1 << "/" << nsteps << "\n"); 62 fxmin = (*g)(&G,X0,usr); if(xIsNan<IssmDouble>(fxmin)) _error_("Function evaluation returned NaN"); 63 if(VerboseControl()) _printf0_("\n"); 64 if(VerboseControl()) _printf0_(" Iteration x f(x) Tolerance Procedure\n"); 65 if(VerboseControl()) _printf0_("\n"); 66 if(VerboseControl()) _printf0_(" N/A "<<setw(12)<<xmin<<" "<<setw(12)<<fxmin<<" N/A boundary\n"); 67 68 /*Get f(xmax)*/ 69 for(int i=0;i<nsize;i++) X[i]=X0[i]+xmax*G[i]; 70 fxmax = (*f)(X,usr); if (xIsNan<IssmDouble>(fxmax)) _error_("Function evaluation returned NaN"); 71 if(VerboseControl()) _printf0_(" N/A "<<setw(12)<<xmax<<" "<<setw(12)<<fxmax<<" N/A boundary\n"); 72 73 /*test if jump option activated and xmin==0*/ 74 if(!xIsNan<IssmDouble>(cm_jump[n]) && (xmin==0) && (fxmax/fxmin)<cm_jump[n]){ 75 for(int i=0;i<nsize;i++) X0[i]=X0[i]+xmax*G[i]; 76 xDelete<IssmDouble>(G); 77 J[n]=fxmax; 78 continue; 79 } 80 81 /*initialize optimization variables*/ 82 seps=sqrt(DBL_EPSILON); //precision of a IssmDouble 83 distance=0.0; //new_x=old_x + distance 84 gold=0.5*(3.0-sqrt(5.0)); //gold = 1 - golden ratio 85 intervalgold=0.0; //distance used by Golden procedure 86 87 /*1: initialize the values of the 4 x needed (x1,x2,x,xbest)*/ 88 x1=xmin+gold*(xmax-xmin); 89 x2=x1; 90 xbest=x1; 91 x=xbest; 92 93 /*2: call the function to be evaluated*/ 94 for(int i=0;i<nsize;i++) X[i]=X0[i]+x*G[i]; 95 fxbest = (*f)(X,usr); if(xIsNan<IssmDouble>(fxbest)) _error_("Function evaluation returned NaN"); 96 iter++; 97 98 /*3: update the other variables*/ 99 fx1=fxbest; 100 fx2=fxbest; 101 /*xm is always in the middle of a and b*/ 102 xm=0.5*(xmin+xmax); 103 /*update tolerances*/ 104 tol1=seps*sqrt(pow(xbest,2))+tolerance/3.0; 105 tol2=2.0*tol1; 106 107 /*4: print result*/ 108 if(VerboseControl()) 109 _printf0_(" "<<setw(5)<<iter<<" "<<setw(12)<<xbest<<" "<<setw(12)<<fxbest<<" "<<setw(12)<<pow(pow(xbest-xm,2),0.5)<<" initial\n"); 110 if (!xIsNan<IssmDouble>(cm_jump[n]) && (xmin==0) && ((fxbest/fxmin)<cm_jump[n])){ 111 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'cm_jump'=" << cm_jump[n] << "\n"); 112 loop=false; 113 } 114 115 while(loop){ 116 117 bool goldenflag=true; 118 119 // Is a parabolic fit possible ? 120 if (sqrt(pow(intervalgold,2))>tol1){ 121 122 // Yes, so fit parabola 123 goldenflag=false; 124 parab_num=(xbest-x1)*(xbest-x1)*(fxbest-fx2)-(xbest-x2)*(xbest-x2)*(fxbest-fx1);; 125 parab_den=2.0*(xbest-x1)*(fxbest-fx2)-2.0*(xbest-x2)*(fxbest-fx1); 126 127 //reverse p if necessary 128 if(parab_den>0.0){ 129 parab_num=-parab_num; 130 } 131 parab_den=sqrt(pow(parab_den,2)); 132 oldintervalgold=intervalgold; 133 intervalgold=distance; 134 135 // Is the parabola acceptable (we use seps here because in some configuration parab_num==parab_den*(xmax-xbest) 136 // and the result is not repeatable anymore 137 if (( sqrt(pow(parab_num,2)) < sqrt(pow(0.5*parab_den*oldintervalgold,2))) && 138 (parab_num>parab_den*(xmin-xbest)+seps) && 139 (parab_num<parab_den*(xmax-xbest)-seps)){ 140 141 // Yes, parabolic interpolation step 142 distance=parab_num/parab_den; 143 x=xbest+distance; 144 145 // f must not be evaluated too close to min_x or max_x 146 if (((x-xmin)<tol2) || ((xmax-x)<tol2)){ 147 if ((xm-xbest)<0.0) si=-1; 148 else si=1; 149 //compute new distance 150 distance=tol1*si; 151 } 152 } 153 else{ 154 // Not acceptable, must do a golden section step 155 goldenflag=true; 156 } 157 } 158 159 //Golden procedure 160 if(goldenflag){ 161 // compute the new distance d 162 if(xbest>=xm){ 163 intervalgold=xmin-xbest; 164 } 165 else{ 166 intervalgold=xmax-xbest; 167 } 168 distance=gold*intervalgold; 169 } 170 171 // The function must not be evaluated too close to xbest 172 if(distance<0) si=-1; 173 else si=1; 174 if(sqrt(pow(distance,2))>tol1) x=xbest+si*sqrt(pow(distance,2)); 175 else x=xbest+si*tol1; 176 177 //evaluate function on x 178 for(int i=0;i<nsize;i++) X[i]=X0[i]+x*G[i]; 179 fx = (*f)(X,usr); if(xIsNan<IssmDouble>(fx)) _error_("Function evaluation returned NaN"); 180 iter++; 181 182 // Update a, b, xm, x1, x2, tol1, tol2 183 if (fx<=fxbest){ 184 if (x>=xbest) xmin=xbest; 185 else xmax=xbest; 186 x1=x2; fx1=fx2; 187 x2=xbest; fx2=fxbest; 188 xbest=x; fxbest=fx; 189 } 190 else{ // fx > fxbest 191 if (x<xbest) xmin=x; 192 else xmax=x; 193 if ((fx<=fx2) || (x2==xbest)){ 194 x1=x2; fx1=fx2; 195 x2=x; fx2=fx; 196 } 197 else if ( (fx <= fx1) || (x1 == xbest) || (x1 == x2) ){ 198 x1=x; fx1=fx; 199 } 200 } 201 xm = 0.5*(xmin+xmax); 202 tol1=seps*pow(pow(xbest,2),0.5)+tolerance/3.0; 203 tol2=2.0*tol1; 204 if(VerboseControl()) 205 _printf0_(" "<<setw(5)<<iter<<" "<<setw(12)<<x<<" "<<setw(12)<<fx<<" "<<setw(12)<<pow(pow(xbest-xm,2),0.5)<< 206 " "<<(goldenflag?"golden":"parabolic")<<"\n"); 207 208 /*Stop the optimization?*/ 209 if (sqrt(pow(xbest-xm,2)) < (tol2-0.5*(xmax-xmin))){ 210 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'tolx'=" << tolerance << "\n"); 211 loop=false; 212 } 213 else if (iter>=maxiter[n]){ 214 if(VerboseControl()) _printf0_(" exiting: Maximum number of iterations has been exceeded ('maxiter'=" << maxiter[n] << ")\n"); 215 loop=false; 216 } 217 else if (!xIsNan<IssmDouble>(cm_jump[n]) && (xmin==0) && ((fxbest/fxmin)<cm_jump[n])){ 218 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'cm_jump'=" << cm_jump[n] << "\n"); 219 loop=false; 220 } 221 else{ 222 //continue 223 loop=true; 224 } 225 }//end while 226 227 //Now, check that the value on the boundaries are not better than current fxbest 228 if (fxbest>fxmin){ 229 xbest=optpars.xmin; fxbest=fxmin; 230 } 231 if (fxbest>fxmax){ 232 xbest=optpars.xmax; fxbest=fxmax; 233 } 234 235 /*Assign output pointers: */ 236 for(int i=0;i<nsize;i++) X0[i]=X0[i]+xbest*G[i]; 237 xDelete<IssmDouble>(G); 238 J[n]=fxbest; 64 239 } 65 66 /*initialize optimization variables*/ 67 seps=sqrt(DBL_EPSILON); //precision of a IssmDouble 68 distance=0.0; //new_x=old_x + distance 69 gold=0.5*(3.0-sqrt(5.0)); //gold = 1 - golden ratio 70 intervalgold=0.0; //distance used by Golden procedure 71 72 /*1: initialize the values of the 4 x needed (x1,x2,x,xbest)*/ 73 x1=xmin+gold*(xmax-xmin); 74 x2=x1; 75 xbest=x1; 76 x=xbest; 77 78 /*2: call the function to be evaluated*/ 79 fxbest = (*f)(x,optargs); 80 if(xIsNan<IssmDouble>(fxbest)) _error_("Function evaluation returned NaN"); 81 iter=iter+1; 82 83 /*3: update the other variables*/ 84 fx1=fxbest; 85 fx2=fxbest; 86 /*xm is always in the middle of a and b*/ 87 xm=0.5*(xmin+xmax); 88 /*update tolerances*/ 89 tol1=seps*sqrt(pow(xbest,2))+tolerance/3.0; 90 tol2=2.0*tol1; 91 92 /*4: print result*/ 93 if(VerboseControl()) 94 _printf0_(" "<<setw(5)<<iter<<" "<<setw(12)<<xbest<<" "<<setw(12)<<fxbest<<" "<<setw(12)<<pow(pow(xbest-xm,2),0.5)<<" initial\n"); 95 if (!xIsNan<IssmDouble>(cm_jump) && (xmin==0) && ((fxbest/fxmin)<cm_jump)){ 96 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'cm_jump'=" << cm_jump << "\n"); 97 loop=false; 98 } 99 100 while(loop){ 101 102 goldenflag=true; 103 104 // Is a parabolic fit possible ? 105 if (sqrt(pow(intervalgold,2))>tol1){ 106 107 // Yes, so fit parabola 108 goldenflag=false; 109 parab_num=(xbest-x1)*(xbest-x1)*(fxbest-fx2)-(xbest-x2)*(xbest-x2)*(fxbest-fx1);; 110 parab_den=2.0*(xbest-x1)*(fxbest-fx2)-2.0*(xbest-x2)*(fxbest-fx1); 111 112 //reverse p if necessary 113 if(parab_den>0.0){ 114 parab_num=-parab_num; 115 } 116 parab_den=sqrt(pow(parab_den,2)); 117 oldintervalgold=intervalgold; 118 intervalgold=distance; 119 120 // Is the parabola acceptable (we use seps here because in some configuration parab_num==parab_den*(xmax-xbest) 121 // and the result is not repeatable anymore 122 if (( sqrt(pow(parab_num,2)) < sqrt(pow(0.5*parab_den*oldintervalgold,2))) && 123 (parab_num>parab_den*(xmin-xbest)+seps) && 124 (parab_num<parab_den*(xmax-xbest)-seps)){ 125 126 // Yes, parabolic interpolation step 127 distance=parab_num/parab_den; 128 x=xbest+distance; 129 130 // f must not be evaluated too close to min_x or max_x 131 if (((x-xmin)<tol2) || ((xmax-x)<tol2)){ 132 if ((xm-xbest)<0.0) si=-1; 133 else si=1; 134 //compute new distance 135 distance=tol1*si; 136 } 137 } 138 else{ 139 // Not acceptable, must do a golden section step 140 goldenflag=true; 141 } 142 } 143 144 //Golden procedure 145 if(goldenflag){ 146 // compute the new distance d 147 if(xbest>=xm){ 148 intervalgold=xmin-xbest; 149 } 150 else{ 151 intervalgold=xmax-xbest; 152 } 153 distance=gold*intervalgold; 154 } 155 156 // The function must not be evaluated too close to xbest 157 if(distance<0) si=-1; 158 else si=1; 159 if(sqrt(pow(distance,2))>tol1) x=xbest+si*sqrt(pow(distance,2)); 160 else x=xbest+si*tol1; 161 162 //evaluate function on x 163 fx = (*f)(x,optargs); 164 if(xIsNan<IssmDouble>(fx)) _error_("Function evaluation returned NaN"); 165 iter=iter+1; 166 167 // Update a, b, xm, x1, x2, tol1, tol2 168 if (fx<=fxbest){ 169 if (x>=xbest) xmin=xbest; 170 else xmax=xbest; 171 x1=x2; fx1=fx2; 172 x2=xbest; fx2=fxbest; 173 xbest=x; fxbest=fx; 174 } 175 else{ // fx > fxbest 176 if (x<xbest) xmin=x; 177 else xmax=x; 178 if ((fx<=fx2) || (x2==xbest)){ 179 x1=x2; fx1=fx2; 180 x2=x; fx2=fx; 181 } 182 else if ( (fx <= fx1) || (x1 == xbest) || (x1 == x2) ){ 183 x1=x; fx1=fx; 184 } 185 } 186 xm = 0.5*(xmin+xmax); 187 tol1=seps*pow(pow(xbest,2),0.5)+tolerance/3.0; 188 tol2=2.0*tol1; 189 if(VerboseControl()) 190 _printf0_(" "<<setw(5)<<iter<<" "<<setw(12)<<x<<" "<<setw(12)<<fx<<" "<<setw(12)<<pow(pow(xbest-xm,2),0.5)<< 191 " "<<(goldenflag?"golden":"parabolic")<<"\n"); 192 193 /*Stop the optimization?*/ 194 if (sqrt(pow(xbest-xm,2)) < (tol2-0.5*(xmax-xmin))){ 195 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'tolx'=" << tolerance << "\n"); 196 loop=false; 197 } 198 else if (iter>=maxiter){ 199 if(VerboseControl()) _printf0_(" exiting: Maximum number of iterations has been exceeded ('maxiter'=" << maxiter << ")\n"); 200 loop=false; 201 } 202 else if (!xIsNan<IssmDouble>(cm_jump) && (xmin==0) && ((fxbest/fxmin)<cm_jump)){ 203 if(VerboseControl()) _printf0_(" optimization terminated: current x satisfies criteria 'cm_jump'=" << cm_jump << "\n"); 204 loop=false; 205 } 206 else{ 207 //continue 208 loop=true; 209 } 210 }//end while 211 212 //Now, check that the value on the boundaries are not better than current fxbest 213 if (fxbest>fxmin){ 214 xbest=optpars->xmin; fxbest=fxmin; 215 } 216 if (fxbest>fxmax){ 217 xbest=optpars->xmax; fxbest=fxmax; 218 } 219 220 /*Assign output pointers: */ 221 *psearch_scalar=xbest; 222 *pJ=fxbest; 240 241 /*return*/ 242 xDelete<IssmDouble>(X); 243 *pJ=J; 223 244 } -
issm/trunk-jpl/src/c/shared/Numerics/OptPars.h
r14977 r18128 10 10 struct OptPars{ 11 11 12 IssmDouble xmin; 13 IssmDouble xmax; 14 IssmDouble cm_jump; 15 int maxiter; 12 IssmDouble xmin; 13 IssmDouble xmax; 14 IssmDouble *cm_jump; 15 int* maxiter; 16 int nsteps; 17 int nsize; 16 18 17 19 }; -
issm/trunk-jpl/src/c/shared/Numerics/numerics.h
r17907 r18128 30 30 int min(int a,int b); 31 31 int max(int a,int b); 32 void BrentSearch(IssmDouble *psearch_scalar,IssmDouble*pJ,OptPars*optpars,IssmDouble (*f)(IssmDouble,void*),void* optargs);32 void BrentSearch(IssmDouble** pJ,OptPars optpars,IssmDouble* X0,IssmDouble (*f)(IssmDouble*,void*),IssmDouble (*g)(IssmDouble**,IssmDouble*,void*),void* usr); 33 33 void cross(IssmDouble *result,IssmDouble*vector1,IssmDouble*vector2); 34 34 void XZvectorsToCoordinateSystem(IssmDouble *T,IssmDouble*xzvectors); -
issm/trunk-jpl/src/m/classes/inversion.m
r17931 r18128 25 25 end 26 26 methods 27 function createxml(obj,fid) % {{{28 fprintf(fid, '<!-- inversion -->\n');29 30 % inversion parameters31 fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="inversion parameters">','<section name="inversion" />');32 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="iscontrol" type="',class(obj.iscontrol),'" default="',convert2str(obj.iscontrol),'">',' <section name="inversion" />',' <help> is inversion activated? </help>',' </parameter>');33 34 % incompleteadjoing drop-down (0 or 1)35 fprintf(fid,'%s\n%s\n%s\n%s\n',' <parameter key ="incomplete_adjoint" type="alternative" optional="false">',' <section name="inversion" />',' <help> 1: linear viscosity, 0: non-linear viscosity </help>');36 fprintf(fid,'%s\n',' <option value="0" type="string" default="true"> </option>');37 fprintf(fid,'%s\n%s\n',' <option value="1" type="string" default="false"> </option>','</parameter>');38 39 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="control_parameters" type="',class(obj.control_parameters),'" default="',convert2str(obj.control_parameters),'">',' <section name="inversion" />',' <help> ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''} </help>',' </parameter>');40 41 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="nsteps" type="',class(obj.nsteps),'" default="',convert2str(obj.nsteps),'">',' <section name="inversion" />',' <help> number of optimization searches </help>',' </parameter>');42 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_functions" type="',class(obj.cost_functions),'" default="',convert2str(obj.cost_functions),'">',' <section name="inversion" />',' <help> indicate the type of response for each optimization step </help>',' </parameter>');43 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_functions_coefficients" type="',class(obj.cost_functions_coefficients),'" default="',convert2str(obj.cost_functions_coefficients),'">',' <section name="inversion" />',' <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>',' </parameter>');44 45 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_function_threshold" type="',class(obj.cost_function_threshold),'" default="',convert2str(obj.cost_function_threshold),'">',' <section name="inversion" />',' <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>',' </parameter>');46 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="maxiter_per_step" type="',class(obj.maxiter_per_step),'" default="',convert2str(obj.maxiter_per_step),'">',' <section name="inversion" />',' <help> maximum iterations during each optimization step </help>',' </parameter>');47 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="gradient_scaling" type="',class(obj.gradient_scaling),'" default="',convert2str(obj.gradient_scaling),'">',' <section name="inversion" />',' <help> scaling factor on gradient direction during optimization, for each optimization step </help>',' </parameter>');48 49 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="step_threshold" type="',class(obj.step_threshold),'" default="',convert2str(obj.step_threshold),'">',' <section name="inversion" />',' <help> decrease threshold for misfit, default is 30% </help>',' </parameter>');50 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="min_parameters" type="',class(obj.min_parameters),'" default="',convert2str(obj.min_parameters),'">',' <section name="inversion" />',' <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>',' </parameter>');51 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="max_parameters" type="',class(obj.max_parameters),'" default="',convert2str(obj.max_parameters),'">',' <section name="inversion" />',' <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>',' </parameter>');52 53 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vx_obs" type="',class(obj.vx_obs),'" default="',convert2str(obj.vx_obs),'">',' <section name="inversion" />',' <help> observed velocity x component [m/yr] </help>',' </parameter>');54 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vy_obs" type="',class(obj.vy_obs),'" default="',convert2str(obj.vy_obs),'">',' <section name="inversion" />',' <help> observed velocity y component [m/yr] </help>',' </parameter>');55 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vel_obs" type="',class(obj.vel_obs),'" default="',convert2str(obj.vel_obs),'">',' <section name="inversion" />',' <help> observed velocity magnitude [m/yr] </help>',' </parameter>');56 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="thickness_obs" type="',class(obj.thickness_obs),'" default="',convert2str(obj.thickness_obs),'">',' <section name="inversion" />',' <help> observed thickness [m]) </help>',' </parameter>');57 58 fprintf(fid,'%s\n%s\n','</frame>');59 60 fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Available cost functions">','<section name="inversion" />');61 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceAbsVelMisfit" type="','string','" default="','101','">',' <section name="inversion" />',' <help> </help>',' </parameter>');62 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceRelVelMisfit" type="','string','" default="','102','">',' <section name="inversion" />',' <help> </help>',' </parameter>');63 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceLogVelMisfit" type="','string','" default="','103','">',' <section name="inversion" />',' <help> </help>',' </parameter>');64 65 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceLogVxVyMisfit" type="','string','" default="','104','">',' <section name="inversion" />',' <help> </help>',' </parameter>');66 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceAverageVelMisfit" type="','string','" default="','105','">',' <section name="inversion" />',' <help> </help>',' </parameter>');67 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="ThicknessAbsMisfit" type="','string','" default="','106','">',' <section name="inversion" />',' <help> </help>',' </parameter>');68 69 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="DragCoefficientAbsGradient" type="','string','" default="','107','">',' <section name="inversion" />',' <help> </help>',' </parameter>');70 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="RheologyBbarAbsGradient" type="','string','" default="','108','">',' <section name="inversion" />',' <help> </help>',' </parameter>');71 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="ThicknessAbsGradient" type="','string','" default="','109','">',' <section name="inversion" />',' <help> </help>',' </parameter>');72 73 fprintf(fid,'%s\n%s\n','</frame>');74 75 end % }}}27 function createxml(obj,fid) % {{{ 28 fprintf(fid, '<!-- inversion -->\n'); 29 30 % inversion parameters 31 fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="inversion parameters">','<section name="inversion" />'); 32 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="iscontrol" type="',class(obj.iscontrol),'" default="',convert2str(obj.iscontrol),'">',' <section name="inversion" />',' <help> is inversion activated? </help>',' </parameter>'); 33 34 % incompleteadjoing drop-down (0 or 1) 35 fprintf(fid,'%s\n%s\n%s\n%s\n',' <parameter key ="incomplete_adjoint" type="alternative" optional="false">',' <section name="inversion" />',' <help> 1: linear viscosity, 0: non-linear viscosity </help>'); 36 fprintf(fid,'%s\n',' <option value="0" type="string" default="true"> </option>'); 37 fprintf(fid,'%s\n%s\n',' <option value="1" type="string" default="false"> </option>','</parameter>'); 38 39 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="control_parameters" type="',class(obj.control_parameters),'" default="',convert2str(obj.control_parameters),'">',' <section name="inversion" />',' <help> ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''} </help>',' </parameter>'); 40 41 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="nsteps" type="',class(obj.nsteps),'" default="',convert2str(obj.nsteps),'">',' <section name="inversion" />',' <help> number of optimization searches </help>',' </parameter>'); 42 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_functions" type="',class(obj.cost_functions),'" default="',convert2str(obj.cost_functions),'">',' <section name="inversion" />',' <help> indicate the type of response for each optimization step </help>',' </parameter>'); 43 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_functions_coefficients" type="',class(obj.cost_functions_coefficients),'" default="',convert2str(obj.cost_functions_coefficients),'">',' <section name="inversion" />',' <help> cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter </help>',' </parameter>'); 44 45 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="cost_function_threshold" type="',class(obj.cost_function_threshold),'" default="',convert2str(obj.cost_function_threshold),'">',' <section name="inversion" />',' <help> misfit convergence criterion. Default is 1%, NaN if not applied </help>',' </parameter>'); 46 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="maxiter_per_step" type="',class(obj.maxiter_per_step),'" default="',convert2str(obj.maxiter_per_step),'">',' <section name="inversion" />',' <help> maximum iterations during each optimization step </help>',' </parameter>'); 47 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="gradient_scaling" type="',class(obj.gradient_scaling),'" default="',convert2str(obj.gradient_scaling),'">',' <section name="inversion" />',' <help> scaling factor on gradient direction during optimization, for each optimization step </help>',' </parameter>'); 48 49 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="step_threshold" type="',class(obj.step_threshold),'" default="',convert2str(obj.step_threshold),'">',' <section name="inversion" />',' <help> decrease threshold for misfit, default is 30% </help>',' </parameter>'); 50 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="min_parameters" type="',class(obj.min_parameters),'" default="',convert2str(obj.min_parameters),'">',' <section name="inversion" />',' <help> absolute minimum acceptable value of the inversed parameter on each vertex </help>',' </parameter>'); 51 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="max_parameters" type="',class(obj.max_parameters),'" default="',convert2str(obj.max_parameters),'">',' <section name="inversion" />',' <help> absolute maximum acceptable value of the inversed parameter on each vertex </help>',' </parameter>'); 52 53 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vx_obs" type="',class(obj.vx_obs),'" default="',convert2str(obj.vx_obs),'">',' <section name="inversion" />',' <help> observed velocity x component [m/yr] </help>',' </parameter>'); 54 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vy_obs" type="',class(obj.vy_obs),'" default="',convert2str(obj.vy_obs),'">',' <section name="inversion" />',' <help> observed velocity y component [m/yr] </help>',' </parameter>'); 55 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="vel_obs" type="',class(obj.vel_obs),'" default="',convert2str(obj.vel_obs),'">',' <section name="inversion" />',' <help> observed velocity magnitude [m/yr] </help>',' </parameter>'); 56 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="thickness_obs" type="',class(obj.thickness_obs),'" default="',convert2str(obj.thickness_obs),'">',' <section name="inversion" />',' <help> observed thickness [m]) </help>',' </parameter>'); 57 58 fprintf(fid,'%s\n%s\n','</frame>'); 59 60 fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Available cost functions">','<section name="inversion" />'); 61 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceAbsVelMisfit" type="','string','" default="','101','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 62 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceRelVelMisfit" type="','string','" default="','102','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 63 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceLogVelMisfit" type="','string','" default="','103','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 64 65 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceLogVxVyMisfit" type="','string','" default="','104','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 66 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="SurfaceAverageVelMisfit" type="','string','" default="','105','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 67 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="ThicknessAbsMisfit" type="','string','" default="','106','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 68 69 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="DragCoefficientAbsGradient" type="','string','" default="','107','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 70 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="RheologyBbarAbsGradient" type="','string','" default="','108','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 71 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',' <parameter key ="ThicknessAbsGradient" type="','string','" default="','109','">',' <section name="inversion" />',' <help> </help>',' </parameter>'); 72 73 fprintf(fid,'%s\n%s\n','</frame>'); 74 75 end % }}} 76 76 function obj = inversion(varargin) % {{{ 77 77 switch nargin … … 196 196 if ~obj.iscontrol, return; end 197 197 WriteData(fid,'object',obj,'fieldname','nsteps','format','Integer'); 198 WriteData(fid,'object',obj,'fieldname','maxiter_per_step','format',' DoubleMat','mattype',3);198 WriteData(fid,'object',obj,'fieldname','maxiter_per_step','format','IntMat','mattype',3); 199 199 WriteData(fid,'object',obj,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1); 200 200 WriteData(fid,'object',obj,'fieldname','gradient_scaling','format','DoubleMat','mattype',3);
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/trac/issm/chrome/common/trac_banner.png)