//--------------------------------------------------------------------- private ExtensionMain[] LoadExtensions(ExtensionAndInitFile[] extensions) { ExtensionMain[] loadedExtensions = new ExtensionMain[extensions.Length]; foreach (int i in Indexes.Of(extensions)) { ExtensionAndInitFile extensionAndInitFile = extensions[i]; ui.WriteLine("Loading {0} extension ...", extensionAndInitFile.Info.Name); ExtensionMain loadedExtension = Loader.Load <ExtensionMain>(extensionAndInitFile.Info); loadedExtension.LoadParameters(extensionAndInitFile.InitFile, this); loadedExtensions[i] = loadedExtension; disturbAndOtherExtensions.Add(loadedExtension); } return(loadedExtensions); }
//--------------------------------------------------------------------- /// <summary> /// Runs a model scenario. /// </summary> public void Run(string scenarioPath, IUserInterface ui) { this.ui = ui; siteVarRegistry.Clear(); Scenario scenario = LoadScenario(scenarioPath); startTime = scenario.StartTime; endTime = scenario.EndTime; timeSinceStart = 0; currentTime = startTime; InitializeRandomNumGenerator(scenario.RandomNumberSeed); LoadSpecies(scenario.Species); LoadEcoregions(scenario.Ecoregions); ui.WriteLine("Initializing landscape from ecoregions map \"{0}\" ...", scenario.EcoregionsMap); Ecoregions.Map ecoregionsMap = new Ecoregions.Map(scenario.EcoregionsMap, ecoregions, rasterFactory); // -- ProcessMetadata(ecoregionsMap.Metadata, scenario); cellLength = scenario.CellLength.Value; cellArea = (float)((cellLength * cellLength) / 10000); ui.WriteLine("Cell length = {0} m, cell area = {1} ha", cellLength, cellArea); using (IInputGrid <bool> grid = ecoregionsMap.OpenAsInputGrid()) { ui.WriteLine("Map dimensions: {0} = {1:#,##0} cell{2}", grid.Dimensions, grid.Count, (grid.Count == 1 ? "" : "s")); // landscape = new Landscape(grid); landscape = landscapeFactory.CreateLandscape(grid); } ui.WriteLine("Sites: {0:#,##0} active ({1:p1}), {2:#,##0} inactive ({3:p1})", landscape.ActiveSiteCount, (landscape.Count > 0 ? ((double)landscape.ActiveSiteCount) / landscape.Count : 0), landscape.InactiveSiteCount, (landscape.Count > 0 ? ((double)landscape.InactiveSiteCount) / landscape.Count : 0)); ecoregionSiteVar = ecoregionsMap.CreateSiteVar(landscape); disturbAndOtherExtensions = new List <ExtensionMain>(); try { ui.WriteLine("Loading {0} extension ...", scenario.Succession.Info.Name); succession = Loader.Load <SuccessionMain>(scenario.Succession.Info); succession.LoadParameters(scenario.Succession.InitFile, this); succession.Initialize(); ExtensionMain[] disturbanceExtensions = LoadExtensions(scenario.Disturbances); InitExtensions(disturbanceExtensions); ExtensionMain[] otherExtensions = LoadExtensions(scenario.OtherExtensions); InitExtensions(otherExtensions); OutputExtensionInfo(scenario.Succession, scenario.Disturbances, scenario.OtherExtensions); // Perform 2nd phase of initialization for non-succession extensions. foreach (ExtensionMain extension in disturbanceExtensions) { extension.InitializePhase2(); } foreach (ExtensionMain extension in otherExtensions) { extension.InitializePhase2(); } // Run output extensions for TimeSinceStart = 0 (time step 0) foreach (ExtensionMain extension in otherExtensions) { if (extension.Type.IsMemberOf("output")) { Run(extension); } } //******************// for Rob // Main time loop // //******************// for (currentTime++, timeSinceStart++; currentTime <= endTime; currentTime++, timeSinceStart++) { bool isSuccTimestep = IsExtensionTimestep(succession); List <ExtensionMain> distExtensionsToRun; distExtensionsToRun = GetExtensionsToRun(disturbanceExtensions); bool isDistTimestep = distExtensionsToRun.Count > 0; List <ExtensionMain> otherExtensionsToRun; otherExtensionsToRun = GetExtensionsToRun(otherExtensions); if (!isSuccTimestep && !isDistTimestep && otherExtensionsToRun.Count == 0) { continue; } ui.WriteLine("Current time: {0}", currentTime); if (isDistTimestep) { if (scenario.DisturbancesRandomOrder) { distExtensionsToRun = shuffle(distExtensionsToRun); } foreach (ExtensionMain distExtension in distExtensionsToRun) { Run(distExtension); } } if (isSuccTimestep || isDistTimestep) { Run(succession); } foreach (ExtensionMain otherExtension in otherExtensionsToRun) { Run(otherExtension); } } // main time loop } finally { foreach (ExtensionMain extension in disturbAndOtherExtensions) { extension.CleanUp(); } } ui.WriteLine("Model run is complete."); }