#USE "dblmath.lib" #USE "course.lib" -- Forditas: kroc -d mandel.occ -lcourse -ldblmath -- Futtatas: ./mandel > mandel.ppm -- Ezutan kepnezovel megnezhetjuk a mandel.ppm-et PROTOCOL Task CASE termination todo; INT; INT; REAL64; REAL64 : PROTOCOL Result IS INT; INT; INT: VAL NofWorkers IS 10: VAL MaxH IS 1024: VAL MaxV IS 768: VAL MaxIter IS 255: PROC farm( CHAN BYTE inp, out, err) -------------------------------------------- PROC worker( VAL INT id, CHAN Task task, CHAN BOOL req, CHAN Result res) ----------------- PROC processtask( VAL REAL64 x, y, INT z) -------------- REAL64 FUNCTION square( VAL REAL64 x) IS ( x*x): REAL64 FUNCTION abs64( VAL REAL64 x, y) IS DSQRT( square( x) + square( y)): REAL64 a, b: SEQ a, b, z := 0.0 ( REAL64), 0.0 ( REAL64), 0 WHILE ( z < MaxIter) AND ( abs64( a, b) < 2.0 ( REAL64)) a, b, z := ( square( a)-square( b))+x, ( 2.0 ( REAL64) * ( a*b))+y, z+1 : -- processtask --------------------------------------- REAL64 x, y: INT i, j, z: BOOL going: SEQ going := TRUE WHILE going SEQ req ! TRUE task ? CASE todo; i; j; x; y SEQ --TIMER t: --INT now: --SEQ -- t ? now -- t ? AFTER now PLUS ( j*100) processtask( x, y, z) res ! i; j; z termination going := FALSE : -- worker ------------------------------------------------------------------ INT currH, currV: REAL64 x0, y0, x1, y1: PROC input() --------------------------------------------- SEQ x0, y0 := -2.0 ( REAL64), 2.0 ( REAL64) x1, y1 := 2.0 ( REAL64), -2.0 ( REAL64) currH, currV := 800, 600 : -- input ----------------------------------------------- [ MaxH][ MaxV]INT picture: VAL NofColors IS 16: VAL [ NofColors][ 3]BYTE Colors IS [ [ 255(BYTE), 255(BYTE), 255(BYTE)], [ 255(BYTE), 100(BYTE), 255(BYTE)], [ 255(BYTE), 255(BYTE), 100(BYTE)], [ 100(BYTE), 255(BYTE), 255(BYTE)], [ 255(BYTE), 100(BYTE), 100(BYTE)], [ 100(BYTE), 100(BYTE), 255(BYTE)], [ 100(BYTE), 255(BYTE), 100(BYTE)], [ 100(BYTE), 100(BYTE), 100(BYTE)], [ 055(BYTE), 100(BYTE), 100(BYTE)], [ 100(BYTE), 055(BYTE), 100(BYTE)], [ 100(BYTE), 100(BYTE), 055(BYTE)], [ 055(BYTE), 055(BYTE), 100(BYTE)], [ 100(BYTE), 055(BYTE), 055(BYTE)], [ 055(BYTE), 100(BYTE), 055(BYTE)], [ 055(BYTE), 055(BYTE), 055(BYTE)], [ 000(BYTE), 000(BYTE), 000]]: PROC output() -------------------------------------------- [ NofColors-1]INT zones: [ 3]BYTE FUNCTION getcolor( VAL INT iter) [ 3]BYTE c: INT z: VALOF IF IF i= 0 FOR ( SIZE zones) iter <= zones[ i] z := i TRUE z := SIZE zones RESULT Colors[ z] : -- getzone SEQ VAL unit IS DALOG( REAL64 ROUND MaxIter) / ( REAL64 ROUND ( NofColors-1)): SEQ i= 0 FOR NofColors-1 zones[ i] := INT ROUND DEXP( ( REAL64 ROUND i) * unit) out.string( "P3*n", 0, out) out.int( currH, 0, out) out.string( "*n", 0, out) out.int( currV, 0, out) out.string( "*n", 0, out) out.int( MaxIter, 0, out) out.string( "*n", 0, out) SEQ j= 0 FOR currV SEQ SEQ i= 0 FOR currH VAL pix IS picture[ i][ j]: SEQ out.byte( getcolor( pix)[ 0], 4, out) out.byte( getcolor( pix)[ 1], 4, out) out.byte( getcolor( pix)[ 2], 4, out) out.string( "*c*n", 0, out) : -- output ---------------------------------------------- PROC farmer( [ NofWorkers]CHAN Task tasks, [ NofWorkers]CHAN BOOL reqs, VAL INT tasknum) INT currI, currJ: PROC nexttask( INT i, INT j, REAL64 x, REAL64 y) --------- VAL dx IS ( x1-x0) / ( REAL64 ROUND ( currH-1)): VAL dy IS ( y1-y0) / ( REAL64 ROUND ( currV-1)): SEQ i, j := currI, currJ x, y := x0 + ( ( REAL64 ROUND i) * dx), y0 + ( ( REAL64 ROUND j) * dy) IF currJ = ( currV-1) currI, currJ := currI+1, 0 TRUE currJ := currJ+1 : -- nexttask -------------------------------------------- INT n: SEQ -- farmer currI, currJ, n := 0, 0, tasknum WHILE n > 0 ALT k= 0 FOR ( SIZE reqs) BOOL dummy: reqs[ k] ? dummy INT i, j: REAL64 x, y: SEQ nexttask( i, j, x, y) tasks[ k] ! todo; i; j; x; y n := n-1 PAR i= 0 FOR NofWorkers SEQ BOOL dummy: reqs[ i] ? dummy tasks[ i] ! termination : -- farmer ------------------------------------------------------------------ PROC collector( [ NofWorkers]CHAN Result results, VAL INT tasknum) ----------- PROC nextresult( VAL INT i, VAL INT j, VAL INT z) -------- picture[ i][ j] := z : -- nextresult ------------------------------------------ INT i, j, z: SEQ SEQ k= 0 FOR tasknum ALT l= 0 FOR ( SIZE results) results[ l] ? i; j; z nextresult( i, j, z) : -- collector --------------------------------------------------------------- [ NofWorkers]CHAN Task tasks: [ NofWorkers]CHAN Result results: [ NofWorkers]CHAN BOOL reqs: SEQ input() VAL TaskNum IS currH * currV: PAR farmer( tasks, reqs, TaskNum) collector( results, TaskNum) PAR i= 0 FOR NofWorkers worker( i, tasks[ i], reqs[ i], results[ i]) output() : -- farm ----------------------------------------------------------------------