Example #1
0
        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);
        }
Example #2
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);
        }
Example #3
0
        /// <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));
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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];
        }