int setdir(char *demfile, char *angfile, char *slopefile, char *pfile) { int err,filetype; float mval; double bndbox[4],csize; /* define directions */ d1[1]=0; d1[2]= -1; d1[3]= -1; d1[4]= -1; d1[5]=0; d1[6]=1; d1[7]=1; d1[8]=1; d2[1]=1; d2[2]=1; d2[3]=0; d2[4]= -1; d2[5]= -1; d2[6]= -1; d2[7]=0; d2[8]=1; err=gridread(demfile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy, bndbox,&csize,&mval,&filetype); if(err != 0) goto ERROR2; /* allocate dir and stack arrays */ dir = (short **) matalloc(nx, ny, RPSHRDTYPE); i1=0; i2=0; n1=nx; n2=ny; /* full grid */ err=setdfnoflood(mval); if(err != 0) goto ERROR1; /* err = gridwrite(pfile,(void **)dir,RPSHRDTYPE,nx,ny,dx,dy, bndbox,csize,-1,filetype); */ /* allocate memory for slope and angle */ slope = (float **) matalloc(nx, ny, RPFLTDTYPE); ang = (float **) matalloc(nx, ny, RPFLTDTYPE); setdf2(); err = gridwrite(slopefile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy, bndbox,csize,-1.,filetype); if (err != 0) goto ERROR3; err = gridwrite(angfile,(void **)ang,RPFLTDTYPE,nx,ny,dx,dy, bndbox,csize,-2.,filetype); if (err != 0) goto ERROR3; /* Wrapping up */ err=0; ERROR3: free(slope[0]); free(slope); free(ang[0]); free(ang); ERROR1: free(dir[0]); free(dir); ERROR2: free(elev[0]); free(elev); return(err); }
int catchmentGrid(char *segFile, char *fdrFile, char *catFile){ int i, j; int mIJ[2]; int err; err=gridread(fdrFile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype); err=gridread(segFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype); err=gridread(segFile,(void ***)&slope,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype); //printf("here1\n"); // THIS LOOP CAN BE ELIMINATED BY CHANGING (SLOPE[I][J] < 0) FROM == IN THE NEXT FOR LOOP for(i=0; i<nx; i++){ for(j=0; j<ny; j++){ if(slope[i][j]<0) slope[i][j]=0; } } //printf("here2\n"); for(i=0; i<nx; i++){ for(j=0; j<ny; j++){ //printf("->%d\t%d\t%d\n", i, j, dir[i][j]); //getchar(); getchar(); if(slope[i][j] == 0 && dir[i][j]!=-1){ //printf("-->%d\t%d\t%d\n", i, j, dir[i][j]);// getchar(); getchar(); findIJCat(dir, i, j, mIJ); slope[i][j]=trace(elev, dir, slope, mIJ[0], mIJ[1]); } } } //printf("here3\n"); //printf("before gridwrite\n"); err = gridwrite(catFile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy,bndbox,csize,mval,filetype); //printf("before gridwrite\n"); }
int flood(char *demfile, char *pointfile, char *newfile) { int err; /* float mval; double bndbox[4],csize; These are external now */ /* define directions */ d1[1]=0; d1[2]= -1; d1[3]= -1; d1[4]= -1; d1[5]=0; d1[6]=1; d1[7]=1; d1[8]=1; d2[1]=1; d2[2]=1; d2[3]=0; d2[4]= -1; d2[5]= -1; d2[6]= -1; d2[7]=0; d2[8]=1; err=gridread(demfile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype); if(err != 0)return(err); /* allocate dir and stack arrays */ dir = (short **) matalloc(nx, ny, RPSHRDTYPE); apool = (short **) matalloc(nx, ny, RPSHRDTYPE); istack = (int) (nx * ny * 0.1); pstack=istack; dn = (short *)malloc(sizeof(short) * istack); is = (short *)malloc(sizeof(short) * istack); js = (short *)malloc(sizeof(short) * istack); ipool = (short *)malloc(sizeof(short) * pstack); jpool = (short *)malloc(sizeof(short) * pstack); if(dn == NULL || is == NULL || js == NULL || ipool == NULL || jpool == NULL) { printf("\nError: Cannot allocate memory for stacks\n"); return(11); } /* nmax=200; Decided to elim iteration nnx=nx/nmax+1; nny=ny/nmax+1; while(nnx > 1 || nny > 1) { for(ix=0; ix<nnx; ix++)for(iy=0; iy<nny; iy++) { i1=ix*nmax; n1=i1+nmax; if(n1>nx) { n1=nx; i1=nx-nmax; if(i1<0)i1=0; } i2=iy*nmax; n2=i2+nmax; if(n2>ny) { n2=ny; i2=ny-nmax; if(i2<0)i2=0; } printf("Ranges: %d %d %d %d\n",i1,n1,i2,n2); setdf(mval); /* this call for range i1,n1,i2,n2 } nmax=(int) (nmax*3.5) ; nnx=nx/nmax+1; nny=ny/nmax+1; } /* end of while */ i1=0; i2=0; n1=nx; n2=ny; /* full grid */ printf("Grid size: %d x %d\n",n1,n2); setdf(mval); /* free stacks */ free(dn); free(is); free(js); free(ipool); free(jpool); free(apool[0]); free(apool); /* filetype=0; 0=ASCII 1= ARCVIEW proprietary */ printf("Writing output ..."); err = gridwrite(newfile,(void **)elev,RPFLTDTYPE,nx,ny,dx,dy, bndbox,csize,mval,filetype); if(err != 0)return(err); /* err = gridwrite(pointfile,(void **)dir,RPSHRDTYPE,nx,ny,dx,dy, bndbox,csize,-1,filetype); if(err != 0)return(err); */ return(0); /* ALL OK return from flood */ }