/// <summary>Calculates volumetric soil water for the given sample.</summary> /// <param name="sample">The sample.</param> /// <param name="soil">The soil.</param> /// <returns>Volumetric water (mm/mm)</returns> private static double[] SWVolumetric(Sample sample, Soil soil) { if (sample.SWUnits == Sample.SWUnitsEnum.Volumetric || sample.SW == null) { return(sample.SW); } else { // convert the numbers if (sample.SWUnits == Sample.SWUnitsEnum.Gravimetric) { double[] bd = Layers.BDMapped(soil, sample.Thickness); return(MathUtilities.Multiply(sample.SW, bd)); } else { return(MathUtilities.Divide(sample.SW, sample.Thickness)); // from mm to mm/mm } } }
/// <summary>Convert soil units to APSIM standard.</summary> /// <param name="soil">The soil.</param> public static void Convert(Soil soil) { // Convert soil organic matter OC to total % if (soil.SoilOrganicMatter != null) { soil.SoilOrganicMatter.OC = OCTotalPercent(soil.SoilOrganicMatter.OC, soil.SoilOrganicMatter.OCUnits); soil.SoilOrganicMatter.OCUnits = Sample.OCSampleUnitsEnum.Total; } // Convert analysis. var analysis = Apsim.Child(soil, typeof(Analysis)) as Analysis; if (analysis != null) { analysis.PH = PHWater(analysis.PH, analysis.PHUnits); analysis.PHUnits = Sample.PHSampleUnitsEnum.Water; } // Convert all samples. var samples = Apsim.Children(soil, typeof(Sample)).Cast <Sample>().ToArray(); foreach (Sample sample in samples) { // Convert sw units to volumetric. if (MathUtilities.ValuesInArray(sample.SW)) { sample.SW = SWVolumetric(sample, soil); } sample.SWUnits = Sample.SWUnitsEnum.Volumetric; // Convert no3 units to ppm. if (MathUtilities.ValuesInArray(sample.NO3)) { double[] bd = Layers.BDMapped(soil, sample.Thickness); sample.NO3 = Nppm(sample.NO3, sample.Thickness, sample.NO3Units, bd); } sample.NO3Units = Sample.NUnitsEnum.ppm; // Convert nh4 units to ppm. if (MathUtilities.ValuesInArray(sample.NH4)) { double[] bd = Layers.BDMapped(soil, sample.Thickness); sample.NH4 = Nppm(sample.NH4, sample.Thickness, sample.NH4Units, bd); } sample.NH4Units = Sample.NUnitsEnum.ppm; // Convert OC to total (%) if (MathUtilities.ValuesInArray(sample.OC)) { sample.OC = OCTotalPercent(sample.OC, sample.OCUnits); } sample.OCUnits = Sample.OCSampleUnitsEnum.Total; // Convert PH to water. if (MathUtilities.ValuesInArray(sample.PH)) { sample.PH = PHWater(sample.PH, sample.PHUnits); } sample.PHUnits = Sample.PHSampleUnitsEnum.Water; } }