Пример #1
0
        /// <summary>
        /// Join data files
        /// </summary>
        /// <param name="inFiles">input nc files</param>
        /// <param name="outFile">joined output nc file</param>
        /// <param name="timeDimStr">time dimension name string</param>
        public static void JoinDataFiles_Time_bak1(List <string> inFiles, string outFile, string timeDimStr)
        {
            //Check number of selected files
            int fNum = inFiles.Count;

            if (fNum < 2)
            {
                MessageBox.Show("There should be at least two files!", "Error");
                return;
            }

            //Open the first file
            int            i, j;
            string         aFile     = inFiles[0];
            NetCDFDataInfo aDataInfo = new NetCDFDataInfo();

            aDataInfo.ReadDataInfo(aFile);
            //Change time dimension as unlimit
            for (i = 0; i < aDataInfo.Dimensions.Count; i++)
            {
                Dimension aDimS = aDataInfo.Dimensions[i];
                if (aDimS.DimName == timeDimStr)
                {
                    //aDimS.dimLen = -1;
                    //aDataInfo.dimList[i] = aDimS;
                    aDataInfo.unlimdimid = aDimS.DimId;
                    break;
                }
            }

            for (i = 0; i < aDataInfo.nvars; i++)
            {
                if (Global.MIMath.IsNumeric(aDataInfo.Variables[i].Name.Substring(0, 1)))
                {
                    aDataInfo.Variables[i].Name = 'V' + aDataInfo.Variables[i].Name;
                }
            }

            int tDimid = 0;

            NetCDF4.nc_inq_dimid(aDataInfo.ncid, timeDimStr, out tDimid);

            object[] sttu  = aDataInfo.GetStartTimeInfo();
            DateTime sTime = (DateTime)sttu[0];
            TimeUnit aTU   = (TimeUnit)sttu[1];

            //Create output nc file and write the data of the first file
            aDataInfo.CreateNCFile(outFile);

            //Write the data of first data file
            NetCDFDataInfo bDataInfo = new NetCDFDataInfo();

            bDataInfo.ReadDataInfo(inFiles[0]);
            for (i = 0; i < bDataInfo.nvars; i++)
            {
                Variable aVarS   = aDataInfo.Variables[i];
                object[] varData = new object[1];
                bDataInfo.GetVarData(aVarS, ref varData);

                int[] start = new int[aVarS.DimNumber];
                int[] count = new int[aVarS.DimNumber];
                for (int v = 0; v < aVarS.DimNumber; v++)
                {
                    start[v] = 0;
                    count[v] = bDataInfo.Dimensions[aVarS.Dimensions[v].DimId].DimLength;
                }
                aDataInfo.WriteVara(aVarS, start, count, varData);
            }

            //Join data
            //Add data
            for (i = 1; i < fNum; i++)
            {
                aFile     = inFiles[i];
                bDataInfo = new NetCDFDataInfo();
                bDataInfo.ReadDataInfo(aFile);

                int tDimNum = 1;
                NetCDF4.nc_inq_dimlen(aDataInfo.ncid, tDimid, out tDimNum);
                for (j = 0; j < bDataInfo.nvars; j++)
                {
                    Variable aVarS = bDataInfo.Variables[j];
                    int      vIdx  = aDataInfo.VariableNames.IndexOf(aVarS.Name);
                    if (vIdx < 0)
                    {
                        continue;
                    }

                    if (aVarS.DimNumber > 1)
                    {
                        if (Array.IndexOf(aVarS.DimIds, tDimid) < 0)
                        {
                            continue;
                        }

                        object[] varData = new object[1];
                        bDataInfo.GetVarData(aVarS, ref varData);

                        int[] start = new int[aVarS.DimNumber];
                        int[] count = new int[aVarS.DimNumber];
                        for (int v = 0; v < aVarS.DimNumber; v++)
                        {
                            start[v] = 0;
                            count[v] = bDataInfo.Dimensions[aVarS.Dimensions[v].DimId].DimLength;
                        }
                        start[Array.IndexOf(aVarS.DimIds, tDimid)] = tDimNum;
                        bDataInfo.WriteVaraData(aDataInfo.ncid, aDataInfo.Variables[vIdx].VarId, aVarS.NCType, start, count, varData);
                    }

                    if (aVarS.Name == timeDimStr)
                    {
                        object[] varData = new object[1];
                        bDataInfo.GetVarData(aVarS, ref varData);
                        sttu = bDataInfo.GetStartTimeInfo();
                        DateTime nTime = (DateTime)sttu[0];
                        TimeUnit nTU   = (TimeUnit)sttu[1];
                        if (DateTime.Compare(sTime, nTime) != 0)
                        {
                            double shift = 0.0;
                            switch (aTU)
                            {
                            case TimeUnit.Day:
                                shift = nTime.Subtract(sTime).TotalDays;
                                break;

                            case TimeUnit.Hour:
                                shift = nTime.Subtract(sTime).TotalHours;
                                break;

                            case TimeUnit.Minute:
                                shift = nTime.Subtract(sTime).TotalMinutes;
                                break;

                            case TimeUnit.Second:
                                shift = nTime.Subtract(sTime).TotalSeconds;
                                break;
                            }
                            for (int d = 0; d < varData.Length; d++)
                            {
                                varData[d] = (double)varData[d] + shift;
                            }
                        }

                        int[] start = new int[aVarS.DimNumber];
                        int[] count = new int[aVarS.DimNumber];
                        for (int v = 0; v < aVarS.DimNumber; v++)
                        {
                            start[v] = 0;
                            count[v] = bDataInfo.Dimensions[aVarS.Dimensions[v].DimId].DimLength;
                        }
                        start[Array.IndexOf(aVarS.DimIds, tDimid)] = tDimNum;
                        bDataInfo.WriteVaraData(aDataInfo.ncid, aDataInfo.Variables[vIdx].VarId, aVarS.NCType, start, count, varData);
                    }
                }
            }

            //Close data file
            aDataInfo.CloseNCFile();
        }