internal void sequestNutrients(string nutrientName, SoilHorizon soilHorizon, float volume) { SoilNutrientManager soilNutrient = soilHorizon.soilNutrientManagers[nutrientName]; float amountAvailableFactor = soilNutrient.getAmountAvailableFactor(); float amount = soilNutrient.amount; float amountToSequester = volume * currentSequestrationRate * amountAvailableFactor * amount; soilNutrient.amount -= amountToSequester; currentLevel += amountToSequester; }
public static void processSoil(ref SoilHorizon soilHorizon) { //calibrate tertiary features first caibrateWindErosionFactor(); caibrateWaterErosionFactor(); calibrateNutrientVolatility(); calibrateWaterContent(); calibrateAeration(); //calibrate secondary features next calibrateAggregateStability(); calibrateBiota(); calibratePorosity(); //calibrate primary features last calibrateOrgainicMatter(); calibrateHumus(); }
// TODO: approximation made here that only the first layer of soil can be dug. Alter this for depth. public void digSoil() { SoilHorizon soil = soilHorizons[0]; // firstly, the soil becomes a great deal more porous. //TODO: have different modifiers for different soil types soil.porosity = soil.porosityAfterDigging; // secondly the soil biota decreases. soil.biota = soil.biotaAfterDigging; // thirdly aggregate stability decreases soil.aggregateStability = soil.aggregateStabilityAfterDigging; // also the amount of nutrient available increases foreach (string nutrientName in soil.soilNutrientManagers.Keys) { //we don't care about water here, because only water content is meaningful SoilNutrientManager nutrient = soil.soilNutrientManagers[nutrientName]; nutrient.setAmountAvailableFactor(nutrient.postDiggingAvailability); } }