示例#1
0
        private void CalculateOutputs(ModelGrid ecosystemModelGrid, FunctionalGroupDefinitions cohortFunctionalGroupDefinitions,
                                      FunctionalGroupDefinitions stockFunctionalGroupDefinitions, List <uint[]> cellIndices, MadingleyModelInitialisation initialisation, uint currentTimestep)
        {
            // Get grids of the total biomass densities of all stocks and all cohorts in each grid cell
            LogBiomassDensityGridCohorts = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", cohortFunctionalGroupDefinitions.
                                                                                                    AllFunctionalGroupsIndex, cellIndices, "cohort", initialisation);
            LogBiomassDensityGridStocks = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", stockFunctionalGroupDefinitions.
                                                                                                   AllFunctionalGroupsIndex, cellIndices, "stock", initialisation);

            // Get grids of total abundance densities of all stocks and all cohorts in each grid cell
            LogAbundanceDensityGridCohorts = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Abundance", "NA", cohortFunctionalGroupDefinitions.
                                                                                                      AllFunctionalGroupsIndex, cellIndices, "cohort", initialisation);

            // Loop over grid cells and add stock and cohort biomass density to get the total of all biomass densities
            for (int ii = 0; ii < ecosystemModelGrid.NumLatCells; ii++)
            {
                for (int jj = 0; jj < ecosystemModelGrid.NumLonCells; jj++)
                {
                    LogBiomassDensityGrid[ii, jj] = Math.Log(Math.Exp(LogBiomassDensityGridCohorts[ii, jj]) + Math.Exp(LogBiomassDensityGridStocks[ii, jj]));
                }
            }

            string[] Keys = CohortTraitIndices.Keys.ToArray();
            foreach (string Key in Keys)
            {
                BiomassDensityGrid[Key]   = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", CohortTraitIndices[Key], cellIndices, "cohort", initialisation);
                AbundanceDensityGrid[Key] = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Abundance", "NA", CohortTraitIndices[Key], cellIndices, "cohort", initialisation);
            }

            Keys = StockTraitIndices.Keys.ToArray();
            foreach (string Key in Keys)
            {
                BiomassDensityGrid[Key] = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", StockTraitIndices[Key], cellIndices, "stock", initialisation);
            }


            // Temporary outputs to check plant model

            Realm = ecosystemModelGrid.GetEnviroGrid("Realm", 0);

            FrostDays   = ecosystemModelGrid.GetEnviroGrid("Fraction Year Frost", 0);
            Temperature = ecosystemModelGrid.GetEnviroGrid("Temperature", Utils.GetCurrentMonth(currentTimestep, initialisation.GlobalModelTimeStepUnit));

            for (int i = 0; i < ecosystemModelGrid.NumLatCells; i++)
            {
                for (int j = 0; j < ecosystemModelGrid.NumLonCells; j++)
                {
                    FracEvergreen[i, j] = BiomassDensityGrid["evergreen"][i, j] / BiomassDensityGrid["autotroph"][i, j];
                }
            }

            HANPP = ecosystemModelGrid.GetEnviroGrid("HANPP", 0);

            if (OutputMetrics)
            {
                //Calculate the values for the ecosystem metrics for each of the grid cells
                for (int i = 0; i < cellIndices.Count; i++)
                {
                    uint latIndex = cellIndices[i][0];
                    uint lonIndex = cellIndices[i][1];
                    MetricsGrid["Mean Trophic Level"][latIndex, lonIndex] = Metrics.CalculateMeanTrophicLevelCell(ecosystemModelGrid, cellIndices, i);
                    MetricsGrid["Trophic Evenness"][latIndex, lonIndex]   = Metrics.CalculateFunctionalEvennessRao(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "trophic index");
                    MetricsGrid["Biomass Evenness"][latIndex, lonIndex]   = Metrics.CalculateFunctionalEvennessRao(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "biomass");
                    double[] FunctionalDiversity = Metrics.CalculateFunctionalDiversity(ecosystemModelGrid, cohortFunctionalGroupDefinitions,
                                                                                        cellIndices, i);
                    // Functional Richness not currently calculated
                    //MetricsGrid["Functional Richness"][latIndex, lonIndex] = FunctionalDiversity[0];
                    MetricsGrid["Rao Functional Evenness"][latIndex, lonIndex] = FunctionalDiversity[1];
                    MetricsGrid["Biomass Richness"][latIndex, lonIndex]        = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[0];
                    MetricsGrid["Min Bodymass"][latIndex, lonIndex]            = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[1];
                    MetricsGrid["Max Bodymass"][latIndex, lonIndex]            = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[2];
                    MetricsGrid["Trophic Richness"][latIndex, lonIndex]        = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[0];
                    MetricsGrid["Min Trophic Index"][latIndex, lonIndex]       = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[1];
                    MetricsGrid["Max Trophic Index"][latIndex, lonIndex]       = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[2];

                    MetricsGrid["Arithmetic Mean Bodymass"][latIndex, lonIndex] = Metrics.CalculateArithmeticCommunityMeanBodyMass(ecosystemModelGrid, cellIndices, i);
                    MetricsGrid["Geometric Mean Bodymass"][latIndex, lonIndex]  = Metrics.CalculateGeometricCommunityMeanBodyMass(ecosystemModelGrid, cellIndices, i);
                }
            }
        }
        private void CalculateOutputs(ModelGrid ecosystemModelGrid, FunctionalGroupDefinitions cohortFunctionalGroupDefinitions,
            FunctionalGroupDefinitions stockFunctionalGroupDefinitions, List<uint[]> cellIndices, MadingleyModelInitialisation initialisation)
        {
            // Get grids of the total biomass densities of all stocks and all cohorts in each grid cell
            LogBiomassDensityGridCohorts = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", cohortFunctionalGroupDefinitions.
                AllFunctionalGroupsIndex, cellIndices, "cohort", initialisation);
            LogBiomassDensityGridStocks = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", stockFunctionalGroupDefinitions.
                AllFunctionalGroupsIndex, cellIndices, "stock", initialisation);

            // Get grids of total abundance densities of all stocks and all cohorts in each grid cell
            LogAbundanceDensityGridCohorts = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Abundance", "NA", cohortFunctionalGroupDefinitions.
                 AllFunctionalGroupsIndex, cellIndices, "cohort", initialisation);

            // Loop over grid cells and add stock and cohort biomass density to get the total of all biomass densities
            for (int ii = 0; ii < ecosystemModelGrid.NumLatCells; ii++)
            {
                for (int jj = 0; jj < ecosystemModelGrid.NumLonCells; jj++)
                {
                    LogBiomassDensityGrid[ii, jj] = Math.Log(Math.Exp(LogBiomassDensityGridCohorts[ii, jj]) + Math.Exp(LogBiomassDensityGridStocks[ii, jj]));
                }
            }

            string[] Keys = CohortTraitIndices.Keys.ToArray();
            foreach (string Key in Keys)
            {
                BiomassDensityGrid[Key] = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", CohortTraitIndices[Key], cellIndices, "cohort", initialisation);
                AbundanceDensityGrid[Key] = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Abundance", "NA", CohortTraitIndices[Key], cellIndices, "cohort", initialisation);
            }

            Keys = StockTraitIndices.Keys.ToArray();
            foreach (string Key in Keys)
            {
                BiomassDensityGrid[Key] = ecosystemModelGrid.GetStateVariableGridLogDensityPerSqKm("Biomass", "NA", StockTraitIndices[Key], cellIndices, "stock", initialisation);
            }

            // Temporary outputs to check plant model

            Realm = ecosystemModelGrid.GetEnviroGrid("Realm", 0);

            FrostDays = ecosystemModelGrid.GetEnviroGrid("Fraction Year Frost", 0);

            for (int i = 0; i < ecosystemModelGrid.NumLatCells; i++)
            {
                for (int j = 0; j < ecosystemModelGrid.NumLonCells; j++)
                {
                    FracEvergreen[i, j] = BiomassDensityGrid["evergreen"][i, j] / BiomassDensityGrid["autotroph"][i, j];
                }
            }

            HANPP = ecosystemModelGrid.GetEnviroGrid("HANPP", 0);

            if (OutputMetrics)
            {
                //Calculate the values for the ecosystem metrics for each of the grid cells
                for (int i = 0; i < cellIndices.Count; i++)
                {
                    uint latIndex = cellIndices[i][0];
                    uint lonIndex = cellIndices[i][1];
                    MetricsGrid["Mean Trophic Level"][latIndex, lonIndex] = Metrics.CalculateMeanTrophicLevelCell(ecosystemModelGrid, cellIndices, i);
                    MetricsGrid["Trophic Evenness"][latIndex, lonIndex] = Metrics.CalculateFunctionalEvennessRao(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "trophic index");
                    MetricsGrid["Biomass Evenness"][latIndex, lonIndex] = Metrics.CalculateFunctionalEvennessRao(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "biomass");
                    double[] FunctionalDiversity = Metrics.CalculateFunctionalDiversity(ecosystemModelGrid, cohortFunctionalGroupDefinitions,
                                                                                        cellIndices, i);
                    // Functional Richness not currently calculated
                    //MetricsGrid["Functional Richness"][latIndex, lonIndex] = FunctionalDiversity[0];
                    MetricsGrid["Rao Functional Evenness"][latIndex, lonIndex] = FunctionalDiversity[1];
                    MetricsGrid["Biomass Richness"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[0];
                    MetricsGrid["Min Bodymass"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[1];
                    MetricsGrid["Max Bodymass"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Biomass")[2];
                    MetricsGrid["Trophic Richness"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[0];
                    MetricsGrid["Min Trophic Index"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[1];
                    MetricsGrid["Max Trophic Index"][latIndex, lonIndex] = Metrics.CalculateFunctionalRichness(ecosystemModelGrid, cohortFunctionalGroupDefinitions, cellIndices, i, "Trophic Index")[2];

                    MetricsGrid["Arithmetic Mean Bodymass"][latIndex, lonIndex] = Metrics.CalculateArithmeticCommunityMeanBodyMass(ecosystemModelGrid, cellIndices, i);
                    MetricsGrid["Geometric Mean Bodymass"][latIndex, lonIndex] = Metrics.CalculateGeometricCommunityMeanBodyMass(ecosystemModelGrid, cellIndices, i);
                }
            }
        }