diff --git a/CarbonCalculation.cs b/CarbonCalculation.cs index b501f6b..84d8b29 100644 --- a/CarbonCalculation.cs +++ b/CarbonCalculation.cs @@ -139,7 +139,7 @@ namespace FarmMapsAPI.Carbon Area = cropField.Area, HistoricalCropData = mappedCropData, SoilType = MapSoil(cropField.SoilType), - SoilProperty = new SoilProperty { Clay_Content = cropField.SoilProperty.Clay_Content, OM_Const = cropField.SoilProperty.OM_Const }, + SoilProperty = new SoilProperty { Clay_Content = cropField.SoilProperty.Clay_Content, OM_Const = cropField.SoilProperty.OM_Const, Depth10 = cropField.SoilProperty.Depth10 }, GreenManures = greenManures }); foreach (var crops in cropField.HistoricalCropData) @@ -242,6 +242,7 @@ namespace FarmMapsAPI.Carbon // cropAreaSheet (external input) var cropAreaField = GetCropAreaField(farmInput); + var year = GetYears(farmInputSet, farmInput); ////////////////////////////////////////////// // precalculations @@ -251,7 +252,7 @@ namespace FarmMapsAPI.Carbon //soilPropSoilType var soilPropSoilType = GetSoilPropSoilType(soilTypeData, soilPropertiesField); - //soilPropertiesField (again) + //soilPropertiesField (again) --> remove this foreach (var item in soilPropertiesField) { var soilProps = soilPropSoilType.Keys.Where(x => x.Item1 == item.Key).ToList(); @@ -263,21 +264,64 @@ namespace FarmMapsAPI.Carbon item.Value.OM_Corr = sumCorr; } + //var oM_corr_SoilType = new Dictionary>(); + var oM_corr_SoilType = new Dictionary<(string,string), double>(); + foreach (var item in soilPropertiesField) + { + var soilOfItem = soilTypeData[item.Key].FirstOrDefault(); + var initialSoilKey = historicalCropdata.Keys.FirstOrDefault(x => x.Item1 == item.Key && x.Item2 == year.First()); + var initialSoil = historicalCropdata[initialSoilKey].FirstOrDefault(); + var soilPropertyDepth10 = item.Value.Depth10; + if (initialSoil == "Temp_gras" && soilPropertyDepth10) + { + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.97); + } + else if (cropSet.Grass_nat.Contains(initialSoil) && soilPropertyDepth10 && (soilOfItem == "Klei" || soilOfItem == "Zand")) + { + if (soilOfItem == "Klei") + { + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.67); + } + else + { + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.81); + } + } + else + { + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont); + } + } + + var oM_Corr = new Dictionary(); + foreach (var item in oM_corr_SoilType) + { + oM_Corr.Add(item.Key.Item1, item.Value); + } + // soilBulkDensities - Dictionary soilBulkDensities = GetSoilBulkDensities(soilPropertiesField, soilTypeData, soilPropSoilType); + Dictionary soilBulkDensities = GetSoilBulkDensities(soilPropertiesField, soilTypeData, soilPropSoilType, oM_corr_SoilType); foreach (var soilBulkDensity in soilBulkDensities) { if (soilPropSoilType.ContainsKey((soilBulkDensity.Key, "Klei"))) { soilPropSoilType[(soilBulkDensity.Key, "Klei")].Bulk_Density = (1.0 / soilBulkDensity.Value.Clay); + soilBulkDensity.Value.Clay = (1.0 / soilBulkDensity.Value.Clay); } if (soilPropSoilType.ContainsKey((soilBulkDensity.Key, "Zand"))) { soilPropSoilType[(soilBulkDensity.Key, "Zand")].Bulk_Density = (1.0 / soilBulkDensity.Value.Sand); + soilBulkDensity.Value.Sand = (1.0 / soilBulkDensity.Value.Sand); } } + var bulkDens = new Dictionary(); + foreach (var soilBulkDensity in soilBulkDensities) + { + bulkDens.Add(soilBulkDensity.Key, (soilBulkDensity.Value.Clay + soilBulkDensity.Value.Sand)); + } + foreach (var item in soilPropertiesField) { var soilProps = soilPropSoilType.Keys.Where(x => x.Item1 == item.Key).ToList(); @@ -295,8 +339,7 @@ namespace FarmMapsAPI.Carbon // loop rothc ////////////////////////////////////////// - var soc_Field = new Dictionary>(); - var year = GetYears(farmInputSet, farmInput); + var soc_Field = new Dictionary>(); var cropAreaField1 = new Dictionary<(string, int), List>(); var carbonInputs = new GamsThreeKeyParameter(); @@ -798,7 +841,7 @@ namespace FarmMapsAPI.Carbon foreach (var field in cropAreaField1.Where(x => x.Key.Item2 == loopYear)) { var valueList = new List(); - var result = parameterSet.LayerDepth * soilPropertiesField[field.Key.Item1].Bulk_Density * soilPropertiesField[field.Key.Item1].OM_Corr * 0.54; + var result = parameterSet.LayerDepth * bulkDens[field.Key.Item1] * oM_Corr[field.Key.Item1] * 0.54; foreach (var crop in field.Value) { valueList.Add(new ColumnValue(crop.Key, result)); @@ -1544,18 +1587,18 @@ namespace FarmMapsAPI.Carbon summary.Initial = sum; } - foreach (var item in soilPropertiesField) + foreach(var item in bulkDens) { - var result = item.Value.Bulk_Density; + var result = item.Value; foreach (var lYear in allYears) { soc_Summary[(item.Key, lYear)].Add(new ColumnValue("Bulk_Density", result)); } } - foreach (var item in soilPropertiesField) + foreach (var item in bulkDens) { - var result = item.Value.Bulk_Density; + var result = item.Value; foreach (var lYear in allYears) { var summaries = cropFieldSummary.Single(x => x.Name == item.Key); @@ -1729,7 +1772,7 @@ namespace FarmMapsAPI.Carbon var soilPropertiesField = new Dictionary(); foreach (var field in farmInput.CropFields) { - soilPropertiesField.Add(field.Name, new SoilPropertyType { OM_Cont = field.SoilProperty.OM_Const.Value, Clay_Content = field.SoilProperty.Clay_Content.Value, OM_Corr = field.SoilProperty.OM_Const.Value <= 20 ? field.SoilProperty.OM_Const.Value : 0 }); + soilPropertiesField.Add(field.Name, new SoilPropertyType { OM_Cont = field.SoilProperty.OM_Const.Value, Clay_Content = field.SoilProperty.Clay_Content.Value, OM_Corr = field.SoilProperty.OM_Const.Value <= 20 ? field.SoilProperty.OM_Const.Value : 0, Depth10 = field.SoilProperty.Depth10.Value }); } return soilPropertiesField; @@ -1772,7 +1815,7 @@ namespace FarmMapsAPI.Carbon return cropAreaField; } - private Dictionary GetSoilBulkDensities(Dictionary soilPropertiesField, Dictionary> soilTypeData, Dictionary<(string, string), SoilPropertyType> soilPropSoilType) + private Dictionary GetSoilBulkDensities(Dictionary soilPropertiesField, Dictionary> soilTypeData, Dictionary<(string, string), SoilPropertyType> soilPropSoilType, Dictionary<(string, string), double> oM_corr_SoilType) { var soilBulkDensities = new Dictionary(); foreach (var item in soilPropertiesField) @@ -1781,15 +1824,17 @@ namespace FarmMapsAPI.Carbon if (soilTypeData[item.Key].Any(x => x == "Klei")) { var soilBulkDensityKey = soilPropSoilType.Keys.Single(x => x.Item1 == item.Key && x.Item2 == "Klei"); + var clay = (0.6117 + (0.003601 * item.Value.Clay_Content)) + - (0.002172 * soilPropSoilType[soilBulkDensityKey].OM_Corr * soilPropSoilType[soilBulkDensityKey].OM_Corr) + - (0.01715 * Math.Log(soilPropSoilType[soilBulkDensityKey].OM_Corr)); + (0.002172 * oM_corr_SoilType[(item.Key, "Klei")] * oM_corr_SoilType[(item.Key, "Klei")]) + + (0.01715 * Math.Log(oM_corr_SoilType[(item.Key, "Klei")])); + soilBulkDensities[item.Key].Clay = clay; } if (soilTypeData[item.Key].Any(x => x == "Zand")) { var soilBulkDensityKey = soilPropSoilType.Keys.Single(x => x.Item1 == item.Key && x.Item2 == "Zand"); - soilBulkDensities[item.Key].Sand = 0.667 + (0.021 * soilPropSoilType[soilBulkDensityKey].OM_Corr); + soilBulkDensities[item.Key].Sand = 0.667 + (0.021 * oM_corr_SoilType[(item.Key, "Zand")]); } } return soilBulkDensities; diff --git a/Models/CarbonRequest.cs b/Models/CarbonRequest.cs index e25e9ee..d4944b8 100644 --- a/Models/CarbonRequest.cs +++ b/Models/CarbonRequest.cs @@ -38,6 +38,7 @@ namespace CarbonService.Models { public double? OM_Const { get; set; } public double? Clay_Content { get; set; } + public bool? Depth10 { get; set; } } public class OrgManureApplied diff --git a/Models/CropSets.cs b/Models/CropSets.cs index 948831d..6671eab 100644 --- a/Models/CropSets.cs +++ b/Models/CropSets.cs @@ -15,5 +15,6 @@ namespace FarmMapsAPI.Carbon.Models public List StrawCrops { get; set; } public List GreenManureType { get; set; } public List Perennial { get; set; } + public List Grass_nat { get; set; } } } diff --git a/Models/FarmMapsCarbonRequest.cs b/Models/FarmMapsCarbonRequest.cs index b9cb853..6030ad4 100644 --- a/Models/FarmMapsCarbonRequest.cs +++ b/Models/FarmMapsCarbonRequest.cs @@ -74,6 +74,7 @@ namespace FarmMapsAPI.Carbon.Models { public double? OM_Const { get; set; } public double? Clay_Content { get; set; } + public bool Depth10 { get; set; } } public class GreenManureTypeFarmMaps diff --git a/Models/SoilPropertyType.cs b/Models/SoilPropertyType.cs index d319e75..2b0bc49 100644 --- a/Models/SoilPropertyType.cs +++ b/Models/SoilPropertyType.cs @@ -11,6 +11,7 @@ namespace FarmMapsAPI.Carbon.Models public double Bulk_Density { get; set; } public double Clay_Content { get; set; } public double Depth { get; set; } + public bool Depth10 { get; set; } } struct SoilTypePropertyKey diff --git a/config/CropSets.json b/config/CropSets.json index 3bbc864..8dceba9 100644 --- a/config/CropSets.json +++ b/config/CropSets.json @@ -69,5 +69,10 @@ "Miscanthus", "Switchgrass", "Willow" + ], + "Grass_nat": [ + "Perm_gras", + "Nat_gras", + "Gras" ] } \ No newline at end of file diff --git a/config/Farm_input_sets.json b/config/Farm_input_sets.json index 6d7e2d2..a1a8229 100644 --- a/config/Farm_input_sets.json +++ b/config/Farm_input_sets.json @@ -36,6 +36,22 @@ "ManureSource_liv": "DIGEST", "Description": "Digestaat" }, + { + "ManureSource_liv": "CHAMPOST", + "Description": "Champost" + }, + { + "ManureSource_liv": "SCHA_GEIT", + "Description": "Schapen/geitenmest" + }, + { + "ManureSource_liv": "VMPIG", + "Description": "Vaste varkensmest" + }, + { + "ManureSource_liv": "DM_ZEUG", + "Description": "Zeugendrijfmest" + }, { "ManureSource_liv": "OVERIG", "Description": "Overig"