begin 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; |