/// <summary> /// Example of how to append data from one file to another. It is assumed that: /// <list type="bullet"> /// <item>The files has identical dynamic and static items</item> /// <item>The last time step of the target file is equal to the first /// timestep of the sourceFile, and therefor the first time step /// from the source file is not added to the target file</item> /// </list> /// <para> /// This example uses the generic DFS functionality, and will work for any type /// of DFS file. /// </para> /// </summary> public static void AppendToFile(string targetFile, string sourceFile) { // Open target for appending and source for reading IDfsFile target = DfsFileFactory.DfsGenericOpenAppend(targetFile); IDfsFile source = DfsFileFactory.DfsGenericOpen(sourceFile); // Time of last time step of file, in the time unit of the time axis. // This is sufficient as long as TimeAxis.StartTimeOffset equals in // source and target file (it is zero for most files) double targetEndTime = target.FileInfo.TimeAxis.TimeSpan(); // Do not add initial time step 0 of source to target file, // so go directly to time step 1 in source source.FindTimeStep(1); // Copy over data IDfsItemData sourceData2; while (null != (sourceData2 = source.ReadItemTimeStepNext())) { target.WriteItemTimeStepNext(targetEndTime + sourceData2.Time, sourceData2.Data); } // Close the files target.Close(); source.Close(); }
/// <summary> /// Update time series with a constant change factor, adding 10% to all values /// </summary> /// <param name="dfs0File">Path and name of file, e.g. Rain_instantaneous.dfs0 test file</param> /// <param name="dfs0FileNew">Name of new updated file</param> public static void UpdateDfs0Data(string dfs0File, string dfs0FileNew) { // Open source file IDfsFile source = DfsFileFactory.DfsGenericOpen(dfs0File); // Create a new file with updated rain values DfsBuilder builder = DfsBuilder.Create(source.FileInfo.FileTitle + "Updated", "MIKE SDK", 13); // Copy header info from source file to new file builder.SetDataType(source.FileInfo.DataType); builder.SetGeographicalProjection(source.FileInfo.Projection); builder.SetTemporalAxis(source.FileInfo.TimeAxis); // Copy over first item from source file to new file builder.AddDynamicItem(source.ItemInfo[0]); // Create the new file builder.CreateFile(dfs0FileNew); IDfsFile target = builder.GetFile(); // Loop over all timesteps for (int i = 0; i < source.FileInfo.TimeAxis.NumberOfTimeSteps; i++) { // Read time step for item, and extract value IDfsItemData <double> itemData = (IDfsItemData <double>)source.ReadItemTimeStep(1, i); double value = itemData.Data[0]; // Write new value to target, adding 10% to its value target.WriteItemTimeStepNext(itemData.Time, new double[] { value * 1.1 }); } source.Close(); target.Close(); }
/// <summary> /// Bulk write the times and data for a dfs0 file. /// <para> /// The <paramref name="data"/> contains a column for each /// item in the file. There are as many rows as there are timesteps. /// </para> /// </summary> public static void WriteDfs0DataDouble(IDfsFile dfs0File, double[] times, double[,] data) { int itemCount = dfs0File.ItemInfo.Count; if (times.Length != data.GetLength(0)) { throw new ArgumentException("Number of time steps does not match number of data rows"); } if (itemCount != data.GetLength(1)) { throw new ArgumentException("Number of items does not match number of data columns"); } bool[] isFloatItem = new bool[itemCount]; for (int j = 0; j < itemCount; j++) { isFloatItem[j] = dfs0File.ItemInfo[j].DataType == DfsSimpleType.Float; } float[] fdata = new float[1]; double[] ddata = new double[1]; dfs0File.Reset(); for (int i = 0; i < times.Length; i++) { for (int j = 0; j < itemCount; j++) { if (isFloatItem[j]) { fdata[0] = (float)data[i, j]; dfs0File.WriteItemTimeStepNext(times[i], fdata); } else { ddata[0] = data[i, j]; dfs0File.WriteItemTimeStepNext(times[i], ddata); } } } }
static void Main(string[] args) { int[] nodeNumber = new int[] { 899, 2686, 2856, 2866, 2331, 3806, 2231, 3831 }; IDfsFile resFile = DfsFileFactory.DfsGenericOpenEdit(@"E:\FFWS\Model\MIKEHYDRO\GBM_MIKEHYDRO.mhydro - Result Files\RiverBasin_GBM.dfs0"); IDfsFileInfo resfileInfo = resFile.FileInfo; int noTimeSteps = resfileInfo.TimeAxis.NumberOfTimeSteps; DateTime[] date = resFile.FileInfo.TimeAxis.GetDateTimes(); DateTime startDate = date[0]; double[] timeSpan = new double[noTimeSteps]; for (int j = 0; j < noTimeSteps; j++) { timeSpan[j] = resFile.ReadItemTimeStep(899, j).Time; } foreach (int element in nodeNumber) { IDfsItemData <float> data; float[] QSimvalues = new float[noTimeSteps]; for (int j = 0; j < noTimeSteps; j++) { data = (IDfsItemData <float>)resFile.ReadItemTimeStep(element, j); QSimvalues[j] = Convert.ToSingle(data.Data[0]); } DfsFactory factory = new DfsFactory(); string filename = @"E:\FFWS\Model\BrahmaputraHD\Boundary\" + element + ".dfs0"; DfsBuilder filecreator = DfsBuilder.Create(element.ToString(), element.ToString(), 2014); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(startDate.Year, startDate.Month, startDate.Day, startDate.Hour, startDate.Minute, startDate.Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(element.ToString(), eumQuantity.Create(eumItem.eumIDischarge, eumUnit.eumUm3PerSec), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); IDfsFileInfo fileinfo = file.FileInfo; for (int j = 0; j < noTimeSteps; j++) { file.WriteItemTimeStepNext(timeSpan[j], new float[] { QSimvalues[j] }); } file.Close(); } }
private void _ProcessAllTimeSteps(List <int> timesteps, int stride) { var numItems = _inputDfs.ItemInfo.Count; int j = -1; foreach (var timestep in timesteps) { j++; if (j % stride != 0) { continue; } for (int item = 1; item <= numItems; ++item) { var itemdata = _inputDfs.ReadItemTimeStep(item, timestep); var data = (float[])itemdata.Data; var time = itemdata.Time; _outputDfs.WriteItemTimeStepNext(time, data); } } }
private void ProcessAllTimeSteps(IDfsFile outputDfs) { var nTimes = _dfsInput.FileInfo.TimeAxis.NumberOfTimeSteps; var nItems = _dfsInput.ItemInfo.Count; List <float[]> outdatalist = new List <float[]>(); int timestep0 = 0; for (int item = 1; item <= nItems; ++item) { var indatatime = _dfsInput.ReadItemTimeStep(item, timestep0); var indata = (float[])indatatime.Data; outdatalist.Add(indata); } // from step 1 and onwards for (int timestep = 1; timestep < nTimes; timestep++) { for (int item = 1; item <= nItems; ++item) { var indatatime = _dfsInput.ReadItemTimeStep(item, timestep); var indata = (float[])indatatime.Data; // sum data outdatalist[item - 1] = outdatalist[item - 1].Zip(indata, (x, y) => x + y).ToArray(); } } for (int item = 1; item <= nItems; ++item) { outdatalist[item - 1] = outdatalist[item - 1].Select( x => x / Convert.ToSingle(nTimes)).ToArray(); outputDfs.WriteItemTimeStepNext(timestep0, outdatalist[item - 1]); } // write all steps (the same) for (int timestep = 0; timestep < nTimes; timestep++) { for (int item = 1; item <= nItems; ++item) { var indatatime = _dfsInput.ReadItemTimeStep(item, timestep); //outputDfs.WriteItemTimeStepNext(timestep, outdatalist[item - 1]); // indatatime.Time outputDfs.WriteItemTimeStep(item, timestep, indatatime.Time, outdatalist[item - 1]); // indatatime.Time } } }
private void ProcessAllTimeSteps(IDfsFile outputDfs, float fac, float constant) { var nTimes = _dfsInput.FileInfo.TimeAxis.NumberOfTimeSteps; var nItems = _dfsInput.ItemInfo.Count; for (int timestep = 0; timestep < nTimes; timestep++) { for (int item = 1; item <= nItems; ++item) { var indatatime = _dfsInput.ReadItemTimeStep(item, timestep); var indata = (float[])indatatime.Data; var time = indatatime.Time; var outdata = indata.Select(r => r * fac + constant).ToArray(); outputDfs.WriteItemTimeStepNext(time, outdata); } } }
private void ProcessAllTimeSteps(IDfsFile outputDfs, float fac1, float fac2) { //int numTimes = _dfsInput1.FileInfo.TimeAxis.NumberOfTimeSteps; var numItems = _dfsInput1.ItemInfo.Count; for (int timestep = 0; timestep < _nTimes; timestep++) { for (int item = 1; item <= numItems; ++item) { var datatime1 = _dfsInput1.ReadItemTimeStep(item, timestep); var data1 = (float[])datatime1.Data; var time1 = datatime1.Time; var data2 = (float[])_dfsInput2.ReadItemTimeStep(item, timestep).Data; data1 = data1.Select(r => r * fac1).ToArray(); data2 = data2.Select(r => r * fac2).ToArray(); var outdata = data1.Zip(data2, (x, y) => x + y).ToArray(); outputDfs.WriteItemTimeStepNext(time1, outdata); } } }
private void btnDFS0Fromlist_Click(object sender, EventArgs e) { if (fileName == "") { MessageBox.Show("No files have been selected for processing...\nPlease Load a file first."); } else { string[] requiredDFS0File = File.ReadAllLines((fileName.Substring(0, fileName.Length - 6) + ".txt")); string[] availableDFS0 = File.ReadAllLines((fileName.Substring(0, fileName.Length - 6) + "_xy.txt")); foreach (string element in requiredDFS0File) { for (int i = 0; i < availableDFS0.Length; i++) { if (element == availableDFS0[i]) { string itemType = element.Substring(0, 2); if (itemType == "WL") { DfsFactory factory = new DfsFactory(); string filename = dfs0Path + @"\" + element + ".dfs0"; DfsBuilder filecreator = DfsBuilder.Create(element, element, 2012); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(dfsDate[0].Year, dfsDate[0].Month, dfsDate[0].Day, dfsDate[0].Hour, dfsDate[0].Minute, dfsDate[0].Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(element, eumQuantity.Create(eumItem.eumIWaterLevel, eumUnit.eumUmeter), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); IDfsFileInfo fileinfo = file.FileInfo; for (int j = 0; j < dfsDate.Count; j++) { file.WriteItemTimeStepNext((dfsDate[j] - dfsDate[0]).TotalSeconds, new float[] { dfsData[j, i] }); } file.Close(); } else if (itemType == "Q,") { DfsFactory factory = new DfsFactory(); string filename = dfs0Path + @"\" + element + ".dfs0"; DfsBuilder filecreator = DfsBuilder.Create(element, element, 2014); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(dfsDate[0].Year, dfsDate[0].Month, dfsDate[0].Day, dfsDate[0].Hour, dfsDate[0].Minute, dfsDate[0].Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(element, eumQuantity.Create(eumItem.eumIDischarge, eumUnit.eumUm3PerSec), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); IDfsFileInfo fileinfo = file.FileInfo; for (int j = 0; j < dfsDate.Count; j++) { file.WriteItemTimeStepNext((dfsDate[j] - dfsDate[0]).TotalSeconds, new float[] { dfsData[j, i] }); } file.Close(); } } } } MessageBox.Show("Result file processed suceesssfully."); } }
private void btnSingleDFS0_Click(object sender, EventArgs e) { try { if (fileName == "") { MessageBox.Show("No files have been selected for processing...\nPlease Load a file first."); } else { string itemType = comboBox1.SelectedItem.ToString().Substring(0, 2); if (itemType == "WL") { string element = comboBox1.SelectedItem.ToString().Substring(0, comboBox1.SelectedItem.ToString().Length - 4); DfsFactory factory = new DfsFactory(); string filename = dfs0Path + @"\" + element + ".dfs0"; DfsBuilder filecreator = DfsBuilder.Create(element, element, 2012); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(dfsDate[0].Year, dfsDate[0].Month, dfsDate[0].Day, dfsDate[0].Hour, dfsDate[0].Minute, dfsDate[0].Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(element, eumQuantity.Create(eumItem.eumIWaterLevel, eumUnit.eumUmeter), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); IDfsFileInfo fileinfo = file.FileInfo; for (int j = 0; j < dfsDate.Count; j++) { file.WriteItemTimeStepNext((dfsDate[j] - dfsDate[0]).TotalSeconds, new float[] { dfsData[j, comboBox1.SelectedIndex] }); } file.Close(); } else if (itemType == "Q,") { string element = comboBox1.SelectedItem.ToString(); DfsFactory factory = new DfsFactory(); string filename = dfs0Path + @"\" + element + ".dfs0"; DfsBuilder filecreator = DfsBuilder.Create(element, element, 2014); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(dfsDate[0].Year, dfsDate[0].Month, dfsDate[0].Day, dfsDate[0].Hour, dfsDate[0].Minute, dfsDate[0].Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(element, eumQuantity.Create(eumItem.eumIDischarge, eumUnit.eumUm3PerSec), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); IDfsFileInfo fileinfo = file.FileInfo; for (int j = 0; j < dfsDate.Count; j++) { file.WriteItemTimeStepNext((dfsDate[j] - dfsDate[0]).TotalSeconds, new float[] { dfsData[j, comboBox1.SelectedIndex] }); } file.Close(); } MessageBox.Show("Result file processed suceesssfully."); } } catch (Exception error) { MessageBox.Show("HD Model Result files cannot be processed due to an error. Error: " + error.Message); } }
private void btnLoadNAM_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Mike NAM Result Files|*.RES11"; if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel) { fileName = dialog.FileName; } var filepath = fileName.Split('\\'); dfs0Path = filepath[0]; for (int i = 1; i < filepath.Length - 1; i++) { dfs0Path = dfs0Path + @"\" + filepath[i]; } IDfsFile resFile = DfsFileFactory.DfsGenericOpenEdit(fileName); IDfsFileInfo resfileInfo = resFile.FileInfo; DateTime[] date = resFile.FileInfo.TimeAxis.GetDateTimes(); DateTime startDate = date[0]; IDfsItemData <float> data; int noTimeSteps = resfileInfo.TimeAxis.NumberOfTimeSteps; float[] values = new float[noTimeSteps]; for (int i = 0; i < noTimeSteps; i++) { dfsDate.Add(startDate.AddHours(resFile.ReadItemTimeStep(1, i).Time)); } for (int j = 0; j < resFile.ItemInfo.Count; j++) { IDfsSimpleDynamicItemInfo dynamicItemInfo = resFile.ItemInfo[j]; string nameOftDynamicItem = dynamicItemInfo.Name; string checkname = nameOftDynamicItem.Substring(0, 6); if (checkname == "RunOff") { string filename = dfs0Path + @"\" + nameOftDynamicItem + ".dfs0"; DfsFactory factory = new DfsFactory(); DfsBuilder filecreator = DfsBuilder.Create(nameOftDynamicItem, nameOftDynamicItem, 2014); filecreator.SetDataType(1); filecreator.SetGeographicalProjection(factory.CreateProjectionUndefined()); //filecreator.SetTemporalAxis(factory.CreateTemporalEqCalendarAxis(eumUnit.eumUsec, new DateTime(2010, 01, 01, 06, 00, 00), 0, 10800)); filecreator.SetTemporalAxis(factory.CreateTemporalNonEqCalendarAxis(eumUnit.eumUsec, new DateTime(dfsDate[0].Year, dfsDate[0].Month, dfsDate[0].Day, dfsDate[0].Hour, dfsDate[0].Minute, dfsDate[0].Second))); filecreator.SetItemStatisticsType(StatType.RegularStat); DfsDynamicItemBuilder item = filecreator.CreateDynamicItemBuilder(); item.Set(nameOftDynamicItem, eumQuantity.Create(eumItem.eumIDischarge, eumUnit.eumUm3PerSec), DfsSimpleType.Float); item.SetValueType(DataValueType.Instantaneous); item.SetAxis(factory.CreateAxisEqD0()); item.SetReferenceCoordinates(1f, 2f, 3f); filecreator.AddDynamicItem(item.GetDynamicItemInfo()); filecreator.CreateFile(filename); IDfsFile file = filecreator.GetFile(); for (int i = 0; i < noTimeSteps; i++) { data = (IDfsItemData <float>)resFile.ReadItemTimeStep(j + 1, i); values[i] = Convert.ToSingle(data.Data[0]); file.WriteItemTimeStepNext((dfsDate[i] - dfsDate[0]).TotalSeconds, new float[] { values[i] }); } file.Close(); } } }
/// <summary> /// Creates a dfs0 file, with an equidistant time axis and one dynamic item. /// <para> /// It uses the generic <see cref="DfsBuilder"/>, since currently no specialized /// builder exists for the dfs0 files. /// </para> /// </summary> /// <param name="filename">Name of new file</param> /// <param name="calendarAxis">boolean specifying whether the temporal axis should be a calendar axis or a time axis</param> public static void CreateDfs0File(string filename, bool calendarAxis) { DfsFactory factory = new DfsFactory(); DfsBuilder builder = DfsBuilder.Create("TemporalAxisTest", "dfs Timeseries Bridge", 10000); // Set up file header builder.SetDataType(1); builder.SetGeographicalProjection(factory.CreateProjectionUndefined()); if (calendarAxis) { builder.SetTemporalAxis(factory.CreateTemporalEqCalendarAxis(eumUnit.eumUsec, new DateTime(2010, 01, 04, 12, 34, 00), 4, 10)); } else { builder.SetTemporalAxis(factory.CreateTemporalEqTimeAxis(eumUnit.eumUsec, 3, 10)); } builder.SetItemStatisticsType(StatType.RegularStat); // Set up first item DfsDynamicItemBuilder item1 = builder.CreateDynamicItemBuilder(); item1.Set("WaterLevel item", eumQuantity.Create(eumItem.eumIWaterLevel, eumUnit.eumUmeter), DfsSimpleType.Float); item1.SetValueType(DataValueType.Instantaneous); item1.SetAxis(factory.CreateAxisEqD0()); item1.SetReferenceCoordinates(1f, 2f, 3f); builder.AddDynamicItem(item1.GetDynamicItemInfo()); DfsDynamicItemBuilder item2 = builder.CreateDynamicItemBuilder(); item2.Set("WaterDepth item", eumQuantity.Create(eumItem.eumIWaterDepth, eumUnit.eumUmeter), DfsSimpleType.Float); item2.SetValueType(DataValueType.Instantaneous); item2.SetAxis(factory.CreateAxisEqD0()); item2.SetReferenceCoordinates(1f, 2f, 3f); builder.AddDynamicItem(item2.GetDynamicItemInfo()); // Create file builder.CreateFile(filename); IDfsFile file = builder.GetFile(); // Write data to file file.WriteItemTimeStepNext(0, new float[] { 0f }); // water level file.WriteItemTimeStepNext(0, new float[] { 100f }); // water depth file.WriteItemTimeStepNext(0, new float[] { 1f }); // water level file.WriteItemTimeStepNext(0, new float[] { 101f }); // water depth file.WriteItemTimeStepNext(0, new float[] { 2f }); // water level file.WriteItemTimeStepNext(0, new float[] { 102f }); // water depth file.WriteItemTimeStepNext(0, new float[] { 3f }); // etc... file.WriteItemTimeStepNext(0, new float[] { 103f }); file.WriteItemTimeStepNext(0, new float[] { 4f }); file.WriteItemTimeStepNext(0, new float[] { 104f }); file.WriteItemTimeStepNext(0, new float[] { 5f }); file.WriteItemTimeStepNext(0, new float[] { 105f }); file.WriteItemTimeStepNext(0, new float[] { 10f }); file.WriteItemTimeStepNext(0, new float[] { 110f }); file.WriteItemTimeStepNext(0, new float[] { 11f }); file.WriteItemTimeStepNext(0, new float[] { 111f }); file.WriteItemTimeStepNext(0, new float[] { 12f }); file.WriteItemTimeStepNext(0, new float[] { 112f }); file.WriteItemTimeStepNext(0, new float[] { 13f }); file.WriteItemTimeStepNext(0, new float[] { 113f }); file.Close(); }
/// /// <param name="fileName">Output DFS0 file path</param> /// <param name="pi">Memory data structure containing TS</param> /// <param name="list">List of TS identification selecting TS to write in file. /// </param> /// <param name="startTime">Date/time of first time step to be written to /// file</param> /// <param name="endTime">Date/time of last time step to be written to /// file</param> /// <param name="parameterType"></param> private void _WriteOneFile(string fileName, PI pi, IList <TsIdentification> list, DateTime startTime, DateTime endTime, string parameterType) { var allTimeSteps = new List <DateTime>(); foreach (var ident in list) { var tsList = pi.GetTS(ident); foreach (var ts in tsList) { for (int i = 0; i < ts.Values.Count; i++) { foreach (var value in ts.Values.Keys) { if ((value >= startTime) && (value <= endTime)) { if (!allTimeSteps.Contains(value)) { allTimeSteps.Add(value); } } } } } } allTimeSteps.Sort(); var fullTsList = new List <TimeSeries>(); DfsFactory factory = new DfsFactory(); DfsBuilder builder = DfsBuilder.Create("FEWS Adaptor", "FEWS Adaptor - Dfs0 writer", 10000); builder.SetItemStatisticsType(StatType.RegularStat); builder.SetDataType(0); builder.SetGeographicalProjection(factory.CreateProjectionUndefined()); builder.SetItemStatisticsType(StatType.RegularStat); IDfsTemporalAxis temporalAxis = factory.CreateTemporalNonEqCalendarAxis(DHI.Generic.MikeZero.eumUnit.eumUsec, allTimeSteps[0]); builder.SetTemporalAxis(temporalAxis); foreach (var ident in list) { var tsList = pi.GetTS(ident); foreach (var ts in tsList) { DfsDynamicItemBuilder item = builder.CreateDynamicItemBuilder(); var itemEnum = eumItem.eumIItemUndefined; var unitEum = eumUnit.eumUUnitUndefined; var array = ts.ParameterId.Split(';'); var itemStr = array[0]; var unitStr = string.Empty; if (array.Count() > 1) { unitStr = array[1]; } if (!Enum.TryParse(itemStr, true, out itemEnum)) { itemEnum = eumItem.eumIItemUndefined; } if (!Enum.TryParse(unitStr, true, out unitEum)) { unitEum = eumUnit.eumUUnitUndefined; } item.Set(ts.LocationId, eumQuantity.Create(itemEnum, unitEum), DfsSimpleType.Float); if (string.IsNullOrEmpty(parameterType)) { item.SetValueType(DataValueType.Instantaneous); } else { switch (parameterType.ToLower()) { case "instantaneous": item.SetValueType(DataValueType.Instantaneous); break; case "accumulated": item.SetValueType(DataValueType.Accumulated); break; case "meanstepbackward": item.SetValueType(DataValueType.MeanStepBackward); break; case "meanstepforward": item.SetValueType(DataValueType.MeanStepForward); break; case "stepaccumulated": item.SetValueType(DataValueType.StepAccumulated); break; default: item.SetValueType(DataValueType.Instantaneous); break; } } item.SetAxis(factory.CreateAxisEqD0()); builder.AddDynamicItem(item.GetDynamicItemInfo()); fullTsList.Add(ts); } } builder.CreateFile(fileName); using (IDfsFile file = builder.GetFile()) { if (fullTsList[0].MissVal.HasValue) { file.FileInfo.DeleteValueFloat = (float)fullTsList[0].MissVal.Value; file.FileInfo.DeleteValueDouble = fullTsList[0].MissVal.Value; } else { file.FileInfo.DeleteValueFloat = -9999.9f; file.FileInfo.DeleteValueDouble = -9999.9; } float[] oneStepValues = new float[1]; double noValue = file.FileInfo.DeleteValueFloat; for (int i = 0; i < allTimeSteps.Count; i++) { double doubleTime = (allTimeSteps[i] - allTimeSteps[0]).TotalSeconds; bool writeTimeStep = false; int k = 0; while (k < fullTsList.Count && !writeTimeStep) { double value = fullTsList[k].GetValue(allTimeSteps[i]); writeTimeStep = (Math.Abs(value - noValue) > double.Epsilon); k++; } if (writeTimeStep) { for (int j = 0; j < fullTsList.Count; j++) { double value = file.FileInfo.DeleteValueFloat; value = fullTsList[j].GetValue(allTimeSteps[i]); oneStepValues[0] = (float)value; file.WriteItemTimeStepNext(doubleTime, oneStepValues); } } } } Logger.AddLog(Logger.TypeEnum.Info, $"File {fileName} written successfully"); }
/// <summary> /// Bulk write the times and data for a dfs0 file. /// <para> /// The <paramref name="data"/> contains a column for each /// item in the file. There are as many rows as there are timesteps. /// </para> /// </summary> public static void WriteDfs0DataDouble(IDfsFile dfs0File, double[] times, double[,] data) { int itemCount = dfs0File.ItemInfo.Count; if (times.Length != data.GetLength(0)) throw new ArgumentException("Number of time steps does not match number of data rows"); if (itemCount != data.GetLength(1)) throw new ArgumentException("Number of items does not match number of data columns"); bool[] isFloatItem = new bool[itemCount]; for (int j = 0; j < itemCount; j++) { isFloatItem[j] = dfs0File.ItemInfo[j].DataType == DfsSimpleType.Float; } float[] fdata = new float[1]; double[] ddata = new double[1]; for (int i = 0; i < times.Length; i++) { for (int j = 0; j < itemCount; j++) { if (isFloatItem[j]) { fdata[0] = (float)data[i, j]; dfs0File.WriteItemTimeStepNext(times[i], fdata); } else { ddata[0] = data[i, j]; dfs0File.WriteItemTimeStepNext(times[i], ddata); } } } }
public bool GenerateWebTideNode(TVFileModel TVFileModelBC, int WebTideNodeNumb, List <Coord> CoordList, List <TVFileModel> tvFileModelList, int BoundaryConditionCodeNumber, List <List <WaterLevelResult> > AllWLResults, List <IEnumerable <CurrentResult> > AllCurrentResults) { List <eumItem> eumItemList = new List <eumItem>(); DfsFactory factory = new DfsFactory(); IDfsFile dfsOldFile = DfsFileFactory.DfsGenericOpen(TVFileModelBC.ServerFilePath + TVFileModelBC.ServerFileName); DfsBuilder dfsNewFile = DfsBuilder.Create(dfsOldFile.FileInfo.FileTitle, dfsOldFile.FileInfo.ApplicationTitle, dfsOldFile.FileInfo.ApplicationVersion); double WebTideStepsInMinutes = ((double)((IDfsEqCalendarAxis)((dfsOldFile.FileInfo).TimeAxis)).TimeStep / 60); DateTime?dateTimeTemp = null; int? NumberOfTimeSteps = null; int? TimeStepInterval = null; using (PFS pfs = new PFS(base.fi)) { dateTimeTemp = pfs.GetVariableDateTime("FemEngineHD/TIME", "start_time"); if (dateTimeTemp == null) { dfsOldFile.Close(); return(false); } NumberOfTimeSteps = pfs.GetVariable <int>("FemEngineHD/TIME", "number_of_time_steps", 1); if (NumberOfTimeSteps == null) { dfsOldFile.Close(); return(false); } TimeStepInterval = pfs.GetVariable <int>("FemEngineHD/TIME", "time_step_interval", 1); if (TimeStepInterval == null) { dfsOldFile.Close(); return(false); } } DateTime StartDate = ((DateTime)dateTimeTemp).AddHours(-1); DateTime EndDate = ((DateTime)dateTimeTemp).AddSeconds((int)NumberOfTimeSteps * (int)TimeStepInterval).AddHours(1); dfsNewFile.SetDataType(dfsOldFile.FileInfo.DataType); dfsNewFile.SetGeographicalProjection(dfsOldFile.FileInfo.Projection); dfsNewFile.SetTemporalAxis(factory.CreateTemporalEqCalendarAxis(eumUnit.eumUsec, StartDate, 0, WebTideStepsInMinutes * 60)); dfsNewFile.SetItemStatisticsType(StatType.RegularStat); foreach (IDfsDynamicItemInfo di in dfsOldFile.ItemInfo) { DfsDynamicItemBuilder ddib = dfsNewFile.CreateDynamicItemBuilder(); ddib.Set(di.Name, eumQuantity.Create(di.Quantity.Item, di.Quantity.Unit), di.DataType); ddib.SetValueType(di.ValueType); ddib.SetAxis(factory.CreateAxisEqD1(eumUnit.eumUsec, CoordList.Count, 0, 1)); ddib.SetReferenceCoordinates(di.ReferenceCoordinateX, di.ReferenceCoordinateY, di.ReferenceCoordinateZ); dfsNewFile.AddDynamicItem(ddib.GetDynamicItemInfo()); eumItemList.Add(di.Quantity.Item); } dfsOldFile.Close(); string[] NewFileErrors = dfsNewFile.Validate(); StringBuilder sbErr = new StringBuilder(); foreach (string s in NewFileErrors) { sbErr.AppendLine(s); } if (NewFileErrors.Count() > 0) { ErrorMessage = string.Format(CSSPDHIRes.CouldNotCreate_, TVFileModelBC.ServerFileName.Replace(".dfs0", "dfs1")); OnCSSPDHIChanged(new CSSPDHIEventArgs(new CSSPDHIMessage("Error", -1, false, ErrorMessage))); return(false); } string NewFileNameBC = TVFileModelBC.ServerFileName; if (CoordList.Count == 0) { ErrorMessage = CSSPDHIRes.NumberOfWebTideNodesIsZero; OnCSSPDHIChanged(new CSSPDHIEventArgs(new CSSPDHIMessage("Error", -1, false, ErrorMessage))); return(false); } if (eumItemList.Count == 1) { if (eumItemList[0] == eumItem.eumIWaterLevel || eumItemList[0] == eumItem.eumIWaterDepth) { List <WaterLevelResult> WLResults = null; dfsNewFile.CreateFile(TVFileModelBC.ServerFilePath + NewFileNameBC); IDfsFile file = dfsNewFile.GetFile(); for (int i = 0; i < WLResults.ToList().Count; i++) { float[] floatArray = new float[AllWLResults.Count]; for (int j = 0; j < AllWLResults.Count; j++) { floatArray[j] = ((float)((List <WaterLevelResult>)AllWLResults[j].ToList())[i].WaterLevel); } file.WriteItemTimeStepNext(0, floatArray); // water level array } file.Close(); } else { ErrorMessage = string.Format(CSSPDHIRes.FileContainsOneParamButItsNotOfTypeWLOrWDItIs_, eumItemList[0].ToString()); OnCSSPDHIChanged(new CSSPDHIEventArgs(new CSSPDHIMessage("Error", -1, false, ErrorMessage))); return(false); } } else if (eumItemList.Count == 2) { if (eumItemList[0] == eumItem.eumIuVelocity && eumItemList[1] == eumItem.eumIvVelocity) { // read web tide for the required time List <CurrentResult> CurrentResults = null; dfsNewFile.CreateFile(TVFileModelBC.ServerFilePath + NewFileNameBC); IDfsFile file = dfsNewFile.GetFile(); for (int i = 0; i < CurrentResults.ToList().Count; i++) { float[] floatArrayX = new float[AllCurrentResults.Count]; float[] floatArrayY = new float[AllCurrentResults.Count]; for (int j = 0; j < AllCurrentResults.Count; j++) { floatArrayX[j] = ((float)((List <CurrentResult>)AllCurrentResults[j].ToList())[i].x_velocity); floatArrayY[j] = ((float)((List <CurrentResult>)AllCurrentResults[j].ToList())[i].y_velocity); } file.WriteItemTimeStepNext(0, floatArrayX); // Current xVelocity file.WriteItemTimeStepNext(0, floatArrayY); // Current yVelocity } file.Close(); } else { ErrorMessage = string.Format(CSSPDHIRes.FileContains2ParamButItsNotOfUVAndVVItIs_And_, eumItemList[0].ToString(), eumItemList[1].ToString()); OnCSSPDHIChanged(new CSSPDHIEventArgs(new CSSPDHIMessage("Error", -1, false, ErrorMessage))); return(false); } } else { // this is not a file that is used for Water Level or Currents } return(false); }