예제 #1
0
        public MQTT_Handling(ConsoleOutputLogger Logger)
        {
            // create client instance
            client              = new MqttClient(IPAddress.Parse(MQTTBindingConfiguration.MQTTBindingConfigFile.mqtt_broker_host), MQTTBindingConfiguration.MQTTBindingConfigFile.mqtt_broker_port, false, null, null, MqttSslProtocols.None);
            clientId            = Guid.NewGuid().ToString();
            ConsoleOutputLogger = Logger;
            // connect
            try
            {
                client.Connect(clientId);

                if (client.IsConnected)
                {
                    ConsoleOutputLogger.WriteLine("MQTT Binding: Successfully connected!");
                }
                else
                {
                    ConsoleOutputLogger.WriteLine("MQTT Binding: Connection Problem - could not connect!");
                }
            }
            catch (Exception e)
            {
                ConsoleOutputLogger.WriteLine("MQTT Binding Exception - " + e.Message);
            }
        }
예제 #2
0
        public void process()
        {
            // we can't use a StreamReader for input, because it buffers up extra data on us inside it's
            // "processed" view of the world, and we want the data raw after the headers
            inputStream = new BufferedStream(socket.GetStream());

            // we probably shouldn't be using a streamwriter for all output from handlers either
            outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
            try {
                parseRequest();
                readHeaders();
                if (http_method.Equals("GET"))
                {
                    handleGETRequest();
                }
                else if (http_method.Equals("POST"))
                {
                    handlePOSTRequest();
                }
            } catch (Exception e) {
                ConsoleOutputLogger.WriteLine("Exception: " + e.ToString());
                writeFailure();
            }
            outputStream.Flush();
            // bs.Flush(); // flush any remaining output
            inputStream = null; outputStream = null;             // bs = null;
            socket.Close();
        }
예제 #3
0
 public HttpServer(Int32 HTTP_Port, String HTTP_ListeningIP, String HTTP_DocumentRoot, ConsoleOutputLogger Logger)
 {
     HTTPServer_Port         = HTTP_Port;
     HTTPServer_ListeningIP  = HTTP_ListeningIP;
     HTTPServer_DocumentRoot = HTTP_DocumentRoot;
     ConsoleOutputLogger     = Logger;
     ThumbCache = new ThumbnailCache(GalleryServer.Properties.Settings.Default.CacheImages);
 }
예제 #4
0
 /// <summary>
 /// Each HTTP processor object handles one client.  If Keep-Alive is enabled then this
 /// object will be reused for subsequent requests until the client breaks keep-alive.
 /// This usually happens when it times out.  Because this could easily lead to a DoS
 /// attack, we keep track of the number of open processors and only allow 100 to be
 /// persistent active at any one time.  Additionally, we do not allow more than 500
 /// outstanding requests.
 /// </summary>
 /// <param name="docRoot">Root-Directory of the HTTP Server</param>
 /// <param name="s">the Socket to work with</param>
 /// <param name="webserver">the "master" HttpServer Object of this Client</param>
 public HttpProcessor(Socket s, String HTTP_DocumentRoot, ConsoleOutputLogger Logger, ThumbnailCache Thumb_Cache)
 {
     this.s = s;
     HTTPServer_DocumentRoot = HTTP_DocumentRoot;
     docRootFile             = new FileInfo(HTTPServer_DocumentRoot);
     headers             = new Hashtable();
     ConsoleOutputLogger = Logger;
     FileManager         = new FileManagement();
     ThumbCache          = Thumb_Cache;
 }
