IMPORT Draw, Strings, Forms;
rows = 40; cols = 50; size = 10; bH = 44;
width = cols * size + 1; height = rows * size + bH + 10;
diffTitle = "diffusion coefficient";
run: BOOLEAN; dt, dx, t: REAL; sourceX, sourceY: INTEGER;
a, aNew: ARRAY cols, rows OF REAL;
kD: Forms.Slider; pressed: BOOLEAN;
x := (Draw.mouseX - 3) DIV size; y := (Draw.mouseY - 3) DIV size;
IF (x >= 0) & (x < cols) & (y >= 0) & (y < rows) THEN
sourceX := x; sourceY := y
BEGIN pressed := TRUE; SetSource
VAR i, j, t1, t2: INTEGER; tmp, pp: REAL;
IF pressed THEN SetSource END;
IF (sourceX # -1) & (sourceY # -1) THEN
a[sourceX, sourceY] := a[sourceX, sourceY] + 50.
tmp := kD.value * dt / (dx * dx);
FOR i := 0 TO cols - 1 DO
FOR j := 0 TO rows - 1 DO
IF i > 0 THEN pp := pp + (a[i - 1, j] - a[i, j]) END;
IF i < cols - 1 THEN pp := pp + (a[i + 1, j] - a[i, j]) END;
IF j > 0 THEN pp := pp + (a[i, j - 1] - a[i, j]) END;
IF j < rows - 1 THEN pp := pp + (a[i, j + 1] - a[i, j]) END;
aNew[i, j] := a[i, j] + tmp * pp
VAR i, j, x, y, color: INTEGER; str: ARRAY 32 OF CHAR; sum: REAL;
Draw.SetBackgroundRGB(255, 255, 255);
Draw.NoStroke; Draw.Fill(0FF4444FFH);
FOR i := 0 TO cols - 1 DO
FOR j := 0 TO rows - 1 DO
color := FLOOR(a[i, j] * 2.0);
IF color > 255 THEN color := 255 END;
Draw.FillRGB(255 - color, 255, 255 - color);
Draw.Recti(i * size, j * size, size, size)
Draw.NoFill; Draw.StrokeRGB(0,0,0); Draw.StrokeWidth(1);
Draw.Recti(1, 1, cols*size-2, rows*size-2);
FOR i := 0 TO cols - 1 DO
FOR j := 0 TO rows - 1 DO
Strings.RealToStringFixed(sum, str, 1);
Draw.FillRGB(0, 0, 0); Draw.NoStroke;
Draw.Stringi(str, width - 100, bY + bH - 6, 16);
Strings.RealToStringFixed(t, str, 1);
Strings.Append(" s", str);
Draw.Stringi(str, 10, bY + bH - 6, 16);
Draw.SetSize(width, height);
kD := Forms.NewSlider(100, bY, 260, 44, diffTitle, 0., 3., 0.1, NIL);
dx := 1.0; dt := 0.05; t := 0.0;
run := FALSE; sourceX := -1; sourceY := -1;
Draw.SetSetupProc(Setup);
Draw.SetDrawProc(Restore);
Draw.SetPressedProc(Pressed);
Draw.SetReleasedProc(Released);
Draw.SetOutProc(Released);