MODULE CompOpt EXPORTS Main; IMPORT Energy, MixedEnergy, ElectEnergy, ExcenEnergy, PotenEnergy, Triang; IMPORT Wr, Scan, ParseParams, ParseEnergyParams, RTMisc, Thread; FROM OptShape IMPORT Sim_X_Prax; FROM Stdio IMPORT stderr; TYPE Options = RECORD inFile: TEXT; (* Input file name (minus ".top" extension) *) outFileB: TEXT; (* Output file name prefix to BUmin *) outFileS: TEXT; (* Output file name prefix to Simplex *) outFileP: TEXT; (* Output file name prefix to Praxis *) NRows: CARDINAL; (* Number of line in initial Simplex *) MaxCalls: CARDINAL; (* Maximum number of calls to "f" in the Praxis *) me: MixedEnergy.T; (* Energy to minimize *) doBum, doSimp, doPrax: BOOLEAN; END; PROCEDURE DefaultEnergy(): MixedEnergy.T = CONST MaxTerms = 3; VAR e: ARRAY [0..MaxTerms-1] OF Energy.T; w: ARRAY [0..MaxTerms-1] OF REAL; BEGIN e[0] := ElectEnergy.New(0.5); w[0] := 0.001; e[1] := ExcenEnergy.New(); w[1] := 1.0; e[2] := PotenEnergy.New(); w[2] := 1.0; RETURN MixedEnergy.New(e, w) END DefaultEnergy; PROCEDURE Main() = VAR NRows: CARDINAL := 0; BEGIN WITH o = GetOptions(), t = Triang.ReadTopTri(o.inFile), coords = NEW(REF ARRAY OF ARRAY OF REAL, t.NV, 3) DO IF o.NRows = 0 THEN NRows := 3*t.NV + 1 ELSE NRows := o.NRows END; Triang.GetCoords(t, coords^); Sim_X_Prax(t, o.me, coords^, o.doBum, o.doSimp, o.doPrax, o.outFileB, o.outFileS, o.outFileP, NRows, o.MaxCalls) 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(); o.doBum := ParseParams.KeywordPresent("-outFileB"); IF o.doBum THEN o.outFileB := ParseParams.GetNext() END; o.doSimp := ParseParams.KeywordPresent("-outFileS"); IF o.doSimp THEN o.outFileS := ParseParams.GetNext() END; o.doPrax := ParseParams.KeywordPresent("-outFileP"); IF o.doPrax THEN o.outFileP := ParseParams.GetNext() END; IF ParseParams.KeywordPresent("-NRows") THEN o.NRows := ParseParams.GetNextInt(0, 10000); ELSE o.NRows := 0 END; IF ParseParams.KeywordPresent("-MaxCalls") THEN o.MaxCalls := ParseParams.GetNextInt(0, 30000); ELSE o.MaxCalls := 1000 END; o.me := ParseEnergyParams.Mixed(); IF o.me = NIL THEN o.me := DefaultEnergy(); END; ParseParams.EndParsing(); EXCEPT | Scan.BadFormat => Wr.PutText(stderr, "Usage: CompOpt\\\n"); Wr.PutText(stderr, " -inFile \\\n"); Wr.PutText(stderr, " -outFileB \\\n"); Wr.PutText(stderr, " -outFileS \\\n"); Wr.PutText(stderr, " -outFileP \\\n"); Wr.PutText(stderr, " [ -NRows ]\\\n"); Wr.PutText(stderr, " [ -MaxCalls ]\\\n"); ParseEnergyParams.PrintHelp(stderr); RTMisc.Exit (1) END; RETURN o END GetOptions; BEGIN Main() END CompOpt.