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; }
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 }