private void GenerateDirectivitySimulationInput() { // Constants double unit = 1e-3; double c0 = 299792458.0; double lambda0 = c0 / m_f0; double lambdaMin = c0 / (m_f0 + m_fc); Compound simulationSpace = new Compound("space"); Compound solidSpace = new Compound("solid-space"); simulationSpace.Add(solidSpace); Compound dut; if (m_excludeEndo == true) { dut = m_endo.GetModule(m_slotIndex); } else { dut = m_endo; } solidSpace.Add(dut); // modifies dut parent (!) // Set up simulation grid, nf2ff and SAR Logger.WriteInfo("Constructing FDTD simulation grid..."); double airBox = 40; double maxRes = Math.Round(lambdaMin / 20 / unit); double maxRatio = 1.5; RectilinearGrid grid = new RectilinearGrid(); grid.Add(dut.BoundingBox.P1); grid.Add(dut.BoundingBox.P2); #region openems_workaround // openEMS v0.0.31 seems to handle transformations on excitation (lumped port), // SAR and NF2FF simulation components incorrectly. // Applied workarounds: // 1. The entire design is moved so that the antenna feedpoint is in the origin // 2. The SAR and NF2FF boxes are added late, w/o transformations Vector3D antennaPosition = new Vector3D( m_antenna.AbsoluteTransformation.X, m_antenna.AbsoluteTransformation.Y, m_antenna.AbsoluteTransformation.Z); solidSpace.Transformations.Add(new TTranslate(-antennaPosition)); grid.Move(-antennaPosition); grid.Add(new Vector3D(0, 0, 0)); grid.ZLines.Add(-(m_antenna.Parent as CSXCAD.Ara.PCB).Thickness); grid.Sort(); grid.SmoothMesh(m_dutResolution, maxRatio); grid.AddAirbox(airBox); grid.SmoothMesh(maxRes, maxRatio); simulationSpace.Add(new NF2FFBox("nf2ff", new Vector3D(grid.XLines.First(), grid.YLines.First(), grid.ZLines.First()), new Vector3D(grid.XLines.Last(), grid.YLines.Last(), grid.ZLines.Last()), lambdaMin / 15 / unit)); #endregion grid.AddPML(8); Simulation fdtd = new Simulation(); fdtd.Excitation = new GaussExcitation(m_f0, m_fc); // Export XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XComment("CyPhy generated openEMS simulation file"), new XElement("openEMS", fdtd.ToXElement(), new XElement("ContinuousStructure", new XAttribute("CoordSystem", 0), simulationSpace.ToXElement(), grid.ToXElement() ) ) ); if (dut is CSXCAD.Ara.Module) { dut.Parent = m_endo; } string openEmsInput = Path.Combine(mainParameters.OutputDirectory, "openEMS_input.xml"); doc.Save(openEmsInput); string nf2ffInput = Path.Combine(mainParameters.OutputDirectory, "nf2ff_input.xml"); var nf2ff = new Postprocess.NF2FF(m_f0); nf2ff.ToXDocument().Save(nf2ffInput); }
public void GenerateFarFieldSimulationInput(string outputDirectory) { Compound simulationSpace = new Compound("space"); Compound solidSpace = new Compound("solid-space"); simulationSpace.Add(solidSpace); Compound dut; if (excludeEndo == true) { dut = endo.GetModule(slotIndex); } else { dut = endo; } solidSpace.Add(dut); // modifies dut parent (!) double airBox = 40; double maxRes = Math.Round(lambdaMin / 20 / unit); double maxRatio = 1.5; RectilinearGrid grid = new RectilinearGrid(); grid.Add(dut.BoundingBox.P1); grid.Add(dut.BoundingBox.P2); Vector3D antennaPosition = new Vector3D( antenna.AbsoluteTransformation.X, antenna.AbsoluteTransformation.Y, antenna.AbsoluteTransformation.Z); solidSpace.Transformations.Add(new TTranslate(-antennaPosition)); grid.Move(-antennaPosition); grid.Add(new Vector3D(0, 0, 0)); grid.ZLines.Add(-(antenna.Parent as CSXCAD.Ara.PCB).Thickness); grid.Sort(); grid.SmoothMesh(dutResolution, maxRatio); grid.AddAirbox(airBox); grid.SmoothMesh(maxRes, maxRatio); simulationSpace.Add(new NF2FFBox("nf2ff", new Vector3D(grid.XLines.First(), grid.YLines.First(), grid.ZLines.First()), new Vector3D(grid.XLines.Last(), grid.YLines.Last(), grid.ZLines.Last()), lambdaMin / 15 / unit)); grid.AddPML(8); Simulation fdtd = new Simulation(); fdtd.Excitation = new GaussExcitation(frequency, bandwidth); // Export XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XComment("CyPhy generated openEMS simulation file"), new XElement("openEMS", fdtd.ToXElement(), new XElement("ContinuousStructure", new XAttribute("CoordSystem", 0), simulationSpace.ToXElement(), grid.ToXElement() ) ) ); if (dut is CSXCAD.Ara.Module) { dut.Parent = endo; } System.IO.Directory.CreateDirectory(outputDirectory); string openEmsInput = Path.Combine(outputDirectory, "openEMS_input.xml"); doc.Save(openEmsInput); string nf2ffInput = Path.Combine(outputDirectory, "nf2ff_input.xml"); var nf2ff = new Postprocess.NF2FF(frequency); nf2ff.ToXDocument().Save(nf2ffInput); File.WriteAllText(Path.Combine(outputDirectory, "run_farfield.cmd"), AraRFAnalysis.Properties.Resources.run_farfield); }