diff --git a/CarbonCalculation.cs b/CarbonCalculation.cs index 348ca48..ae32069 100644 --- a/CarbonCalculation.cs +++ b/CarbonCalculation.cs @@ -225,6 +225,18 @@ namespace FarmMapsAPI.Carbon { var knmiFile = Helper.GetPlatformIndependentDirectoryPath(Path.Combine(configPath, "KNMI_data.csv")); + if (farmInput.CropFields[0].SoilProperty.OM_Choice == "c") + { + //carbon_organicmatter_factor = 1; + farmInput.CropFields[0].SoilProperty.C_Const = farmInput.CropFields[0].SoilProperty.OM_Const; + farmInput.CropFields[0].SoilProperty.OM_Const = 0; + } + else + { + farmInput.CropFields[0].SoilProperty.C_Const = farmInput.CropFields[0].SoilProperty.OM_Const * 0.54; + } + + // soilTypeData (external input) var soilTypeData = GetSoilTypeData(farmInput); @@ -239,7 +251,8 @@ namespace FarmMapsAPI.Carbon var year = GetYears(farmInputSet, farmInput); - + //var carbon_organicmatter_factor = 0.54; + ////////////////////////////////////////////// // precalculations ////////////////////////////////////////////// @@ -253,14 +266,18 @@ namespace FarmMapsAPI.Carbon { var soilProps = soilPropSoilType.Keys.Where(x => x.Item1 == item.Key).ToList(); var sumCorr = 0.0; + var sumC_Corr = 0.0; foreach (var soilProp in soilProps) { sumCorr += soilPropSoilType[soilProp].OM_Corr; + sumC_Corr += soilPropSoilType[soilProp].C_Corr; } item.Value.OM_Corr = sumCorr; + item.Value.C_Corr = sumC_Corr; } var oM_corr_SoilType = new Dictionary<(string,string), double>(); + var C_corr_SoilType = new Dictionary<(string, string), double>(); foreach (var item in soilPropertiesField) { var soilOfItem = soilTypeData[item.Key].FirstOrDefault(); @@ -276,25 +293,35 @@ namespace FarmMapsAPI.Carbon parameterSet.LayerDepth = item.Value.Depth.HasValue? item.Value.Depth.Value : parameterSet.LayerDepth; if (initialSoil == "Temp_gras" && soilPropertyDepth10) { - oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.97); + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.97 * (1 / 0.54)); + C_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); + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.67 * (1/0.54)); + C_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); + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.81 * (1 / 0.54)); + C_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * 0.81); } } else { - oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont); + oM_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont * (1 / 0.54)); + C_corr_SoilType.Add((item.Key, soilOfItem), item.Value.OM_Cont); } } + var C_Corr = new Dictionary(); + foreach (var item in C_corr_SoilType) + { + C_Corr.Add(item.Key.Item1, item.Value); + } + var oM_Corr = new Dictionary(); foreach (var item in oM_corr_SoilType) { @@ -899,7 +926,8 @@ namespace FarmMapsAPI.Carbon foreach (var field in cropAreaField1.Where(x => x.Key.Item2 == loopYear)) { var valueList = new List(); - var result = parameterSet.LayerDepth * bulkDens[field.Key.Item1] * oM_Corr[field.Key.Item1] * 0.54; //carbon_organicmatter_factor + //var result = parameterSet.LayerDepth * bulkDens[field.Key.Item1] * oM_Corr[field.Key.Item1];// * 0.54; //carbon_organicmatter_factor + var result = parameterSet.LayerDepth * bulkDens[field.Key.Item1] * C_Corr[field.Key.Item1];// * 0.54; //carbon_organicmatter_factor foreach (var crop in field.Value) { valueList.Add(new ColumnValue(crop.Key, result)); @@ -1708,7 +1736,7 @@ namespace FarmMapsAPI.Carbon var iniValue = item.Value.SingleOrDefault(x => x.Key == "IniCcontent")?.Value ?? 0; var balanceValue = item.Value.SingleOrDefault(x => x.Key == "Balance")?.Value ?? 0; - var resultOmIni = iniValue / 0.54; //carbon_organicmatter_factor + var resultOmIni = iniValue;// / 0.54; //carbon_organicmatter_factor var resultCo2 = balanceValue * (44.0 / 12.0); item.Value.Add(new ColumnValue("OM_ini", resultOmIni)); @@ -1727,7 +1755,7 @@ namespace FarmMapsAPI.Carbon var greenManure = item.SOC_CarbonGreenManure; var compost = item.SOC_CarbonCompost; - item.OM_ini = iniValue / 0.54; //carbon_organicmatter_factor + item.OM_ini = iniValue;// / 0.54; //carbon_organicmatter_factor item.CO2seq = balanceValue * (44.0 / 12.0); var emision = -1 * (manure + residues + greenManure + compost - balanceValue); @@ -1781,7 +1809,7 @@ namespace FarmMapsAPI.Carbon var resultBal = sumBal / farmArea.Total_crop_area; var resultIni = sumIni / farmArea.Total_crop_area; var resultiniCc = sumInicc / farmArea.Total_crop_area; - var resultOm_Ini = resultiniCc / 0.54; //carbon_organicmatter_factor + var resultOm_Ini = resultiniCc;// / 0.54; //carbon_organicmatter_factor var resultCo2 = resultBal * (44.0 / 12.0); var resultCo2Tot = resultCo2 * farmArea.Total_crop_area; @@ -1828,7 +1856,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_Choice.ToLower() == "c" ? field.SoilProperty.OM_Const.Value * 1.85185 : 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, Depth = field.SoilProperty.Depth }); + 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, C_Cont = field.SoilProperty.C_Const.Value, C_Corr = field.SoilProperty.C_Const.Value <= 20 ? field.SoilProperty.C_Const.Value : 0, Depth10 = field.SoilProperty.Depth10.Value, Depth = field.SoilProperty.Depth }); } return soilPropertiesField; @@ -1841,7 +1869,7 @@ namespace FarmMapsAPI.Carbon { foreach (var item2 in item.Value) { - soilPropSoilType.Add((item.Key, item2), new SoilPropertyType { Bulk_Density = soilPropertiesField[item.Key].Bulk_Density, Clay_Content = soilPropertiesField[item.Key].Clay_Content, OM_Cont = soilPropertiesField[item.Key].OM_Cont, OM_Corr = soilPropertiesField[item.Key].OM_Corr }); // soilPropertiesField[item.Key]); + soilPropSoilType.Add((item.Key, item2), new SoilPropertyType { Bulk_Density = soilPropertiesField[item.Key].Bulk_Density, Clay_Content = soilPropertiesField[item.Key].Clay_Content, OM_Cont = soilPropertiesField[item.Key].OM_Cont, OM_Corr = soilPropertiesField[item.Key].OM_Corr, C_Cont = soilPropertiesField[item.Key].C_Cont, C_Corr = soilPropertiesField[item.Key].C_Corr }); // soilPropertiesField[item.Key]); } } return soilPropSoilType; diff --git a/Models/CarbonRequest.cs b/Models/CarbonRequest.cs index 94f4faf..515a27d 100644 --- a/Models/CarbonRequest.cs +++ b/Models/CarbonRequest.cs @@ -36,6 +36,7 @@ namespace CarbonService.Models public class SoilProperty { public double? OM_Const { get; set; } + public double? C_Const { get; set; } public string OM_Choice { get; set; } public double? Clay_Content { get; set; } public bool? Depth10 { get; set; } diff --git a/Models/SoilPropertyType.cs b/Models/SoilPropertyType.cs index 1b04a05..328e422 100644 --- a/Models/SoilPropertyType.cs +++ b/Models/SoilPropertyType.cs @@ -8,6 +8,8 @@ namespace FarmMapsAPI.Carbon.Models { public double OM_Cont { get; set; } public double OM_Corr { get; set; } + public double C_Cont { get; set; } + public double C_Corr { get; set; } public double Bulk_Density { get; set; } public double Clay_Content { get; set; } public int? Depth { get; set; }