/// <summary>Apply fertiliser.</summary> /// <param name="Amount">The amount.</param> /// <param name="Type">The type.</param> /// <param name="Depth">The depth.</param> /// <param name="doOutput">If true, output will be written to the summary.</param> public void Apply(double Amount, Types Type, double Depth = 0.0, bool doOutput = true) { if (Amount > 0) { // find the layer that the fertilizer is to be added to. int layer = SoilUtilities.LayerIndexOfDepth(soilPhysical.Thickness, Depth); FertiliserType fertiliserType = Definitions.FirstOrDefault(f => f.Name == Type.ToString()); if (fertiliserType == null) { throw new ApsimXException(this, "Cannot find fertiliser type '" + Type + "'"); } // We find the current amount of N in each form, add to it as needed, // then set the new value. An alternative approach could call AddKgHaDelta // rather than SetKgHa if (fertiliserType.FractionNO3 != 0) { var values = NO3.kgha; values[layer] += Amount * fertiliserType.FractionNO3; NO3.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionNO3; } if (fertiliserType.FractionNH4 != 0) { var values = NH4.kgha; values[layer] += Amount * fertiliserType.FractionNH4; NH4.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionNH4; } if (fertiliserType.FractionUrea != 0) { var values = Urea.kgha; values[layer] += Amount * fertiliserType.FractionUrea; Urea.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionUrea; } if (doOutput) { Summary.WriteMessage(this, string.Format("{0} kg/ha of {1} added at depth {2} layer {3}", Amount, Type, Depth, layer + 1)); } Fertilised?.Invoke(this, new FertiliserApplicationType() { Amount = Amount, Depth = Depth, FertiliserType = Type }); } }
/// <summary>Apply fertiliser.</summary> /// <param name="Amount">The amount.</param> /// <param name="Type">The type.</param> /// <param name="Depth">The depth.</param> /// <param name="doOutput">If true, output will be written to the summary.</param> /// <exception cref="ApsimXException">Cannot find fertiliser type ' + Type + '</exception> public void Apply(double Amount, Types Type, double Depth = 0.0, bool doOutput = true) { if (Amount > 0) { // find the layer that the fertilizer is to be added to. int layer = GetLayerDepth(Depth, Soil.Thickness); FertiliserType fertiliserType = Definitions.FirstOrDefault(f => f.Name == Type.ToString()); if (fertiliserType == null) { throw new ApsimXException(this, "Cannot find fertiliser type '" + Type + "'"); } if (fertiliserType.FractionNO3 != 0) { var values = NO3.kgha; values[layer] += Amount * fertiliserType.FractionNO3; NO3.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionNO3; } if (fertiliserType.FractionNH4 != 0) { var values = NH4.kgha; values[layer] += Amount * fertiliserType.FractionNH4; NH4.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionNH4; } if (fertiliserType.FractionUrea != 0) { var values = Urea.kgha; values[layer] += Amount * fertiliserType.FractionUrea; Urea.SetKgHa(SoluteSetterType.Fertiliser, values); NitrogenApplied += Amount * fertiliserType.FractionUrea; } if (doOutput) { Summary.WriteMessage(this, string.Format("{0} kg/ha of {1} added at depth {2} layer {3}", Amount, Type, Depth, layer + 1)); } Fertilised?.Invoke(this, new FertiliserApplicationType() { Amount = Amount, Depth = Depth, FertiliserType = Type }); } }