Exemple #1
0
        /// <summary>
        /// Add time dimension
        /// </summary>
        /// <param name="inFile">input nc file</param>
        /// <param name="outFile">output nc file</param>
        /// <param name="aTime">time</param>
        /// <param name="timeUnit">time unit (days, minutes, seconds)</param>
        public static void AddTimeDimension(string inFile, string outFile, DateTime aTime, string timeUnit)
        {
            //Set data info
            NetCDFDataInfo aDataInfo = new NetCDFDataInfo();

            aDataInfo.ReadDataInfo(inFile);
            NetCDFDataInfo bDataInfo = (NetCDFDataInfo)aDataInfo.Clone();

            //Check variables if time included
            List <string> varList = new List <string>();
            int           j;

            for (j = 0; j < aDataInfo.Variables.Count; j++)
            {
                varList.Add(aDataInfo.Variables[j].Name.ToLower());
            }
            if (varList.Contains("time"))
            {
                return;
            }

            //set start time of the data
            DateTime sTime  = new DateTime();
            double   tValue = 0;

            switch (timeUnit.ToLower())
            {
            case "minutes":
                sTime  = aTime.AddYears(-1);
                tValue = (aTime - sTime).TotalMinutes;
                break;

            case "seconds":
                sTime  = aTime.AddYears(-1);
                tValue = (aTime - sTime).TotalSeconds;
                break;

            default:
                sTime  = DateTime.Parse("1800-1-1 00:00:00");
                tValue = (aTime - sTime).TotalDays;
                break;
            }

            //Set data info, Add time dimension and variable
            Dimension tDim = new Dimension();

            tDim.DimName   = "time";
            tDim.DimLength = 1;
            tDim.DimId     = bDataInfo.ndims;
            bDataInfo.AddDimension(tDim);

            Variable         tVar    = new Variable();
            List <AttStruct> attList = new List <AttStruct>();
            AttStruct        aAtts   = new AttStruct();

            aAtts.attName  = "units";
            aAtts.NCType   = NetCDF4.NcType.NC_CHAR;
            aAtts.attValue = timeUnit.ToLower() + " since " + sTime.ToString("yyyy-M-d HH:mm:ss");
            aAtts.attLen   = ((string)aAtts.attValue).Length;
            attList.Add(aAtts);
            aAtts          = new AttStruct();
            aAtts.attName  = "long_name";
            aAtts.NCType   = NetCDF4.NcType.NC_CHAR;
            aAtts.attValue = "Time";
            aAtts.attLen   = ((string)aAtts.attValue).Length;
            attList.Add(aAtts);
            //aAtts = new AttStruct();
            //aAtts.attName = "delta_t";
            //aAtts.ncType = NetCDF4.NcType.NC_CHAR;
            //aAtts.attValue = "0000-00-01 00:00:00";
            //aAtts.attLen = ((string)aAtts.attValue).Length;
            //attList.Add(aAtts);
            tVar.Attributes = attList;
            tVar.Dimensions.Add(tDim);
            tVar.AttNumber = attList.Count;
            tVar.NCType    = NetCDF4.NcType.NC_DOUBLE;
            //tVar.nDims = 1;
            tVar.VarId = bDataInfo.nvars;
            tVar.Name  = "time";
            //tVar.isDataVar = false;
            bDataInfo.AddVariable(tVar);
            for (j = 0; j < bDataInfo.Variables.Count; j++)
            {
                Variable aVarS = bDataInfo.Variables[j];
                if (aVarS.DimNumber > 1)
                {
                    aVarS.Dimensions.Insert(0, tDim);
                    //for (int d = 0; d < aVarS.DimNumber; d++)
                    //    aVarS.Dimensions.Add(aVarS.Dimensions[d]);
                    //aVarS.nDims += 1;
                    bDataInfo.Variables[j] = aVarS;
                }
            }

            //Get and set data array
            object[] dataArray = new object[0];
            int      cLen      = 0;

            for (j = 0; j < aDataInfo.nvars; j++)
            {
                object[] varData = new object[1];
                if (aDataInfo.GetVarData(aDataInfo.Variables[j], ref varData))
                {
                    Array.Resize(ref dataArray, cLen + varData.Length);
                    Array.Copy(varData, 0, dataArray, cLen, varData.Length);
                    cLen = dataArray.Length;
                }
            }
            Array.Resize(ref dataArray, cLen + 1);
            dataArray[cLen] = tValue;

            //Write NetCDF data file
            bDataInfo.WriteNetCDFData(outFile, dataArray);
        }
        private void B_AddTimeDim_Click(object sender, EventArgs e)
        {
            //Check number of selected files
            int fNum = LB_SelectedFiles.Items.Count;

            if (fNum == 0)
            {
                MessageBox.Show("No selected files!", "Error");
                return;
            }

            //Show progressbar
            toolStripProgressBar1.Visible = true;
            toolStripProgressBar1.Value   = 0;
            this.Cursor = Cursors.WaitCursor;

            //File loop
            int i, j;
            //NetCDFData CNetCDFData = new NetCDFData();
            NetCDFDataInfo aDataInfo = new NetCDFDataInfo();
            List <string>  varList   = new List <string>();

            for (i = 0; i < fNum; i++)
            {
                string aFile = Path.Combine(TB_DataFolder.Text, LB_SelectedFiles.Items[i].ToString());
                aDataInfo = new NetCDFDataInfo();
                aDataInfo.ReadDataInfo(aFile);
                //CNetCDFData.ReadNetCDFDataInfo(aFile, ref aDataInfo);
                string         outFile   = Path.Combine(TB_DataFolder.Text, "T_" + LB_SelectedFiles.Items[i].ToString());
                NetCDFDataInfo bDataInfo = (NetCDFDataInfo)aDataInfo.Clone();
                //bDataInfo.CreatNCFile(outFile);

                //Check variables if time included
                varList.Clear();
                for (j = 0; j < aDataInfo.Variables.Count; j++)
                {
                    varList.Add(aDataInfo.Variables[j].Name.ToLower());
                }
                if (varList.Contains("time"))
                {
                    continue;
                }

                //Read time of the data
                string timeStr = LB_SelectedFiles.Items[i].ToString();
                timeStr = timeStr.Split('.')[1].TrimStart('A');
                int      days  = int.Parse(timeStr.Substring(4));
                DateTime aTime = DateTime.Parse(timeStr.Substring(0, 4) + "-01-01");
                aTime = aTime.AddDays(days - 1);
                DateTime sTime = DateTime.Parse("0001-1-1 00:00:00");

                //Set data info, Add time dimension and variable
                Dimension tDim = new Dimension();
                tDim.DimName   = "time";
                tDim.DimLength = 1;
                tDim.DimId     = bDataInfo.ndims;
                bDataInfo.AddDimension(tDim);

                Variable         tVar    = new Variable();
                List <AttStruct> attList = new List <AttStruct>();
                AttStruct        aAtts   = new AttStruct();
                aAtts.attName  = "units";
                aAtts.NCType   = NetCDF4.NcType.NC_CHAR;
                aAtts.attValue = "days since 1-1-1 00:00:00";
                aAtts.attLen   = ((string)aAtts.attValue).Length;
                attList.Add(aAtts);
                aAtts          = new AttStruct();
                aAtts.attName  = "long_name";
                aAtts.NCType   = NetCDF4.NcType.NC_CHAR;
                aAtts.attValue = "Time";
                aAtts.attLen   = ((string)aAtts.attValue).Length;
                attList.Add(aAtts);
                aAtts          = new AttStruct();
                aAtts.attName  = "delta_t";
                aAtts.NCType   = NetCDF4.NcType.NC_CHAR;
                aAtts.attValue = "0000-00-01 00:00:00";
                aAtts.attLen   = ((string)aAtts.attValue).Length;
                attList.Add(aAtts);
                tVar.Attributes = attList;
                tVar.Dimensions.Add(tDim);
                tVar.AttNumber = attList.Count;
                tVar.NCType    = NetCDF4.NcType.NC_DOUBLE;
                //tVar.nDims = 1;
                tVar.VarId = bDataInfo.nvars;
                tVar.Name  = "time";
                //tVar.isDataVar = false;
                bDataInfo.AddVariable(tVar);
                for (j = 0; j < bDataInfo.Variables.Count; j++)
                {
                    Variable aVarS = bDataInfo.Variables[j];
                    if (aVarS.DimNumber > 1)
                    {
                        aVarS.Dimensions.Add(tDim);
                        for (int d = 0; d < aVarS.DimNumber; d++)
                        {
                            aVarS.Dimensions.Add(aVarS.Dimensions[d]);
                        }

                        //aVarS.nDims += 1;
                        bDataInfo.Variables[j] = aVarS;
                    }
                }

                //Get and set data array
                object[] dataArray = new object[0];
                int      cLen      = 0;
                for (j = 0; j < aDataInfo.nvars; j++)
                {
                    object[] varData = new object[1];
                    if (aDataInfo.GetVarData(aDataInfo.Variables[j], ref varData))
                    {
                        Array.Resize(ref dataArray, cLen + varData.Length);
                        Array.Copy(varData, 0, dataArray, cLen, varData.Length);
                        cLen = dataArray.Length;
                    }
                }
                Array.Resize(ref dataArray, cLen + 1);
                dataArray[cLen] = (aTime - sTime).Days;

                //Write NetCDF data file
                bDataInfo.WriteNetCDFData(outFile, dataArray);
                //CNetCDFData.WriteNetCDFData(outFile, bDataInfo, dataArray);

                //Set progressbar value
                toolStripProgressBar1.Value = (int)((double)(i + 1) / (double)fNum * 100);
                Application.DoEvents();
            }

            //Hide progressbar
            toolStripProgressBar1.Visible = false;
            toolStripProgressBar1.Value   = 0;
            this.Cursor = Cursors.Default;
        }