/// <summary>Sets the soil organic matter thickness.</summary> /// <param name="soilOrganicMatter">The soil organic matter.</param> /// <param name="thickness">Thickness to change soil water to.</param> private static void SetSoilOrganicMatterThickness(SoilOrganicMatter soilOrganicMatter, double[] thickness) { if (soilOrganicMatter != null) { if (!MathUtilities.AreEqual(thickness, soilOrganicMatter.Thickness)) { soilOrganicMatter.FBiom = MapConcentration(soilOrganicMatter.FBiom, soilOrganicMatter.Thickness, thickness, MathUtilities.LastValue(soilOrganicMatter.FBiom)); soilOrganicMatter.FInert = MapConcentration(soilOrganicMatter.FInert, soilOrganicMatter.Thickness, thickness, MathUtilities.LastValue(soilOrganicMatter.FInert)); soilOrganicMatter.OC = MapConcentration(soilOrganicMatter.OC, soilOrganicMatter.Thickness, thickness, MathUtilities.LastValue(soilOrganicMatter.OC)); soilOrganicMatter.SoilCN = MapConcentration(soilOrganicMatter.SoilCN, soilOrganicMatter.Thickness, thickness, MathUtilities.LastValue(soilOrganicMatter.SoilCN)); soilOrganicMatter.RootWt = MapMass(soilOrganicMatter.RootWt, soilOrganicMatter.Thickness, thickness, false); soilOrganicMatter.Thickness = thickness; soilOrganicMatter.OCMetadata = StringUtilities.CreateStringArray("Mapped", thickness.Length);; } if (soilOrganicMatter.FBiom != null) { MathUtilities.ReplaceMissingValues(soilOrganicMatter.FBiom, MathUtilities.LastValue(soilOrganicMatter.FBiom)); } if (soilOrganicMatter.FInert != null) { MathUtilities.ReplaceMissingValues(soilOrganicMatter.FInert, MathUtilities.LastValue(soilOrganicMatter.FInert)); } if (soilOrganicMatter.OC != null) { MathUtilities.ReplaceMissingValues(soilOrganicMatter.OC, MathUtilities.LastValue(soilOrganicMatter.OC)); } } }
public void ImporterTests_SoilImports() { string oldXml = ReflectionUtilities.GetResourceAsString("UnitTests.ImporterTestsSoilImports.xml"); APSIMImporter importer = new APSIMImporter(); Simulations sims = importer.CreateSimulationsFromXml(oldXml); Soil s = sims.Children[0].Children[0] as Soil; Assert.AreEqual(s.Name, "Soil"); InitialWater initWater = s.Children[0] as InitialWater; Assert.AreEqual(initWater.FractionFull, 0.5); Assert.AreEqual(initWater.PercentMethod, InitialWater.PercentMethodEnum.FilledFromTop); Water w = s.Children[1] as Water; Assert.AreEqual(w.Thickness, new double[] { 150, 150, 300, 300 }); Assert.AreEqual(w.BD, new double[] { 1.02, 1.03, 1.02, 1.02 }); Assert.AreEqual(w.LL15, new double[] { 0.29, 0.29, 0.29, 0.29 }); SoilWater sw = s.Children[2] as SoilWater; Assert.AreEqual(sw.Thickness, new double[] { 150, 150, 300, 300 }); Assert.AreEqual(sw.SWCON, new double[] { 0.3, 0.3, 0.3, 0.3 }); Assert.AreEqual(sw.SummerCona, 3.5); Assert.AreEqual(sw.SummerU, 6); Assert.AreEqual(sw.WinterCona, 2); Assert.AreEqual(sw.WinterU, 2); Assert.IsTrue(s.Children[3] is SoilNitrogen); SoilOrganicMatter som = s.Children[4] as SoilOrganicMatter; Assert.AreEqual(som.Thickness, new double[] { 150, 150, 300, 300 }); Assert.AreEqual(som.OC, new double[] { 1.04, 0.89, 0.89, 0.89 }); Assert.AreEqual(som.FBiom, new double[] { 0.025, 0.02, 0.015, 0.01 }); Analysis a = s.Children[5] as Analysis; Assert.AreEqual(a.Thickness, new double[] { 150, 150, 300, 300 }); Assert.AreEqual(a.EC, new double[] { 0.2, 0.25, 0.31, 0.40 }); Assert.AreEqual(a.PH, new double[] { 8.4, 8.8, 9.0, 9.2 }); Sample sam = s.Children[6] as Sample; Assert.AreEqual(sam.Thickness, new double[] { 150, 150, 300 }); Assert.AreEqual(sam.NO3, new double[] { 6.5, 2.1, 2.1 }); Assert.AreEqual(sam.NH4, new double[] { 0.5, 0.1, 0.1 }); SoilCrop crop = s.Children[1].Children[0] as SoilCrop; Assert.AreEqual(crop.Thickness, new double[] { 150, 150, 300, 300 }); Assert.AreEqual(crop.LL, new double[] { 0.29, 0.29, 0.32, 0.38 }); Assert.AreEqual(crop.KL, new double[] { 0.1, 0.1, 0.08, 0.06 }); Assert.AreEqual(crop.XF, new double[] { 1, 1, 1, 1 }); }
/// <summary> /// Gets a soil description from the ISRIC REST API for World Modellers /// </summary> /// <returns>True if successful</returns> private bool GetISRICSoil() { if (!CheckValue(entryLatitude) || !CheckValue(entryLatitude)) { return(false); } string url = "https://worldmodel.csiro.au/apsimsoil?lon=" + entryLongitude.Text + "&lat=" + entryLatitude.Text; Soil newSoil = null; WaitCursor = true; try { try { MemoryStream stream = WebUtilities.ExtractDataFromURL(url); stream.Position = 0; XmlDocument doc = new XmlDocument(); doc.Load(stream); List <XmlNode> soilNodes = XmlUtilities.ChildNodesRecursively(doc, "Soil"); // We will have either 0 or 1 soil nodes if (soilNodes.Count > 0) { newSoil = SoilFromApsoil(soilNodes[0]); // Something looks very wrong with organic carbon in these soils. // It looks to me like it's off by a factor of 10. SoilOrganicMatter soilOrganic = Apsim.Child(newSoil, typeof(SoilOrganicMatter)) as SoilOrganicMatter; soilOrganic.OC = MathUtilities.Divide_Value(soilOrganic.OC, 10.0); ReplaceModelCommand command = new ReplaceModelCommand(soil, newSoil, explorerPresenter); explorerPresenter.CommandHistory.Add(command, true); } MessageDialog md = new MessageDialog(owningView.MainWidget.Toplevel as Window, DialogFlags.Modal, MessageType.Warning, ButtonsType.Ok, "Initial values for water and soil nitrogen have not been provided with this soil description. " + "Please add sensible values before using this soil in a simulation."); md.Title = "Soil use warning"; md.Run(); md.Destroy(); return(true); } catch (Exception) { return(false); } } finally { WaitCursor = false; } }