Still stuck with the simulation system, is there any good pseudocode for the multiple flow direction (MFD) algorithm? I read a pseudocode example and implemented it, however the simulation was linear: that is the first cell gets the highest amount of rainfall and the last cell does not get any water. I'm resorting to sorting the elevation of the cells from highest to lowest so that the water would spread out properly. I don't want to use r.terraflow or TOPMODEL since this is an independent project and I don't want to use existing simulation systems.
Any ideas as to how to implement MFD or correct my algorithm would be very appreciated.
BTW, null values were set to -500 by the DEM reader. The code is implemented in C# and is not yet optimized, I just want a correct MFD simulation at the moment.
static void rainfallAlgo() {
double total, percentage, transfer;
double[] tile = new double[10];
for (int i = 0; i != Convert.ToInt32(totalRow); i++){
for (int j = 0; j != Convert.ToInt32(totalCol); j++){
if ((elev[i, j] != -500)&&(elevrain[i,j]>=elev[i,j])){
Console.WriteLine();
total = 0;
for (int k = 1; k <= 9; k++){
if (k != 5){
tile[k] = compare(i, j, k);
total += tile[k];
}
}
for (int k = 1; k <= 9; k++){
if (total == 0){
Console.WriteLine("I am ZERO");
total = 1;
}
if (k != 5){
percentage = tile[k] / total;
Console.Write(k+ ":");
Console.WriteLine(percentage);
transfer = percentage * (elevrain[i,j]-elev[i,j]);
if (k == 1)
elevrain[i - 1, j - 1] += transfer;
else if (k == 2)
elevrain[i - 1, j] += transfer;
else if (k == 3)
elevrain[i - 1, j + 1] += transfer;
else if (k == 4)
elevrain[i, j - 1] += transfer;
else if (k == 6)
elevrain[i, j + 1] += transfer;
else if (k == 7)
elevrain[i + 1, j - 1] += transfer;
else if (k == 8)
elevrain[i + 1, j] += transfer;
else if (k == 9)
elevrain[i + 1, j + 1] += transfer;
}
}
if(total!=1)
elevrain[i, j] = elev[i, j];
Console.WriteLine(elevrain[i,j]);
}
}
}
}
static void addRain(){
rainfall = new double[Convert.ToInt32(totalRow), Convert.ToInt32(totalCol)];
elevrain = new double[Convert.ToInt32(totalRow), Convert.ToInt32(totalCol)];
int i = 0, j = 0;
while (i != Convert.ToInt32(totalRow)){
while (j != Convert.ToInt32(totalCol)){
rainfall[i, j] = 2;
elevrain[i, j] = elev[i, j] + rainfall[i,j];
j++;
}
i++;
j = 0;
}
}
static double compare(int i, int j, int k){
double total=0;
if( k==1 ) {
if ( (elevrain[i, j] > elevrain[i - 1, j - 1] ) && (elev[i-1, j-1]!=-500.0) )
total = (elevrain[i, j] - elevrain[i - 1, j - 1]) / 1.414213562373095;
else
total = 0;
} else if( k==2 ) {
if ( (elevrain[i, j] > elevrain[i - 1, j]) && (elev[i - 1, j] != -500.0))
total = elevrain[i, j] - elevrain[i - 1, j];
else
total = 0;
} else if( k==3 ) {
if ( (elevrain[i, j] > elevrain[i - 1, j + 1]) && (elev[i - 1, j + 1] != -500.0) )
total = (elevrain[i, j] - elevrain[i - 1, j + 1]) / 1.414213562373095;
else
total = 0;
} else if( k==4 ) {
if ((elevrain[i, j] > elevrain[i, j - 1]) && (elev[i, j - 1] != -500.0) )
total = elevrain[i, j] - elevrain[i, j - 1];
else
total = 0;
} else if( k== 6 ) {
if ( (elevrain[i, j] > elevrain[i, j + 1]) && (elev[i, j + 1] != -500.0) )
total = elevrain[i, j] - elevrain[i, j + 1];
else
total = 0;
} else if( k== 7 ) {
if ( (elevrain[i, j] > elevrain[i + 1, j - 1]) && (elev[i + 1, j-1] != -500.0) )
total = (elevrain[i, j] - elevrain[i + 1, j - 1]) / 1.414213562373095;
else
total = 0;
} else if ( k== 8 ) {
if ((elevrain[i, j] > elevrain[i + 1, j]) && (elev[i + 1, j] != -500.0) )
total = elevrain[i, j] - elevrain[i + 1, j];
else
total = 0;
} else if ( k== 9) {
if ( (elevrain[i, j] > elevrain[i + 1, j + 1]) && (elev[i + 1, j +1] != -500.0) )
total = (elevrain[i, j] - elevrain[i + 1, j + 1]) / 1.414213562373095;
else
total = 0;
}
return total;
}