import java.io.*; class AddAat { // Copyleft Harvey Greenberg, UW hgreen@u.washington.edu Dec 26 1997 // This loads an ARC/INFO AAT file into an array of objects (see Aat.java), // and adds the local contributing area as you go downstream. // Before invoking this class, we have built (in ARCINFO) a river network, // The first argument is the name of the stream cover. // Items names are hardwired // It checks for items, but not item type. // There is no item that indicates order in split rivers, as there is in raw // rivers. // Therefore, we set up an array of flags: 1=computed, 2=used downstream // We reselect sources from shreve==1, and follow links. // Remember, java defaults to a memory limit of 16 megs. Use the mx switch, // e.g. "java -mx200m AddAat mycover" for large data. OR NOT public static void main (String args[]) throws IOException { Aat myatt; int maxid,ilocal,imax,imean,ilevel,ishreve,shreve=1,ndone=99,current=0,it=0; String covername; boolean verbose = false; System.out.println("Summing aat, version 1.01"); if (args.length < 1){ System.out.println("The cover name are required arguments."); return; } else covername = args[0]; System.out.println("Cover: " + covername ); try{ myatt = new Aat(covername); } catch (AatError e){ System.out.print("Error loading AAT file:"); System.out.println(e.getMessage()); return; } myatt.report(); //return; maxid = myatt.nrecords; ilocal = myatt.findItem("local"); imax = myatt.findItem("maxmsq"); imean = myatt.findItem("meanmsq"); ishreve = myatt.findItem("shreve"); ilevel = myatt.findItem("level"); if(ilocal < 0) return; if(imax < 0) return; if(imean < 0) return; if(ishreve < 0) return; if(ilevel < 0) return; int flags[] = new int[maxid]; // set up flags for sources for(int i = 0;i < maxid;i++){ myatt.ivalues[imax][i] = myatt.ivalues[ilocal][i]; myatt.ivalues[imean][i] = 0; // zero out the values if(myatt.ivalues[ishreve][i] == 1){ flags[i] = 1; // tentative current++; for(int j = 0;j< maxid;j++){ if(myatt.fnode[i] == myatt.tnode[j]){ // found upstream arc flags[i] = 0; current--; break; } } //uphill search } } // for each arc i System.out.println(current + " source arcs"); // work our way downstream while(ndone > 0){ it++; System.out.println("iteration " + it); current=0; ndone = 0; for(int i = 0;i < maxid;i++){ // for each arc // verbose = (i == 525) || (i == 521) || (i == 522); if(verbose) System.out.println("***Arc " + i + ", flag = " + flags[i]); if(flags[i] == 0){ // not done yet current++; for(int j = 0;j< maxid;j++){ // looking for upstream arc if(myatt.fnode[i] == myatt.tnode[j]){ // found upstream arc if(verbose) System.out.println("***upstream= " + j+ ", flag = " + flags[j]); if(flags[j] == 1){ // upstream arc is ready myatt.ivalues[imax][i] += myatt.ivalues[imax][j]; if(flags[i] == 0)flags[i] = 1; //tentative flags[j] = 2; //System.out.println("Max for i=" + i + " equals " + myatt.ivalues[imax][i]); } else if (flags[j] != 2){ flags[i] = -1; // does not get flagged until all upstreams done } } // a match } // uphill search j if(flags[i] < 0) { if(verbose) System.out.println("restting flag for i=" + i); flags[i] = 0; // We did only one upstream arc } if(flags[i] > 0) ndone++; } // not done yet // System.out.println(i + "," + flags[522]); } // each arc System.out.println("Tried " + current + " arcs, did " + ndone + " more."); } // while // None completed this round. Should be done. if(current != 0){ System.out.println("-------------------Hey, " + current + " not done!"); for(int i = 0;i < maxid;i++){ if(flags[i] == 0){ System.out.println("**********************i=" + i); for(int j = 0;j< maxid;j++){ // looking for upstream arc if(myatt.fnode[i] == myatt.tnode[j]){ // found upstream arc System.out.println("upstream arc=" + j + ",flag=" + flags[j]); } } } } } for(int i = 0;i < maxid;i++){ myatt.ivalues[ilevel][i] = flags[i]; myatt.ivalues[imax][i] *= 100; // cells to square meters myatt.ivalues[imean][i] = myatt.ivalues[imax][i] - (myatt.ivalues[ilocal][i] * 50); //System.out.println(imax + "=imax, " + myatt.ivalues[imax][i]); // destructive mtest!!!!!!!!!!!!!!!!!!! myatt.ivalues[ilocal][i] = 99; } System.out.println("Writing to the AAT file."); myatt.writeAat(); } }