Changeset 18446


Ignore:
Timestamp:
08/19/14 11:44:48 (11 years ago)
Author:
abuzzi
Message:

MODIF: final version not tested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp

    r18439 r18446  
    134134void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my);
    135135void newmodelgen(Matrix* m0,Matrix* m1,Matrix* bathy,Matrix* icethick,int mx,int my,double T,double ptval,double mmax,double mmax2,double ctr,double sd);
     136double coolshed(double T0,int k,double c,double D);
    136137/*}}}*/
    137138
     
    197198        double ca=0.9;                    /* for acceptance */
    198199        double cm=0.5;                    /* for model perturbation */
     200
     201        double T0a          = 0.1;      /* initial temperature for acceptance           */
     202        double T0m          = 0.9;      /* initial temperature for model perturbation   */
     203        double D            = 2;        /* dimension of the model                       */
     204        int    maxconsecrej = 1000;     /* max consecutive rejection                    */
     205        int    maxsuccess   = 100;      /* max number of success within one temperature */
     206        double T_min        = 1e-10;    /* stopping temp                                */
     207        double Tred         = 1;
     208        double E_min        = -1000000;
     209        double E_exp        = 0.0291;   /* expected misfit                              */
     210        int    maxiter      = 10000;
     211        int    maxtotaliter = 1000000;
     212        double Tol          = 1e-10;    /* tolerance on misfit                          */
     213        int    sfreq        = 100;
     214
    199215                             /*}}}*/     
    200216        /* load the data {{{*/
     
    259275//      mesh_ini->Echo();
    260276                           /*}}}*/
    261         double q=0;
    262 /* q=misfit(mesh_ini,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
    263      cout<< q;
    264 Matrix* G=new Matrix(4,3);
    265         Matrix* df=new Matrix(4,1);
    266         Matrix* o=new Matrix(4,1);
    267         for(int i= 0;i<4;i++){
    268                 for(int j=0;j<3;j++){
    269                         if(j==2){G->SetValue(i,j,1);}
    270                         else{G->SetValue(i,j,i+j);}
    271                 }
    272                 df->SetValue(i,0,i*1e-3);
    273         }
    274                 G->SetValue(0,0,1);
    275                 G->SetValue(0,1,2);
    276 
    277         Matrix* M = NULL;
    278         GSLsquarefit(&M,G,df);
    279         for(int i= 0;i<4;i++){
    280                 o->SetValue(i,0,G->GetValue(i,0)*M->GetValue(0,0)+G->GetValue(i,1)*M->GetValue(1,0)+G->GetValue(i,2)*M->GetValue(2,0));}
    281 
    282         G->Echo();
    283         df->Echo();
    284         M->Echo();
    285         o->Echo();*/
    286         Matrix* m1=new Matrix(mx*my,3);
    287         double T=100;
    288 newmodelgen(mesh_ini,m1,bathy,icethick,mx,my,T,ptval,mmax,mmax2,ctr,sd);
     277                /* VFSA {{{ */
     278
     279        /* name of the files to save results */
     280        std::ofstream savefile1 ("r_140114b.txt");
     281        std::ofstream savefile2("m_140114b.txt");
     282
     283        /* counters initialization */
     284        int    success   = 0;
     285        int    finished  = 0;
     286        int    consec    = 0;
     287        double Ta        = T0a;
     288        double Tm        = T0m;
     289        int    iterT     = 0;   /* iteration within a T      */
     290        int    total     = 0;   /* total number of iteration */
     291        int    totaliter = 0;
     292        int    msave     = 0;
     293        double E_new;
     294        double E_final;
     295        double dE;
     296        double P;
     297        double rn;
     298        Matrix* m_old    = new Matrix(mx *my,3);
     299        Matrix* m_min    = new Matrix(mx *my,3);
     300        Matrix* m_new    = new Matrix(mx *my,3);
     301        m_old->MatrixEqual(mesh_ini);
     302        mesh_ini->Echo();
     303
     304        /* calculate initial misfit */
     305        double E_old=misfit(m_old,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my);
     306
     307        /* record initial settings */
     308        savefile1 << "P     "<< "Ta    "<< "Tm    "<< "Eold  "<< "totaliter "<< "Tred   "<< endl;
     309        savefile1 << "nan   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
     310        savefile2 << totaliter<< endl;
     311        for(int i=0;i<mx*my;i++){
     312        savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
     313        }
     314       
     315        /* beginning of the loop */
     316
     317        while(finished==0){
     318               
     319                iterT++;
     320                totaliter++;
     321
     322                /* stop or reduce T */
     323                if(iterT>=maxiter || success>maxsuccess){
     324                        if(Ta<T_min || total>maxtotaliter || fabs(E_old)<=Tol){
     325                                finished=1;
     326                                total+=iterT;
     327                                break;
     328                        }
     329                        else{ /* reduce T */
     330                                Ta=coolshed(T0a,Tred,ca,D);
     331                                Tm=coolshed(T0m,Tred,cm,D);
     332                                total+=iterT;
     333                                iterT=0;
     334                                success=1;
     335                                Tred++;
     336                                consec=0;
     337                        }
     338                }
     339
     340                /* update model and calculate energy */
     341
     342                newmodelgen(m_old,m_new,bathy,icethick,mx,my,Tm,ptval,mmax,mmax2,ctr,sd);  /* new model */
     343           E_new=misfit(m_new,evalid,gobs,dlevel,Pobs,xobs,yobs,Pp,rho1,rho2,dx,dy,dn,nx,ny,mx,my); /* new energy */
     344                dE=E_new-E_old;                                        /* energy difference */
     345
     346                /* acceptance probability */
     347
     348                P=exp(-dE/Ta);
     349
     350                /* stop if energy is lower than specified minimum */
     351                if (E_new<E_min){
     352                        m_old->MatrixEqual(m_new);
     353                        E_old=E_new;
     354                        break;
     355                }
     356
     357                rn=rand()/double (RAND_MAX);
     358
     359                /* accept new model or not */
     360                if(dE<=0){
     361                        m_old->MatrixEqual(m_new);
     362                        E_old=E_new;
     363                        success++;
     364                        consec=0;
     365                        savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
     366                        if(Ta<1e-3){
     367                                savefile2 << totaliter<< endl;
     368                                for(int i=0;i<mx*my;i++){
     369                                        savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
     370                                }
     371                        }
     372                }
     373                else{
     374                        if(P>rn){
     375                                m_old->MatrixEqual(m_new);
     376                                E_old=E_new;
     377                                success++;
     378                                consec=0;
     379                                savefile1 << P<<"   "<<  Ta<<"   "<< Tm<<"   "<< E_old<<"     "<< totaliter<<"         "<< Tred <<"  "<< endl;
     380                                if(Ta<1e-3){
     381                                        savefile2 << totaliter<< endl;
     382                                        for(int i=0;i<mx*my;i++){
     383                                                savefile2 << m_old->GetValue(i,0)<<"   "<< m_old->GetValue(i,1)<<"   "<< m_old->GetValue(i,2)<<endl;
     384                                        }
     385                                }
     386                        }
     387                        else{
     388                                consec++;
     389                        }
     390                }
     391        }
     392
     393        m_min->MatrixEqual(m_old);
     394        E_final=E_old;
     395        savefile1 << "nan"<<"   "<<  "nan"<<"   "<< "nan"<<"   "<< E_final<<"     "<< "nan"<<"         "<< "nan" <<"  "<< endl;
     396        savefile2 << " Mesh final"<< endl;
     397        for(int i=0;i<mx*my;i++){
     398                savefile2 << m_min->GetValue(i,0)<<"   "<< m_min->GetValue(i,1)<<"   "<< m_min->GetValue(i,2)<<endl;
     399        }
     400                        /*}}}*/
    289401        return 0;
    290402}/*}}}*/
     
    577689        }
    578690}/*}}}*/
     691double coolshed(double T0,int k,double c,double D){/*{{{*/
     692        double T1=T0*exp(-c*pow(k,1/D));
     693        return T1;
     694}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.