Exemple #1
0
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);
        }
Exemple #2
0
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);
}