public int Read(IntPtr pItem) { int eumT = 0, eumU = 0; DfsSimpleType dataT = DfsSimpleType.Int; DfsDLLWrapper.dfsGetItemInfo(pItem, out eumT, out EUMTypeString, out Name, out eumU, out EUMUnitString, out dataT); EUMType = (eumItem)eumT; EUMUnit = (eumUnit)eumU; dataType = (DfsSimpleType)dataT; //if (dataType != UfsSimpleType.UFS_FLOAT)return err("Only float dataType supported."); dim = DfsDLLWrapper.dfsGetItemDim(pItem); dataValType = DfsDLLWrapper.dfsGetItemValueType(pItem); sAxisType = (SpaceAxisType)DfsDLLWrapper.dfsGetItemAxisType(pItem); switch (sAxisType) { case SpaceAxisType.EqD0: DfsDLLWrapper.dfsGetItemAxisEqD0(pItem, out eumU, out axisEUMUnitString); nPointsX = 1; break; case SpaceAxisType.EqD1: DfsDLLWrapper.dfsGetItemAxisEqD1(pItem, out eumU, out axisEUMUnitString, out m_nPointsX, out XMinLimit, out DX); break; case SpaceAxisType.EqD2: DfsDLLWrapper.dfsGetItemAxisEqD2(pItem, out eumU, out axisEUMUnitString, out m_nPointsX, out m_nPointsY, out XMinLimit, out YMinLimit, out DX, out DY); break; case SpaceAxisType.EqD3: DfsDLLWrapper.dfsGetItemAxisEqD3(pItem, out eumU, out axisEUMUnitString, out m_nPointsX, out m_nPointsY, out m_nPointsZ, out XMinLimit, out YMinLimit, out ZMinLimit, out DX, out DY, out DZ); break; default: return(_err("Unsupported space axis " + sAxisType.ToString())); } axisEUMUnit = (eumUnit)eumU; return(0); }
/// <summary> /// Bulk read the times and data for a dfs0 file, putting it all in /// a matrix structure. /// <para> /// First column in the result are the times, then a column for each /// item in the file. There are as many rows as there are timesteps. /// All item data are converted to doubles. /// </para> /// </summary> public static double[,] ReadDfs0DataDouble(IDfsFile dfs0File) { int itemCount = dfs0File.ItemInfo.Count; int timestepCount = dfs0File.FileInfo.TimeAxis.NumberOfTimeSteps; double[,] res = new double[timestepCount, itemCount + 1]; // Preload a set of item data IDfsItemData[] itemDatas = new IDfsItemData[itemCount]; for (int j = 0; j < itemCount; j++) { itemDatas[j] = dfs0File.CreateEmptyItemData(j + 1); } dfs0File.Reset(); // Check if time axis is really a time axis, or if it is a non-time axis eumUnit timeUnit = dfs0File.FileInfo.TimeAxis.TimeUnit; bool isTimeUnit = EUMWrapper.eumUnitsEqv((int)eumUnit.eumUsec, (int)timeUnit); for (int i = 0; i < timestepCount; i++) { for (int j = 0; j < itemCount; j++) { IDfsItemData itemData = itemDatas[j]; dfs0File.ReadItemTimeStep(itemData, i); // First column is time, remaining colums are data if (j == 0) { if (isTimeUnit) { res[i, 0] = itemData.TimeInSeconds(dfs0File.FileInfo.TimeAxis); } else // not a time-unit, just return the value { res[i, 0] = itemData.Time; } } res[i, j + 1] = Convert.ToDouble(itemData.Data.GetValue(0)); } } return(res); }
/// <summary> Extract EUM quantity from NetCDF item </summary> private eumQuantity GetQuantityFromItem(Variable item) { eumItem eumitem = eumItem.eumIItemUndefined; eumUnit eumunit = eumUnit.eumUUnitUndefined; switch (item.Name) { case "Mean sea-level pressure": eumitem = eumItem.eumIPressure; break; case "10 metre U wind component": eumitem = eumItem.eumIWindVelocity; break; case "10 metre V wind component": eumitem = eumItem.eumIWindVelocity; break; } switch (item.Unit.ToLower()) { case "m s**-1": eumunit = eumUnit.eumUmeterPerSec; break; case "pa": eumunit = eumUnit.eumUPascal; break; } return(new eumQuantity(eumitem, eumunit)); }
/// <summary> /// Introductory example of how to load a dfs0 file with a non-time axis /// as the primary axis. The important part here is to NOT call /// the <code>data.TimeInSeconds()</code>, because that will fail. /// </summary> /// <param name="filename">path and name of Added_Mass.dfs0 test file</param> public static double ReadNonTimeAxisDfs0(string filename) { // Open the file as a generic dfs file IDfsFile dfs0File = DfsFileFactory.DfsGenericOpen(filename); // Header information is contained in the IDfsFileInfo IDfsFileInfo fileInfo = dfs0File.FileInfo; // The TimeAxis is not a time axis, but a regular axis int steps = fileInfo.TimeAxis.NumberOfTimeSteps; // 256 TimeAxisType timeAxisType = fileInfo.TimeAxis.TimeAxisType; // TimeNonEquidistant eumUnit timeUnit = fileInfo.TimeAxis.TimeUnit; // radian-per-second // Information on each of the dynamic items, here the first one IDfsSimpleDynamicItemInfo dynamicItemInfo = dfs0File.ItemInfo[0]; string nameOfFirstDynamicItem = dynamicItemInfo.Name; // "DOF_1-1" DfsSimpleType typeOfFirstDynamicItem = dynamicItemInfo.DataType; // Float ValueType valueType = dynamicItemInfo.ValueType; // Instantaneous // This iterates through all timesteps and items in the file // For performance reasons it is important to iterate over time steps // first and items second. double sum = 0; for (int i = 0; i < steps; i++) { for (int j = 1; j <= dfs0File.ItemInfo.Count; j++) { var data = (IDfsItemData <float>)dfs0File.ReadItemTimeStep(j, i); // The Time axis value is not a time value but in radian-per-second. double axisValue = data.Time; float value = data.Data[0]; sum += value; } } dfs0File.Close(); return(sum); }
/// <summary> Extract time properties </summary> private void FindTimeProperties(out eumUnit timeUnit, out DateTime startDateTime, out double timestep) { string unitstr = _time.Unit; string[] strings = unitstr.Split(new string[] { "since" }, 2, StringSplitOptions.RemoveEmptyEntries); string timeUnitStr = strings[0].Trim(); switch (timeUnitStr) { case "hours": timeUnit = eumUnit.eumUhour; break; default: throw new NotSupportedException("Time unit is not known: " + timeUnitStr); } string startTimeStr = strings[1].Trim(); startDateTime = DateTime.ParseExact(startTimeStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); // Assuming a fixed time step here double[] times = (double[])_time.Array; timestep = times[1] - times[0]; }