Exemple #1
0
        public static void UpdatePhysicsParameters(WrfConfiguration config,
                                                   PhysicsConfigurationProcessed physicsConfig, IFileSystem iFileSystem)
        {
            string wrfNamelistPath    = config.WRFNamelist;
            string wrfNamelistContent = iFileSystem.ReadFileContent(wrfNamelistPath);

            Namelist nameList = NamelistParser.ParseFromString(wrfNamelistContent);

            PropertyInfo[] physicsProperties = typeof(PhysicsConfigurationProcessed).GetProperties();
            foreach (PropertyInfo prop in physicsProperties)
            {
                ConfigurationPropertyAttribute configPropertyAttribute =
                    prop.GetCustomAttribute <ConfigurationPropertyAttribute>();

                if (configPropertyAttribute != null)
                {
                    string propertyName = configPropertyAttribute.Name;
                    if (propertyName.ToLower() != "name")
                    {
                        List <object> values = new List <object>();
                        int           value  = (int)(float)prop.GetValue(physicsConfig);
                        values.Add(value);

                        nameList["physics"][propertyName].Values = values;
                    }
                }
            }

            string newFileContent = NamelistParser.ParseToString(nameList);

            iFileSystem.WriteFileContent(wrfNamelistPath, newFileContent);
        }
Exemple #2
0
        static void RecurseAdd(List <PhysicsConfigurationProcessed> list, PhysicsConfiguration sourceConfig,
                               List <PropertyInfo> multipleProps, int level, Type physicsConfigurationType)
        {
            if (level < multipleProps.Count)
            {
                PropertyInfo readProp  = multipleProps[level];
                PropertyInfo writeProp = physicsConfigurationType.GetProperty(readProp.Name);

                string[] vals       = (readProp.GetValue(sourceConfig) as string).Split(',').Select(n => n.Trim()).ToArray();
                int      numberSame = list.Count / vals.Length;

                for (int valueIndex = 0; valueIndex < vals.Length; valueIndex++)
                {
                    int startIndex = valueIndex * numberSame;
                    int value      = int.Parse(vals[valueIndex]);

                    List <PhysicsConfigurationProcessed> toSendDown =
                        new List <PhysicsConfigurationProcessed>(numberSame);
                    for (int i = startIndex; i < numberSame + startIndex; i++)
                    {
                        PhysicsConfigurationProcessed settingNow = list[i];
                        writeProp.SetValue(settingNow, value);
                        toSendDown.Add(settingNow);
                    }

                    RecurseAdd(toSendDown, sourceConfig, multipleProps,
                               level + 1, physicsConfigurationType);
                }
            }
        }
Exemple #3
0
        static void ComputeStage(IFileSystem iFileSystem, ILogger iLogger,
                                 IProcessLauncher iProcess, IEnvironment iEnvironment, IDatabase iDatabase,
                                 WrfConfiguration config, PhysicsConfigurationProcessed physicsConfig)
        {
            DateTime runStartTime = DateTime.Now;
            string   runId        = Guid.NewGuid().ToString().Replace("-", "");

            iLogger.LogLine("Updating physics parameters...");
            NamelistHelper.UpdatePhysicsParameters(config, physicsConfig, iFileSystem);
            iLogger.LogLine("...done");

            iLogger.LogLine("Changing directory to real directory...");
            FileSystemHelper.SetCurrentDirectoryToWRFDirectory(config, iFileSystem);
            iLogger.LogLine("...done");

            iLogger.LogLine("Launching real.exe...");
            ProcessHelper.MpiRunRealExecutable(config, iProcess);
            iLogger.LogLine("...done");

            iLogger.LogLine($"Launching wrf.exe against mp_physics={physicsConfig.MpPhysics}");
            ProcessHelper.MpiRunWrfExecutable(config, iProcess);
            iLogger.LogLine("...done");

            iLogger.LogLine("Locating the WrfOut file...");
            string wrfOutFile =
                FileSystemHelper.RetrievePathToWrfOutFile(config, iFileSystem);

            iLogger.LogLine($"...found at {wrfOutFile}.");

            iLogger.LogLine("Retrieving scripts to run...");
            string[] scripts = FileSystemHelper.RetrieveNclScriptsToRun(config, iFileSystem);
            iLogger.LogLine($"...found {scripts.Length} scripts: {string.Join(",", scripts)}");

            //string wrfOutFile = @"C:\Users\Ben\Desktop\wrfout";

            DateTime      runEndTime   = DateTime.Now;
            INetCDFReader netCdfReader = new NetCDFReader(wrfOutFile);

            DatabaseHelper.CreateRunRecord(netCdfReader, iDatabase,
                                           runStartTime, runEndTime, runId);

            LatLongRect latLongRect = ConfigurationHelper.ParseLatLongRect(config);

            DatabaseHelper.RecordVariables(netCdfReader, iDatabase,
                                           runId, latLongRect.UpperLeftLong, latLongRect.LowerRightLong,
                                           latLongRect.LowerRightLat, latLongRect.UpperLeftLat);

            foreach (string script in scripts)
            {
                iLogger.LogLine($"Launching NCL against {script}...");
                ProcessHelper.NclRunScript(config, iProcess, script, wrfOutFile);
                iLogger.LogLine("...done");

                ProcessHelper.MakeVideoWithFFMPEG(config, iProcess, script, runId);
            }
        }