예제 #5
0
 public HttpServer(Int32 HTTP_Port, String HTTP_ListeningIP, String HTTP_DocumentRoot, TinyOnDiskStorage _Storage, TinyOnDiskStorage _LatitudeStorage, XS1Configuration _XS1_Configuration, ConsoleOutputLogger Logger, MAXMonitoringThread _ELVMAXMonitoringThread, bool AuthEnabled, String Uname, String Pword, String StartAdrFilter)
 {
     HTTPServer_Port         = HTTP_Port;
     HTTPServer_ListeningIP  = HTTP_ListeningIP;
     HTTPServer_DocumentRoot = HTTP_DocumentRoot;
     Storage                = _Storage;
     XS1_Configuration      = _XS1_Configuration;
     ConsoleOutputLogger    = Logger;
     ELVMAXMonitoringThread = _ELVMAXMonitoringThread;
     LatitudeStorage        = _LatitudeStorage;
     AuthorizationEnabled   = AuthEnabled;
     Username               = Uname;
     Password               = Pword;
     AuthDisabledForAdressesThatStartWith = StartAdrFilter;
 }
        public void ExecuteAllScriptsForDatabaseSmokeTest()
        {
            // Setup
            string        pathName      = "ExecuteAllScriptsForDatabaseSmokeTest";
            DirectoryInfo directoryInfo = DirectoryStructureHelper.CreateValidDatabaseDirStructure(pathName);

            DirectoryStructureHelper.CreateEmptyFile(Path.Combine(directoryInfo.GetDirectories()[1].FullName, "1.0_TestScript.sql"));

            IFileStructurePolicy fileStucturePolicyComposite = new FileStructurePolicyComposite();

            IDatabaseConnectionFactory connectionFactory = CreateMockDatabaseConnectionFactory();

            IOutputLogger       outputLogger  = new ConsoleOutputLogger();
            DatabaseReleaseTool dbreleaseTool = new DatabaseReleaseTool(
                directoryInfo.FullName,
                null,
                fileStucturePolicyComposite,
                outputLogger,
                _connectionStringFactory,
                connectionFactory);

            string fromVersion = "1.0.0.0";
            string toVersion   = "2.0";

            DatabaseConnectionParameters parameters = new DatabaseConnectionParameters {
                DatabaseType = DatabaseType.MsSql
            };

            parameters.CreationType       = ConnectionStringCreationType.FromArguments;
            parameters.Arguments.Hostname = ".";
            parameters.Arguments.Username = "******";
            parameters.Arguments.Password = "******";
            parameters.Arguments.Database = "testdatabase";

            // Act
            ExcecutionResult result = dbreleaseTool.ExecuteAllScriptsForDatabase(fromVersion, toVersion, parameters, null);

            Assert.IsTrue(result.Success, string.Join("|", result.Errors.ToArray()));
            Assert.IsEmpty(result.Errors);
        }
예제 #7
0
        public MQTT_Handling(ConsoleOutputLogger Logger)
        {
            // create client instance 
            client = new MqttClient(IPAddress.Parse(MQTTBindingConfiguration.MQTTBindingConfigFile.mqtt_broker_host),MQTTBindingConfiguration.MQTTBindingConfigFile.mqtt_broker_port,false,null,null,MqttSslProtocols.None);
            clientId = Guid.NewGuid().ToString();
            ConsoleOutputLogger = Logger;
            // connect
            try
            {
                client.Connect(clientId);

                if (client.IsConnected)
                    ConsoleOutputLogger.WriteLine("MQTT Binding: Successfully connected!");
                else
                    ConsoleOutputLogger.WriteLine("MQTT Binding: Connection Problem - could not connect!");
            }
            catch(Exception e)
            {
                ConsoleOutputLogger.WriteLine("MQTT Binding Exception - " + e.Message);
            }
            
        }
예제 #8
0
파일: JSONData.cs 프로젝트: devrez/hacs
 public JSONData(TinyOnDiskStorage sensor_data_storage, ConsoleOutputLogger Logger)
 {
     sensor_data          = sensor_data_storage;
     ConsoleOutputLogger_ = Logger;
 }
예제 #9
0
파일: JSONData.cs 프로젝트: pereritob/hacs
 public JSONData(TinyOnDiskStorage sensor_data_storage, ConsoleOutputLogger Logger)
 {
     sensor_data = sensor_data_storage;
     ConsoleOutputLogger_ = Logger;
 }
