/// <summary> /// Modify the KL values for subsoil constraints. /// </summary> /// <remarks> /// From: /// Hochman, Z., Dang, Y.P., Schwenke, G.D., Dalgliesh, N.P., Routley, R., McDonald, M., /// Daniells, I.G., Manning, W., Poulton, P.L., 2007. /// Simulating the effects of saline and sodic subsoils on wheat crops /// growing on Vertosols. Australian Journal of Agricultural Research 58, 802–810. doi:10.1071/ar06365 /// </remarks> /// <param name="crop"></param> /// <param name="soil">The soil the crop belongs to.</param> private static void ModifyKLForSubSoilConstraints(SoilCrop crop, Soil soil) { var soilPhysical = soil.FindChild <IPhysical>(); var initialConditions = soil.Children.Find(child => child is Sample) as Sample; double[] cl = initialConditions.CL; if (MathUtilities.ValuesInArray(cl)) { crop.KL = Layers.MapConcentration(StandardKL, StandardThickness, soilPhysical.Thickness, StandardKL.Last()); for (int i = 0; i < soilPhysical.Thickness.Length; i++) { crop.KL[i] *= Math.Min(1.0, 4.0 * Math.Exp(-0.005 * cl[i])); } } else { double[] esp = initialConditions.ESP; if (MathUtilities.ValuesInArray(esp)) { crop.KL = Layers.MapConcentration(StandardKL, StandardThickness, soilPhysical.Thickness, StandardKL.Last()); for (int i = 0; i < soilPhysical.Thickness.Length; i++) { crop.KL[i] *= Math.Min(1.0, 10.0 * Math.Exp(-0.15 * esp[i])); } } else { double[] ec = initialConditions.EC; if (MathUtilities.ValuesInArray(ec)) { crop.KL = Layers.MapConcentration(StandardKL, StandardThickness, soilPhysical.Thickness, StandardKL.Last()); for (int i = 0; i < soilPhysical.Thickness.Length; i++) { crop.KL[i] *= Math.Min(1.0, 3.0 * Math.Exp(-1.3 * ec[i])); } } } } }
/// <summary> /// Return a predicted SoilCrop for the specified crop name or null if not found. /// </summary> /// <param name="soil">The soil.</param> /// <param name="CropName">Name of the crop.</param> /// <returns></returns> private static SoilCrop PredictedCrop(Soil soil, string CropName) { double[] A = null; double B = double.NaN; double[] KL = null; if (soil.SoilType == null) { return(null); } if (soil.SoilType.Equals("Black Vertosol", StringComparison.CurrentCultureIgnoreCase)) { if (CropName.Equals("Cotton", StringComparison.CurrentCultureIgnoreCase)) { A = BlackVertosol.CottonA; B = BlackVertosol.CottonB; KL = CottonKL; } else if (CropName.Equals("Sorghum", StringComparison.CurrentCultureIgnoreCase)) { A = BlackVertosol.SorghumA; B = BlackVertosol.SorghumB; KL = SorghumKL; } else if (CropName.Equals("Wheat", StringComparison.CurrentCultureIgnoreCase)) { A = BlackVertosol.WheatA; B = BlackVertosol.WheatB; KL = WheatKL; } } else if (soil.SoilType.Equals("Grey Vertosol", StringComparison.CurrentCultureIgnoreCase)) { if (CropName.Equals("Cotton", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.CottonA; B = GreyVertosol.CottonB; KL = CottonKL; } else if (CropName.Equals("Sorghum", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.SorghumA; B = GreyVertosol.SorghumB; KL = SorghumKL; } else if (CropName.Equals("Wheat", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.WheatA; B = GreyVertosol.WheatB; KL = WheatKL; } else if (CropName.Equals("Barley", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.BarleyA; B = GreyVertosol.BarleyB; KL = BarleyKL; } else if (CropName.Equals("Chickpea", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.ChickpeaA; B = GreyVertosol.ChickpeaB; KL = ChickpeaKL; } else if (CropName.Equals("Fababean", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.FababeanA; B = GreyVertosol.FababeanB; KL = FababeanKL; } else if (CropName.Equals("Mungbean", StringComparison.CurrentCultureIgnoreCase)) { A = GreyVertosol.MungbeanA; B = GreyVertosol.MungbeanB; KL = MungbeanKL; } } if (A == null) { return(null); } double[] LL = PredictedLL(soil, A, B); LL = Layers.MapConcentration(LL, PredictedThickness, soil.Thickness, LL.Last()); KL = Layers.MapConcentration(KL, PredictedThickness, soil.Thickness, KL.Last()); double[] XF = Layers.MapConcentration(PredictedXF, PredictedThickness, soil.Thickness, PredictedXF.Last()); string[] Metadata = StringUtilities.CreateStringArray("Estimated", soil.Thickness.Length); return(new SoilCrop() { Name = CropName, LL = LL, LLMetadata = Metadata, KL = KL, KLMetadata = Metadata, XF = XF, XFMetadata = Metadata }); }