MODULE LinePlot EXPORTS Main; IMPORT Triang, R3, Fmt, FileStream, ParseParams, RTMisc, Wr, Scan, Stdio, Thread; IMPORT MixedEnergy, ParseEnergyParams; FROM Triang IMPORT Topology, GetVertexCoords, PutWire, ReadTopTri, Coords, InitVariable; FROM Stdio IMPORT stderr; TYPE Options = RECORD inFile: TEXT; outFile: TEXT; vertex: CARDINAL; dir: R3.T; nSteps: CARDINAL; show: BOOLEAN; all: BOOLEAN; me: MixedEnergy.T END; PROCEDURE WriteWireFrame( READONLY t: Topology; READONLY coords: Coords; filename: TEXT; all: BOOLEAN ) = <* FATAL Wr.Failure, Thread.Alerted *> BEGIN WITH name = filename & ".poly", wr = FileStream.OpenWrite(name) DO PutWire(wr, t, coords, all); Wr.Close(wr) END END WriteWireFrame; PROCEDURE GetCoords(READONLY t: Topology; VAR coords: Coords) = BEGIN FOR i := 0 TO LAST(coords) DO WITH v = t.vertex[i] DO coords[i] := GetVertexCoords(v) END; END; END GetCoords; PROCEDURE Main() = VAR c, minv: R3.T; Energy, mine: REAL := 0.0; <* FATAL Wr.Failure, Thread.Alerted *> BEGIN WITH o = GetOptions(), t = ReadTopTri(o.inFile), variable = NEW(REF ARRAY OF BOOLEAN, t.NV), file = FileStream.OpenWrite(o.outFile & ".plot"), coords = NEW(REF Coords, t.NV) DO GetCoords(t, coords^); c := coords[o.vertex]; InitVariable(t, variable^); WITH me = o.me, s = -1.0, (* FLOAT(-o.nSteps)/FLOAT(o.nSteps) *) p = R3.add(c, R3.scale(o.dir, s)) DO coords[o.vertex] := p; minv := p; Energy := me.varen(coords^, variable^, t); mine := Energy; Wr.PutText(file, Fmt.Real(FLOAT(s), 4, Fmt.Style.Flo)); Wr.PutText(file, " "); Wr.PutText(file, Fmt.Real(Energy, 6, Fmt.Style.Flo)); Wr.PutText(file, "\n"); IF o.show THEN WITH shape = o.outFile & "-lo" DO WriteWireFrame(t, coords^, shape, o.all) END END END; FOR i := -o.nSteps+1 TO o.nSteps DO WITH me = o.me, s = FLOAT(i)/FLOAT(o.nSteps), p = R3.add(c, R3.scale(o.dir, s)) DO coords[o.vertex] := p; Energy := me.varen(coords^, variable^, t); Wr.PutText(file, Fmt.Real(FLOAT(s), 4, Fmt.Style.Flo)); Wr.PutText(file, " "); Wr.PutText(file, Fmt.Real(Energy, 6, Fmt.Style.Flo)); Wr.PutText(file, "\n"); IF Energy < mine THEN mine := Energy; minv := p END END END; IF o.show THEN WITH shape = o.outFile & "-hi" DO WriteWireFrame(t, coords^, shape, o.all) END; WITH shape = o.outFile & "-min" DO coords[o.vertex] := minv; WriteWireFrame(t, coords^, shape, o.all) END END; Wr.Close(file); END END Main; PROCEDURE GetOptions (): Options = <* FATAL Thread.Alerted, Wr.Failure *> VAR o: Options; BEGIN TRY ParseParams.BeginParsing(stderr); ParseParams.GetKeyword("-inFile"); o.inFile := ParseParams.GetNext(); ParseParams.GetKeyword("-outFile"); o.outFile := ParseParams.GetNext(); ParseParams.GetKeyword("-vertex"); o.vertex := ParseParams.GetNextInt(1, 1000); ParseParams.GetKeyword("-dir"); o.dir[0] := ParseParams.GetNextReal(-10.0, 10.0); o.dir[1] := ParseParams.GetNextReal(-10.0, 10.0); o.dir[2] := ParseParams.GetNextReal(-10.0, 10.0); ParseParams.GetKeyword("-nSteps"); o.nSteps := ParseParams.GetNextInt(1, 1000); o.show := ParseParams.KeywordPresent("-show"); IF o.show THEN o.all := ParseParams.KeywordPresent("-all"); ELSE o.all := FALSE END; o.me := ParseEnergyParams.Mixed(); ParseParams.EndParsing(); EXCEPT | Scan.BadFormat => 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); RTMisc.Exit (1); END; RETURN o END GetOptions; BEGIN Main() END LinePlot.