public static Color GetGrowthColor(GrowthPeriod period, int growthID, MatPairStruct mat) { if (period == GrowthPeriod.Fresh) { return(GetColor(mat)); } if (mat.mat_index >= DFConnection.Instance.NetPlantRawList.plant_raws.Count) { return(GetColor(mat)); } if (growthID >= DFConnection.Instance.NetPlantRawList.plant_raws[mat.mat_index].growths.Count) { return(GetColor(mat)); } var growth = DFConnection.Instance.NetPlantRawList.plant_raws[mat.mat_index].growths[growthID]; int currentTicks = TimeHolder.DisplayedTime.CurrentYearTicks; RemoteFortressReader.GrowthPrint freshPrints = null; RemoteFortressReader.GrowthPrint currentPrint = null; RemoteFortressReader.GrowthPrint stalePrint = null; int minTicks = int.MaxValue; int maxTicks = int.MinValue; foreach (var print in growth.prints) { if ((print.timing_start == -1 || print.timing_start <= currentTicks) && (print.timing_end == -1 || print.timing_end >= currentTicks)) { currentPrint = print; } if (print.timing_start == -1 || print.timing_start < minTicks) { minTicks = print.timing_start; freshPrints = print; } if (print.timing_end == -1 || print.timing_end > maxTicks) { maxTicks = print.timing_end; stalePrint = print; } } if (currentPrint == null) { currentPrint = stalePrint; } switch (period) { case GrowthPeriod.Current: return(DfColor.MorphColor(GetColor(mat), freshPrints.color, currentPrint.color)); case GrowthPeriod.Stale: return(DfColor.MorphColor(GetColor(mat), freshPrints.color, stalePrint.color)); } return(GetColor(mat)); }
/// <summary> /// 标准情况下的作物蒸散量 /// </summary> /// <param name="dailyMaxTemperature">日最高温度(℃)</param> /// <param name="dailyMinTemperature">日最低温度(℃)</param> /// <param name="dailyMaxRelativeHumidity">日最大相对湿度</param> /// <param name="dailyMinRelativeHumidity">日最小相对湿度</param> /// <param name="windSpeed">风速(m s^-1)</param> /// <param name="solarRadiation">到达冠层的辐射量(MJ m^-2 day^-1)</param> /// <param name="period">当前生长阶段</param> /// <returns></returns> public static double CropEvapotranspirationUnderStandardConditions(double dailyMaxTemperature, double dailyMinTemperature, double dailyMaxRelativeHumidity, double dailyMinRelativeHumidity, double windSpeed, double solarRadiation, int GC, GrowthPeriod period) { double ET0 = ReferenceCropEvapotranspiration(dailyMaxTemperature, dailyMinTemperature, dailyMaxRelativeHumidity, dailyMinRelativeHumidity, windSpeed, solarRadiation); double KC = GetCropCoefficient(GC, period); return(ET0 * KC); }
public void MorphologicalSim(List <BranchIndex> branchIndexes, List <OrganIndex> organIndexes) { GrowthPeriod period = FunctionSim.GrowthPeriodJudgment(branchIndexes, organIndexes); //判断生长时期 if (period <= GrowthPeriod.TASSELING_STAGE) { MorphologicalSim(FemaleType.Hair); } else { MorphologicalSim(FemaleType.Corn); } }
/// <summary> /// 光合产物分配给各个器官 /// </summary> /// <param name="period">当前的发育期</param> public static void PhotosynthateAllocation(TreeModel treeModel, double biomass, GrowthPeriod period) { switch (period) { case GrowthPeriod.SEEDING_STAGE: PhotosynthateAllocation_SeedingStage(treeModel, biomass); break; case GrowthPeriod.JOINTING_STAGE: PhotosynthateAllocation_JointingStage(treeModel, biomass); break; case GrowthPeriod.TASSELING_STAGE: PhotosynthateAllocation_TasselingStage(treeModel, biomass); break; case GrowthPeriod.GRAIN_STAGE: PhotosynthateAllocation_GrainStage(treeModel, biomass); break; case GrowthPeriod.MATURE_STAGE: PhotosynthateAllocation_MatureStage(biomass); break; } }
/// <summary> /// 获取作物系数 /// </summary> private static double GetCropCoefficient(int GC, GrowthPeriod period) { double[] KC = MaizeParams.KC; //作物系数 switch (period) { case GrowthPeriod.SEEDING_STAGE: return(KC[0]); case GrowthPeriod.JOINTING_STAGE: return((GC - 8) * (KC[1] - KC[0]) / (22.0 - 8.0) + KC[0]); case GrowthPeriod.TASSELING_STAGE: return(KC[1]); case GrowthPeriod.GRAIN_STAGE: return((GC - 21) * (KC[2] - KC[1]) / (34.0 - 21.0) + KC[1]); default: return(KC[2]); } }
/// <summary> /// 温度胁迫因子 /// </summary> /// <param name="temperature">日均温度(℃)</param> public static double TemperatureStressFactor(GrowthPeriod period, double temperature) { int periodIndex = (int)period; float lowestTemperature = MaizeParams.MAIZE_DEVELOPMENT_TEMPERATURE[periodIndex][0]; //最低温度 float optimumTemperature = MaizeParams.MAIZE_DEVELOPMENT_TEMPERATURE[periodIndex][1]; //最适温度 float maximumTemperature = MaizeParams.MAIZE_DEVELOPMENT_TEMPERATURE[periodIndex][2]; //最高温度 /* * 当温度低于最低温度或高于最高温度时 * 温度胁迫因子为0 */ if (temperature < lowestTemperature || temperature > maximumTemperature) { return(0); } double q = 0.25; return (Math.Pow((temperature - lowestTemperature) / (optimumTemperature - lowestTemperature), 1 + q) * Math.Pow((maximumTemperature - temperature) / (maximumTemperature - optimumTemperature), 1 - q)); }
/// <summary> /// 温度胁迫因子 /// </summary> /// <param name="dailyMaxTemperature">日最高温度(℃)</param> /// <param name="dailyMinTemperature">日最低温度(℃)</param> public static double TemperatureStressFactor(GrowthPeriod period, double dailyMaxTemperature, double dailyMinTemperature) { return(TemperatureStressFactor(period, (dailyMaxTemperature + dailyMinTemperature) / 2.0)); }
/// <summary> /// 水分胁迫因子 /// </summary> /// <param name="dailyMaxTemperature">日最高温度(℃)</param> /// <param name="dailyMinTemperature">日最低温度(℃)</param> /// <param name="dailyMaxRelativeHumidity">日最大相对湿度</param> /// <param name="dailyMinRelativeHumidity">日最小相对湿度</param> /// <param name="windSpeed">风速(m s^-1)</param> /// <param name="solarRadiation">到达冠层的辐射量(MJ m^-2 day^-1)</param> /// <param name="period">当前生长阶段</param> /// <param name="WC">土壤当前平均体积持水量(mm)</param> /// <param name="rootDepth">根的深度</param> public static double WaterStressFactor(double dailyMaxTemperature, double dailyMinTemperature, double dailyMaxRelativeHumidity, double dailyMinRelativeHumidity, double windSpeed, double solarRadiation, int GC, GrowthPeriod period, double WC, double rootDepth = 1) { //标准情况下作物的蒸散量 double ETc = CropEvapotranspirationUnderStandardConditions( dailyMaxTemperature, dailyMinTemperature, dailyMaxRelativeHumidity, dailyMinRelativeHumidity, windSpeed, solarRadiation, GC, period); //土壤有效水分含量 double TAW = TotalAvailableWater(rootDepth); //土壤可速效水分含量(在此区间内无水分胁迫) double RAW = ReadilyAvailableWater(TAW, ETc); //土壤水分消耗量 double Dr = RootZoneDepletion(WC, rootDepth); if (Dr < 0) { //未验证数据 Dr = -Dr; if (Dr >= TAW) { return(0); } else { return(1 - Dr / TAW); } } else if (Dr <= RAW) { return(1); } else { return((TAW - Dr) / (TAW - RAW)); } }