Beispiel #1
0
 /// <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
         }
     }
 }
Beispiel #2
0
        /// <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;
            }
        }