//--------------------------------------------------------------------------- private static int CalculateBeginGrowingSeason(IClimateRecord[] annualClimate) //Calculate Begin Growing Degree Day (Last Frost; Minimum = 0 degrees C): { NormalRandomVar randVar = new NormalRandomVar(0, 1); double lastMonthMinTemp = annualClimate[0].AvgMinTemp; int dayCnt = 15; //the middle of February int beginGrowingSeason = -1; for (int i = 1; i < 7; i++) //Begin looking in February (1). Should be safe for at least 100 years. { int totalDays = (DaysInMonth(i, 3) + DaysInMonth(i - 1, 3)) / 2; double MonthlyMinTemp = annualClimate[i].AvgMinTemp;// + (monthlyTempSD[i] * randVar.GenerateNumber()); //Now interpolate between days: double degreeIncrement = System.Math.Abs(MonthlyMinTemp - lastMonthMinTemp) / (double)totalDays; double Tnight = MonthlyMinTemp; //start from warmer month double TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); for (int day = 1; day <= totalDays; day++) { if (TnightRandom <= 0) { beginGrowingSeason = (dayCnt + day); } Tnight += degreeIncrement; //work backwards to find last frost day. TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); } lastMonthMinTemp = MonthlyMinTemp; dayCnt += totalDays; //new monthly mid-point } return(beginGrowingSeason); }
//--------------------------------------------------------------------------- private static int CalculateEndGrowingSeason(IClimateRecord[] annualClimate)//, Random autoRand) //Calculate End Growing Degree Day (First frost; Minimum = 0 degrees C): { NormalRandomVar randVar = new NormalRandomVar(0, 1); //Defaults for the middle of July: double lastMonthTemp = annualClimate[6].AvgMinTemp; int dayCnt = 198; //int endGrowingSeason = 198; for (int i = 7; i < 12; i++) //Begin looking in August. Should be safe for at least 100 years. { int totalDays = (DaysInMonth(i, 3) + DaysInMonth(i - 1, 3)) / 2; double MonthlyMinTemp = annualClimate[i].AvgMinTemp; //Now interpolate between days: double degreeIncrement = System.Math.Abs(lastMonthTemp - MonthlyMinTemp) / (double)totalDays; double Tnight = lastMonthTemp; //start from warmer month //double randomT = (2 * annualClimate[i].StdDevTemp * randVar.GenerateNumber(autoRand)); //Console.WriteLine("Night Temp random offset = {0}.", randomT); double TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); for (int day = 1; day <= totalDays; day++) { if (TnightRandom <= 0) { return(dayCnt + day); } Tnight -= degreeIncrement; //work forwards to find first frost day. TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); //Console.WriteLine("Tnight = {0}.", TnightRandom); } lastMonthTemp = MonthlyMinTemp; dayCnt += totalDays; //new monthly mid-point } return(365); }
//--------------------------------------------------------------------------- private static int CalculateEndGrowingSeason(IClimateRecord[] annualClimate)//, Random autoRand) //Calculate End Growing Degree Day (First frost; Minimum = 0 degrees C): { NormalRandomVar randVar = new NormalRandomVar(0, 1); //Defaults for the middle of July: double lastMonthTemp = annualClimate[6].AvgMinTemp; int dayCnt = 198; //int endGrowingSeason = 198; for (int i = 7; i < 12; i++) //Begin looking in August. Should be safe for at least 100 years. { int totalDays = (DaysInMonth(i, 3) + DaysInMonth(i-1, 3)) / 2; double MonthlyMinTemp = annualClimate[i].AvgMinTemp; //Now interpolate between days: double degreeIncrement = System.Math.Abs(lastMonthTemp - MonthlyMinTemp) / (double) totalDays; double Tnight = lastMonthTemp; //start from warmer month //double randomT = (2 * annualClimate[i].StdDevTemp * randVar.GenerateNumber(autoRand)); //Console.WriteLine("Night Temp random offset = {0}.", randomT); double TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); for(int day = 1; day <= totalDays; day++) { if(TnightRandom <= 0) return (dayCnt + day); Tnight -= degreeIncrement; //work forwards to find first frost day. TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); //Console.WriteLine("Tnight = {0}.", TnightRandom); } lastMonthTemp = MonthlyMinTemp; dayCnt += totalDays; //new monthly mid-point } return 365; }
//--------------------------------------------------------------------------- private static int CalculateBeginGrowingSeason(IClimateRecord[] annualClimate) //Calculate Begin Growing Degree Day (Last Frost; Minimum = 0 degrees C): { NormalRandomVar randVar = new NormalRandomVar(0, 1); double lastMonthMinTemp = annualClimate[0].AvgMinTemp; int dayCnt = 15; //the middle of February int beginGrowingSeason = -1; for (int i = 1; i < 7; i++) //Begin looking in February (1). Should be safe for at least 100 years. { int totalDays = (DaysInMonth(i, 3) + DaysInMonth(i-1, 3)) / 2; double MonthlyMinTemp = annualClimate[i].AvgMinTemp;// + (monthlyTempSD[i] * randVar.GenerateNumber()); //Now interpolate between days: double degreeIncrement = System.Math.Abs(MonthlyMinTemp - lastMonthMinTemp) / (double) totalDays; double Tnight = MonthlyMinTemp; //start from warmer month double TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); for(int day = 1; day <= totalDays; day++) { if(TnightRandom <= 0) beginGrowingSeason = (dayCnt + day); Tnight += degreeIncrement; //work backwards to find last frost day. TnightRandom = Tnight + (annualClimate[i].StdDevTemp * (Landis.Util.Random.GenerateUniform() * 2 - 1)); } lastMonthMinTemp = MonthlyMinTemp; dayCnt += totalDays; //new monthly mid-point } return beginGrowingSeason; }