예제 #1
0
        private void IndexColumns()
        {
            // assume first row is header with names
            var header = _sheet.Rows[0];

            for (var index = 0; index < header.Cells.Length; index++)
            {
                var name = header.TextCells[index];
                if (!String.IsNullOrWhiteSpace(name))
                {
                    var column = _columns.FirstOrDefault(x => String.Compare(x, name, true) == 0);
                    if (column == null)
                    {
                        UnknownColumns.Add(column);                         // unknown column
                    }
                    else
                    {
                        ColumnIndex.Add(column, index);
                    }
                }
            }

            // figure out which columns are missing
            foreach (var col in _columns)
            {
                if (!ColumnIndex.ContainsKey(col))
                {
                    MissingColumns.Add(col);
                }
            }
        }
 protected virtual void AddFields(int i, string name, PropertyInfo propertyInfo)
 {
     ColumnNames.Add(name, propertyInfo);
     ColumnIndex.Add(i, propertyInfo);
     IndexToName.Add(i, name);
     NameToIndex.Add(name, i);
 }
예제 #3
0
        /// <summary>
        /// provides data collected during a solver run in tabular form
        /// </summary>
        /// <param name="ErrorOrResidual">
        /// - true: output is error against exact solution (if provided) during each iteration
        /// - false: output is residual against exact solution (if provided) during each iteration
        /// </param>
        /// <param name="SepVars">
        /// - true: separate column for each variable
        /// - false:  l2-norm over all variables
        /// </param>
        /// <param name="SepPoly">
        /// - true:   separate column for each polynomial degree
        /// - false:  l2-norm over all polynomial degrees
        /// </param>
        /// <param name="SepLev">
        /// - true:   separate column for each multi-grid level
        /// - false:  l2-norm over all multi-grid levels
        /// </param>
        /// <param name="Titels">
        /// Column names/titles
        /// </param>
        /// <param name="ConvTrendData">
        /// data table:
        /// - columns: correspond to <paramref name="Titels"/>
        /// - rows: solver iterations
        /// </param>
        public void WriteTrendToTable(bool ErrorOrResidual, bool SepVars, bool SepPoly, bool SepLev, out string[] Titels, out MultidimensionalArray ConvTrendData)
        {
            var data = ErrorOrResidual ? ErrNormTrend : ResNormTrend;

            List <string> titleS = new List <string>();
            int           iCol   = 0;
            Dictionary <(int MGlevel, int iVar, int deg), int> ColumnIndex = new Dictionary <(int, int, int), int>();

            foreach (var kv in data)
            {
                int iLevel = kv.Key.Item1;
                int pDG    = kv.Key.Item3;
                int iVar   = kv.Key.Item2;

                string title;
                {
                    if (SepVars)
                    {
                        title = $"Var{iVar}";
                    }
                    else
                    {
                        title = "";
                    }

                    if (SepLev)
                    {
                        if (title.Length > 0)
                        {
                            title = title + ",";
                        }
                        title = title + $"Mglv{iLevel}";
                    }

                    if (SepPoly)
                    {
                        if (title.Length > 0)
                        {
                            title = title + ",";
                        }
                        title = title + $"p={pDG}";
                    }

                    if (title.Length > 0)
                    {
                        title = "_" + title;
                    }

                    if (ErrorOrResidual)
                    {
                        title = "Err" + title;
                    }
                    else
                    {
                        title = "Res" + title;
                    }
                }

                /*
                 * if (SepPoly == false && SepLev == false) {
                 *  title = string.Format("(var#{0})", iVar);
                 * } else if (SepPoly == false && SepLev == true) {
                 *  title = string.Format("(var#{0},mg.lev.{1})", iVar, iLevel);
                 * } else if (SepPoly == true && SepLev == false) {
                 *  title = string.Format("(var#{0},p={1})", iVar, pDG);
                 * } else if (SepPoly == true && SepLev == true) {
                 *  title = string.Format("(var#{0},mg.lev.{1},p={2})", iVar, iLevel, pDG);
                 * } else {
                 *  throw new ApplicationException();
                 * }
                 */

                int iColKv = titleS.IndexOf(title);
                if (iColKv < 0)
                {
                    titleS.Add(title);
                    iColKv = iCol;
                    iCol++;
                }
                ColumnIndex.Add(kv.Key, iColKv);
            }
            Titels        = titleS.ToArray();
            ConvTrendData = MultidimensionalArray.Create(data.First().Value.Count, titleS.Count);

            foreach (var kv in data)   // over all data columns

            {
                double[] ColumnSquared = kv.Value.Select(val => val.Pow2()).ToArray();

                if (ConvTrendData.GetLength(0) != ColumnSquared.Length)
                {
                    throw new ApplicationException();
                }

                int iColkv = ColumnIndex[kv.Key]; // output column index in which we sum up the column
                ConvTrendData.ExtractSubArrayShallow(-1, iColkv).AccVector(1.0, ColumnSquared);
            }
            ConvTrendData.ApplyAll(x => Math.Sqrt(x));
        }