Changeset 18446
- Timestamp:
- 08/19/14 11:44:48 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/m/contrib/gravity/vfsa.cpp ¶
r18439 r18446 134 134 void filtergrav(Matrix* A,Matrix* Ain,double ctr,double sd,int mx,int my); 135 135 void 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); 136 double coolshed(double T0,int k,double c,double D); 136 137 /*}}}*/ 137 138 … … 197 198 double ca=0.9; /* for acceptance */ 198 199 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 199 215 /*}}}*/ 200 216 /* load the data {{{*/ … … 259 275 // mesh_ini->Echo(); 260 276 /*}}}*/ 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 /*}}}*/ 289 401 return 0; 290 402 }/*}}}*/ … … 577 689 } 578 690 }/*}}}*/ 691 double 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.