private void OnIncorpFOMPool(FOMPoolType FOMPoolData) { if (FOMPoolData.Layer.Length > FOMLignin.C.Length) { throw new Exception("Incorrect number of soil layers of IncorporatedFOM"); } for (int layer = 0; layer < FOMPoolData.Layer.Length; layer++) { FOMCarbohydrate.C[layer] += FOMPoolData.Layer[layer].Pool[0].C; FOMCarbohydrate.N[layer] += FOMPoolData.Layer[layer].Pool[0].N; FOMCellulose.C[layer] += FOMPoolData.Layer[layer].Pool[1].C; FOMCellulose.N[layer] += FOMPoolData.Layer[layer].Pool[1].N; FOMLignin.C[layer] += FOMPoolData.Layer[layer].Pool[2].C; FOMLignin.N[layer] += FOMPoolData.Layer[layer].Pool[2].N; } }
/// <summary> /// Calculate surfom incorporation as a result of tillage and update; /// residue and N pools. /// </summary> /// <param name="fIncorp">The f incorp.</param> /// <param name="tillageDepth">The tillage depth.</param> private void Incorp(double fIncorp, double tillageDepth) { int deepestLayer; int nLayers = soil.Thickness.Length; double F_incorp_layer = 0; double[] residueIncorpFraction = new double[nLayers]; double layerIncorpDepth; double[,] CPool = new double[maxFr, nLayers]; // total C in each Om fraction and layer (from all surfOM"s) incorporated; double[,] NPool = new double[maxFr, nLayers]; // total N in each Om fraction and layer (from all surfOM"s) incorporated; double[,] PPool = new double[maxFr, nLayers]; // total P in each Om fraction and layer (from all surfOM"s) incorporated; double[,] AshAlkPool = new double[maxFr, nLayers]; // total AshAlk in each Om fraction and layer (from all surfOM"s) incorporated; double[] no3 = new double[nLayers]; // total no3 to go into each soil layer (from all surfOM"s) double[] nh4 = new double[nLayers]; // total nh4 to go into each soil layer (from all surfOM"s) double[] po4 = new double[nLayers]; // total po4 to go into each soil layer (from all surfOM"s) FOMPoolType FPoolProfile = new FOMPoolType(); fIncorp = MathUtilities.Bound(fIncorp, 0.0, 1.0); deepestLayer = Soil.LayerIndexOfDepth(tillageDepth, soil.Thickness); double cumDepth = 0.0; for (int layer = 0; layer <= deepestLayer; layer++) { for (int residue = 0; residue < numSurfom; residue++) { double depthToGo = tillageDepth - cumDepth; layerIncorpDepth = Math.Min(depthToGo, soil.Thickness[layer]); F_incorp_layer = MathUtilities.Divide(layerIncorpDepth, tillageDepth, 0.0); for (int i = 0; i < maxFr; i++) { CPool[i, layer] += (SurfOM[residue].Lying[i].C + SurfOM[residue].Standing[i].C) * fIncorp * F_incorp_layer; NPool[i, layer] += (SurfOM[residue].Lying[i].N + SurfOM[residue].Standing[i].N) * fIncorp * F_incorp_layer; PPool[i, layer] += (SurfOM[residue].Lying[i].P + SurfOM[residue].Standing[i].P) * fIncorp * F_incorp_layer; } no3[layer] += SurfOM[residue].no3 * fIncorp * F_incorp_layer; nh4[layer] += SurfOM[residue].nh4 * fIncorp * F_incorp_layer; po4[layer] += SurfOM[residue].po4 * fIncorp * F_incorp_layer; } cumDepth = cumDepth + soil.Thickness[layer]; residueIncorpFraction[layer] = F_incorp_layer; } FPoolProfile.Layer = new FOMPoolLayerType[deepestLayer + 1]; for (int layer = 0; layer <= deepestLayer; layer++) { FPoolProfile.Layer[layer] = new FOMPoolLayerType() { thickness = soil.Thickness[layer], no3 = no3[layer], nh4 = nh4[layer], po4 = po4[layer], Pool = new FOMType[maxFr] }; for (int i = 0; i < maxFr; i++) { FPoolProfile.Layer[layer].Pool[i] = new FOMType() { C = CPool[i, layer], N = NPool[i, layer], P = PPool[i, layer], AshAlk = AshAlkPool[i, layer] } } ; } if (IncorpFOMPool != null) { IncorpFOMPool.Invoke(FPoolProfile); } for (int pool = 0; pool < maxFr; pool++) { for (int i = 0; i < SurfOM.Count; i++) { SurfOM[i].Lying[pool].amount = SurfOM[i].Lying[pool].amount * (1.0 - fIncorp); SurfOM[i].Standing[pool].amount = SurfOM[i].Standing[pool].amount * (1.0 - fIncorp); SurfOM[i].Lying[pool].C = SurfOM[i].Lying[pool].C * (1.0 - fIncorp); SurfOM[i].Standing[pool].C = SurfOM[i].Standing[pool].C * (1.0 - fIncorp); SurfOM[i].Lying[pool].N = SurfOM[i].Lying[pool].N * (1.0 - fIncorp); SurfOM[i].Standing[pool].N = SurfOM[i].Standing[pool].N * (1.0 - fIncorp); SurfOM[i].Lying[pool].P = SurfOM[i].Lying[pool].P * (1.0 - fIncorp); SurfOM[i].Standing[pool].P = SurfOM[i].Standing[pool].P * (1.0 - fIncorp); } } for (int i = 0; i < SurfOM.Count; i++) { SurfOM[i].no3 *= (1.0 - fIncorp); SurfOM[i].nh4 *= (1.0 - fIncorp); SurfOM[i].po4 *= (1.0 - fIncorp); } }