예제 #10
0
        public Dictionary <string, List <Simulation> > Open(ConsoleOutputLogger consoleoutput, string filename)
        {
            try
            {
                ConsoleOutput = consoleoutput;
                FileName      = filename;
                var path = Path.GetDirectoryName(filename);
                OutputsDirectory = Path.Combine(path, "Outputs");
                if (RemapDictionary != null)
                {
                    AddConsoleOutput($"Opening {filename}...");
                    if (File.Exists(filename))
                    {
                        var type = Path.GetExtension(filename.ToLower());
                        if (type == ".hlk")
                        {
                            var         datasets    = new Dictionary <string, ParameterDataSet>();
                            var         datafiles   = new Dictionary <string, P51DataFile>();
                            var         alldatasets = new List <ParameterDataSet>();
                            XmlDocument Doc         = new XmlDocument();
                            Doc.Load(filename);
                            var parameterdatasets = ExtractParameterDataSetFileNames(Doc);

                            foreach (var item in parameterdatasets)
                            {
                                if (IsValidateType(item))
                                {
                                    var    itemfilename = Path.GetFileName(item);
                                    string updateditem  = item;
                                    if (!File.Exists(item))
                                    {
                                        var oldpathname1 = Path.GetDirectoryName(item);
                                        var oldpathname  = Path.GetDirectoryName(oldpathname1);
                                        updateditem = item.Replace(oldpathname, path).ToLower();
                                    }

                                    if (updateditem.Contains("p51"))
                                    {
                                        var datafile = new P51DataFile(updateditem);

                                        datafiles.Add(itemfilename, datafile);
                                    }
                                    else
                                    {
                                        var dataset = ExtractParameterDataSet(updateditem);
                                        if (dataset != null)
                                        {
                                            datasets.Add(itemfilename, dataset);
                                            alldatasets.Add(dataset);
                                        }
                                        else
                                        {
                                            AddErrorOutput($"CORRUPTED PARAMETERSET -Couldn't read {item}");
                                        }
                                    }
                                }
                            }
                            DataFiles          = datafiles.Select(x => x.Value).ToList();
                            Datasets           = alldatasets;
                            Simulations        = ExtractSimulations(Doc, datasets, datafiles);
                            GroupedSimulations = GroupSimulations();
                            GenerateInitialConsoleOutput(filename, alldatasets, datafiles);
                            return(GroupedSimulations);
                        }
                    }
                    else
                    {
                        AddErrorOutput($"File note found ({filename})");
                    }
                }
                else
                {
                    AddErrorOutput($"Remap dictionary could not be found");
                    throw new Exception("Fatal Error - Remap dictionary not found");
                }
            }
            catch (Exception ex)
            {
                AddErrorOutput($"Exception Caught: {ex}");
            }
            return(null);
        }
