Changeset 18128
- Timestamp:
- 06/10/14 10:18:16 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 14 edited
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 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 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.