static string GetUanPath(RxObject rx, SetupObject setup) { //用配置文件读取程序安装位置 List <AntennaStp> antennas = setup.antenna.allAntennas; int i; for (i = 0; i < antennas.Count; i++) { if (rx.at.antennaNum == antennas[i].antenna) { break; } } //DLL路径加上相对路径 string path; if (antennas[i].uan_path == null) { path = GetDllPath() + "\\" + antennas[i].type + ".uan"; } else { path = ".\\project\\" + setup.name + "\\" + antennas[i].uan_path; } return(path); }
/// <summary> ///从setup文件中获取发射机的频率 /// </summary> private static double GetFrequence(RxObject rx, SetupObject setup) { List <WaveformStp> waveform = setup.waveform.allWaveforms; List <AntennaStp> antenna = setup.antenna.allAntennas; if (rx.at.waveformNum == -1) { for (int j = 0; j < antenna.Count; j++) { if (rx.at.antennaNum == antenna[j].antenna) { rx.at.waveformNum = antenna[j].waveform; } } } //接收机频率有用么? int i; for (i = 0; i < waveform.Count; i++) { if (rx.at.waveformNum == waveform[i].waveform) { break; } } if (i > waveform.Count - 1) { LogFileManager.ObjLog.info("如果这是点状接收机,则没问题。如果是态势,则有问题"); return(0); } return(waveform[i].CarrierFrequency); }
/// <summary> ///获取每个发射机的频段信息 /// </summary> public static List <FrequencyBand> GetTxFrequenceBand(string txpath, string setuppath, int txindex) { List <FrequencyBand> TxFrequenceBand = new List <FrequencyBand>(); List <TxObject> txs = TxReader(txpath); SetupObject setupfile = SetupFileProceed.GetSetupFile.GetSetup(setuppath); WaveformStp txwaveform = GetTxWaveForm(txs[txindex], setupfile); if (txwaveform.type == null) { throw new Exception("波形信息错误"); } if (txwaveform.type == "Sinusoid") { if (txwaveform.bandwidth < 2) { FrequencyBand temp = new FrequencyBand((int)(txwaveform.CarrierFrequency - 1), (int)(txwaveform.CarrierFrequency + 1), (txs[txindex].at.power)); TxFrequenceBand.Add(temp); } else { FrequencyBand temp = new FrequencyBand((int)(txwaveform.CarrierFrequency - txwaveform.bandwidth / 2), (int)(txwaveform.CarrierFrequency + txwaveform.bandwidth / 2), (txs[txindex].at.power)); TxFrequenceBand.Add(temp); } } else { psd TxDivFrequence = new psd(txwaveform.type, txwaveform.PulseWidth, (long)txwaveform.CarrierFrequency, txwaveform.Rolloff, txwaveform.FrequencyVariation, txwaveform.StartFrequency, txwaveform.StopFrequency); DivFrequency Frequencyinfo = TxDivFrequence.GetFandPSD(); TxFrequenceBand = GetBandInformation((txs[txindex].at.power), Frequencyinfo); } return(TxFrequenceBand); }
/// <summary> ///从setup文件中获取发射机的载波频率 /// </summary> private static double GetTxCarrierFrequence(TxObject tx, SetupObject setup) { List <WaveformStp> waveform = setup.waveform.allWaveforms; List <AntennaStp> antenna = setup.antenna.allAntennas; if (tx.at.waveformNum == -1) { for (int j = 0; j < antenna.Count; j++) { if (tx.at.antennaNum == antenna[j].antenna) { tx.at.waveformNum = antenna[j].waveform; } } } int i; for (i = 0; i < waveform.Count; i++) { if (tx.at.waveformNum == waveform[i].waveform) { break; } } return(waveform[i].CarrierFrequency); }
//获取setup文件对象,path为setup路径 public static SetupObject GetSetup(string path) { FileInfo fi = new FileInfo(path); if (!fi.Exists) { return(null); throw new Exception("输入路径不存在"); } string[] paths = path.Split(new char[] { '.' }); if (paths.Length < 1 || !paths[paths.Length - 1].Equals("setup")) { return(null); throw new Exception("这不是一个setup文件"); } StreamReader sr = new StreamReader(path); string s = sr.ReadToEnd(); sr.Close(); SetupObject setupfile = new SetupObject(s); return(setupfile); }
/// <summary> ///从setup中获取发射机波形信息 /// </summary> private static WaveformStp GetTxWaveForm(TxObject tx, SetupObject setup) { WaveformStp txwaveform = new WaveformStp(); List <WaveformStp> waveform = setup.waveform.allWaveforms; List <AntennaStp> antenna = setup.antenna.allAntennas; if (tx.at.waveformNum == -1) { for (int j = 0; j < antenna.Count; j++) { if (tx.at.antennaNum == antenna[j].antenna) { tx.at.waveformNum = antenna[j].waveform; } } } int i; for (i = 0; i < waveform.Count; i++) { if (tx.at.waveformNum == waveform[i].waveform) { txwaveform = waveform[i]; } } return(txwaveform); }
/// <summary> ///从setup中获取发射频率带宽???? /// </summary> private static double GetWidth(RxObject rx, SetupObject setup) { if (rx.at.waveformNum == -1) { LogFileManager.ObjLog.info("如果这是点状接收机,则没问题。如果是态势,则有问题"); return(0); } double temp; List <WaveformStp> waveform = setup.waveform.allWaveforms; int i; for (i = 0; i < waveform.Count; i++) { if (rx.at.waveformNum == waveform[i].waveform) { break; } } switch (waveform[i].type) { case "Sinusoid": temp = waveform[i].bandwidth; break; case "RaisedCosine": temp = 10000000 * (1 + waveform[i].Rolloff) / (waveform[i].PulseWidth / 0.0000001); break; case "Chirp": temp = waveform[i].StopFrequency - waveform[i].StartFrequency; break; case "Blackman": temp = 60000000 / (waveform[i].PulseWidth / 0.0000001); break; case "Gaussian": temp = 23190000 / (waveform[i].PulseWidth / 0.0000001); break; case "GaussianDerivative": temp = 16480000 / (waveform[i].PulseWidth / 0.0000001);; break; case "Hamming": temp = 40000000 / (waveform[i].PulseWidth / 0.0000001);; break; case "RootRaisedCosine": temp = 10000000 * (1 + waveform[i].Rolloff) / (waveform[i].PulseWidth / 0.0000001); break; default: temp = 0; break; } return(temp / 1000000); }
public static StartupServer Create(Uri baseAddress = null) { var appEnv = CallContextServiceLocator.Locator.ServiceProvider.GetRequiredService<IApplicationEnvironment>(); var config = new ConfigurationBuilder(); var configDict = new Dictionary<string, string>(); configDict["Hosting:Environment"] = "Test"; config.AddInMemoryCollection(configDict.AsEnumerable()); var conf = config.Build(); var env = new HostingEnvironment(); env.Initialize($"{appEnv.ApplicationBasePath}/../../src/Accounting", conf); var startup = new Accounting.Startup(appEnv, env); var setup = new SetupObject(); Action<IApplicationBuilder> buildApp = (app) => { app.Use(async (context, next) => { var req = context.Request; if (req.Path == testSetupPathString && setup.Setup != null) { await setup.Setup(context); } else { await next(); } }); startup.Configure(app); }; Action<IServiceCollection> buildServices = (services) => { startup.ConfigureServices(services); services.Remove(services.Where(sp => sp.ServiceType == typeof(IConfigureOptions<AntiforgeryOptions>)).First()); services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<AntiforgeryOptions>, TestAntiforgeryOptionsSetup>()); services.AddSingleton<IAntiforgeryTokenSerializer, TestAntiforgeryTokenSerializer>(); services.AddSingleton<IAntiforgeryTokenGenerator, TestAntiforgeryTokenGenerator>(); }; StartupServer server = new StartupServer(CreateBuilder(conf, app => buildApp(app), services => buildServices(services))); server.setupObject = setup; server.BaseAddress = baseAddress; return server; }
/// <summary> /// 读取UAN(王楠) /// </summary> /// <param name="rx"></param> /// <param name="setup"></param> /// <returns></returns> public static string GetUan(RxObject rx, SetupObject setup) { DateTime startime = DateTime.Now; StreamReader sr = new StreamReader(GetUanPath(rx, setup)); //string s = sr.ReadToEnd(); if (string.IsNullOrEmpty(s2)) { s2 = sr.ReadToEnd(); DateTime finishtime = DateTime.Now; TimeSpan span = finishtime - startime; LogFileManager.ObjLog.debug("第" + (++indexUanRead) + "次读取uan文件到内存中耗时:" + span); } sr.Close(); return(s2); }
/// <summary> /// 读取UAN(王楠) /// </summary> /// <param name="tx">发射</param> /// <param name="setup">设置</param> /// <returns>UAN字符串</returns> public static string GetUan(TxObject tx, SetupObject setup) { DateTime startime = DateTime.Now;//记录开始时间 StreamReader sr = new StreamReader(GetUanPath(tx, setup)); //string s = sr.ReadToEnd(); if (string.IsNullOrEmpty(s1)) //判断是否读到结尾 { s1 = sr.ReadToEnd(); //将读取的流转化为string类型 DateTime finishtime = DateTime.Now; //记录结束时间 TimeSpan span = finishtime - startime; //读取所花时间 LogFileManager.ObjLog.debug("第" + (++indexUanRead) + "次读取uan文件到内存中耗时:" + span); } sr.Close();//读取关闭 return(s1); }
public static void Calculate(string setuppath, string terpath, string txpath, string rxpath) { //此判断用来将ter文件中的三角面读入Intersection.Tris中 Terrain newTer = new Terrain(terpath); string DirectoryPath = GetDirectory(setuppath) + "result\\"; SetupObject setupOne = SetupFileProceed.GetSetupFile.GetSetup(setuppath); int txTotal = setupOne.tr.FirstAvailableTxNumber; string ProName = GetProName(setuppath); List <Node> txs = TxFileProceed.GetTx(txpath, setuppath, terpath); myLog.Info(txs.Count); List <List <ReceiveBall> > rxs = RxFileProceed.GetRx(rxpath, setuppath, terpath); myLog.Info(rxs.Count); //rxs.AddRange(TxFileProceed.GetTxAsRx(txpath, setuppath, terpath)); City buildings = new City(GetDirectory(setuppath) + ProName + ".city"); buildings.RestructTerrainByBuildings(newTer.TerRect); if (buildings.Build != null && buildings.Build.Count != 0) { newTer.OutPutNewTerrain(GetDirectory(setuppath)); } //输出新地形 int?[] index = { null, null }; int txindex = 0; for (int i = 0; i < txs.Count; i++) { List <FrequencyBand> txFrequencyBand = TxFileProceed.GetTxFrequenceBand(txpath, setuppath, i);//获取频段信息 myLog.Debug("这是第" + (i + 1) + "个发射机的射线追踪=========================================================================="); for (int j = 0; j < rxs.Count; j++) { //该接收区只有一个接收机 if (rxs[j].Count == 1) { if (rxs[j][0].GetType().ToString().Equals("CalculateModelClasses.ReceiveArea")) { //电磁态势的追踪模块 ReceiveArea reArea = (ReceiveArea)rxs[j][0]; //第一步:构建态势区域 myLog.Debug("构建态势区域"); reArea.CreateAreaSituation(newTer.TerRect); //第二步:正向追踪,获取路径 myLog.Debug("正向追踪,获取粗略路径"); RayTubeMethod areaTracing = new RayTubeMethod(txs[i], reArea, newTer, buildings, 64); //读取发射天线的极化信息 string txPol = GetRxTxPol("tx", txs[i].TxNum); //读取接收天线的极化信息(删除??) string rxPol = GetRxTxPol("areaSituation", rxs[j][0].RxNum); //第三步:反向追踪,获取准确路径 //for (int m = 0; m < reArea.areaSituationNodes.Count; m++) //{ // areaTracing.ReverseAreaTracingPathsAndDeleteRepeatedPaths(reArea.areaSituationNodes[m].paths); //} //获取发射天线的4个参数 ReadUan.GetGainPara(txs[i].UAN); for (int m = 0; m < reArea.areaSituationNodes.Count; m++) { reArea.areaSituationNodes[m].classifiedFrequencyPaths = new List <List <CalculateModelClasses.Path> >(); if (reArea.areaSituationNodes[m].paths.Count != 0) { PathsafterPolization(reArea.areaSituationNodes[m].paths, txPol, rxPol);//极化代码 //第四步:分频段求每条路径上的场强 reArea.areaSituationNodes[m].classifiedFrequencyPaths = new List <List <CalculateModelClasses.Path> >(); //areaTracing.ScreenAreaSituationPathsByFrequencyAndCalculateEField(txFrequencyBand, reArea.areaSituationNodes[m].paths, reArea.areaSituationNodes[m].classifiedFrequencyPaths); //计算每个频段上的各个路径叠加的总场强 for (int n = 0; n < txFrequencyBand.Count; n++) { EField tempEfield = new EField(); tempEfield.X = tempEfield.GetTolEx(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]); tempEfield.Y = tempEfield.GetTolEy(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]); tempEfield.Z = tempEfield.GetTolEz(reArea.areaSituationNodes[m].classifiedFrequencyPaths[n]); //得到每个频段上各个路径叠加的场强 reArea.areaSituationNodes[m].totleEfields.Add(tempEfield); //得到各个频段上各个路径后得到的总场强 reArea.areaSituationNodes[m].totleEfield.X += tempEfield.X; reArea.areaSituationNodes[m].totleEfield.Y += tempEfield.Y; reArea.areaSituationNodes[m].totleEfield.Z += tempEfield.Z; } } } //文件输出 string path = ".\\.\\project\\station\\areaSituationResult.txt"; if (!System.IO.File.Exists(path)) { System.IO.File.Create(path).Close(); } StringBuilder sb = new StringBuilder(); for (int m = 0; m < reArea.areaSituationNodes.Count; m++) { if (reArea.areaSituationNodes[m].paths.Count != 0) { //string appendText1 = m+" " + reArea.areaSituationNodes[m].paths.Count+" " ; //sb.Append(appendText1); //string appendText2 = "Ex " + reArea.areaSituationNodes[m].totleEfield.X.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.X.Im + ",Ey " + reArea.areaSituationNodes[m].totleEfield.Y.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Y.Im + ",Ez " + reArea.areaSituationNodes[m].totleEfield.Z.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Z.Im + "\r\n"; //sb.Append(appendText2); string appendText1 = "第" + m + "个态势点上有" + reArea.areaSituationNodes[m].paths.Count + "条路径,"; sb.Append(appendText1); string appendText2 = "总场强为:Ex " + reArea.areaSituationNodes[m].totleEfield.X.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.X.Im + ",Ey " + reArea.areaSituationNodes[m].totleEfield.Y.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Y.Im + ",Ez " + reArea.areaSituationNodes[m].totleEfield.Z.Re + "+j" + reArea.areaSituationNodes[m].totleEfield.Z.Im + "\r\n"; sb.Append(appendText2); } //else //{ // string appendText1 = "没有到达第" + m + "个态势点的路径\r\n"; // sb.Append(appendText1); //} } StreamWriter stw = new StreamWriter(path); stw.Write(sb); stw.Flush(); //清空缓冲区 stw.Close(); //关闭流 //--------------------------------- myLog.Debug("结果计算和文件输出过程结束,进入下一个接收机的追踪--------------------------------------"); } else { if (("tx_" + txs[i].NodeName).Equals(rxs[j][0].RxName)) { myLog.Debug("这是第" + (i + 1) + "个发射机第" + (j + 1) + "个接收机的射线追踪:是同一个发射机"); continue; } myLog.Debug("这是第" + (i + 1) + "个发射机第" + (j + 1) + "个接收机的射线追踪*****************************************************"); index[0] = j; RayTubeMethod rayTubeMethod = new RayTubeMethod(txs[i], rxs[j][0], newTer, buildings, 32); rayTubeMethod.ReverseTracingPathsAndDeleteRepeatedPaths(); rayTubeMethod.UpdateRayInForNodes(); // PunctiformLaunchMethod punctiformMethod = new PunctiformLaunchMethod(txs[i], rxs[j][0], newTer, buildings, 64, txFrequencyBand); // List<CalculateModelClasses.Path> temp = punctiformMethod.GetPunctiformRxPath(tx, rxs[j][0], newTer,cityBuilding, 32, 128,TxFrequencyBand); // if (rayTubeMethod.ReceivedPaths.Count != 0)//若存在直射射线 // { // string txPol = GetRxTxPol("tx", txs[i].TxNum);//极化代码 // string rxPol = null; // if (rxs[j][0].isTx == true) // { // rxPol = GetRxTxPol("tx", rxs[j][0].RxNum); // } // else // { // rxPol = GetRxTxPol("rx", rxs[j][0].RxNum);// // } // PathsafterPolization(rayTubeMethod.ReceivedPaths, txPol, rxPol);// // } myLog.Debug("射线追踪过程结束,进入射线筛选和计算过程-----------------------------------------"); //输出结果 ReadUan.GetGainPara(rxs[j][0].UAN); List <List <CalculateModelClasses.Path> > ClassifiedPaths = rayTubeMethod.ScreenPunctiformPathsByFrequencyAndCalculateEField(txFrequencyBand); for (int m = 0; m < txFrequencyBand.Count; m++) { P2mFileOutput.p2mfileoutput(ClassifiedPaths[m], DirectoryPath, ProName, txs[i].TxNum, txTotal, txindex, rxs[j][0], txs[i].Position, txFrequencyBand[m].MidPointFrequence, txFrequencyBand[m].FrequenceWidthMin, txFrequencyBand[m].FrequenceWidthMax); } List <CalculateModelClasses.Path> totalPowerPath = GetTotalPowerPath(ClassifiedPaths); PowerOutput.GetRxTotalPower(totalPowerPath, DirectoryPath, ProName, txs[i].TxNum, txTotal, rxs[j][0], txs[i].Position); myLog.Debug("结果计算和文件输出过程结束,进入下一个接收机的追踪---------------------------------------"); } } else { throw new Exception("没有接收机"); } } } GC.Collect(); }
//参数是接收机和发射机之间的路径 private static string GetRxTxPol(string rxOrTx, int rxTxNum) { string pathSet = ConfigurationManager.AppSettings["setupath"]; SetupObject so = SetupFileProceed.GetSetupFile.GetSetup(pathSet); SetupFileObject.TotalAntenna ta = so.antenna; List <SetupFileObject.AntennaStp> asAll = ta.allAntennas; //从tx,rx,setup文件中得到信息 string pathTx = ConfigurationManager.AppSettings["txpath"]; //存放rxtx的文件内容 string s; int tantNum = -1; int rantNum = -1; try { if (rxOrTx == "tx") { StreamReader st = new StreamReader(pathTx); s = st.ReadToEnd(); int tstart = s.IndexOf("TxSet " + Convert.ToString(rxTxNum)); int tbstart = s.IndexOf("<antenna>", tstart); int tastart = s.IndexOf("antenna", tbstart + 7); string str = s.Substring(tastart + 8); tantNum = Convert.ToInt32(s.Substring(tastart + 8, 1)); st.Close(); s = ""; if (tantNum == -1) { throw new Exception("读取天线的编号出现问题"); } } else if (rxOrTx == "rx") { //读取文件rxset string pathRx = ConfigurationManager.AppSettings["rxpath"]; StreamReader sr = new StreamReader(pathRx); s = sr.ReadToEnd(); int tstart = s.IndexOf("RxSet " + Convert.ToString(rxTxNum)); int tbstart = s.IndexOf("<antenna>", tstart); int tastart = s.IndexOf("antenna", tbstart + 7); string str = s.Substring(tastart + 8); rantNum = Convert.ToInt32(s.Substring(tastart + 8, 1)); s = ""; if (rantNum == -1) { throw new Exception("读取天线的编号出现问题"); } sr.Close(); } } catch (Exception e) { Console.WriteLine(e.Message); throw e; } for (int an = 0; an < asAll.Count; an++) { if (tantNum == asAll[an].antenna) { //返回天线极化类型 return(asAll[an].polarization); } if (rantNum == asAll[an].antenna) { //返回天线的极化类型 return(asAll[an].polarization); } } return(""); }
//path是传入的路径参数,获取setup文件中的天线信息 public static List <AntennaStp> GetAntennaStp(SetupObject setup) { return(setup.antenna.allAntennas); }
//path是传入的路径参数,获取setup文件中的波形信息 public static List <WaveformStp> GetWaveformStp(SetupObject setup) { return(setup.waveform.allWaveforms); }