source:
issm/oecreview/Archive/17984-18295/ISSM-18127-18128.diff@
18296
Last change on this file since 18296 was 18296, checked in by , 11 years ago | |
---|---|
File size: 54.6 KB |
-
../trunk-jpl/src/c/shared/Numerics/BrentSearch.cpp
19 19 #include "./types.h" 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 25 25 * (Golden or parabolic procedure)*/ 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; 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; 45 44 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"); 45 /*Initialize gradient and controls*/ 46 IssmDouble* G = NULL; 47 IssmDouble* J = xNew<IssmDouble>(nsteps); 48 IssmDouble* X = xNew<IssmDouble>(nsize); 58 49 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; 64 } 50 /*start iterations*/ 51 for(int n=0;n<nsteps;n++){ 65 52 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 53 /*Reset some variables*/ 54 iter = 0; 55 xmin = 0.; 56 xmax = 1.; 57 bool loop = true; 58 cout<<setprecision(5); 71 59 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; 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"); 77 72 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; 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 } 82 80 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; 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 91 86 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 } 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; 99 92 100 while(loop){ 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++; 101 97 102 goldenflag=true; 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; 103 106 104 // Is a parabolic fit possible ? 105 if (sqrt(pow(intervalgold,2))>tol1){ 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 } 106 114 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); 115 while(loop){ 111 116 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; 117 bool goldenflag=true; 119 118 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)){ 119 // Is a parabolic fit possible ? 120 if (sqrt(pow(intervalgold,2))>tol1){ 125 121 126 // Yes, parabolic interpolation step 127 distance=parab_num/parab_den; 128 x=xbest+distance; 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); 129 126 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; 127 //reverse p if necessary 128 if(parab_den>0.0){ 129 parab_num=-parab_num; 136 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 } 137 157 } 138 else{139 // Not acceptable, must do a golden section step140 goldenflag=true;141 }142 }143 158 144 //Golden procedure 145 if(goldenflag){ 146 // compute the new distance d 147 if(xbest>=xm){ 148 intervalgold=xmin-xbest; 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; 149 169 } 150 else{151 intervalgold=xmax-xbest;152 }153 distance=gold*intervalgold;154 }155 170 156 // The function must not be evaluated too close to xbest157 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;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; 161 176 162 //evaluate function on x163 fx = (*f)(x,optargs);164 if(xIsNan<IssmDouble>(fx)) _error_("Function evaluation returned NaN");165 iter=iter+1;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++; 166 181 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; 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; 181 189 } 182 else if ( (fx <= fx1) || (x1 == xbest) || (x1 == x2) ){ 183 x1=x; fx1=fx; 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 } 184 200 } 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"); 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"); 192 207 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; 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; 197 230 } 198 else if (iter>=maxiter){ 199 if(VerboseControl()) _printf0_(" exiting: Maximum number of iterations has been exceeded ('maxiter'=" << maxiter << ")\n"); 200 loop=false; 231 if (fxbest>fxmax){ 232 xbest=optpars.xmax; fxbest=fxmax; 201 233 } 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 //continue208 loop=true;209 }210 }//end while211 234 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; 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; 215 239 } 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 } -
../trunk-jpl/src/c/shared/Numerics/numerics.h
29 29 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); 35 35 int cubic(IssmDouble a, IssmDouble b, IssmDouble c, IssmDouble d, double X[3], int *num); -
../trunk-jpl/src/c/shared/Numerics/OptPars.h
9 9 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 }; 18 20 -
../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
15 15 int num_control_type; 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: */ 24 24 iomodel->Constant(&control_analysis,InversionIscontrolEnum); … … 55 55 iomodel->FetchData(&maxiter,NULL,NULL,InversionMaxiterPerStepEnum); 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*/ 61 61 parameters->AddObject(iomodel->CopyConstantObject(InversionFatolEnum)); … … 82 82 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 } -
../trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
6 6 #include "../../shared/shared.h" 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; 12 12 int *control_type = NULL; 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 } 23 23 } … … 25 25 xDelete<int>(control_type); 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 } -
../trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h
7 7 #include "../../classes/classes.h" 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 -
../trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
49 49 gradient->AXPY(gradient_list[i],1.0); 50 50 delete gradient_list[i]; 51 51 } 52 //gradient->Echo(); 53 //_error_("S"); 52 54 53 55 /*Check that gradient is clean*/ 54 56 norm_inf=gradient->Norm(NORM_INF); -
../trunk-jpl/src/c/cores/controlvalidation_core.cpp
72 72 for(int i=0;i<n;i++) X[i] = X0[i] + alpha; 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); 78 78 -
../trunk-jpl/src/c/cores/controlm1qn3_core.cpp
105 105 } 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); 111 111 femmodel->results->AddObject(new GenericExternalResult<double>(JEnum,f,1,0)); … … 130 130 int solution_type; 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*/ 139 138 IssmDouble *XL = NULL; … … 146 145 } 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*/ 152 151 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); … … 169 168 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); 175 173 return; … … 192 190 } 193 191 194 192 /*Clean-up and return*/ 195 xDelete<int>(responses);196 193 xDelete<IssmDouble>(XU); 197 194 xDelete<IssmDouble>(XL); 198 195 } -
../trunk-jpl/src/c/cores/control_core.cpp
10 10 #include "../solutionsequences/solutionsequences.h" 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){ 17 21 18 22 int i; 19 23 20 24 /*parameters: */ 21 int num_controls ;25 int num_controls,nsize; 22 26 int nsteps; 23 27 IssmDouble tol_cm; 24 28 int solution_type; … … 26 30 bool dakota_analysis = false; 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 36 39 /*Solution and Adjoint core pointer*/ … … 60 63 if(VerboseControl()) _printf0_(" preparing initial solution\n"); 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; 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; 68 80 69 /*Start looping: */ 70 for(int n=0;n<nsteps;n++){ 81 /*Initialize function argument*/ 82 AppCtx usr; 83 usr.femmodel = femmodel; 84 usr.nsize = nsize; 71 85 72 /*Display info*/73 if(VerboseControl()) _printf0_("\n" << " control method step " << n+1 << "/" << nsteps << "\n");86 /*Call Brent optimization*/ 87 BrentSearch(&J,optpars,X0,&FormFunction,&FormFunctionGradient,(void*)&usr); 74 88 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; 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]; 91 97 } 92 93 if(VerboseControl()) _printf0_(" preparing final solution\n"); 98 xDelete<IssmDouble>(XU); 99 xDelete<IssmDouble>(XL); 100 SetControlInputsFromVectorx(femmodel,X0); 94 101 femmodel->parameters->SetParam(true,SaveResultsEnum); 95 102 solutioncore(femmodel); 96 103 … … 110 117 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 125 119 bool converged=false; 126 IssmDouble FormFunction(IssmDouble* X,void* usrvoid){ 120 127 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){131 132 128 /*output: */ 133 129 IssmDouble J; 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: */ 142 140 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 143 141 femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum); 144 142 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); 143 femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 145 144 146 /*set analysis type to compute velocity: */ 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: 162 180 _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet"); 163 181 } 164 182 165 /*update parameter according to scalar: */ //false means: do not save control 166 InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,false); 183 /*Compute misfit for this velocity field.*/ 184 IssmDouble* Jlist = NULL; 185 femmodel->CostFunctionx(&J,&Jlist,NULL); 186 //_printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<" | "); 167 187 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) 188 /*Retrieve objective functions independently*/ 189 //for(int i=0;i<num_responses;i++) _printf0_(" "<<setw(12)<<setprecision(7)<<Jlist[i]); 190 //_printf0_("\n"); 191 192 /*Free ressources:*/ 193 xDelete<IssmDouble>(XU); 194 xDelete<IssmDouble>(XL); 195 xDelete<IssmDouble>(Jlist); 196 return J; 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]; 171 233 } 172 else if (solution_type==StressbalanceSolutionEnum){ 173 solutionsequence_nonlinear(femmodel,conserve_loads); 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 } 174 254 } 175 else if (solution_type==BalancethicknessSolutionEnum){ 176 solutionsequence_linear(femmodel); 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.; 177 262 } 178 else if (solution_type==Balancethickness2SolutionEnum){ 179 solutionsequence_linear(femmodel); 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"); 180 287 } 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 288 188 289 /*Compute misfit for this velocity field.*/ 189 femmodel->CostFunctionx(&J,NULL,NULL); 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"); 190 294 191 /*Free ressources:*/ 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; 192 302 return J; 193 303 } -
../trunk-jpl/src/c/cores/controltao_core.cpp
92 92 TaoGetSolutionVector(tao,&X->pvector->vector); 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); 98 98 femmodel->results->AddObject(new GenericExternalResult<double*>(femmodel->results->Size()+1,JEnum,user.J,maxiter+3,1,1,0)); … … 112 112 TaoDestroy(&tao); 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; 122 122 Vector<IssmDouble> *X = NULL; … … 126 126 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 132 132 /*Recover some parameters*/ -
../trunk-jpl/src/c/classes/Elements/Tria.cpp
983 983 this->inputs->AddInput(new IntInput(ApproximationEnum,reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[index]))); 984 984 } 985 985 986 987 986 /*Control Inputs*/ 988 987 if (control_analysis && iomodel->Data(InversionControlParametersEnum)){ 989 988 for(i=0;i<num_control_type;i++){ -
../trunk-jpl/src/c/classes/Elements/Penta.cpp
2850 2850 GradientIndexing(&vertexpidlist[0],control_index); 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"); 2855 2856 … … 2864 2865 void Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){/*{{{*/ 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; 2870 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 } 2882 2871 2883 /*Get out if this is not an element input*/ 2872 2884 if(!IsInput(control_enum)) return; 2873 2885 … … 2875 2887 GradientIndexing(&vertexpidlist[0],control_index); 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 } 2881 2893 new_input = new PentaInput(control_enum,values,P1Enum); … … 2886 2898 } 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 /*}}}*/ 2891 2910 -
../trunk-jpl/src/m/classes/inversion.m
24 24 thickness_obs = NaN 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 78 78 case 0 … … 195 195 WriteData(fid,'object',obj,'fieldname','incomplete_adjoint','format','Boolean'); 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); 201 201 WriteData(fid,'object',obj,'fieldname','cost_function_threshold','format','Double');
Note:
See TracBrowser
for help on using the repository browser.