Exemple #1
0
inline int MaxValuePruning(Board* state, int turn, int alpha, int beta, int level, clock_t st){
    if(CutOffTest1(state, level, st)){
        return state->getValue();
    }
    
    BoardQueue *q;
    q = state->successor(turn);
    
    while(!q->isEmpty()){
        Board* s = q->dequeue();
        alpha = Max1(alpha, MinValuePruning(s,changeTurn1(turn), alpha, beta, level, st));
        delete s;
        if(alpha >= beta){
            while(!q->isEmpty()){
                Board* s = q->dequeue();
                delete s;
            }
            delete q;
            return beta;
        }
    }
    delete q;
    return alpha;
}
Exemple #2
0
void main()
{
    int i=0,j=0,r=0;
    //Model size
    double xsize=5e5;
    double ysize=5e4;
    //Number of time steps
    int maxtnum=200000;
    //grid size
    double dx=xsize/(xnum-1);
    double dy=ysize/(ynum-1);
    //Grid step
    double xstp,ystp;
    double x[xnum],y[ynum];

    xstp=xsize/(xnum-1); //horizontal
    ystp=ysize/(ynum-1); //vertical
    for(i=0;i<xnum;i++)
    {
        *(x+i)=xstp*i;
    }
    for(i=0;i<ynum;i++)
    {
        *(y+i)=ystp*i;
    }

    //Initial hydraulic uniform head value
    double H0=0;
    double h0[ynum][xnum];
    double h1[ynum][xnum];
    double *h0p,*h1p;
    h0p=&h0[0][0];
    h1p=&h1[0][0];

    //background permeability for x and y direction.
    double kxbg=1;
    double kybg=1.5;

    //Source at the bottom
    double Ls=3500;
    double xlS=0.5*xsize-0.5*Ls;
    double xrS=0.5*xsize+0.5*Ls;
    double v0=100/Ls;
    //printf("\n%f,%f",xlS,xrS);

    //high K blocks
    //int nb=5; //number of blocks
    double Kbx[nb],Kby[nb]; //K for different block
    double xc[nb],yc[nb];//positions of the center points of blocks
    double L[nb],W[nb];//length and width of block
    double xlb[nb],xrb[nb],ytb[nb],ybb[nb];//edges of the blocks
    //Block a
    xc[0]=xsize*0.5-3e4;
    yc[0]=25e3;
    L[0]=28e3;W[0]=10e3;
    Kbx[0]=kxbg*5;
    Kby[0]=kybg*5;

    //block b
    xc[1]=xsize*0.5+5e3;
    yc[1]=20e3;
    L[1]=15e3;W[1]=15e3;
    Kbx[1]=kxbg*4;
    Kby[1]=kybg*4;

    //block c
    xc[2]=xsize*0.5+50e3;
    yc[2]=18e3;
    L[2]=12e3;W[2]=12e3;
    Kbx[2]=kxbg*15;
    Kby[2]=kybg*5;

    //block d
    xc[3]=xsize*0.5+50e3+80e3;
    yc[3]=15e3;
    L[3]=12e3;W[3]=12e3;
    Kbx[3]=kxbg*15;
    Kby[3]=kybg*15;

    //block e
    xc[4]=xsize*0.5+110e3;
    yc[4]=14e3;
    L[4]=11e3;W[4]=11e3;
    Kbx[4]=kxbg*25;
    Kby[4]=kybg*25;

    for(i=0;i<nb;i++)
    {
        xlb[i]=xc[i]-L[i]*0.5;
        xrb[i]=xc[i]+L[i]*0.5;
        ytb[i]=yc[i]-W[i]*0.5;
        ybb[i]=yc[i]+W[i]*0.5;
        //printf("%f\t%f\t%f\t%f\t\%f\t\%f\n",xlb[i],xrb[i],ytb[i],ybb[i],Kbx[i],Kby[i]);
    }

    //Specific storage uniform......
    double ss=1;
    double Ss[ynum][xnum],Kx[ynum][xnum],Ky[ynum][xnum],Q[ynum][xnum];
    double v1[ynum][xnum],v1x[ynum][xnum],v1y[ynum][xnum];

    for (i=0;i<ynum;i++)
    {
        for(j=0;j<xnum;j++)
        {
            h0[i][j]=0;
            h1[i][j]=0;
            Ss[i][j]=ss;
            Kx[i][j]=kxbg;
            Ky[i][j]=kybg;
            Q[i][j]=0;
            v1[0][0]=v1x[0][0]=v1y[0][0]=0;
        }
    }

    //set the K for different block
    for(r=0;r<nb;r++)
    {
        for(i=0;i<ynum;i++)
        {
            for(j=0;j<xnum;j++)
            {
                if((y[i]<=ybb[r])&&(y[i]>=ytb[r])&&(x[j]>=xlb[r])&&(x[j]<=xrb[r]))
                {
                    Kx[i][j]=Kbx[r];
                    Ky[i][j]=Kby[r];
                }

            }

        }
         //printf("%d\t",r);

    }

    //diffusivity for computing time step
    double kappax=Max(&Kx[0][0])/Min(&Ss[0][0]);
    double kappay=Max(&Ky[0][0])/Min(&Ss[0][0]);
    double kappa=Max1(kappax,kappay);

    //time step limit, [book]introduction to numerical geodynamic modelling p134, equation (10.4)
    double dtexp=100*100.0/(3*kappa);
    //time step
    double dt=1.0*dtexp;
    double time=0;
    int it;

    for(it=1;it<=maxtnum;it++)
    {
         solver(dx,dy,dt,h0p,h1p,&Kx[0][0],&Ky[0][0],&Ss[0][0],&Q[0][0],xlS,xrS,v0,&x[0]);
         //h0p=h1p;
         flow(dx,dy,&h1[0][0],&Kx[0][0],&Ky[0][0],&v1x[0][0],&v1y[0][0],&v1[0][0]);
         for(i=0;i<ynum;i++)
            for(j=0;j<xnum;j++)
            h0[i][j]=h1[i][j];
         time=time+dt;
    }

    //calculate the min of head and v1 for reference
    /*double min_h,min_v1;
    min_h=Min(&h1[0][0]);
    min_v1=Min(&v1[0][0]);
    printf("%g\n%g\n",min_h,min_v1);*/


    FILE *fp1,*fp2;
    FILE *fp3,*fp4;
    FILE *fp5,*fp6,*fp7,*fp8;
    fp1=fopen("head_h1.txt","w");
    fp2=fopen("v1.txt","w");
    fp3=fopen("v1x.txt","w");
    fp4=fopen("v1y.txt","w");
    fp5=fopen("Kx.txt","w");
    fp6=fopen("Ky.txt","w");
    fp7=fopen("xy.txt","w"); //storage x and y grid step
    fp8=fopen("paramaters.txt","w");

    for(i=0;i<ynum;i++)
    {
        for(j=0;j<xnum;j++)
        {
            //sometimes, if the results are to small (like 1e-100), we should be careful when write the result to file. maybe we can try %g
            fprintf(fp1,"%.100lf\t",h1[i][j]); //%15.10lf
            fprintf(fp2,"%.100lf\t",v1[i][j]);
            fprintf(fp3,"%.100lf\t",v1x[i][j]);
            fprintf(fp4,"%.100lf\t",v1y[i][j]);
            fprintf(fp5,"%f\t",Kx[i][j]);
            fprintf(fp6,"%f\t",Ky[i][j]);
        }
        fprintf(fp1,"\n");
        fprintf(fp2,"\n");
        fprintf(fp3,"\n");
        fprintf(fp4,"\n");
        fprintf(fp5,"\n");
        fprintf(fp6,"\n");

    }

    for(i=0;i<ynum;i++)
        fprintf(fp7,"%f\t",y[i]);
    fprintf(fp7,"\n");

    for(j=0;j<xnum;j++)
        fprintf(fp7,"%f\t",x[j]);

    fprintf(fp8,"%lf\t%lf\t%d\t%d\t%d\t%lf",xsize,ysize,xnum,ynum,it-1,time);

    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fclose(fp4);
    fclose(fp5);
    fclose(fp6);
    fclose(fp7);
    fclose(fp8);

    //plot the results in matlab


}