int find_pourpts(void) { int row, col; double easting, northing, stream_length; CELL old_elev, basin_num, no_basin, curr_basin; WAT_ALT wa; ASP_FLAG af; char is_swale; ocs_alloced = 2 * bas_thres; ocs = (OC_STACK *)G_malloc(ocs_alloced * sizeof(OC_STACK)); basin_num = 0; Rast_set_c_null_value(&no_basin, 1); stream_length = old_elev = 0; for (row = 0; row < nrows; row++) { G_percent(row, nrows, 1); northing = window.north - (row + .5) * window.ns_res; for (col = 0; col < ncols; col++) { seg_get(&aspflag, (char *)&af, row, col); cseg_get(&bas, &curr_basin, row, col); if (curr_basin == 0) cseg_put(&bas, &no_basin, row, col); cseg_get(&haf, &curr_basin, row, col); if (curr_basin == 0) cseg_put(&haf, &no_basin, row, col); is_swale = FLAG_GET(af.flag, SWALEFLAG); if (af.asp <= 0 && is_swale > 0) { basin_num += 2; if (arm_flag) { easting = window.west + (col + .5) * window.ew_res; fprintf(fp, "%5d drains into %5d at %3d %3d %.3f %.3f", (int)basin_num, 0, row, col, easting, northing); if (col == 0 || col == ncols - 1) { stream_length = .5 * window.ew_res; } else if (row == 0 || row == nrows - 1) { stream_length = .5 * window.ns_res; } else { stream_length = 0.0; } seg_get(&watalt, (char *) &wa, row, col); old_elev = wa.ele; } basin_num = def_basin(row, col, basin_num, stream_length, old_elev); } } } G_percent(nrows, nrows, 1); /* finish it */ n_basins = basin_num; G_free(ocs); return 0; }
CELL split_stream(int row, int col, int new_r[], int new_c[], int ct, CELL basin_num, double stream_length, CELL old_elev) { CELL downdir, old_basin, new_elev, aspect; double slope, easting, northing; SHORT doit, ctr, updir, splitdir[9]; SHORT thisdir, leftflag, riteflag; int r, c, rr, cc; for (ctr = 1; ctr <= ct; ctr++) splitdir[ctr] = drain[row - new_r[ctr] + 1][col - new_c[ctr] + 1]; updir = splitdir[1]; downdir = asp[SEG_INDEX(asp_seg, row, col)]; if (downdir < 0) downdir = -downdir; riteflag = leftflag = 0; for (r = row - 1, rr = 0; rr < 3; r++, rr++) { for (c = col - 1, cc = 0; cc < 3; c++, cc++) { if (r >= 0 && c >= 0 && r < nrows && c < ncols) { aspect = asp[SEG_INDEX(asp_seg, r, c)]; if (aspect == drain[rr][cc]) { doit = 1; thisdir = updrain[rr][cc]; for (ctr = 1; ctr <= ct; ctr++) { if (thisdir == splitdir[ctr]) { doit = 0; ctr = ct; } } if (doit) { thisdir = updrain[rr][cc]; switch (haf_basin_side (updir, (SHORT) downdir, thisdir)) { case LEFT: overland_cells(r, c, basin_num, basin_num - 1, &new_elev); leftflag++; break; case RITE: overland_cells(r, c, basin_num, basin_num, &new_elev); riteflag++; break; } } } } } } if (leftflag >= riteflag) { haf[SEG_INDEX(haf_seg, row, col)] = basin_num - 1; } else { haf[SEG_INDEX(haf_seg, row, col)] = basin_num; } old_basin = basin_num; new_elev = alt[SEG_INDEX(alt_seg, row, col)]; if ((slope = (new_elev - old_elev) / stream_length) < MIN_SLOPE) slope = MIN_SLOPE; if (arm_flag) fprintf(fp, " %f %f\n", slope, stream_length); for (r = 1; r <= ct; r++) { basin_num += 2; easting = window.west + (new_c[r] + .5) * window.ew_res; northing = window.north - (new_r[r] + .5) * window.ns_res; if (arm_flag) { fprintf(fp, "%5d drains into %5d at %3d %3d %.3f %.3f", (int)basin_num, old_basin, new_r[r], new_c[r], easting, northing); } if (new_r[r] != row && new_c[r] != col) basin_num = def_basin(new_r[r], new_c[r], basin_num, diag, new_elev); else if (new_r[r] != row) basin_num = def_basin(new_r[r], new_c[r], basin_num, window.ns_res, new_elev); else basin_num = def_basin(new_r[r], new_c[r], basin_num, window.ew_res, new_elev); } return (basin_num); }