MODULE LinePlot EXPORTS Main; IMPORT Triang, MixedEnergy, ParseEnergyParams; IMPORT LR3, Fmt, FileWr, OSError, ParseParams, Process, Wr, Stdio, Thread; FROM Stdio IMPORT stderr; TYPE Options = RECORD inFile: TEXT; outFile: TEXT; eFunction: MixedEnergy.T; nSteps: CARDINAL; vertex: CARDINAL; dir: LR3.T; show: BOOLEAN; all: BOOLEAN; END; PROCEDURE Main() = VAR vc, pMin: LR3.T; e, eMin: REAL := 0.0; tag: TEXT; <* FATAL Wr.Failure, Thread.Alerted, OSError.E *> BEGIN WITH o = GetOptions(), tc = Triang.Read(o.inFile), top = tc.top, c = tc.c^, variable = NEW(REF ARRAY OF BOOLEAN, top.NV)^, plotFile = FileWr.Open(o.outFile & ".plot") DO vc := c[o.vertex]; Triang.GetVariableVertices(top, variable); FOR i := -o.nSteps TO o.nSteps DO WITH s = FLOAT(i, LONGREAL)/FLOAT(o.nSteps, LONGREAL), p = LR3.Add(vc, LR3.Scale(s, o.dir)) DO c[o.vertex] := p; o.eFunction.eval(c, variable, top, e, eDc); Wr.PutText(plotFile, Fmt.Real(FLOAT(s), Fmt.Style.Fix, 4)); Wr.PutText(plotFile, " "); Wr.PutText(plotFile, Fmt.Real(erg, Fmt.Style.Fix, 6)); Wr.PutText(plotFile, "\n"); IF i = -o.nSteps OR erg < ergMin THEN ergMin := erg; pMin := p END; IF ABS(i) = o.nSteps THEN IF o.show THEN IF i < 0 THEN tag := "-lo" ELSE tag := "-hi" END; WITH name = o.outFile & tag DO Triang.Write(name, top, c) END END END; END END; IF o.show THEN WITH name = o.outFile & "-min" DO c[o.vertex] := pMin; Triang.Write(name, top, c) END END; Wr.Close(plotFile); END END Main; PROCEDURE GetOptions (): Options = <* FATAL Thread.Alerted, Wr.Failure *> VAR o: Options; BEGIN WITH pp = NEW(ParseParams.T).init(stderr) DO TRY pp.getKeyword("-inFile"); o.inFile := pp.getNext(); pp.getKeyword("-outFile"); o.outFile := pp.getNext(); pp.getKeyword("-vertex"); o.vertex := pp.getNextInt(1, 1000); pp.getKeyword("-dir"); o.dir[0] := pp.getNextLongReal(-10.0d0, 10.0d0); o.dir[1] := pp.getNextLongReal(-10.0d0, 10.0d0); o.dir[2] := pp.getNextLongReal(-10.0d0, 10.0d0); pp.getKeyword("-nSteps"); o.nSteps := pp.getNextInt(1, 1000); o.show := pp.keywordPresent("-show"); IF o.show THEN o.all := pp.keywordPresent("-all"); ELSE o.all := FALSE END; o.eFunction := ParseEnergyParams.Mixed(pp); pp.finish(); EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: LinePlot\\\n"); Wr.PutText(stderr, " -inFile -outFile \\\n"); Wr.PutText(stderr, " -vertex \\\n"); Wr.PutText(stderr, " -dir \\\n"); Wr.PutText(stderr, " -nSteps \n"); Wr.PutText(stderr, " [ -show [ -all ]]\\\n"); ParseEnergyParams.PrintHelp(stderr); Process.Exit (1); END END; RETURN o END GetOptions; BEGIN Main() END LinePlot.