private void ReadExcel2007File(string filename)
        {
            var excelParameters = new Esmf.FundExcelParameterFile(filename);

            excelParameters.Load();

            foreach (Esmf.FundExcelParameterFile.Parameter p in excelParameters.Parameters)
            {
                string parameterName = p.Name.ToLower();
                int    parameterId   = -1;

                if (!_parameterIdsByName.TryGetValue(parameterName, out parameterId))
                {
                    parameterId = _nextFreeId;
                    _parameterIdsByName.Add(parameterName, parameterId);
                    _nextFreeId++;
                }

                if (p is Esmf.FundExcelParameterFile.NonDimensionalParameter)
                {
                    var typedExcelParameter = (Esmf.FundExcelParameterFile.NonDimensionalParameter)p;

                    var key = new ParameterElementKey(parameterId, parameterName);

                    var parameterValueDef = GetParameterValueDefinition(key, p.Type, typedExcelParameter.Value);

                    if (parameterValueDef.GetElementType() == typeof(double))
                    {
                        var parameter = new ParameterNonDimensional <double>(parameterName, parameterId, (ParameterElement <double>)parameterValueDef);

                        Add(parameter);
                    }
                    else if (parameterValueDef.GetElementType() == typeof(Timestep))
                    {
                        var parameter = new ParameterNonDimensional <Timestep>(parameterName, parameterId, (ParameterElement <Timestep>)parameterValueDef);

                        Add(parameter);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                else if (p is Esmf.FundExcelParameterFile.OneDimensionalParameter)
                {
                    var pp = (Esmf.FundExcelParameterFile.OneDimensionalParameter)p;

                    var parameterValueDef0 = GetParameterValueDefinition(null, p.Type, pp[0]);

                    if (parameterValueDef0.GetElementType() == typeof(double))
                    {
                        ParameterElement <double>[] values = new ParameterElement <double> [pp.Length];

                        for (int i = 0; i < pp.Length; i++)
                        {
                            var key = new ParameterElementKey1Dimensional(parameterId, parameterName, i);
                            values[i] = (ParameterElement <double>)GetParameterValueDefinition(key, p.Type, pp[i]);
                        }
                        var parameter = new ParameterOneDimensional <double>(parameterName, parameterId, values);

                        Add(parameter);
                    }
                    else if (parameterValueDef0.GetElementType() == typeof(Timestep))
                    {
                        ParameterElement <Timestep>[] values = new ParameterElement <Timestep> [pp.Length];

                        for (int i = 0; i < pp.Length; i++)
                        {
                            var key = new ParameterElementKey1Dimensional(parameterId, parameterName, i);
                            values[i] = (ParameterElement <Timestep>)GetParameterValueDefinition(key, p.Type, pp[i]);
                        }
                        var parameter = new ParameterOneDimensional <Timestep>(parameterName, parameterId, values);

                        Add(parameter);
                    }
                    else if (parameterValueDef0.GetElementType() == typeof(string))
                    {
                        ParameterElement <string>[] values = new ParameterElement <string> [pp.Length];

                        for (int i = 0; i < pp.Length; i++)
                        {
                            var key = new ParameterElementKey1Dimensional(parameterId, parameterName, i);
                            values[i] = (ParameterElement <string>)GetParameterValueDefinition(key, p.Type, pp[i]);
                        }
                        var parameter = new ParameterOneDimensional <string>(parameterName, parameterId, values);

                        Add(parameter);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                else if (p is Esmf.FundExcelParameterFile.TwoDimensionalParameter)
                {
                    var pp = (Esmf.FundExcelParameterFile.TwoDimensionalParameter)p;

                    var parameterValueDef0 = GetParameterValueDefinition(null, p.Type, pp[0, 0]);

                    if (parameterValueDef0.GetElementType() == typeof(double))
                    {
                        ParameterElement <double>[,] values = new ParameterElement <double> [pp.Count0, pp.Count1];

                        for (int i = 0; i < pp.Count0; i++)
                        {
                            for (int l = 0; l < pp.Count1; l++)
                            {
                                var key = new ParameterElementKey2Dimensional(parameterId, parameterName, i, l);
                                values[i, l] = (ParameterElement <double>)GetParameterValueDefinition(key, p.Type, pp[i, l]);
                            }
                        }

                        var parameter = new Parameter2Dimensional <double>(parameterName, parameterId, values);

                        Add(parameter);
                    }
                    else if (parameterValueDef0.GetElementType() == typeof(Timestep))
                    {
                        ParameterElement <Timestep>[,] values = new ParameterElement <Timestep> [pp.Count0, pp.Count1];

                        for (int i = 0; i < pp.Count0; i++)
                        {
                            for (int l = 0; l < pp.Count1; l++)
                            {
                                var key = new ParameterElementKey2Dimensional(parameterId, parameterName, i, l);
                                values[i, l] = (ParameterElement <Timestep>)GetParameterValueDefinition(key, p.Type, pp[i, l]);
                            }
                        }

                        var parameter = new Parameter2Dimensional <Timestep>(parameterName, parameterId, values);

                        Add(parameter);
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
                ;
            }
            ;
        }
Esempio n. 2
0
        public void ReadDirectory(string directoryname)
        {
            var filenames = Directory.EnumerateFiles(directoryname);

            foreach (var filename in filenames)
            {
                string parameterName = Path.GetFileNameWithoutExtension(filename).ToLowerInvariant();
                int    parameterId   = -1;

                if (!_parameterIdsByName.TryGetValue(parameterName, out parameterId))
                {
                    parameterId = _nextFreeId;
                    _parameterIdsByName.Add(parameterName, parameterId);
                    _nextFreeId++;
                }

                var lines = (from line in File.ReadLines(filename)
                             let uncommented = line.Contains('#') ? line.Substring(0, line.IndexOf('#')) : line
                                               let trimmed = uncommented.Trim()
                                                             where trimmed.Length > 0
                                                             let columns = trimmed.Split(',')
                                                                           select columns).ToArray();

                if (lines.Select(l => l.Length).Distinct().Count() > 1)
                {
                    throw new InvalidOperationException(String.Format("Parameter file {0} has different columns counts in different lines.", filename));
                }

                int columncount = lines.Select(l => l.Length).Distinct().First();

                if (columncount == 1)
                {
                    var key = new ParameterElementKey(parameterId, parameterName);

                    var parameterValueDef = GetParameterValueDefinition2(key, lines[0][0]);

                    if (parameterValueDef.GetElementType() == typeof(double))
                    {
                        var parameter = new ParameterNonDimensional <double>(parameterName, parameterId, (ParameterElement <double>)parameterValueDef);

                        Add(parameter);
                    }
                    else if (parameterValueDef.GetElementType() == typeof(Timestep))
                    {
                        var parameter = new ParameterNonDimensional <Timestep>(parameterName, parameterId, (ParameterElement <Timestep>)parameterValueDef);

                        Add(parameter);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                else if (columncount == 2)
                {
                    var values = (from i in Enumerable.Range(0, lines.Length)
                                  let key = new ParameterElementKey1Dimensional(parameterId, parameterName, i)
                                            select GetParameterValueDefinition2(key, lines[i][1])).ToArray();

                    if (values.Select(i => i.GetElementType()).Distinct().Count() != 1)
                    {
                        throw new InvalidOperationException("Cannot load 1 dimensional parameter with different data types");
                    }

                    Type datatype = values.Select(i => i.GetElementType()).First();

                    if (datatype == typeof(double))
                    {
                        var parameter = new ParameterOneDimensional <double>(parameterName, parameterId, values.Cast <ParameterElement <double> >().ToArray());
                        Add(parameter);
                    }
                    else if (datatype == typeof(string))
                    {
                        var parameter = new ParameterOneDimensional <string>(parameterName, parameterId, values.Cast <ParameterElement <string> >().ToArray());
                        Add(parameter);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                else if (columncount == 3)
                {
                    var index0 = lines.Select(i => i[0]).Distinct().ToList();
                    var index1 = lines.Select(i => i[1]).Distinct().ToList();

                    var values = (from i in Enumerable.Range(0, lines.Length)
                                  let key = new ParameterElementKey2Dimensional(parameterId, parameterName, index0.IndexOf(lines[i][0]), index1.IndexOf(lines[i][1]))
                                            select GetParameterValueDefinition2(key, lines[i][2])).ToArray();

                    if (values.Select(i => i.GetElementType()).Distinct().Count() != 1)
                    {
                        throw new InvalidOperationException("Cannot load 2 dimensional parameter with different data types");
                    }

                    Type datatype = values.Select(i => i.GetElementType()).First();

                    if (datatype == typeof(double))
                    {
                        ParameterElement <double>[,] vals = new ParameterElement <double> [index0.Count, index1.Count];

                        foreach (var v in values)
                        {
                            var key = (ParameterElementKey2Dimensional)v.Key;
                            vals[key.D1, key.D2] = (ParameterElement <double>)v;
                        }

                        for (int i = 0; i < index0.Count; i++)
                        {
                            for (int l = 0; l < index1.Count; l++)
                            {
                                if (vals[i, l] == null)
                                {
                                    throw new InvalidOperationException("Missing element in 2 dimensional parameter");
                                }
                            }
                        }

                        var parameter = new Parameter2Dimensional <double>(parameterName, parameterId, vals);
                        Add(parameter);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
                else
                {
                    throw new InvalidOperationException("Cannot read parameter files with more than three columns.");
                }
            }
            ;
        }