/// <summary> /// Assigns ingested biomass from other ecological processes to reproductive potential mass /// </summary> /// <param name="gridCellCohorts">The cohorts in the current grid cell</param> /// <param name="gridCellStocks">The stocks in the current grid cell</param> /// <param name="actingCohort">The position of the acting cohort in the jagged array of grid cell cohorts</param> /// <param name="cellEnvironment">The environment in the current grid cell</param> /// <param name="deltas">The sorted list to track changes in biomass and abundance of the acting cohort in this grid cell</param> /// <param name="madingleyCohortDefinitions">The definitions of cohort functional groups in the model</param> /// <param name="madingleyStockDefinitions">The definitions of stock functional groups in the model</param> /// <param name="currentTimestep">The current model time step</param> /// <param name="tracker">An instance of ProcessTracker to hold diagnostics for reproduction</param> public void RunReproductiveMassAssignment(GridCellCohortHandler gridCellCohorts, GridCellStockHandler gridCellStocks, int[] actingCohort, SortedList <string, double[]> cellEnvironment, Dictionary <string, Dictionary <string, double> > deltas, FunctionalGroupDefinitions madingleyCohortDefinitions, FunctionalGroupDefinitions madingleyStockDefinitions, uint currentTimestep, ProcessTracker tracker) { // Biomass per individual in each cohort to be assigned to reproductive potential double _BiomassToAssignToReproductivePotential; // Net biomass change from other ecological functions this time step double NetBiomassFromOtherEcologicalFunctionsThisTimeStep; // Reset variable holding net biomass change of individuals in this cohort as a result of other ecological processes NetBiomassFromOtherEcologicalFunctionsThisTimeStep = 0.0; // Loop over all items in the biomass deltas foreach (var Biomass in deltas["biomass"]) { // Add the delta biomass to net biomass NetBiomassFromOtherEcologicalFunctionsThisTimeStep += Biomass.Value; } // If individual body mass after the addition of the net biomass from processes this time step will yield a body mass // greater than the adult body mass for this cohort, then assign the surplus to reproductive potential if ((gridCellCohorts[actingCohort].IndividualBodyMass + NetBiomassFromOtherEcologicalFunctionsThisTimeStep) > gridCellCohorts[actingCohort].AdultMass) { // Calculate the biomass for each individual in this cohort to be assigned to reproductive potential _BiomassToAssignToReproductivePotential = gridCellCohorts[actingCohort].IndividualBodyMass + NetBiomassFromOtherEcologicalFunctionsThisTimeStep - gridCellCohorts[actingCohort].AdultMass; // Check that a positive biomass is to be assigned to reproductive potential Debug.Assert(_BiomassToAssignToReproductivePotential >= 0.0, "Assignment of negative reproductive potential mass"); // If this is the first time reproductive potential mass has been assigned for this cohort, // then set the maturity time step for this cohort as the current model time step if (gridCellCohorts[actingCohort].MaturityTimeStep == uint.MaxValue) { gridCellCohorts[actingCohort].MaturityTimeStep = currentTimestep; // Track the generation length for this cohort if (tracker.TrackProcesses && (!gridCellCohorts[actingCohort].Merged)) { tracker.TrackMaturity((uint)cellEnvironment["LatIndex"][0], (uint)cellEnvironment["LonIndex"][0], currentTimestep, gridCellCohorts[actingCohort].BirthTimeStep, gridCellCohorts[actingCohort].JuvenileMass, gridCellCohorts[actingCohort].AdultMass, gridCellCohorts[actingCohort].FunctionalGroupIndex); } } // Assign the specified mass to reproductive potential mass and remove it from individual biomass deltas["reproductivebiomass"]["reproduction"] += _BiomassToAssignToReproductivePotential; deltas["biomass"]["reproduction"] -= _BiomassToAssignToReproductivePotential; } else { // Cohort has not gained sufficient biomass to assign any to reproductive potential, so take no action } }
/// <summary> /// Assigns biomass from body mass to reproductive potential mass /// </summary> /// <param name="gridCellCohorts">The cohorts in the current grid cell</param> /// <param name="gridCellStocks">The stocks in the current grid cell</param> /// <param name="actingCohort">The position of the acting cohort in the jagged array of grid cell cohorts</param> /// <param name="cellEnvironment">The environment in the current grid cell</param> /// <param name="deltas">The sorted list to track changes in biomass and abundance of the acting cohort in this grid cell</param> /// <param name="madingleyCohortDefinitions">The definitions of cohort functional groups in the model</param> /// <param name="madingleyStockDefinitions">The definitions of stock functional groups in the model</param> /// <param name="currentTimestep">The current model time step</param> /// <param name="tracker">An instance of ProcessTracker to hold diagnostics for reproduction</param> public void AssignMassToReproductivePotential(GridCellCohortHandler gridCellCohorts, GridCellStockHandler gridCellStocks, int[] actingCohort, SortedList <string, double[]> cellEnvironment, Dictionary <string, Dictionary <string, double> > deltas, FunctionalGroupDefinitions madingleyCohortDefinitions, FunctionalGroupDefinitions madingleyStockDefinitions, uint currentTimestep, ProcessTracker tracker) { // If this is the first time reproductive potential mass has been assigned for this cohort, // then set the maturity time step for this cohort as the current model time step if (gridCellCohorts[actingCohort].MaturityTimeStep == uint.MaxValue) { gridCellCohorts[actingCohort].MaturityTimeStep = currentTimestep; // Track the generation length for this cohort if ((!gridCellCohorts[actingCohort].Merged) && tracker.TrackProcesses) { tracker.TrackMaturity((uint)cellEnvironment["LatIndex"][0], (uint)cellEnvironment["LonIndex"][0], currentTimestep, gridCellCohorts[actingCohort].BirthTimeStep, gridCellCohorts[actingCohort].JuvenileMass, gridCellCohorts[actingCohort].AdultMass, gridCellCohorts[actingCohort].FunctionalGroupIndex); } } // Assign the specified mass to reproductive potential mass and remove it from individual biomass deltas["reproductivebiomass"]["reproduction"] += _BiomassToAssignToReproductivePotential; deltas["biomass"]["reproduction"] -= _BiomassToAssignToReproductivePotential; }
/// <summary> /// Assigns biomass from body mass to reproductive potential mass /// </summary> /// <param name="gridCellCohorts">The cohorts in the current grid cell</param> /// <param name="gridCellStocks">The stocks in the current grid cell</param> /// <param name="actingCohort">The position of the acting cohort in the jagged array of grid cell cohorts</param> /// <param name="cellEnvironment">The environment in the current grid cell</param> /// <param name="deltas">The sorted list to track changes in biomass and abundance of the acting cohort in this grid cell</param> /// <param name="madingleyCohortDefinitions">The definitions of cohort functional groups in the model</param> /// <param name="madingleyStockDefinitions">The definitions of stock functional groups in the model</param> /// <param name="currentTimestep">The current model time step</param> /// <param name="tracker">An instance of ProcessTracker to hold diagnostics for reproduction</param> public void AssignMassToReproductivePotential(GridCellCohortHandler gridCellCohorts, GridCellStockHandler gridCellStocks, int[] actingCohort, SortedList<string, double[]> cellEnvironment, Dictionary<string, Dictionary<string, double>> deltas, FunctionalGroupDefinitions madingleyCohortDefinitions, FunctionalGroupDefinitions madingleyStockDefinitions, uint currentTimestep, ProcessTracker tracker) { // If this is the first time reproductive potential mass has been assigned for this cohort, // then set the maturity time step for this cohort as the current model time step if (gridCellCohorts[actingCohort].MaturityTimeStep == uint.MaxValue) { gridCellCohorts[actingCohort].MaturityTimeStep = currentTimestep; // Track the generation length for this cohort if ((!gridCellCohorts[actingCohort].Merged) && tracker.TrackProcesses) tracker.TrackMaturity((uint)cellEnvironment["LatIndex"][0], (uint)cellEnvironment["LonIndex"][0], currentTimestep, gridCellCohorts[actingCohort].BirthTimeStep, gridCellCohorts[actingCohort].JuvenileMass, gridCellCohorts[actingCohort].AdultMass, gridCellCohorts[actingCohort].FunctionalGroupIndex); } // Assign the specified mass to reproductive potential mass and remove it from individual biomass deltas["reproductivebiomass"]["reproduction"] += _BiomassToAssignToReproductivePotential; deltas["biomass"]["reproduction"] -= _BiomassToAssignToReproductivePotential; }
/// <summary> /// Assigns ingested biomass from other ecological processes to reproductive potential mass /// </summary> /// <param name="gridCellCohorts">The cohorts in the current grid cell</param> /// <param name="gridCellStocks">The stocks in the current grid cell</param> /// <param name="actingCohort">The position of the acting cohort in the jagged array of grid cell cohorts</param> /// <param name="cellEnvironment">The environment in the current grid cell</param> /// <param name="deltas">The sorted list to track changes in biomass and abundance of the acting cohort in this grid cell</param> /// <param name="madingleyCohortDefinitions">The definitions of cohort functional groups in the model</param> /// <param name="madingleyStockDefinitions">The definitions of stock functional groups in the model</param> /// <param name="currentTimestep">The current model time step</param> /// <param name="tracker">An instance of ProcessTracker to hold diagnostics for reproduction</param> public void RunReproductiveMassAssignment(GridCellCohortHandler gridCellCohorts, GridCellStockHandler gridCellStocks, int[] actingCohort, SortedList<string, double[]> cellEnvironment, Dictionary<string, Dictionary<string, double>> deltas, FunctionalGroupDefinitions madingleyCohortDefinitions, FunctionalGroupDefinitions madingleyStockDefinitions, uint currentTimestep, ProcessTracker tracker) { // Biomass per individual in each cohort to be assigned to reproductive potential double _BiomassToAssignToReproductivePotential; // Net biomass change from other ecological functions this time step double NetBiomassFromOtherEcologicalFunctionsThisTimeStep; // Reset variable holding net biomass change of individuals in this cohort as a result of other ecological processes NetBiomassFromOtherEcologicalFunctionsThisTimeStep = 0.0; // Loop over all items in the biomass deltas foreach (var Biomass in deltas["biomass"]) { // Add the delta biomass to net biomass NetBiomassFromOtherEcologicalFunctionsThisTimeStep += Biomass.Value; } // If individual body mass after the addition of the net biomass from processes this time step will yield a body mass // greater than the adult body mass for this cohort, then assign the surplus to reproductive potential if ((gridCellCohorts[actingCohort].IndividualBodyMass + NetBiomassFromOtherEcologicalFunctionsThisTimeStep) > gridCellCohorts[actingCohort].AdultMass) { // Calculate the biomass for each individual in this cohort to be assigned to reproductive potential _BiomassToAssignToReproductivePotential = gridCellCohorts[actingCohort].IndividualBodyMass + NetBiomassFromOtherEcologicalFunctionsThisTimeStep - gridCellCohorts[actingCohort].AdultMass; // Check that a positive biomass is to be assigned to reproductive potential Debug.Assert(_BiomassToAssignToReproductivePotential >= 0.0, "Assignment of negative reproductive potential mass"); // If this is the first time reproductive potential mass has been assigned for this cohort, // then set the maturity time step for this cohort as the current model time step if (gridCellCohorts[actingCohort].MaturityTimeStep == uint.MaxValue) { gridCellCohorts[actingCohort].MaturityTimeStep = currentTimestep; // Track the generation length for this cohort if (tracker.TrackProcesses && (!gridCellCohorts[actingCohort].Merged)) tracker.TrackMaturity((uint)cellEnvironment["LatIndex"][0], (uint)cellEnvironment["LonIndex"][0], currentTimestep, gridCellCohorts[actingCohort].BirthTimeStep, gridCellCohorts[actingCohort].JuvenileMass, gridCellCohorts[actingCohort].AdultMass, gridCellCohorts[actingCohort].FunctionalGroupIndex); } // Assign the specified mass to reproductive potential mass and remove it from individual biomass deltas["reproductivebiomass"]["reproduction"] += _BiomassToAssignToReproductivePotential; deltas["biomass"]["reproduction"] -= _BiomassToAssignToReproductivePotential; } else { // Cohort has not gained sufficient biomass to assign any to reproductive potential, so take no action } }