FOR side := -1 TO +1 BY 2 DO IF side = +1 THEN tag := "apv" ELSE tag := "apf" END; SPPlot.Everything( func := UValue, tri := tri, outName := o.outName & "-val-" & tag, fMax := fMax, fStep := FLOAT(fMax/10.0d0, REAL), M := o.gridSize, N := o.gridSize, obs := obs, upp := HLR3.Point{c := LR4.T{0.0d0, 0.0d0, 0.0d0, 1.0d0}}, dLight := LR3.T{0.0d0, 0.0d0, 1.0d0}, eps := TRUE, verbose := TRUE ); SPPlot.Everything( func := UError, tri := tri, outName := o.outName & "-err-" & tag, fMax := eMax, fStep := FLOAT(eMax/10.0d0, REAL), M := o.gridSize, N := o.gridSize, obs := obs, upp := HLR3.Point{c := LR4.T{0.0d0, 0.0d0, 0.0d0, 1.0d0}}, dLight := LR3.T{0.0d0, 0.0d0, 1.0d0}, eps := TRUE, verbose := TRUE ); (* Reverse position of observer: *) FOR k := 1 TO 3 DO obs.c[k] := - obs.c[k] END; END eMax := FIRST(LONG); fMax := FIRST(LONG); FOR i := -10 TO +10 DO FOR j := -10 TO +10 DO FOR k := -10 TO +10 DO IF i # 0 OR j # 0 OR k # 0 THEN WITH x = FLOAT(i, LONG), y = FLOAT(j, LONG), z = FLOAT(k, LONG), p = LR3.Dir(LR3.T{x, y, z}), fp = f.eval(p), up = u.eval(p), afp = ABS(fp), aep = ABS(up - fp) DO IF afp > fMax THEN fMax := afp END; IF aep > eMax THEN eMax := aep END; END; END; END; END; END; fMax: LONGREAL; (* Nominal max absolute function value. *) fStep: REAL; (* Value difference between successive level curves *) eMax: LONGREAL; (* Nominal max absolute approx error. *) eStep: REAL; (* Value difference between successive error level curves *) IF pp.keywordPresent("-fMax") THEN o.fMax := pp.getNextLongReal(0.0d0, LAST(LONGREAL)) ELSE o.fMax := +1.0d0 END; IF pp.keywordPresent("-fStep") THEN o.fStep := pp.getNextReal() ELSE o.fStep := 0.1 END; IF pp.keywordPresent("-eMax") THEN o.eMax := pp.getNextLongReal(0.0d0, LAST(LONGREAL)) ELSE o.eMax := +1.0d0 END; IF pp.keywordPresent("-eStep") THEN o.eStep := pp.getNextReal() ELSE o.eStep := 0.1 END;