Changeset 2211


Ignore:
Timestamp:
09/11/09 11:58:27 (16 years ago)
Author:
Mathieu Morlighem
Message:

Added eps_cm control method convergence criterion

Location:
issm/trunk/src
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/ModelProcessorx/Control/CreateParametersControl.cpp

    r2188 r2211  
    8080                param= new Param(count,"tolx",DOUBLE);
    8181                param->SetDouble(iomodel->tolx);
     82                parameters->AddObject(param);
     83
     84                /*eps_cm: */
     85                count++;
     86                param= new Param(count,"eps_cm",DOUBLE);
     87                param->SetDouble(iomodel->eps_cm);
    8288                parameters->AddObject(param);
    8389
  • issm/trunk/src/c/ModelProcessorx/IoModel.cpp

    r2188 r2211  
    113113        iomodel->artificial_diffusivity=0;
    114114        iomodel->nsteps=0;
     115        iomodel->eps_cm=0;
    115116        iomodel->tolx=0;
    116117        iomodel->maxiter=NULL;
     
    327328        IoModelFetchData((void**)&iomodel->artificial_diffusivity,NULL,NULL,iomodel_handle,"artificial_diffusivity","Integer",NULL);
    328329        IoModelFetchData((void**)&iomodel->nsteps,NULL,NULL,iomodel_handle,"nsteps","Integer",NULL);
     330        IoModelFetchData((void**)&iomodel->eps_cm,NULL,NULL,iomodel_handle,"eps_cm","Scalar",NULL);
    329331        IoModelFetchData((void**)&iomodel->tolx,NULL,NULL,iomodel_handle,"tolx","Scalar",NULL);
    330332        IoModelFetchData((void**)&iomodel->mincontrolconstraint,NULL,NULL,iomodel_handle,"mincontrolconstraint","Scalar",NULL);
  • issm/trunk/src/c/ModelProcessorx/IoModel.h

    r2188 r2211  
    111111        int     artificial_diffusivity;
    112112        int     nsteps;
     113        double  eps_cm;
    113114        double  tolx;
    114115        double* maxiter;
  • issm/trunk/src/c/parallel/control_core.cpp

    r2188 r2211  
    3030        double* maxiter=NULL;
    3131        double* cmjump=NULL;
     32        double  eps_cm;
    3233        double  tolx;
    3334        double* param_g=NULL;
     
    4849        int sub_analysis_type;
    4950        int debug=0;
     51        int convergence=0;
    5052        int numberofnodes;
    5153
     
    6163        model->FindParam(&maxiter,"maxiter");
    6264        model->FindParam(&cmjump,"cmjump");
     65        model->FindParam(&eps_cm,"eps_cm");
    6366        model->FindParam(&tolx,"tolx");
    6467        model->FindParam(&mincontrolconstraint,"mincontrolconstraint");
     
    124127                xfree((void**)&grad_g_double);
    125128
     129                /*Has convergence been reached?*/
     130                if (!isnan(eps_cm)){
     131                        i=n-2;
     132                        //go through the previous misfits(starting from n-2)
     133                        while(i>=0){
     134                                if (fit[i]==fit[n]){
     135                                        //convergence test only if we have the same misfits
     136                                        if ((J[i]-J[n])/J[n] <= eps_cm){
     137                                                //convergence if convergence criteria fullfilled
     138                                                convergence=1;
     139                                                _printf_("%s%g%s%g\n","      Convergence criterion: dJ/J = ",(J[i]-J[n])/J[n],"<",eps_cm);
     140                                        }
     141                                        else{
     142                                                _printf_("%s%g%s%g\n","      Convergence criterion: dJ/J = ",(J[i]-J[n])/J[n],">",eps_cm);
     143                                        }
     144                                        break;
     145                                }
     146                                i=i-1;
     147                        }
     148                }
     149                //stop if convergence has been reached
     150                if(convergence) break;
     151
    126152                //some temporary saving
    127153                /*if (((n+1)%5)==0){
  • issm/trunk/src/m/classes/@model/model.m

    r2188 r2211  
    178178        md.nsteps=0;
    179179        md.maxiter=[];
     180        md.eps_cm=0;
    180181        md.tolx=0;
    181182        md.optscal=[];
  • issm/trunk/src/m/classes/@model/setdefaultparameters.m

    r2188 r2211  
    190190
    191191%cmjump
    192 md.cmjump=.7*ones(md.nsteps,1); %30 % decrement.
     192md.cmjump=.7*ones(md.nsteps,1); %30 per cent decrement.
     193
     194%eps_cm is a criteria to stop the control methods.
     195%if J[n]-J[n-1]/J[n] < criteria, the control run stops
     196%NaN if not applied
     197md.eps_cm=0.01; %1 percent
    193198
    194199%minimum velocity to avoid the misfit to be singular
  • issm/trunk/src/m/classes/public/display/displaycontrol.m

    r2188 r2211  
    1313        fielddisplay(md,'control_type','parameter where inverse control is carried out; ex: ''drag'', or ''B'')');
    1414        fielddisplay(md,'nsteps','number of optimization searches');
     15        fielddisplay(md,'eps_cm','misfit convergence criterion. Default is 1%, NaN if not applied');
    1516        fielddisplay(md,'optscal','scaling factor on gradient direction during optimization, for each optimization step');
    1617        fielddisplay(md,'fit','''absolute: 0'', ''relative: 1'', or ''logarithmic: 2''. default is ''absolute: 0'', for each optimization steps');
  • issm/trunk/src/m/classes/public/ismodelselfconsistent.m

    r2208 r2211  
    351351
    352352        %LENGTH CONTROL FIELDS
    353         if (length(md.maxiter)~=md.nsteps | length(md.optscal)~=md.nsteps | length(md.fit)~=md.nsteps)
    354                 disp('maxiter, optscal and fit must have the length specified by nsteps')
     353        if (length(md.maxiter)~=md.nsteps | length(md.optscal)~=md.nsteps | length(md.fit)~=md.nsteps | length(md.cmjump)~=md.nsteps)
     354                disp('maxiter, optscal, fit and cmjump must have the length specified by nsteps')
    355355                bool=0;return;
    356356        end
  • issm/trunk/src/m/classes/public/marshall.m

    r2188 r2211  
    109109WriteData(fid,md.artificial_diffusivity,'Integer','artificial_diffusivity');
    110110WriteData(fid,md.nsteps,'Integer','nsteps');
     111WriteData(fid,md.eps_cm,'Scalar','eps_cm');
    111112WriteData(fid,md.tolx,'Scalar','tolx');
    112113WriteData(fid,md.maxiter,'Mat','maxiter');
  • issm/trunk/src/m/solutions/cielo/control_core.m

    r2188 r2211  
    1616dim=model.parameters.dim;
    1717isstokes=model.parameters.isstokes;
     18
     19%recover other parameters
     20eps_cm=model.parameters.eps_cm;
     21fit=model.parameters.fit;
    1822
    1923%initialize control parameters
     
    7175        param_g=ControlConstrain(param_g,model.parameters);
    7276
    73         %visualize direction.
    74         if model.parameters.plot,
    75                 plot_newdistribution;
     77        disp(['      value of misfit J after optimization #' num2str(n) ':' num2str(c(n).J)]);
     78
     79        %Has convergence been reached?
     80        convergence=0;
     81        if ~isnan(eps_cm),
     82                i=n-2;
     83                %go through the previous misfits(starting from n-2)
     84                while (i>=1),
     85                        if (fit(i)==fit(n)),
     86                                %convergence test only if we have the same misfits
     87                                if ((c(i).J-c(n).J)/c(n).J <= eps_cm),
     88                                        %convergence if convergence criteria fullfilled
     89                                        convergence=1;
     90                                        displaystring(debug,'\n%s%g%s%g\n','      Convergence criterion: dJ/J = ',(c(i).J-c(n).J)/c(n).J,'<',eps_cm);
     91                                else
     92                                        displaystring(debug,'\n%s%g%s%g\n','      Convergence criterion: dJ/J = ',(c(i).J-c(n).J)/c(n).J,'>',eps_cm);
     93                                end
     94                                break;
     95                        end
     96                        i=i-1;                                                                                                                                         
     97                end
    7698        end
     99        %stop if convergence has been reached                                                                                                               
     100        if (convergence), break; end
    77101
    78         disp(['      value of misfit J after optimization #' num2str(n) ':' num2str(c(n).J)]);
    79102end
    80103
Note: See TracChangeset for help on using the changeset viewer.