source:
issm/oecreview/Archive/21724-22754/ISSM-22442-22443.diff@
22755
Last change on this file since 22755 was 22755, checked in by , 7 years ago | |
---|---|
File size: 14.2 KB |
-
TabularUnified ../trunk-jpl/src/m/classes/adm1qn3inversion.m
1 %ADM1QN3INVERSION class definition 2 % 3 % Usage: 4 % adm1qn3inversion=adm1qn3inversion(); 5 6 classdef adm1qn3inversion 7 properties (SetAccess=public) 8 iscontrol = 0 9 control_parameters = NaN 10 control_scaling_factors = NaN 11 maxsteps = 0 12 maxiter = 0 13 dxmin = 0 14 gttol = 0 15 cost_functions = NaN 16 cost_functions_coefficients = NaN 17 min_parameters = NaN 18 max_parameters = NaN 19 vx_obs = NaN 20 vy_obs = NaN 21 vz_obs = NaN 22 vel_obs = NaN 23 thickness_obs = NaN 24 surface_obs = NaN 25 26 end 27 methods 28 function self = adm1qn3inversion(varargin) % {{{ 29 switch nargin 30 case 0 31 self=setdefaultparameters(self); 32 case 1 33 self=structtoobj(adm1qn3inversion(),varargin{1}); 34 otherwise 35 error('constructor not supported'); 36 end 37 end % }}} 38 function self = extrude(self,md) % {{{ 39 self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node'); 40 self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node'); 41 self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node'); 42 self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node'); 43 if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end; 44 if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end; 45 if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end; 46 end % }}} 47 function self = setdefaultparameters(self) % {{{ 48 49 50 %parameter to be inferred by control methods (only 51 %drag and B are supported yet) 52 self.control_parameters={'FrictionCoefficient'}; 53 54 %Scaling factor for each control 55 self.control_scaling_factors=1; 56 57 %number of iterations 58 self.maxsteps=20; 59 self.maxiter=40; 60 61 %several responses can be used: 62 self.cost_functions=101; 63 64 %m1qn3 parameters 65 self.dxmin = 0.1; 66 self.gttol = 1e-4; 67 68 end % }}} 69 function md = checkconsistency(self,md,solution,analyses) % {{{ 70 71 %Early return 72 if ~self.iscontrol, return; end 73 74 if ~IssmConfig('_HAVE_M1QN3_'), 75 md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']); 76 end 77 num_controls=numel(md.inversion.control_parameters); 78 num_costfunc=size(md.inversion.cost_functions,2); 79 80 md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]); 81 md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols()); 82 md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1,'Inf',1); 83 md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0); 84 md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0); 85 md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0); 86 md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0); 87 md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions()); 88 md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0); 89 md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]); 90 md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]); 91 92 if strcmp(solution,'BalancethicknessSolution') 93 md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 94 md = checkfield(md,'fieldname','inversion.surface_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 95 elseif strcmp(solution,'BalancethicknessSoftSolution') 96 md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 97 else 98 md = checkfield(md,'fieldname','inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 99 if ~strcmp(domaintype(md.mesh),'2Dvertical'), 100 md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 101 end 102 end 103 end % }}} 104 function disp(self) % {{{ 105 disp(sprintf(' adm1qn3inversion parameters:')); 106 fielddisplay(self,'iscontrol','is inversion activated?'); 107 fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}'); 108 fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)'); 109 fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)'); 110 fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)'); 111 fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical'); 112 fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)'); 113 fielddisplay(self,'cost_functions','indicate the type of response for each optimization step'); 114 fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter'); 115 fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex'); 116 fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex'); 117 fielddisplay(self,'vx_obs','observed velocity x component [m/yr]'); 118 fielddisplay(self,'vy_obs','observed velocity y component [m/yr]'); 119 fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]'); 120 fielddisplay(self,'thickness_obs','observed thickness [m]'); 121 fielddisplay(self,'surface_obs','observed surface elevation [m]'); 122 disp('Available cost functions:'); 123 disp(' 101: SurfaceAbsVelMisfit'); 124 disp(' 102: SurfaceRelVelMisfit'); 125 disp(' 103: SurfaceLogVelMisfit'); 126 disp(' 104: SurfaceLogVxVyMisfit'); 127 disp(' 105: SurfaceAverageVelMisfit'); 128 disp(' 201: ThicknessAbsMisfit'); 129 disp(' 501: DragCoefficientAbsGradient'); 130 disp(' 502: RheologyBbarAbsGradient'); 131 disp(' 503: ThicknessAbsGradient'); 132 end % }}} 133 function marshall(self,prefix,md,fid) % {{{ 134 135 yts=md.constants.yts; 136 137 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','iscontrol','format','Boolean'); 138 WriteData(fid,prefix,'name','md.inversion.type','data',4,'format','Integer'); 139 if ~self.iscontrol, return; end 140 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3); 141 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxsteps','format','Integer'); 142 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxiter','format','Integer'); 143 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dxmin','format','Double'); 144 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','gttol','format','Double'); 145 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1); 146 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3); 147 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3); 148 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts); 149 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts); 150 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts); 151 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vel_obs','format','DoubleMat','mattype',1,'scale',1./yts); 152 if(numel(self.thickness_obs)==md.mesh.numberofelements), 153 mattype=2; 154 else 155 mattype=1; 156 end 157 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype); 158 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype); 159 160 %process control parameters 161 num_control_parameters=numel(self.control_parameters); 162 WriteData(fid,prefix,'object',self,'fieldname','control_parameters','format','StringArray'); 163 WriteData(fid,prefix,'data',num_control_parameters,'name','md.inversion.num_control_parameters','format','Integer'); 164 165 %process cost functions 166 num_cost_functions=size(self.cost_functions,2); 167 data=marshallcostfunctions(self.cost_functions); 168 WriteData(fid,prefix,'data',data,'name','md.inversion.cost_functions','format','StringArray'); 169 WriteData(fid,prefix,'data',num_cost_functions,'name','md.inversion.num_cost_functions','format','Integer'); 170 end % }}} 171 function savemodeljs(self,fid,modelname) % {{{ 172 173 writejsdouble(fid,[modelname '.inversion.iscontrol'],self.iscontrol); 174 writejscellstring(fid,[modelname '.inversion.control_parameters'],self.control_parameters); 175 writejsdouble(fid,[modelname '.inversion.control_scaling_factors'],self.control_scaling_factors); 176 writejsdouble(fid,[modelname '.inversion.maxsteps'],self.maxsteps); 177 writejsdouble(fid,[modelname '.inversion.maxiter'],self.maxiter); 178 writejsdouble(fid,[modelname '.inversion.dxmin'],self.dxmin); 179 writejsdouble(fid,[modelname '.inversion.gttol'],self.gttol); 180 writejs2Darray(fid,[modelname '.inversion.cost_functions'],self.cost_functions); 181 writejs2Darray(fid,[modelname '.inversion.cost_functions_coefficients'],self.cost_functions_coefficients); 182 writejs1Darray(fid,[modelname '.inversion.min_parameters'],self.min_parameters); 183 writejs1Darray(fid,[modelname '.inversion.max_parameters'],self.max_parameters); 184 writejs1Darray(fid,[modelname '.inversion.vx_obs'],self.vx_obs); 185 writejs1Darray(fid,[modelname '.inversion.vy_obs'],self.vy_obs); 186 writejs1Darray(fid,[modelname '.inversion.vz_obs'],self.vz_obs); 187 writejs1Darray(fid,[modelname '.inversion.vel_obs'],self.vel_obs); 188 writejs1Darray(fid,[modelname '.inversion.thickness_obs'],self.thickness_obs); 189 writejs1Darray(fid,[modelname '.inversion.surface_obs'],self.surface_obs); 190 191 end % }}} 192 end 193 end -
TabularUnified ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp
46 46 case 1: solutioncore=controltao_core; break; 47 47 case 2: solutioncore=controlm1qn3_core; break; 48 48 case 3: solutioncore=controlvalidation_core; break; 49 case 4: solutioncore=controlad _core; break;49 case 4: solutioncore=controladm1qn3_core; break; 50 50 default: _error_("control type not supported"); 51 51 } 52 52 } -
TabularUnified ../trunk-jpl/src/c/cores/cores.h
29 29 void control_core(FemModel* femmodel); 30 30 void controltao_core(FemModel* femmodel); 31 31 void controlm1qn3_core(FemModel* femmodel); 32 void controladm1qn3_core(FemModel* femmodel); 32 33 void controlad_core(FemModel* femmodel); 33 34 void controlvalidation_core(FemModel* femmodel); 34 35 void masstransport_core(FemModel* femmodel); -
TabularUnified ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
101 101 iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors"); 102 102 parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls)); 103 103 break; 104 case 4:/* M1QN3 AD*/104 case 4:/*AD M1QN3*/ 105 105 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.dxmin",InversionDxminEnum)); 106 106 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum)); 107 107 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum)); -
TabularUnified ../trunk-jpl/src/c/Makefile.am
282 282 ./cores/controltao_core.cpp\ 283 283 ./cores/controlad_core.cpp\ 284 284 ./cores/controlm1qn3_core.cpp\ 285 ./cores/controladm1qn3_core.cpp\ 285 286 ./cores/controlvalidation_core.cpp\ 286 287 ./cores/adjointstressbalance_core.cpp\ 287 288 ./cores/adjointbalancethickness_core.cpp\ -
TabularUnified ../trunk-jpl/src/c/cores/controladm1qn3_core.cpp
1 /*!\file: control m1qn3_core.cpp1 /*!\file: controladm1qn3_core.cpp 2 2 * \brief: core of the control solution 3 3 */ 4 4 … … 314 314 xDelete<IssmPDouble>(totalgradient); 315 315 316 316 }/*}}}*/ 317 void control m1qn3_core(FemModel* femmodel){/*{{{*/317 void controladm1qn3_core(FemModel* femmodel){/*{{{*/ 318 318 319 319 /*Intermediaries*/ 320 320 long omode; … … 466 466 }/*}}}*/ 467 467 468 468 #else 469 void control m1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}469 void controladm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");} 470 470 #endif //_HAVE_M1QN3_
Note:
See TracBrowser
for help on using the repository browser.