FLUID| begin comment library A0, A1, A4, A5, A12, A15; comment Specimen ALGOL program from Appendix 1 of KDF9 ALGOL manual. This is a program for a practically arising problem. It illustrates the use of many of the facilities available to the ALGOL user; real alpha, lambda, Delta alpha; integer i, f1, f2, f3, f4, f5; real procedure erfc (z); value z; real z; begin comment This procedure evaluates the complementary error function of z using the trapezoidal rule. It halves the interval until the required accuracy is attained, but avoids repeating the evaluation of ordinates more than once; real x, h, J0, J1; integer n, i; h := 0.1; J0 := 0; n := 0; i := 1; R: J1 := J0; for n := n, n + i while n × h × (n × h + 2 × z) < 11.51 do begin x := z + n × h; J0 := J0 + exp(-(x^2)) × (if n = 0 then 0.5 else 1); end ; if abs(1 - 2 × J1/J0) > 0.00001 then begin i := 2; n := 1; h := h/2; goto R end ; erfc := 1.128379 × J0 × h end erfc; open (20); Delta alpha := read (20); close (20); comment Delta alpha is the only input data item required by the program; open (10); write text (10, [ Propagation*of*an*Impulse*into*a*Viscous-locking*Medium [cccc_] [ssss_] Delta*alpha*=* ] ); write (10, format ([d.ddddccc_]), Delta alpha); write text(10, [ [ssss_] alpha [sssss_] [sssss_] [sss_] lambda [sssssss_] [sssssss_] [ss_] lambda.sqrt(2alpha) [s_] g [cc_] [ssss_] 0.0000 [sssss_] [sssss_] [sss_] INFINITY [sssss_] [sssss_] [sss_] 1.00000 [sssss_] [sssss_] [sss_] 1.00000 [c_] ] ); f1 := format ([ssssd.dddd_]); f2 := format ([12sd.ddddº+nd_]); f3 := format ([12sd.ddddd_]); f4 := format ([13sd.dddddcc_]); f5 := format ([13sd.dddddc_]); i := 1; for alpha := Delta alpha step Delta alpha until 1.0 do begin real l1, l2; i := i + 1; lambda := (1 - alpha)/sqrt (2 × alpha); if alpha = 1 then goto SKIP; Repeat: l1 := lambda; l2 := sqrt (0.886227 × (1-alpha)/alpha × l1 × erfc (l1) × exp(+l1^2)); lambda := l2 + 0.835 × alpha × (l2-l1); if abs (1-l2/lambda)>º-5 then goto Repeat; SKIP: write (10, f1, alpha); write (10, f2, lambda); write (10, f3, lambda × sqrt (2 × alpha)); write (10, if i - i ÷ 5 × 5 = 0 then f4 else f5, if lambda > .70710678 then 2 × lambda^2 × alpha × (1-alpha) else if lambda ± 0 then alpha × (1 - alpha) × exp (lambda^2) / (lambda × 2.3282180) else 0.48394 ) end ; newline(10, 2); close (10) end | 0.1; |