Beispiel #1
0
            public static Vibrate FromLines(IList <string> lines)
            {
                if (HDebug.Selftest())
                #region MyRegion
                {
                    Vibrate tvib  = FromLines(selftest);
                    Vector  tmass = new double[tvib.idx2freq_mode.First().Value.Item2.Length];
                    tmass.SetValue(1);
                    tvib.ToModes(tmass.ToArray());
                }
                #endregion
                if (lines == null)
                {
                    return(null);
                }

                try
                {
                    List <string> llines = new List <string>(lines);
                    for (int i = 0; i < llines.Count; i++)
                    {
                        string line = llines[i];
                        int    idx  = line.IndexOf('#');
                        if (idx >= 0)
                        {
                            line = line.Substring(0, idx);
                        }
                        line      = line.TrimEnd(' ');
                        llines[i] = line;
                    }
                    llines = llines.HRemoveAll("").ToList();
                    List <List <string> > groups = FromLines_CollectGroup(llines);

                    Dictionary <int, double> idx2eigval = null;
                    Dictionary <int, double> idx2freq   = null;
                    Dictionary <int, Tuple <double, Tuple <int, Vector>[]> > idx2freq_mode = new Dictionary <int, Tuple <double, Tuple <int, Vector>[]> >();
                    foreach (List <string> group in groups)
                    {
                        string header = group[0];

                        if (header.Contains("Eigenvalues"))
                        {
                            idx2eigval = FromLines_GetKeyValue(group);
                            continue;
                        }
                        if (header.Contains("Frequencies"))
                        {
                            idx2freq = FromLines_GetKeyValue(group);
                            foreach (int idx in idx2freq.Keys)
                            {
                                idx2freq_mode.Add(idx, null);
                            }
                            continue;
                        }
                        if (header.Contains("Mode"))
                        {
                            Tuple <int, Tuple <double, Tuple <int, Vector>[]> > idx_freq_mode = FromLines_GetMode(group);
                            int    idx  = idx_freq_mode.Item1;
                            double freq = idx_freq_mode.Item2.Item1;
                            Tuple <int, Vector>[] modevecs = idx_freq_mode.Item2.Item2;
                            if (modevecs.Length * 3 != idx2freq.Count)
                            {
                                throw new Exception("mode vector size is not matching");
                            }
                            HDebug.Assert(idx2freq != null);
                            HDebug.Assert(idx2freq[idx] == freq);
                            if (idx2freq_mode.ContainsKey(idx) == false)
                            {
                                throw new Exception("idx2freq_mode.ContainsKey(idx) == false");
                            }
                            if (idx2freq_mode[idx] != null)
                            {
                                throw new Exception("double assign idx2freq_mode[idx]");
                            }
                            HDebug.Assert(idx2freq_mode[idx] == null);
                            idx2freq_mode[idx] = idx_freq_mode.Item2;
                            continue;
                        }
                    }

                    foreach (int idx in idx2freq_mode.Keys)
                    {
                        if (idx2freq_mode[idx] == null)
                        {
                            throw new Exception("(idx2freq_mode[idx] == null) ==> exist not-assigned mode vector");
                        }
                    }

                    Vibrate vibrate = new Vibrate();
                    vibrate.idx2eigval    = idx2eigval;
                    vibrate.idx2freq      = idx2freq;
                    vibrate.idx2freq_mode = idx2freq_mode;

                    return(vibrate);
                }
                catch (Exception)
                {
                    HDebug.Assert(false);
                    return(null);
                }
            }