[22755] | 1 | Index: ../trunk-jpl/src/m/classes/adm1qn3inversion.m
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/m/classes/adm1qn3inversion.m (nonexistent)
|
---|
| 4 | +++ ../trunk-jpl/src/m/classes/adm1qn3inversion.m (revision 22443)
|
---|
| 5 | @@ -0,0 +1,193 @@
|
---|
| 6 | +%ADM1QN3INVERSION class definition
|
---|
| 7 | +%
|
---|
| 8 | +% Usage:
|
---|
| 9 | +% adm1qn3inversion=adm1qn3inversion();
|
---|
| 10 | +
|
---|
| 11 | +classdef adm1qn3inversion
|
---|
| 12 | + properties (SetAccess=public)
|
---|
| 13 | + iscontrol = 0
|
---|
| 14 | + control_parameters = NaN
|
---|
| 15 | + control_scaling_factors = NaN
|
---|
| 16 | + maxsteps = 0
|
---|
| 17 | + maxiter = 0
|
---|
| 18 | + dxmin = 0
|
---|
| 19 | + gttol = 0
|
---|
| 20 | + cost_functions = NaN
|
---|
| 21 | + cost_functions_coefficients = NaN
|
---|
| 22 | + min_parameters = NaN
|
---|
| 23 | + max_parameters = NaN
|
---|
| 24 | + vx_obs = NaN
|
---|
| 25 | + vy_obs = NaN
|
---|
| 26 | + vz_obs = NaN
|
---|
| 27 | + vel_obs = NaN
|
---|
| 28 | + thickness_obs = NaN
|
---|
| 29 | + surface_obs = NaN
|
---|
| 30 | +
|
---|
| 31 | + end
|
---|
| 32 | + methods
|
---|
| 33 | + function self = adm1qn3inversion(varargin) % {{{
|
---|
| 34 | + switch nargin
|
---|
| 35 | + case 0
|
---|
| 36 | + self=setdefaultparameters(self);
|
---|
| 37 | + case 1
|
---|
| 38 | + self=structtoobj(adm1qn3inversion(),varargin{1});
|
---|
| 39 | + otherwise
|
---|
| 40 | + error('constructor not supported');
|
---|
| 41 | + end
|
---|
| 42 | + end % }}}
|
---|
| 43 | + function self = extrude(self,md) % {{{
|
---|
| 44 | + self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');
|
---|
| 45 | + self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');
|
---|
| 46 | + self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');
|
---|
| 47 | + self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');
|
---|
| 48 | + if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;
|
---|
| 49 | + if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;
|
---|
| 50 | + if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;
|
---|
| 51 | + end % }}}
|
---|
| 52 | + function self = setdefaultparameters(self) % {{{
|
---|
| 53 | +
|
---|
| 54 | +
|
---|
| 55 | + %parameter to be inferred by control methods (only
|
---|
| 56 | + %drag and B are supported yet)
|
---|
| 57 | + self.control_parameters={'FrictionCoefficient'};
|
---|
| 58 | +
|
---|
| 59 | + %Scaling factor for each control
|
---|
| 60 | + self.control_scaling_factors=1;
|
---|
| 61 | +
|
---|
| 62 | + %number of iterations
|
---|
| 63 | + self.maxsteps=20;
|
---|
| 64 | + self.maxiter=40;
|
---|
| 65 | +
|
---|
| 66 | + %several responses can be used:
|
---|
| 67 | + self.cost_functions=101;
|
---|
| 68 | +
|
---|
| 69 | + %m1qn3 parameters
|
---|
| 70 | + self.dxmin = 0.1;
|
---|
| 71 | + self.gttol = 1e-4;
|
---|
| 72 | +
|
---|
| 73 | + end % }}}
|
---|
| 74 | + function md = checkconsistency(self,md,solution,analyses) % {{{
|
---|
| 75 | +
|
---|
| 76 | + %Early return
|
---|
| 77 | + if ~self.iscontrol, return; end
|
---|
| 78 | +
|
---|
| 79 | + if ~IssmConfig('_HAVE_M1QN3_'),
|
---|
| 80 | + md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']);
|
---|
| 81 | + end
|
---|
| 82 | + num_controls=numel(md.inversion.control_parameters);
|
---|
| 83 | + num_costfunc=size(md.inversion.cost_functions,2);
|
---|
| 84 | +
|
---|
| 85 | + md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]);
|
---|
| 86 | + md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());
|
---|
| 87 | + md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1,'Inf',1);
|
---|
| 88 | + md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0);
|
---|
| 89 | + md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0);
|
---|
| 90 | + md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0);
|
---|
| 91 | + md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0);
|
---|
| 92 | + md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());
|
---|
| 93 | + md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);
|
---|
| 94 | + md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
|
---|
| 95 | + md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
|
---|
| 96 | +
|
---|
| 97 | + if strcmp(solution,'BalancethicknessSolution')
|
---|
| 98 | + md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1);
|
---|
| 99 | + md = checkfield(md,'fieldname','inversion.surface_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1);
|
---|
| 100 | + elseif strcmp(solution,'BalancethicknessSoftSolution')
|
---|
| 101 | + md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1);
|
---|
| 102 | + else
|
---|
| 103 | + md = checkfield(md,'fieldname','inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1);
|
---|
| 104 | + if ~strcmp(domaintype(md.mesh),'2Dvertical'),
|
---|
| 105 | + md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1);
|
---|
| 106 | + end
|
---|
| 107 | + end
|
---|
| 108 | + end % }}}
|
---|
| 109 | + function disp(self) % {{{
|
---|
| 110 | + disp(sprintf(' adm1qn3inversion parameters:'));
|
---|
| 111 | + fielddisplay(self,'iscontrol','is inversion activated?');
|
---|
| 112 | + fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');
|
---|
| 113 | + fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');
|
---|
| 114 | + fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)');
|
---|
| 115 | + fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)');
|
---|
| 116 | + fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical');
|
---|
| 117 | + fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)');
|
---|
| 118 | + fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');
|
---|
| 119 | + fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');
|
---|
| 120 | + fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');
|
---|
| 121 | + fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');
|
---|
| 122 | + fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');
|
---|
| 123 | + fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');
|
---|
| 124 | + fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');
|
---|
| 125 | + fielddisplay(self,'thickness_obs','observed thickness [m]');
|
---|
| 126 | + fielddisplay(self,'surface_obs','observed surface elevation [m]');
|
---|
| 127 | + disp('Available cost functions:');
|
---|
| 128 | + disp(' 101: SurfaceAbsVelMisfit');
|
---|
| 129 | + disp(' 102: SurfaceRelVelMisfit');
|
---|
| 130 | + disp(' 103: SurfaceLogVelMisfit');
|
---|
| 131 | + disp(' 104: SurfaceLogVxVyMisfit');
|
---|
| 132 | + disp(' 105: SurfaceAverageVelMisfit');
|
---|
| 133 | + disp(' 201: ThicknessAbsMisfit');
|
---|
| 134 | + disp(' 501: DragCoefficientAbsGradient');
|
---|
| 135 | + disp(' 502: RheologyBbarAbsGradient');
|
---|
| 136 | + disp(' 503: ThicknessAbsGradient');
|
---|
| 137 | + end % }}}
|
---|
| 138 | + function marshall(self,prefix,md,fid) % {{{
|
---|
| 139 | +
|
---|
| 140 | + yts=md.constants.yts;
|
---|
| 141 | +
|
---|
| 142 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean');
|
---|
| 143 | + WriteData(fid,prefix,'name','md.inversion.type','data',4,'format','Integer');
|
---|
| 144 | + if ~self.iscontrol, return; end
|
---|
| 145 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);
|
---|
| 146 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxsteps','format','Integer');
|
---|
| 147 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxiter','format','Integer');
|
---|
| 148 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dxmin','format','Double');
|
---|
| 149 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','gttol','format','Double');
|
---|
| 150 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
|
---|
| 151 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);
|
---|
| 152 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);
|
---|
| 153 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
|
---|
| 154 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
|
---|
| 155 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
|
---|
| 156 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vel_obs','format','DoubleMat','mattype',1,'scale',1./yts);
|
---|
| 157 | + if(numel(self.thickness_obs)==md.mesh.numberofelements),
|
---|
| 158 | + mattype=2;
|
---|
| 159 | + else
|
---|
| 160 | + mattype=1;
|
---|
| 161 | + end
|
---|
| 162 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
|
---|
| 163 | + WriteData(fid,prefix,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
|
---|
| 164 | +
|
---|
| 165 | + %process control parameters
|
---|
| 166 | + num_control_parameters=numel(self.control_parameters);
|
---|
| 167 | + WriteData(fid,prefix,'object',self,'fieldname','control_parameters','format','StringArray');
|
---|
| 168 | + WriteData(fid,prefix,'data',num_control_parameters,'name','md.inversion.num_control_parameters','format','Integer');
|
---|
| 169 | +
|
---|
| 170 | + %process cost functions
|
---|
| 171 | + num_cost_functions=size(self.cost_functions,2);
|
---|
| 172 | + data=marshallcostfunctions(self.cost_functions);
|
---|
| 173 | + WriteData(fid,prefix,'data',data,'name','md.inversion.cost_functions','format','StringArray');
|
---|
| 174 | + WriteData(fid,prefix,'data',num_cost_functions,'name','md.inversion.num_cost_functions','format','Integer');
|
---|
| 175 | + end % }}}
|
---|
| 176 | + function savemodeljs(self,fid,modelname) % {{{
|
---|
| 177 | +
|
---|
| 178 | + writejsdouble(fid,[modelname '.inversion.iscontrol'],self.iscontrol);
|
---|
| 179 | + writejscellstring(fid,[modelname '.inversion.control_parameters'],self.control_parameters);
|
---|
| 180 | + writejsdouble(fid,[modelname '.inversion.control_scaling_factors'],self.control_scaling_factors);
|
---|
| 181 | + writejsdouble(fid,[modelname '.inversion.maxsteps'],self.maxsteps);
|
---|
| 182 | + writejsdouble(fid,[modelname '.inversion.maxiter'],self.maxiter);
|
---|
| 183 | + writejsdouble(fid,[modelname '.inversion.dxmin'],self.dxmin);
|
---|
| 184 | + writejsdouble(fid,[modelname '.inversion.gttol'],self.gttol);
|
---|
| 185 | + writejs2Darray(fid,[modelname '.inversion.cost_functions'],self.cost_functions);
|
---|
| 186 | + writejs2Darray(fid,[modelname '.inversion.cost_functions_coefficients'],self.cost_functions_coefficients);
|
---|
| 187 | + writejs1Darray(fid,[modelname '.inversion.min_parameters'],self.min_parameters);
|
---|
| 188 | + writejs1Darray(fid,[modelname '.inversion.max_parameters'],self.max_parameters);
|
---|
| 189 | + writejs1Darray(fid,[modelname '.inversion.vx_obs'],self.vx_obs);
|
---|
| 190 | + writejs1Darray(fid,[modelname '.inversion.vy_obs'],self.vy_obs);
|
---|
| 191 | + writejs1Darray(fid,[modelname '.inversion.vz_obs'],self.vz_obs);
|
---|
| 192 | + writejs1Darray(fid,[modelname '.inversion.vel_obs'],self.vel_obs);
|
---|
| 193 | + writejs1Darray(fid,[modelname '.inversion.thickness_obs'],self.thickness_obs);
|
---|
| 194 | + writejs1Darray(fid,[modelname '.inversion.surface_obs'],self.surface_obs);
|
---|
| 195 | +
|
---|
| 196 | + end % }}}
|
---|
| 197 | + end
|
---|
| 198 | +end
|
---|
| 199 | Index: ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp
|
---|
| 200 | ===================================================================
|
---|
| 201 | --- ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp (revision 22442)
|
---|
| 202 | +++ ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp (revision 22443)
|
---|
| 203 | @@ -46,7 +46,7 @@
|
---|
| 204 | case 1: solutioncore=controltao_core; break;
|
---|
| 205 | case 2: solutioncore=controlm1qn3_core; break;
|
---|
| 206 | case 3: solutioncore=controlvalidation_core; break;
|
---|
| 207 | - case 4: solutioncore=controlad_core; break;
|
---|
| 208 | + case 4: solutioncore=controladm1qn3_core; break;
|
---|
| 209 | default: _error_("control type not supported");
|
---|
| 210 | }
|
---|
| 211 | }
|
---|
| 212 | Index: ../trunk-jpl/src/c/cores/cores.h
|
---|
| 213 | ===================================================================
|
---|
| 214 | --- ../trunk-jpl/src/c/cores/cores.h (revision 22442)
|
---|
| 215 | +++ ../trunk-jpl/src/c/cores/cores.h (revision 22443)
|
---|
| 216 | @@ -29,6 +29,7 @@
|
---|
| 217 | void control_core(FemModel* femmodel);
|
---|
| 218 | void controltao_core(FemModel* femmodel);
|
---|
| 219 | void controlm1qn3_core(FemModel* femmodel);
|
---|
| 220 | +void controladm1qn3_core(FemModel* femmodel);
|
---|
| 221 | void controlad_core(FemModel* femmodel);
|
---|
| 222 | void controlvalidation_core(FemModel* femmodel);
|
---|
| 223 | void masstransport_core(FemModel* femmodel);
|
---|
| 224 | Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
|
---|
| 225 | ===================================================================
|
---|
| 226 | --- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp (revision 22442)
|
---|
| 227 | +++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp (revision 22443)
|
---|
| 228 | @@ -101,7 +101,7 @@
|
---|
| 229 | iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors");
|
---|
| 230 | parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
|
---|
| 231 | break;
|
---|
| 232 | - case 4:/*M1QN3 AD*/
|
---|
| 233 | + case 4:/*AD M1QN3*/
|
---|
| 234 | parameters->AddObject(iomodel->CopyConstantObject("md.inversion.dxmin",InversionDxminEnum));
|
---|
| 235 | parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum));
|
---|
| 236 | parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum));
|
---|
| 237 | Index: ../trunk-jpl/src/c/Makefile.am
|
---|
| 238 | ===================================================================
|
---|
| 239 | --- ../trunk-jpl/src/c/Makefile.am (revision 22442)
|
---|
| 240 | +++ ../trunk-jpl/src/c/Makefile.am (revision 22443)
|
---|
| 241 | @@ -282,6 +282,7 @@
|
---|
| 242 | ./cores/controltao_core.cpp\
|
---|
| 243 | ./cores/controlad_core.cpp\
|
---|
| 244 | ./cores/controlm1qn3_core.cpp\
|
---|
| 245 | + ./cores/controladm1qn3_core.cpp\
|
---|
| 246 | ./cores/controlvalidation_core.cpp\
|
---|
| 247 | ./cores/adjointstressbalance_core.cpp\
|
---|
| 248 | ./cores/adjointbalancethickness_core.cpp\
|
---|
| 249 | Index: ../trunk-jpl/src/c/cores/controladm1qn3_core.cpp
|
---|
| 250 | ===================================================================
|
---|
| 251 | --- ../trunk-jpl/src/c/cores/controladm1qn3_core.cpp (revision 22442)
|
---|
| 252 | +++ ../trunk-jpl/src/c/cores/controladm1qn3_core.cpp (revision 22443)
|
---|
| 253 | @@ -1,4 +1,4 @@
|
---|
| 254 | -/*!\file: controlm1qn3_core.cpp
|
---|
| 255 | +/*!\file: controladm1qn3_core.cpp
|
---|
| 256 | * \brief: core of the control solution
|
---|
| 257 | */
|
---|
| 258 |
|
---|
| 259 | @@ -314,7 +314,7 @@
|
---|
| 260 | xDelete<IssmPDouble>(totalgradient);
|
---|
| 261 |
|
---|
| 262 | }/*}}}*/
|
---|
| 263 | -void controlm1qn3_core(FemModel* femmodel){/*{{{*/
|
---|
| 264 | +void controladm1qn3_core(FemModel* femmodel){/*{{{*/
|
---|
| 265 |
|
---|
| 266 | /*Intermediaries*/
|
---|
| 267 | long omode;
|
---|
| 268 | @@ -466,5 +466,5 @@
|
---|
| 269 | }/*}}}*/
|
---|
| 270 |
|
---|
| 271 | #else
|
---|
| 272 | -void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
|
---|
| 273 | +void controladm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
|
---|
| 274 | #endif //_HAVE_M1QN3_
|
---|