public void InitializeEcology() { //Initialize the autotrophprocessor MarineNPPtoAutotrophStock = new AutotrophProcessor(); // Initialise the plant model DynamicPlantModel = new RevisedTerrestrialPlantModel(); // Initialise the human NPP appropriation class HANPP = new HumanAutotrophMatterAppropriation(); }
/// <summary> /// Seed grid cell with stocks, as specified in the model input files /// </summary> /// <param name="functionalGroups">A reference to the stock functional group handler</param> /// <param name="cellEnvironment">The environment in the grid cell</param> /// <param name="globalDiagnostics">A list of global diagnostic variables for the model grid</param> private void SeedGridCellStocks(ref FunctionalGroupDefinitions functionalGroups, ref SortedList<string, double[]> cellEnvironment, SortedList<string, double> globalDiagnostics) { // Set the seed for the random number generator from the system time RandomNumberGenerator.SetSeedFromSystemTime(); Stock NewStock; // Define local variables int[] FunctionalGroupsToUse; // Get the individual body masses for organisms in each stock functional group double[] IndividualMass = functionalGroups.GetBiologicalPropertyAllFunctionalGroups("individual mass"); // Check which realm the cell is in if (cellEnvironment["Realm"][0] == 1.0 && _CellEnvironment["Precipitation"][0] != _CellEnvironment["Missing Value"][0] && _CellEnvironment["Temperature"][0] != _CellEnvironment["Missing Value"][0]) { // Get the indices of all terrestrial functional groups FunctionalGroupsToUse = functionalGroups.GetFunctionalGroupIndex("realm", "terrestrial", true); } else if (cellEnvironment["Realm"][0] == 2.0 && _CellEnvironment["NPP"][0] != _CellEnvironment["Missing Value"][0]) { // Get the indices of all marine functional groups FunctionalGroupsToUse = functionalGroups.GetFunctionalGroupIndex("realm", "marine", true); } else { // For cells without a realm designation, no functional groups will be used FunctionalGroupsToUse = new int[0]; } // Loop over all functional groups in the model for (int FunctionalGroup = 0; FunctionalGroup < functionalGroups.GetNumberOfFunctionalGroups(); FunctionalGroup++) { // Create a new list to hold the stocks in the grid cell _GridCellStocks[FunctionalGroup] = new List<Stock>(); // If it is a functional group that corresponds to the current realm, then seed the stock if (FunctionalGroupsToUse.Contains(FunctionalGroup)) { if (_CellEnvironment["Realm"][0] == 1.0) { // An instance of the terrestrial carbon model class RevisedTerrestrialPlantModel PlantModel = new RevisedTerrestrialPlantModel(); // Calculate predicted leaf mass at equilibrium for this stock double LeafMass = PlantModel.CalculateEquilibriumLeafMass(_CellEnvironment, functionalGroups.GetTraitNames("leaf strategy", FunctionalGroup) == "deciduous"); // Initialise the new stock with the relevant properties NewStock = new Stock((byte)FunctionalGroup, IndividualMass[FunctionalGroup], LeafMass); // Add the new stock to the list of grid cell stocks _GridCellStocks[FunctionalGroup].Add(NewStock); // Increment the variable tracking the total number of stocks in the model globalDiagnostics["NumberOfStocksInModel"]++; } else if (FunctionalGroupsToUse.Contains(FunctionalGroup)) { // Initialise the new stock with the relevant properties NewStock = new Stock((byte)FunctionalGroup, IndividualMass[FunctionalGroup], 1e12); // Add the new stock to the list of grid cell stocks _GridCellStocks[FunctionalGroup].Add(NewStock); // Increment the variable tracking the total number of stocks in the model globalDiagnostics["NumberOfStocksInModel"]++; } else { } } } }
/// <summary> /// Copy parameter values to a text file in the specified output directory /// </summary> /// <param name="outputDirectory">THe directory for outputs</param> public void CopyParameterValues(string outputDirectory) { // Create a stream write object to write the parameter values to StreamWriter sw = new StreamWriter(outputDirectory + "Parameters.txt"); // Write out the column headings sw.WriteLine("Ecological process\tParameter name\tParameter value"); // Create dummy instances of the ecological processes RevisedHerbivory DummyHerbivory = new RevisedHerbivory(0.0, _GlobalModelTimeStepUnit); RevisedPredation DummyPredation = new RevisedPredation(0.0, _GlobalModelTimeStepUnit); MetabolismEndotherm DummyEndoMetabolism = new MetabolismEndotherm(_GlobalModelTimeStepUnit); MetabolismEctotherm DummyEctoMetabolism = new MetabolismEctotherm(_GlobalModelTimeStepUnit); BackgroundMortality DummyBackgroundMortality = new BackgroundMortality(_GlobalModelTimeStepUnit); SenescenceMortality DummySenescenceMortality = new SenescenceMortality(_GlobalModelTimeStepUnit); StarvationMortality DummyStarvationMortality = new StarvationMortality(_GlobalModelTimeStepUnit); ReproductionBasic DummyReproduction = new ReproductionBasic(_GlobalModelTimeStepUnit, _DrawRandomly); DiffusiveDispersal DummyDiffusiveDispersal = new DiffusiveDispersal(_GlobalModelTimeStepUnit, _DrawRandomly); RevisedTerrestrialPlantModel DummyPlantModel = new RevisedTerrestrialPlantModel(); Activity DummyActivityModel = new Activity(); // Call the methods in these processes that write the parameter values out DummyHerbivory.WriteOutParameterValues(sw); DummyPredation.WriteOutParameterValues(sw); DummyEndoMetabolism.WriteOutParameterValues(sw); DummyEctoMetabolism.WriteOutParameterValues(sw); DummyBackgroundMortality.WriteOutParameterValues(sw); DummySenescenceMortality.WriteOutParameterValues(sw); DummyStarvationMortality.WriteOutParameterValues(sw); DummyReproduction.WriteOutParameterValues(sw); DummyDiffusiveDispersal.WriteOutParameterValues(sw); DummyPlantModel.WriteOutParameterValues(sw); DummyActivityModel.WriteOutParameterValues(sw); sw.Dispose(); }