MODULE SPFGMatrix EXPORTS Main; (* Computes the dot product matrix for two PW spherical bases *) IMPORT Wr, Thread, ParseParams, Process; IMPORT SPTriang, SPMatrix, SPPWFunction; FROM SPFile IMPORT OpenRead, OpenWrite; FROM Stdio IMPORT stderr; TYPE Options = RECORD triNameF: TEXT; (* Triangulation file for basis "F" *) baseNameF: TEXT; (* Function file of basis "F" *) triNameG: TEXT; (* Triangulation file for basis "G" *) baseNameG: TEXT; (* Function file of basis "G" *) outName: TEXT; (* Prefix for matrix files *) order: CARDINAL; (* Order of sampling grid in each triangle *) sample: [0..1]; (* Which triangulation to use for sampling *) END; <* FATAL Wr.Failure, Thread.Alerted *> PROCEDURE Main() = VAR F: SPMatrix.T; BEGIN WITH o = GetOptions(), rd0 = OpenRead(o.triNameF & ".tri"), tri0 = MakeTriRef(SPTriang.Read(rd0)), rd1 = OpenRead(o.triNameG & ".tri"), tri1 = MakeTriRef(SPTriang.Read(rd1)), rdbas0 = OpenRead(o.baseNameF & ".bas"), basis0 = SPPWFunction.ReadBasis(rdbas0, tri0), rdbas1 = OpenRead(o.baseNameG & ".bas"), basis1 = SPPWFunction.ReadBasis(rdbas1, tri1) DO Wr.PutText(stderr, "computing dot products...\n"); IF o.sample = 0 THEN F := SPPWFunction.BuildMatrix(basis0^, basis1^, o.order, tri0) ELSE F := SPPWFunction.BuildMatrix(basis0^, basis1^, o.order, tri1) END; WITH wr = OpenWrite(o.outName & "-F.mat") DO SPMatrix.Write(wr, F) END; END; END Main; PROCEDURE MakeTriRef(READONLY tri: SPTriang.T): REF SPTriang.T = (* Droga de Modula-3... *) BEGIN WITH t = NEW(REF SPTriang.T) DO t^ := tri; RETURN t END END MakeTriRef; PROCEDURE GetOptions (): Options = VAR o: Options; BEGIN TRY WITH pp = NEW(ParseParams.T).init(stderr) DO pp.getKeyword("-baseF"); o.triNameF := pp.getNext(); o.baseNameF := pp.getNext(); pp.getKeyword("-baseG"); o.triNameG := pp.getNext(); o.baseNameG := pp.getNext(); pp.getKeyword("-outName"); o.outName := pp.getNext(); pp.getKeyword("-order"); o.order := pp.getNextInt(0,LAST(CARDINAL)); pp.getKeyword("-sample"); o.sample := pp.getNextInt(0,1); pp.finish(); END EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: SPFGMatrix \\\n"); Wr.PutText(stderr, " -baseF \\\n"); Wr.PutText(stderr, " -baseG \\\n"); Wr.PutText(stderr, " -outName \\\n"); Wr.PutText(stderr, " -order \\\n"); Wr.PutText(stderr, " -sample [0|1]\n"); Process.Exit (1); END; RETURN o END GetOptions; BEGIN Main(); END SPFGMatrix.