source: issm/oecreview/Archive/21724-22754/ISSM-22442-22443.diff@ 22755

Last change on this file since 22755 was 22755, checked in by Mathieu Morlighem, 7 years ago

CHG: added 21724-22754

File size: 14.2 KB
  • TabularUnified ../trunk-jpl/src/m/classes/adm1qn3inversion.m

     
     1%ADM1QN3INVERSION class definition
     2%
     3%   Usage:
     4%      adm1qn3inversion=adm1qn3inversion();
     5
     6classdef 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
     193end
  • TabularUnified ../trunk-jpl/src/c/cores/WrapperCorePointerFromSolutionEnum.cpp

     
    4646                        case 1: solutioncore=controltao_core; break;
    4747                        case 2: solutioncore=controlm1qn3_core; break;
    4848                        case 3: solutioncore=controlvalidation_core; break;
    49                         case 4: solutioncore=controlad_core; break;
     49                        case 4: solutioncore=controladm1qn3_core; break;
    5050                        default: _error_("control type not supported");
    5151                }
    5252        }
  • TabularUnified ../trunk-jpl/src/c/cores/cores.h

     
    2929void control_core(FemModel* femmodel);
    3030void controltao_core(FemModel* femmodel);
    3131void controlm1qn3_core(FemModel* femmodel);
     32void controladm1qn3_core(FemModel* femmodel);
    3233void controlad_core(FemModel* femmodel);
    3334void controlvalidation_core(FemModel* femmodel);
    3435void masstransport_core(FemModel* femmodel);
  • TabularUnified ../trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

     
    101101                                iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors");
    102102                                parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls));
    103103                                break;
    104                         case 4:/*M1QN3 AD*/
     104                        case 4:/*AD M1QN3*/
    105105                                parameters->AddObject(iomodel->CopyConstantObject("md.inversion.dxmin",InversionDxminEnum));
    106106                                parameters->AddObject(iomodel->CopyConstantObject("md.inversion.gttol",InversionGttolEnum));
    107107                                parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum));
  • TabularUnified ../trunk-jpl/src/c/Makefile.am

     
    282282                                        ./cores/controltao_core.cpp\
    283283                                        ./cores/controlad_core.cpp\
    284284                                        ./cores/controlm1qn3_core.cpp\
     285                                        ./cores/controladm1qn3_core.cpp\
    285286                                        ./cores/controlvalidation_core.cpp\
    286287                                        ./cores/adjointstressbalance_core.cpp\
    287288                                        ./cores/adjointbalancethickness_core.cpp\
  • TabularUnified ../trunk-jpl/src/c/cores/controladm1qn3_core.cpp

     
    1 /*!\file: controlm1qn3_core.cpp
     1/*!\file: controladm1qn3_core.cpp
    22 * \brief: core of the control solution
    33 */
    44
     
    314314        xDelete<IssmPDouble>(totalgradient);
    315315
    316316}/*}}}*/
    317 void controlm1qn3_core(FemModel* femmodel){/*{{{*/
     317void controladm1qn3_core(FemModel* femmodel){/*{{{*/
    318318
    319319        /*Intermediaries*/
    320320        long         omode;
     
    466466}/*}}}*/
    467467
    468468#else
    469 void controlm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
     469void controladm1qn3_core(FemModel* femmodel){_error_("M1QN3 not installed");}
    470470#endif //_HAVE_M1QN3_
Note: See TracBrowser for help on using the repository browser.