Exemple #4
0
        public static void CreateRunRecord(INetCDFReader iNetCdf, IDatabase iDatabase,
                                           DateTime startDate, DateTime endDate, string runId)
        {
            DateTime simulationStartDate = NetCDFReaderHelper.GetSimulationDate(iNetCdf);

            float westEast = 0, southNorth = 0, bottomTop = 0;

            NetCDFReaderHelper.ReadGridDimensions(iNetCdf, out westEast, out southNorth, out bottomTop);

            PhysicsConfigurationProcessed physics =
                NetCDFReaderHelper.ReadPhysicsSettings(iNetCdf);

            iDatabase.SaveRun(startDate, endDate, simulationStartDate,
                              westEast, southNorth, bottomTop,
                              physics, runId);
        }
Exemple #5
0
        public void SaveRun(DateTime startDate, DateTime endDate, DateTime simulationStartDate, float westEastDimension,
                            float southNorthDimension, float bottomTopDimension,
                            PhysicsConfigurationProcessed physics, string runId)
        {
            using (MySqlConnection conn = new MySqlConnection())
            {
                conn.ConnectionString = _connectionString;
                conn.Open();

                using (MySqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "insert into Runs (RunStartDate, RunEndDate, SimulationStartDate, WestEastDimension, SouthNorthDimension, " +
                                      "BottomTopDimension, Mp_physics, Ra_lw_physics, Ra_sw_physics, Sf_sfclay_physics, Sf_surface_physics, Bl_pbl_physics, Bldt, Cu_physics, " +
                                      "Cudt, Isfflx, Ifsnow, Icloud, Surface_input_source, Num_soil_layers, Sf_urban_physics, RunId) values " +
                                      "(@RunStartDate, @RunEndDate, @SimulationStartDate, @WestEastDimension, @SouthNorthDimension, " +
                                      "@BottomTopDimension, @Mp_physics, @Ra_lw_physics, @Ra_sw_physics, @Sf_sfclay_physics, @Sf_surface_physics, @Bl_pbl_physics, @Bldt, @Cu_physics, " +
                                      "@Cudt, @Isfflx, @Ifsnow, @Icloud, @Surface_input_source, @Num_soil_layers, @Sf_urban_physics, @RunId)";

                    cmd.CommandTimeout = 60;

                    cmd.Parameters.AddWithValue("RunStartDate", startDate);
                    cmd.Parameters.AddWithValue("RunEndDate", endDate);
                    cmd.Parameters.AddWithValue("SimulationStartDate", simulationStartDate);
                    cmd.Parameters.AddWithValue("WestEastDimension", westEastDimension);
                    cmd.Parameters.AddWithValue("SouthNorthDimension", southNorthDimension);
                    cmd.Parameters.AddWithValue("BottomTopDimension", bottomTopDimension);
                    cmd.Parameters.AddWithValue("Mp_physics", physics.MpPhysics);
                    cmd.Parameters.AddWithValue("Ra_lw_physics", physics.RaLwPhysics);
                    cmd.Parameters.AddWithValue("Ra_sw_physics", physics.RaSwPhysics);
                    cmd.Parameters.AddWithValue("Sf_sfclay_physics", physics.SfSfClayPhysics);
                    cmd.Parameters.AddWithValue("Sf_surface_physics", physics.SfSurfacePhysics);
                    cmd.Parameters.AddWithValue("Bl_pbl_physics", physics.BlPblPhysics);
                    cmd.Parameters.AddWithValue("Bldt", physics.Bldt);
                    cmd.Parameters.AddWithValue("Cu_physics", physics.CuPhysics);
                    cmd.Parameters.AddWithValue("Cudt", physics.Cudt);
                    cmd.Parameters.AddWithValue("Isfflx", physics.IsFflx);
                    cmd.Parameters.AddWithValue("Ifsnow", physics.IfSnow);
                    cmd.Parameters.AddWithValue("Icloud", physics.ICloud);
                    cmd.Parameters.AddWithValue("Surface_input_source", physics.SurfaceInputSource);
                    cmd.Parameters.AddWithValue("Num_soil_layers", physics.NumSoilLayers);
                    cmd.Parameters.AddWithValue("Sf_urban_physics", physics.SfUrbanPhysics);
                    cmd.Parameters.AddWithValue("RunId", runId);

                    cmd.ExecuteNonQuery();
                }
            }
        }
        public static PhysicsConfigurationProcessed ReadPhysicsSettings(INetCDFReader reader)
        {
            PhysicsConfigurationProcessed ret = new PhysicsConfigurationProcessed();

            ret.Bldt               = reader.ReadFloatAttribute("BLDT");
            ret.BlPblPhysics       = reader.ReadFloatAttribute("BL_PBL_PHYSICS");
            ret.Cudt               = reader.ReadFloatAttribute("CUDT");
            ret.CuPhysics          = reader.ReadFloatAttribute("CU_PHYSICS");
            ret.ICloud             = 0; // ?
            ret.IfSnow             = 0; // ?
            ret.IsFflx             = reader.ReadFloatAttribute("ISFFLX");
            ret.MpPhysics          = reader.ReadFloatAttribute("MP_PHYSICS");
            ret.NumSoilLayers      = 0; // ?
            ret.Radt               = reader.ReadFloatAttribute("RADT");
            ret.RaLwPhysics        = reader.ReadFloatAttribute("RA_LW_PHYSICS");
            ret.RaSwPhysics        = reader.ReadFloatAttribute("RA_SW_PHYSICS");
            ret.SfSfClayPhysics    = reader.ReadFloatAttribute("SF_SFCLAY_PHYSICS");
            ret.SfSurfacePhysics   = reader.ReadFloatAttribute("SF_SURFACE_PHYSICS");
            ret.SfUrbanPhysics     = reader.ReadFloatAttribute("SF_URBAN_PHYSICS");
            ret.SurfaceInputSource = reader.ReadFloatAttribute("SURFACE_INPUT_SOURCE");

            return(ret);
        }