예제 #11
0
        static void Main(string[] args)
        {
            try
            {
                if (args != null && args.Length > 0 && args[0].Contains(".hlk"))
                {
                    var consoleoutput  = new ConsoleOutputLogger(true);
                    var argstrings     = string.Join(",", args);
                    var inputspath     = args[0];
                    var deleteExisting = argstrings.Contains("-x");
                    var outputdaily    = argstrings.Contains("-d");
                    var outputmonthly  = argstrings.Contains("-m");
                    var outputyear     = argstrings.Contains("-y");
                    var type           = outputyear ? HowLeakyOutputType.YearlyCsv:(outputmonthly?HowLeakyOutputType.MonthlyCsv: HowLeakyOutputType.DailyCsv);
                    var outputscsv     = GetOutputsCSV(args);
                    var cores          = GetCores(args);
                    var controller     = new SimulationController();
                    var project        = new ProjectHLK();
                    project.Open(consoleoutput, inputspath);
                    try
                    {
                        project.AddConsoleOutput("Preparing to rerun all simulations...");
                        project.AddConsoleOutput($"Outputs will be saved in {project.OutputsDirectory}...");
                        if (deleteExisting)
                        {
                            if (Directory.Exists(project.OutputsDirectory))
                            {
                                var files = Directory.GetFiles(project.OutputsDirectory, "*.hlkbinout", SearchOption.AllDirectories).ToList();
                                if (files.Count > 0)
                                {
                                    project.AddConsoleOutput($"Please wait... deleting {files.Count} existing binary output files");
                                    foreach (var file in files)
                                    {
                                        File.Delete(file);
                                    }
                                }
                                var files2 = Directory.GetFiles(project.OutputsDirectory, "*.csv", SearchOption.AllDirectories).ToList();
                                if (files2.Count > 0)
                                {
                                    project.AddConsoleOutput($"Please wait... deleting {files2.Count} existing csv output files");
                                    foreach (var file in files2)
                                    {
                                        File.Delete(file);
                                    }
                                }
                            }
                        }

                        SimulationEngineExecute(project, outputscsv, cores, type, null);
                    }
                    catch (Exception ex)
                    {
                        project.AddErrorOutput(ex.ToString());
                    }
                }
                else
                {
                    Console.WriteLine("Input parameters not configured correctly. Use:");
                    Console.WriteLine("   howleakyconsole \"<projectname.hlk>\" -<optional parameters>");
                    Console.WriteLine("Optional parameters include:");
                    Console.WriteLine("   -x : delete existing outputs");
                    Console.WriteLine("   -d : include daily outputs");
                    Console.WriteLine("   -m : include monthly outputs");
                    Console.WriteLine("   -y : include yearly outputs");
                    Console.WriteLine("   -c : number of processing cores");
                    Console.WriteLine("   -o : outputs list in csv format");
                    Console.WriteLine("Examples:");
                    Console.WriteLine("    howleakyconsole \"D:\\HLProjects\\project.hlk\" -m -c1 -o\"Rain,SoilEvap\"");
                    Console.WriteLine("    howleakyconsole \"..\\myvalidation.hlk\" -m -o\"Rain,Runoff,DeepDrainage\"");
                    Console.WriteLine(" ");
                    Console.WriteLine("Outputs include:");
                    Console.WriteLine("     Climate'");
                    Console.WriteLine("         Rainfall mm - use 'Rain'");
                    Console.WriteLine("         Maximum temperature oC - use 'MaxTemp'");
                    Console.WriteLine("         Minimum temperatures oC - use 'MinTemp'");
                    Console.WriteLine("         Pan evaporation mm - use 'PanEvap'");
                    Console.WriteLine("         Solar radiation MJ/m2/day - use 'SolarRadiation'");
                    Console.WriteLine("     Water-balance'");

                    Console.WriteLine("         Runoff mm - use 'Runoff'");
                    Console.WriteLine("         Soil evaporation mm - use 'SoilEvap'");
                    Console.WriteLine("         Transpiration mm - use 'Transpiration'");
                    Console.WriteLine("         Evapotranspiration mm - use 'EvapoTransp'");
                    Console.WriteLine("         Deep drainage mm - use 'DeepDrainage'");
                    Console.WriteLine("         Overflow mm - use 'Overflow'");
                    Console.WriteLine("         Potential soil evaporation mm - use 'PotSoilEvap'");
                    Console.WriteLine("         Irrigation mm - use 'Irrigation'");
                    Console.WriteLine("         Runoff from Irrigation mm - use 'RunoffFromIrrigation'");
                    Console.WriteLine("         Runoff from rainfall mm - use 'RunoffFromRainfall'");
                    Console.WriteLine("         Lateral flow mm - use 'LateralFlow'");
                    Console.WriteLine("         Volume balance error % - use 'VBE'");
                    Console.WriteLine("         Runoff Curve No - use 'RunoffCurveNo'");
                    Console.WriteLine("         Runoff Rention No - use 'RunoffRetentionNumber'");
                    Console.WriteLine("         Layer 1 Sat Index - use 'Layer1SatIndex'");

                    Console.WriteLine("     Soil'");
                    Console.WriteLine("         Hillslope erosion t/ha - use 'HillSlopeErosion'");
                    Console.WriteLine("         Off-site sediment delivery t/ha - use 'OffSiteSedDelivery'");
                    Console.WriteLine("         Total available soil water mm - use 'TotalSoilWater'");
                    Console.WriteLine("         Soil water deficit mm - use 'SoilWaterDeficit'");
                    Console.WriteLine("         Total crop residue kg/ha - use 'TotalCropResidue'");
                    Console.WriteLine("         Total Residue Cover % - use 'TotalResidueCover'");
                    Console.WriteLine("         Total Cover % - use 'TotalCoverAllCrops'");
                    Console.WriteLine("         Layer Outputs: Available soil water mm - use 'SoilWater'");
                    Console.WriteLine("         Layer Outputs: Drainage mm - use 'Drainage'");

                    Console.WriteLine("     Crops'");

                    Console.WriteLine("         Days since planting days - use 'DaysSincePlanting'");
                    Console.WriteLine("         Leaf Area Index (if applicable)  - use 'LAI'");
                    Console.WriteLine("         Crop cover % - use 'GreenCover'");
                    Console.WriteLine("         Residue cover % - use 'ResidueCover'");
                    Console.WriteLine("         Total cover % - use 'TotalCover'");
                    Console.WriteLine("         Crop residue kg/ha - use 'ResidueAmount'");
                    Console.WriteLine("         Dry matter kg/ha - use 'DryMatter'");
                    Console.WriteLine("         Root depth mm - use 'RootDepth'");
                    Console.WriteLine("         Yield t/ha - use 'Yield'");
                    Console.WriteLine("         Potential transpiration mm - use 'PotTranspiration'");
                    Console.WriteLine("         Growth regulator - use 'GrowthRegulator'");
                    Console.WriteLine("         Water Stress Index - use 'WaterStressIndex'");
                    Console.WriteLine("         Temperature Stress Index - use 'TempStressIndex'");
                    Console.WriteLine("         In-crop rainfall mm - use 'CropRainfall'");
                    Console.WriteLine("         In-crop irrigation mm - use 'CropIrrigation'");
                    Console.WriteLine("         In-crop runoff mm - use 'CropRunoff'");
                    Console.WriteLine("         In-crop soil evaporation mm - use 'SoilEvaporation'");
                    Console.WriteLine("         In-crop Transpiration mm - use 'CropTranspiration'");
                    Console.WriteLine("         In-crop evapotranspiration mm - use 'CropEvapoTranspiration'");
                    Console.WriteLine("         In-crop Drainage - use 'Crop - use 'mm - use 'CropDrainage'");
                    Console.WriteLine("         In-crop LateralFlow - use 'Crop - use 'mm - use 'CropLateralFlow'");
                    Console.WriteLine("         In-crop Overflow - use 'Crop - use 'mm - use 'CropOverflow'");
                    Console.WriteLine("         In-crop SoilErosion - use 'Crop - use 'mm - use 'CropSoilErosion'");
                    Console.WriteLine("         In-crop SedimentDelivery - use 'Crop - use 'mm - use 'CropSedimentDelivery'");
                    Console.WriteLine("         PlantingCount - use 'Crop - use 'mm - use 'PlantingCount'");
                    Console.WriteLine("         HarvestCount - use 'Crop - use 'mm - use 'HarvestCount'");
                    Console.WriteLine("         CropDeathCount - use 'Crop - use 'mm - use 'CropDeathCount'");
                    Console.WriteLine("         FallowCount - use 'Crop - use 'mm - use 'FallowCount'");

                    Console.WriteLine("     Irrigation'");

                    Console.WriteLine("         IrrigationRunoff mm - use 'IrrigationRunoff'");
                    Console.WriteLine("         IrrigationApplied mm - use 'IrrigationApplied'");
                    Console.WriteLine("         IrrigationInfiltration mm - use 'IrrigationInfiltration'");
                    Console.WriteLine("         Evaporation losses ML - use 'RingTankEvaporationLosses'");
                    Console.WriteLine("         Seepage losses ML - use 'RingTankSeepageLosses'");
                    Console.WriteLine("         Overtopping losses ML - use 'RingTankOvertoppingLosses'");
                    Console.WriteLine("         Irrigation losses ML - use 'RingTankIrrigationLosses'");
                    Console.WriteLine("         Total losses ML - use 'RingTankTotalLosses'");
                    Console.WriteLine("         Captured runoff inflow ML - use 'RingTankRunoffCaptureInflow'");
                    Console.WriteLine("         Rainfall inflow ML - use 'RingTankRainfalInflow'");
                    Console.WriteLine("         Effective additional inflow ML - use 'RingTankEffectiveAdditionalInflow'");
                    Console.WriteLine("         Total additional inflow ML - use 'RingTankTotalAdditionalInflow'");
                    Console.WriteLine("         Total inflow ML - use 'RingTankTotalInflow'");
                    Console.WriteLine("         Ineffective additional inflow ML - use 'RingTankIneffectiveAdditionalInflow'");
                    Console.WriteLine("         Storage volume ML - use 'RingTankStorageVolume'");
                    Console.WriteLine("         Irrigation storage level % - use 'RingTankStorageLevel'");

                    Console.WriteLine("     Phosphorus'");
                    Console.WriteLine("         Particulate concentration mg/L - use 'ParticulateConc'");
                    Console.WriteLine("         Dissolved concentration mg/L - use 'DissolvedConc'");
                    Console.WriteLine("         Bioavailable particulate P concentration mg/L - use 'BioAvailParticPConc'");
                    Console.WriteLine("         Bioavailable P concentration mg/L - use 'BioAvailPConc'");
                    Console.WriteLine("         Total P concentration mg/L - use 'TotalPConc'");
                    Console.WriteLine("         Particulate P export kg/ha - use 'ParticPExport'");
                    Console.WriteLine("         Dissolved export kg/ha - use 'PhosExportDissolve'");
                    Console.WriteLine("         Bioavailable particulate P export kg/ha - use 'BioAvailParticPExport'");
                    Console.WriteLine("         Total bioavailable export kg/ha - use 'TotalBioAvailExport'");
                    Console.WriteLine("         Total phosphorus export kg/ha - use 'TotalP'");
                    Console.WriteLine("         PPHLC kg/ha - use 'PPHLC'");

                    Console.WriteLine("     Pesticides'");
                    Console.WriteLine("         Applied pest on veg g/ha - use 'AppliedPestOnVeg'");
                    Console.WriteLine("         Applied pest on stubble g/ha - use 'AppliedPestOnStubble'");
                    Console.WriteLine("         Applied pest on soil g/ha - use 'AppliedPestOnSoil'");
                    Console.WriteLine("         Pest on veg g/ha - use 'PestOnVeg'");
                    Console.WriteLine("         Pest on stubble g/ha - use 'PestOnStubble'");
                    Console.WriteLine("         Pest in soil g/ha - use 'PestInSoil'");
                    Console.WriteLine("         Pest soil conc. mg/kg - use 'PestSoilConc'");
                    Console.WriteLine("         Pest sediment phase conc. mg/kg - use 'PestSedPhaseConc'");
                    Console.WriteLine("         Pest water phase conc. ug/L - use 'PestWaterPhaseConc'");
                    Console.WriteLine("         Pest runoff conc. ug/L - use 'PestRunoffConc'");
                    Console.WriteLine("         Pest lost in runoff water g/ha - use 'PestLostInRunoffWater'");
                    Console.WriteLine("         Pest lost in runoff sediment g/ha - use 'PestLostInRunoffSediment'");
                    Console.WriteLine("         Total pest lost in runoff g/ha - use 'TotalPestLostInRunoff'");
                    Console.WriteLine("         Pest lost in leaching g/ha - use 'PestLostInLeaching'");
                    Console.WriteLine("         Pest losses as percent of last input % - use 'PestLossesPercentOfInput'");

                    Console.WriteLine("     Nitrates'");
                    Console.WriteLine("         Dissolved NO3 N in Runoff mg/L - use 'NO3NDissolvedInRunoff'");
                    Console.WriteLine("         NO3 Runoff Load kg/ha - use 'NO3NRunoffLoad'");
                    Console.WriteLine("         Dissolved NO3 N in Leaching mg/L - use 'NO3NDissolvedLeaching'");
                    Console.WriteLine("         NO3 N Leaching Load kg/ha - use 'NO3NLeachingLoad'");
                    Console.WriteLine("         Particulate N in Runoff kg/ha - use 'ParticNInRunoff'");
                    Console.WriteLine("         PNHLC kg/ha - use 'PNHLCa'");
                    Console.WriteLine("         NO3 N Store (top layer) kg/ha - use 'NO3NStoreTopLayer'");
                    Console.WriteLine("         NO3 N Store (bot layer) kg/ha - use 'NO3NStoreBotLayer'");
                    Console.WriteLine("         Total N Store (top layer) kg/ha - use 'TotalNStoreTopLayer'");
                    Console.WriteLine("         Drainage in NO3 period mm - use 'DrainageInNO3Period'");
                    Console.WriteLine("         Runoff in NO3 period mm - use 'RunoffInNO3Period'");

                    Console.WriteLine("     Solutes'");
                    Console.WriteLine("         Total Soil Solute kg/ha - use 'TotalSoilSolute'");
                    Console.WriteLine("         Total Soil Water Solute (Concentration) mg/L_soil-water - use '??'");
                    Console.WriteLine("         Layer Solute (Load) kg/ha - use 'LayerSoluteLoad'");
                    Console.WriteLine("         Layer Solute (Concentration) mg/L_soil-water - use 'LayerSoluteConcmgPerL'");
                    Console.WriteLine("         Layer Solute (Concentration) mg/kg soil - use 'LayerSoluteConcmgPerkg'");
                    Console.WriteLine("         Leachate Solute Concentration mg/L soil-water - use 'LeachateSoluteConcmgPerL'");
                    Console.WriteLine("         Leachate Solute Load kg/ha - use 'LeachateSoluteLoadkgPerha'");
                }
            }
            catch (Exception ex)
            {
                Console.Write($"{ex}");
            }
        }