コード例 #1
0
    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));
    }
コード例 #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>
    /// <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);
    }
コード例 #3
0
    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);
        }
    }
コード例 #4
0
    /// <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;
        }
    }
コード例 #5
0
    /// <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]);
        }
    }
コード例 #6
0
    /// <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));
    }
コード例 #7
0
 /// <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));
 }
コード例 #8
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));
        }
    }