Exemple #7
0
        static List <PhysicsConfigurationProcessed> LoadPhysicsConfigurationsFromConfiguration()
        {
            Type physicsConfigType          = typeof(PhysicsConfiguration);
            Type physicsConfigProcessedType = typeof(PhysicsConfigurationProcessed);

            Configuration obj = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            PhysicsConfigurationSection section = (PhysicsConfigurationSection)obj.GetSection("physics");

            List <PhysicsConfigurationProcessed> ret = new List <PhysicsConfigurationProcessed>();

            foreach (PhysicsConfiguration configuration in section.PhysicsConfigurations)
            {
                int total = 1;
                List <PropertyInfo> multipleProps = new List <PropertyInfo>();
                List <PropertyInfo> singleProps   = new List <PropertyInfo>();
                foreach (PropertyInfo prop in physicsConfigType.GetProperties())
                {
                    string val = prop.GetValue(configuration) as string;
                    if (val != null)
                    {
                        int numberOfCommas = (val as string).Count(n => n == ',');
                        if (numberOfCommas > 0)
                        {
                            multipleProps.Add(prop);
                        }
                        else
                        {
                            singleProps.Add(prop);
                        }
                        total *= (numberOfCommas + 1);
                    }
                }

                Type physicsConfigurationProcessedType = typeof(PhysicsConfigurationProcessed);

                List <PhysicsConfigurationProcessed> toAdd = new List <PhysicsConfigurationProcessed>(total);
                for (int c = 0; c < total; c++)
                {
                    PhysicsConfigurationProcessed config = new PhysicsConfigurationProcessed();
                    foreach (PropertyInfo singleProp in singleProps)
                    {
                        if (singleProp.Name.ToLower() != "name")
                        {
                            string value = singleProp.GetValue(configuration) as string;
                            if (value != null)
                            {
                                physicsConfigProcessedType.GetProperty(singleProp.Name).SetValue(config, int.Parse(value));
                            }
                        }
                    }

                    toAdd.Add(config);
                }

                RecurseAdd(toAdd, configuration, multipleProps, 0, physicsConfigurationProcessedType);

                ret.AddRange(toAdd);
            }

            return(ret);
        }
