static int iteroi() { int jj,nj; int i,gr,d; hav=muste_fopen(tempfile,"r+b"); jj=0L; nj=0L; while (1) { /* sprintf(sbuf," %ld",jj+1); sur_print(sbuf); */ hav_read1(jj,&gr); --gr; hav_read3(jj,xx); init_obs(gr); for (d=0; d<ng; ++d) { if (d==gr) continue; i=sift(gr,d); if (i) break; } if (d==ng) { ++nj; if (nj>=n) break; } else { nj=0L; shift(gr,d); ++d; hav_write1(jj,&d); /* sprintf(sbuf,"\nL=%g shift %d -> %d ",f2,gr+1,d); sur_print(sbuf); */ } ++jj; if (jj==n) jj=0L; } muste_fclose(hav); return(1); }
int MakeMEM(MEMData *md) { int i, nc, ierr; double gain; string buf; void MapDraw(); if (!md) return 1; if (!md->obs) return 2; if (!md->mem) return 3; if (init_obs(md) <= 0) return CleanUpMEM(4); if (init_mem(md) <= 0) return CleanUpMEM(5); calc_PQR(md, 0); nc = 0; gain = md->aGain; for (i=0; i<md->aIter; i++) { ierr = solve_quick(md, gain); if (ierr != 0) return CleanUpMEM(6); calc_PQR(md, -i-1); if (c2_now > c2_prev) nc++; else nc = 0; if (nc >= 1) { set_back_to_old(); s_df = s_df_old; send_line("Increasing Chi^2 value! Aborting approx. iterations."); calc_PQR(md, -i-1); while (MyLoop(1)); break; } if (s_df > s_df_old && i > 0) { gain *= md->aGain; set_back_to_old(); s_df = s_df_old; sprintf(buf, "Lowering gain to %12.5e.", gain); send_line(buf); calc_PQR(md, -i-1); } save_mem_map(md); sprintf(buf, "Approx. %d, Chi^2=%f", i+1, c2_now); strcpy(md->mem->name, buf); if (s_df < md->aLimit) { sprintf(buf, "Approx. accuracy limit achieved: s_df=%10.3e < %10.3e.", s_df, md->aLimit); send_line(buf); MapDraw(NULL, md->mem, NULL); while (MyLoop(1)); break; } while (MyLoop(1)); if (QueryHaltMEM()) return CleanUpMEM(0); } for (i=0; i<md->eIter; i++) { calc_SE(md); ierr = solve_SE(); if (ierr != 0) return CleanUpMEM(7); calc_PQR(md, i+1); save_mem_map(md); sprintf(buf, "Iter=%d, Chi^2=%f", i+1, c2_now); strcpy(md->mem->name, buf); MapDraw(NULL, md->mem, NULL); if (s_df < md->eLimit) { sprintf(buf, "Exact accuracy limit achieved: s_df=%10.3e < %10.3e.", s_df, md->eLimit); send_line(buf); break; } while (MyLoop(1)); if (QueryHaltMEM()) return CleanUpMEM(0); } return CleanUpMEM(0); }