Exemple #8
0
        static void Main(string[] args)
        {
            try
            {
                IFileSystem      iFileSystem  = new FileSystem();
                INetwork         iDownloader  = new Downloader();
                ILogger          iLogger      = new Logger("/home/brush/wrf/log.txt");
                IProcessLauncher iProcess     = new ProcessLauncher();
                IEnvironment     iEnvironment = new WrfSharp.Runner.Implementations.Environment();

                ProcessLock lockFile = ProcessLock.TryLock();
                if (lockFile != null)
                {
                    using (lockFile)
                    {
                        string connectionString =
                            ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
                        IDatabase iDatabase = MySQL.OpenConnection(connectionString);

                        iLogger.Log("Testing DB connectivity...");
                        if (!iDatabase.TestConnection())
                        {
                            iLogger.LogLine("....Connection failed. Check connection string.");
                        }
                        else
                        {
                            iLogger.LogLine("....Connection succeeded.");
                        }

                        List <PhysicsConfigurationProcessed> physicsConfigs = LoadPhysicsConfigurationsFromConfiguration();
                        iLogger.LogLine($"Loading configuration...");
                        WrfConfiguration config = LoadConfigurationFromAppSettings(iLogger);
                        iLogger.LogLine("...done");

                        string stateText = "Prepping";

                        _timer = new Timer(delegate(object state)
                        {
                            iDatabase.Checkin(stateText, DateTime.Now);
                        }, null, 0, 1000 * 60);

                        if (args.Length > 0 && args[0].ToLower() == "nodownload")
                        {
                            iLogger.LogLine("Downloading of new data skipped...");
                        }
                        else
                        {
                            PrepStage(iFileSystem, iDownloader, iLogger, iProcess, config);
                        }

                        Random rand = new Random();
                        physicsConfigs = physicsConfigs.OrderBy(m => rand.Next()).ToList();

                        // infinity if -1
                        if (config.MaximumNumberOfRuns == -1)
                        {
                            config.MaximumNumberOfRuns = int.MaxValue;
                        }

                        stateText = "Computing";

                        for (int c = 0; c < config.MaximumNumberOfRuns && c < physicsConfigs.Count; c++)
                        {
                            PhysicsConfigurationProcessed physicsConfig = physicsConfigs[c];
                            ComputeStage(iFileSystem, iLogger, iProcess,
                                         iEnvironment, iDatabase, config, physicsConfig);
                        }

                        iDatabase.Checkin("Done", DateTime.Now);
                    }
                }
                else
                {
                    //iLogger.LogLine("WrfSharp appears to be running already, or port 666 is in use.");
                }
            }
            catch (Exception ex)
            {
                File.AppendAllText("crash.txt", ex.ToString());
            }
        }