ALMaSS Skylark ODDox  1.1
The skylark model description following ODdox protocol
PLBeet Class Reference

PLBeet class
. More...

#include <PLBeet.h>

Public Member Functions

virtual bool Do (Farm *a_farm, LE *a_field, FarmEvent *a_ev)
 The one and only method for a crop management plan. All farm actions go through here. More...
 
 PLBeet ()
 
- Public Member Functions inherited from Crop
virtual ~Crop ()
 
 Crop ()
 
int GetFirstDate (void)
 
void ChooseNextCrop (int a_no_dates)
 Chooses the next crop to grow in a field. More...
 
int GetCropClassification ()
 
void SetCropClassification (int a_classification)
 

Additional Inherited Members

- Protected Member Functions inherited from Crop
void SimpleEvent (long a_date, int a_todo, bool a_lock)
 Adds an event to this crop management. More...
 
void SimpleEvent_ (long a_date, int a_todo, bool a_lock, Farm *a_farm, LE *a_field)
 Adds an event to this crop management without relying on member variables. More...
 
- Protected Attributes inherited from Crop
Farmm_farm
 
LE * m_field
 
FarmEventm_ev
 
int m_first_date
 
int m_count
 
int m_last_date
 
int m_ddegstoharvest
 
int m_CropClassification
 

Detailed Description

PLBeet class
.

See PLBeet.h::PLBeetToDo for a complete list of all possible events triggered codes by the beet management plan. When triggered these events are handled by Farm and are available as information for other objects such as animal and bird models.

Constructor & Destructor Documentation

◆ PLBeet()

PLBeet::PLBeet ( )
inline
103  {
104  // When we start it off, the first possible date for a farm operation is 20th October
105  // This information is used by other crops when they decide how much post processing of
106  // the management is allowed after harvest before the next crop starts.
107  m_first_date=g_date->DayInYear( 5,11 );
108  }

References Crop::m_first_date.

Member Function Documentation

◆ Do()

bool PLBeet::Do ( Farm a_farm,
LE *  a_field,
FarmEvent a_ev 
)
virtual

The one and only method for a crop management plan. All farm actions go through here.

Called every time something is done to the crop by the farmer in the first instance it is always called with a_ev->todo set to start, but susequently will be called whenever the farmer wants to carry out a new operation.
This method details all the management and relationships between operations necessary to grow and ALMaSS crop - in this case conventional beet.

Reimplemented from Crop.

65 {
66  bool done = false; // The boolean value done indicates when we are totally finished with this plan (i.e. it is set to true).
67  int d1 = 0;
68  // Depending what event has occured jump to the correct bit of code
69  switch (a_ev->m_todo)
70  {
71  case pl_be_start:
72  {
73  // pl_be_start just sets up all the starting conditions and reference dates that are needed to start a pl_sw
74  PL_BE_FERTI_P1 = false;
75  PL_BE_FERTI_S1 = false;
76  PL_BE_STUBBLE_PLOUGH = false;
77  PL_BE_WINTER_PLOUGH = false;
79  PL_BE_WATER_DATE = 0;
80  PL_BE_HERBI_DATE = 0;
81  PL_BE_HERBI1 = false;
82  PL_BE_HERBI3 = false;
83 
84  // Set up the date management stuff
85  // The next bit of code just allows for altering dates after harvest if it is necessary
86  // to allow for a crop which starts its management early.
87 
88  // 2 start and stop dates for all 'movable' events for this crop
89  int noDates = 2;
90  a_field->SetMDates(0, 0, g_date->DayInYear(30, 12)); // last possible day of harvest
91  a_field->SetMDates(1, 0, g_date->DayInYear(30, 12)); // end day of calcium application
92  a_field->SetMDates(0, 1, 0);
93  a_field->SetMDates(1, 1, g_date->DayInYear(30, 12));
94 
95  a_field->SetMConstants(0, 1);
96 
97  // Check the next crop for early start, unless it is a spring crop
98  // in which case we ASSUME that no checking is necessary!!!!
99  // So DO NOT implement a crop that runs over the year boundary (i.e. from spring to spring!), at least not without fixing this.
100 
101  //new if: do the check only for non-optimising farms and if year>0. (030713 - m_rotation used only in the hidden year, so I modified the condition from >7 to >0)
102  //optimising farms not used for now so most of related code is removed (but not in 'start' case)
103  if (!(a_farm->GetType() == tof_OptimisingFarm && g_date->GetYearNumber() > 0)) {
104 
105  if (a_ev->m_startday > g_date->DayInYear(1, 7)) {
106  if (a_field->GetMDates(0, 0) >= a_ev->m_startday)
107  {
108  g_msg->Warn(WARN_BUG, "PLBeet::Do(): ", "Harvest too late for the next crop to start!!!");
109  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
110  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
111  }
112  // Now fix any late finishing problems
113  for (int i = 0; i < noDates; i++) {
114  if (a_field->GetMDates(0, i) >= a_ev->m_startday) {
115  a_field->SetMDates(0, i, a_ev->m_startday - 1); //move the starting date
116  }
117  if (a_field->GetMDates(1, i) >= a_ev->m_startday) {
118  a_field->SetMConstants(i, 0); //change the default value of the MConst (=1) to 0 (necessary to correctly execute farm events in case the finishing date (MDate) was moved)
119  a_field->SetMDates(1, i, a_ev->m_startday - 1); //move the finishing date
120  }
121  }
122  }
123  // Now no operations can be timed after the start of the next crop.
124 
125  if (!a_ev->m_first_year) {
126  // Are we before July 1st?
127  d1 = g_date->OldDays() + g_date->DayInYear(1, 7);
128  if (g_date->Date() < d1) {
129  // Yes, too early. We assumme this is because the last crop was late
130  printf("Poly: %d\n", a_field->GetPoly());
131  g_msg->Warn(WARN_BUG, "PLBeet::Do(): ", "Crop start attempt between 1st Jan & 1st July");
132  int prev = g_landscape_p->BackTranslateVegTypes(a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex()));
133  g_msg->Warn(WARN_BUG, "Previous Crop ", prev);
134  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
135  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
136  }
137  else {
138  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
139  if (g_date->Date() > d1) {
140  // Yes too late - should not happen - raise an error
141  g_msg->Warn(WARN_BUG, "PLBeet::Do(): ", "Crop start attempt after last possible start date");
142  g_msg->Warn(WARN_BUG, "Previous Crop ", "");
143  a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex());
144  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
145  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
146  }
147  }
148  }
149  else {
150  // Is the first year
151  // Some special code to cope with that first start-up year in ALMaSS - ignore for all practical purposes
152  // Code for first spring treatment used
153  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 3), pl_be_spring_harrow, false, a_farm, a_field);
154  break;
155  }
156  }//if
157 
158  // End single block date checking code. Please see next line comment as well.
159  // Reinit d1 to first possible starting date.
160  d1 = g_date->OldDays() + g_date->DayInYear(20, 7);
161  // OK, let's go.
162  // Here we queue up the first event - this differs depending on whether we have a
163  // stock or arable farmer
164  if (a_farm->IsStockFarmer()) { // StockFarmer
165  SimpleEvent_(d1, pl_be_ferti_s1, false, a_farm, a_field);
166  }
167  else SimpleEvent_(d1, pl_be_ferti_p1, false, a_farm, a_field);
168  }
169  break;
170 
171  // This is the first real farm operation
172  case pl_be_ferti_p1:
173  // In total 50% of arable farmers do PK in the autumn, either before stubble plough/harrow or later before winter plough
174  // We therefore assume that half of them (25%) do it now
175  if (a_ev->m_lock || a_farm->DoIt(25))
176  {
177  if (!a_farm->FP_PK(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
178  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p1, true, a_farm, a_field);
179  break;
180  }
181  else
182  {
183  //Rest of farmers do PK before winter plough so we need to remeber who already did it
184  PL_BE_FERTI_P1 = true;
185  }
186  }
187  // Queue up the next event -in this case stubble ploughing
188  SimpleEvent_(g_date->Date() + 1, pl_be_stubble_plough, false, a_farm, a_field);
189  break;
190  case pl_be_ferti_s1:
191  // In total 50% of stock farmers do PK in the autumn, either before stubble plough/harrow or later before winter plough
192  // We therefore assume that half of them (25%) do it now
193  if (a_ev->m_lock || a_farm->DoIt(25))
194  {
195  if (!a_farm->FA_PK(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
196  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s1, true, a_farm, a_field);
197  break;
198  }
199  else
200  {
201  //Rest of farmers do slurry before autumn plough/stubble cultivation so we need to remeber who already did it
202  PL_BE_FERTI_S1 = true;
203  }
204  }
205  // Queue up the next event -in this case stubble ploughing
206  SimpleEvent_(g_date->Date() + 1, pl_be_stubble_plough, false, a_farm, a_field);
207  break;
209  // 55% will do stubble plough, but rest will get away with non-inversion cultivation
210  if (a_ev->m_lock || a_farm->DoIt(55))
211  {
212  if (!a_farm->StubblePlough(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
213  SimpleEvent_(g_date->Date() + 1, pl_be_stubble_plough, true, a_farm, a_field);
214  break;
215  }
216  else
217  {
218  // 55% of farmers will do this, but the other 45% won't so we need to remember whether we are in one or the other group
219  PL_BE_STUBBLE_PLOUGH = true;
220  // Queue up the next event
221  SimpleEvent_(g_date->Date() + 1, pl_be_autumn_harrow1, false, a_farm, a_field);
222  break;
223  }
224  }
225  SimpleEvent_(g_date->Date() + 1, pl_be_stubble_harrow, false, a_farm, a_field);
226  break;
228  if (!a_farm->AutumnHarrow(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
229  SimpleEvent_(g_date->Date() + 1, pl_be_autumn_harrow1, true, a_farm, a_field);
230  break;
231  }
232  SimpleEvent_(g_date->Date() + 2, pl_be_autumn_harrow2, false, a_farm, a_field);
233  break;
235  if (a_ev->m_lock || a_farm->DoIt(40))
236  {
237  if (!a_farm->AutumnHarrow(a_field, 0.0, g_date->Date() + 7 - g_date->DayInYear())) {
238  SimpleEvent_(g_date->Date() + 1, pl_be_autumn_harrow2, true, a_farm, a_field);
239  break;
240  }
241  }
242  d1 = g_date->Date() + 1;
243  if (d1 < g_date->OldDays() + g_date->DayInYear(10, 9)) {
244  d1 = g_date->OldDays() + g_date->DayInYear(10, 9);
245  }
246  if (a_farm->IsStockFarmer()) //Stock Farmer
247  {
248  SimpleEvent_(d1, pl_be_ferti_s2, false, a_farm, a_field);
249  }
250  else SimpleEvent_(d1, pl_be_ferti_p2, false, a_farm, a_field);
251  break;
253  if (!a_farm->StubbleHarrowing(a_field, 0.0, g_date->DayInYear(10, 11) - g_date->DayInYear())) {
254  SimpleEvent_(g_date->Date() + 1, pl_be_stubble_harrow, true, a_farm, a_field);
255  break;
256  }
257  d1 = g_date->Date() + 1;
258  if (d1 < g_date->OldDays() + g_date->DayInYear(10, 9)) {
259  d1 = g_date->OldDays() + g_date->DayInYear(10, 9);
260  }
261  if (a_farm->IsStockFarmer()) //Stock Farmer
262  {
263  SimpleEvent_(d1, pl_be_ferti_s2, false, a_farm, a_field);
264  }
265  else SimpleEvent_(d1, pl_be_ferti_p2, false, a_farm, a_field);
266  break;
267  case pl_be_ferti_p2:
268  // In total 50% of arable farmers do PK in the autumn, either before stubble plough/harrow or later before winter plough
269  // We therefore assume that half of them (25%) do it now (if haven't done before)
270  if ((a_ev->m_lock || a_farm->DoIt(static_cast<int>((25.0/75.0)*100)))&&(PL_BE_FERTI_P1==false))
271  {
272  if (!a_farm->FP_PK(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
273  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p2, true, a_farm, a_field);
274  break;
275  }
276  }
277  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p3, false, a_farm, a_field);
278  break;
279  case pl_be_ferti_s2:
280  // In total 50% of stock farmers do PK in the autumn, either before stubble plough/harrow or later before winter plough
281  // We therefore assume that half of them (25%) do it now (if haven't done before)
282  if ((a_ev->m_lock || a_farm->DoIt(static_cast<int>((25.0/75.0)*100))) && (PL_BE_FERTI_S1==false))
283  {
284  if (!a_farm->FA_PK(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
285  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s2, true, a_farm, a_field);
286  break;
287  }
288  }
289  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s3, false, a_farm, a_field);
290  break;
291  case pl_be_ferti_p3:
292  if (a_ev->m_lock || a_farm->DoIt(74))
293  {
294  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
295  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p3, true, a_farm, a_field);
296  break;
297  }
298  }
299  SimpleEvent_(g_date->Date() + 1, pl_be_winter_plough, false, a_farm, a_field);
300  break;
301  case pl_be_ferti_s3:
302  if (a_ev->m_lock || a_farm->DoIt(74))
303  {
304  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
305  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s3, true, a_farm, a_field);
306  break;
307  }
308  }
309  SimpleEvent_(g_date->Date() + 1, pl_be_winter_plough, false, a_farm, a_field);
310  break;
311  case pl_be_winter_plough:
312  // 88% will do winter plough, but 8% will get away with non-inversion cultivation
313  if (a_ev->m_lock || a_farm->DoIt(88))
314  {
315  if (!a_farm->WinterPlough(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
316  SimpleEvent_(g_date->Date() + 1, pl_be_winter_plough, true, a_farm, a_field);
317  break;
318  }
319  else
320  {
321  PL_BE_WINTER_PLOUGH = true;
322  // Queue up the next event
323  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 3) + 365, pl_be_spring_harrow, false, a_farm, a_field);
324  break;
325  }
326  }
327  SimpleEvent_(g_date->Date() + 1, pl_be_winter_stubble_cultivator_heavy, false, a_farm, a_field);
328  break;
330  // 8% will get away with non-inversion cultivation
331  if (a_ev->m_lock || a_farm->DoIt(67)) // 67% of remaining 12% of farmers who didn't do winter plough
332  {
333  if (!a_farm->StubbleCultivatorHeavy(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
334  SimpleEvent_(g_date->Date() + 1, pl_be_winter_stubble_cultivator_heavy, true, a_farm, a_field);
335  break;
336  }
337  }
338  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 3) + 365, pl_be_spring_harrow, false, a_farm, a_field);
339  break;
340 
341  case pl_be_spring_harrow:
342  if ((a_ev->m_lock) || a_farm->DoIt(50))
343  {
344  if (!a_farm->SpringHarrow(a_field, 0.0, g_date->DayInYear(31, 3) - g_date->DayInYear())) {
345  SimpleEvent_(g_date->Date() + 1, pl_be_spring_harrow, true, a_farm, a_field);
346  break;
347  }
348  }
349  d1 = g_date->Date() + 1;
350  if (d1 < g_date->OldDays() + g_date->DayInYear(15, 3)) {
351  d1 = g_date->OldDays() + g_date->DayInYear(15, 3);
352  }
353  if (a_farm->IsStockFarmer()) //Stock Farmer
354  {
355  SimpleEvent_(d1, pl_be_ferti_s4, false, a_farm, a_field);
356  }
357  else SimpleEvent_(d1, pl_be_ferti_p4, false, a_farm, a_field);
358  break;
359  case pl_be_ferti_p4:
360  if (a_ev->m_lock || a_farm->DoIt(98))
361  {
362  if (!a_farm->FP_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
363  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p4, true, a_farm, a_field);
364  break;
365  }
366  PL_BE_SPRING_FERTI = true;
367  }
368  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p5, false, a_farm, a_field);
369  break;
370  case pl_be_ferti_s4:
371  if (a_ev->m_lock || a_farm->DoIt(98))
372  {
373  if (!a_farm->FA_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
374  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s4, true, a_farm, a_field);
375  break;
376  }
377  PL_BE_SPRING_FERTI = true;
378  }
379  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s5, false, a_farm, a_field);
380  break;
381  case pl_be_ferti_p5:
382  if (a_ev->m_lock || a_farm->DoIt(25))
383  {
384  if (!a_farm->FP_PK(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
385  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p5, true, a_farm, a_field);
386  break;
387  }
388  PL_BE_SPRING_FERTI = true;
389  }
390  SimpleEvent_(g_date->Date() + 1, pl_be_heavy_cultivator, false, a_farm, a_field);
391  break;
392  case pl_be_ferti_s5:
393  if (a_ev->m_lock || a_farm->DoIt(25))
394  {
395  if (!a_farm->FA_PK(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
396  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s5, true, a_farm, a_field);
397  break;
398  }
399  PL_BE_SPRING_FERTI = 1;
400  }
401  SimpleEvent_(g_date->Date() + 1, pl_be_heavy_cultivator, false, a_farm, a_field);
402  break;
404  if (PL_BE_SPRING_FERTI == 1)
405  {
406  if (!a_farm->HeavyCultivatorAggregate(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
407  SimpleEvent_(g_date->Date() + 1, pl_be_heavy_cultivator, true, a_farm, a_field);
408  break;
409  }
410  }
411  d1 = g_date->Date() + 1;
412  if (d1 < g_date->OldDays() + g_date->DayInYear(1, 4)) {
413  d1 = g_date->OldDays() + g_date->DayInYear(1, 4);
414  }
415  SimpleEvent_(d1, pl_be_preseeding_cultivator, false, a_farm, a_field);
416  break;
418  // 90% will do preseeding cultivation, the rest will do it together with sow
419  if (a_ev->m_lock || a_farm->DoIt(90))
420  {
421  if (!a_farm->PreseedingCultivator(a_field, 0.0, g_date->DayInYear(19, 4) - g_date->DayInYear())) {
422  SimpleEvent_(g_date->Date() + 1, pl_be_preseeding_cultivator, true, a_farm, a_field);
423  break;
424  }
425  SimpleEvent_(g_date->Date() + 1, pl_be_spring_sow, false, a_farm, a_field);
426  break;
427  }
428  SimpleEvent_(g_date->Date() + 1, pl_be_preseeding_cultivator_sow, false, a_farm, a_field);
429  break;
430  case pl_be_spring_sow:
431  if (!a_farm->SpringSow(a_field, 0.0, g_date->DayInYear(20, 4) - g_date->DayInYear())) {
432  SimpleEvent_(g_date->Date() + 1, pl_be_spring_sow, true, a_farm, a_field);
433  break;
434  }
435  // Here is a fork leading to four parallel events
436  SimpleEvent_(g_date->Date() + 5, pl_be_harrow_before_emergence, false, a_farm, a_field); // Harrowing before emergence, followed by thinning after emergence
437  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_be_watering1, false, a_farm, a_field); // Watering thread
438  SimpleEvent_(g_date->Date() + 5, pl_be_herbicide1, false, a_farm, a_field); // Herbicide thread
439  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 7), pl_be_fungicide1, false, a_farm, a_field); // Fungicide thread = MAIN THREAD
440  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 6), pl_be_insecticide, false, a_farm, a_field); // Insecticide thread
441  if (a_farm->IsStockFarmer()) //Stock Farmer
442  {
443  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), pl_be_ferti_s6, false, a_farm, a_field); // Fertilizers thread
444  }
445  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), pl_be_ferti_p6, false, a_farm, a_field);
446  break;
448  // 10% will do preseeding cultivation with sow
449  if (!a_farm->PreseedingCultivatorSow(a_field, 0.0, g_date->DayInYear(20, 4) - g_date->DayInYear())) {
450  SimpleEvent_(g_date->Date() + 1, pl_be_preseeding_cultivator_sow, true, a_farm, a_field);
451  break;
452  }
453  // Here is a fork leading to four parallel events
454  SimpleEvent_(g_date->Date() + 5, pl_be_harrow_before_emergence, false, a_farm, a_field); // Harrowing before emergence, followed by thinning after emergence
455  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_be_watering1, false, a_farm, a_field); // Watering thread
456  SimpleEvent_(g_date->Date() + 5, pl_be_herbicide1, false, a_farm, a_field); // Herbicide thread
457  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 7), pl_be_fungicide1, false, a_farm, a_field); // Fungicide thread = MAIN THREAD
458  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 6), pl_be_insecticide, false, a_farm, a_field); // Insecticide thread
459  if (a_farm->IsStockFarmer()) //Stock Farmer
460  {
461  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_be_ferti_s6, false, a_farm, a_field); // Fertilizers thread
462  }
463  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_be_ferti_p6, false, a_farm, a_field);
464  break;
466  if (a_field->GetGreenBiomass() <= 0)
467  {
468  if (a_ev->m_lock || a_farm->DoIt(3))
469  {
470  if (!a_farm->SpringHarrow(a_field, 0.0, g_date->DayInYear(25, 4) - g_date->DayInYear())) {
471  SimpleEvent_(g_date->Date() + 1, pl_be_harrow_before_emergence, true, a_farm, a_field);
472  break;
473  }
474  }
475  SimpleEvent_(g_date->Date() + 5, pl_be_thinning, false, a_farm, a_field);
476  break;
477  }
478  else {
479  SimpleEvent_(g_date->Date() + 1, pl_be_thinning, false, a_farm, a_field);
480  }
481  break;
482  case pl_be_thinning:
483  if (a_ev->m_lock || a_farm->DoIt(5))
484  {
485  if (a_field->GetGreenBiomass() <= 0) {
486  SimpleEvent_(g_date->Date() + 1, pl_be_thinning, true, a_farm, a_field);
487  }
488  else
489  {
490  if (!a_farm->RowCultivation(a_field, 0.0, g_date->DayInYear(5, 5) - g_date->DayInYear())) {
491  SimpleEvent_(g_date->Date() + 1, pl_be_thinning, true, a_farm, a_field);
492  break;
493  }
494  }
495  }
496  // End of thread
497  break;
498  case pl_be_watering1:
499  if (a_ev->m_lock || a_farm->DoIt(3))
500  {
501  if (a_field->GetGreenBiomass() <= 0) {
502  SimpleEvent_(g_date->Date() + 1, pl_be_watering1, true, a_farm, a_field);
503  }
504  else
505  {
506  if (!a_farm->Water(a_field, 0.0, g_date->DayInYear(31, 5) - g_date->DayInYear())) {
507  SimpleEvent_(g_date->Date() + 1, pl_be_watering1, true, a_farm, a_field);
508  break;
509  }
510  PL_BE_WATER_DATE = g_date->Date();
511  }
512  d1 = g_date->Date() + 7;
513  if (d1 < g_date->OldDays() + g_date->DayInYear(1, 6)) {
514  d1 = g_date->OldDays() + g_date->DayInYear(1, 6);
515  }
516  SimpleEvent_(d1, pl_be_watering2, false, a_farm, a_field);
517  break;
518  }
519  break;
520 
521  case pl_be_watering2:
522  if (!a_farm->Water(a_field, 0.0, g_date->DayInYear(30, 6) - g_date->DayInYear())) {
523  SimpleEvent_(g_date->Date() + 1, pl_be_watering2, true, a_farm, a_field);
524  break;
525  }
526  PL_BE_WATER_DATE = g_date->Date();
527  d1 = g_date->Date() + 7;
528  if (d1 < g_date->OldDays() + g_date->DayInYear(1, 7)) {
529  d1 = g_date->OldDays() + g_date->DayInYear(1, 7);
530  }
531  SimpleEvent_(d1, pl_be_watering3, false, a_farm, a_field);
532  break;
533  case pl_be_watering3:
534  if (!a_farm->Water(a_field, 0.0, g_date->DayInYear(31, 7) - g_date->DayInYear())) {
535  SimpleEvent_(g_date->Date() + 1, pl_be_watering3, true, a_farm, a_field);
536  break;
537  }
538  PL_BE_WATER_DATE = g_date->Date();
539  // End of thread
540  break;
541  case pl_be_ferti_p6:
542  // Here comes fertilizers thread
543  if (a_field->GetGreenBiomass() <= 0) {
544  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p6, false, a_farm, a_field);
545  }
546  else
547  {
548  if (!a_farm->FP_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(25, 5) - g_date->DayInYear())) {
549  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p6, true, a_farm, a_field);
550  break;
551  }
552  d1 = g_date->Date() + 1;
553  if (d1 < g_date->OldDays() + g_date->DayInYear(20, 5)) {
554  d1 = g_date->OldDays() + g_date->DayInYear(20, 5);
555  }
556  SimpleEvent_(d1, pl_be_ferti_p7, false, a_farm, a_field);
557  break;
558  }
559  break;
560  case pl_be_ferti_s6:
561  if (a_field->GetGreenBiomass() <= 0) {
562  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s6, false, a_farm, a_field);
563  }
564  else
565  {
566  if (!a_farm->FA_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(25, 5) - g_date->DayInYear())) {
567  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s6, true, a_farm, a_field);
568  break;
569  }
570  d1 = g_date->Date() + 1;
571  if (d1 < g_date->OldDays() + g_date->DayInYear(20, 5)) {
572  d1 = g_date->OldDays() + g_date->DayInYear(20, 5);
573  }
574  SimpleEvent_(d1, pl_be_ferti_s7, false, a_farm, a_field);
575  break;
576  }
577  break;
578  case pl_be_ferti_p7:
579  if (a_ev->m_lock || a_farm->DoIt(89))
580  {
581  if (!a_farm->FP_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(10, 6) - g_date->DayInYear())) {
582  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p7, true, a_farm, a_field);
583  break;
584  }
585  }
586  // End of thread
587  break;
588  case pl_be_ferti_s7:
589  if (a_ev->m_lock || a_farm->DoIt(89))
590  {
591  if (!a_farm->FA_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(10, 6) - g_date->DayInYear())) {
592  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s7, true, a_farm, a_field);
593  break;
594  }
595  }
596  // End of thread
597  break;
598  case pl_be_herbicide1: // The first of the pesticide managements.
599  // Here comes the herbicide thread
600  // We assume that farmers do max 3 herbicide treatments
601  if (a_field->GetGreenBiomass() <= 0)
602  {
603  if (a_ev->m_lock || a_farm->DoIt(43))
604  {
605  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(25, 4) - g_date->DayInYear())) {
606  SimpleEvent_(g_date->Date() + 1, pl_be_herbicide1, true, a_farm, a_field);
607  break;
608  }
609  PL_BE_HERBI1 = true;
610  PL_BE_HERBI_DATE = g_date->Date();
611  }
612  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 5), pl_be_herbicide2, false, a_farm, a_field);
613  break;
614  }
615  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 5), pl_be_herbicide2, false, a_farm, a_field);
616  break;
617  case pl_be_herbicide2:
618  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(31, 5) - g_date->DayInYear())) {
619  SimpleEvent_(g_date->Date() + 1, pl_be_herbicide2, true, a_farm, a_field);
620  break;
621  }
622  PL_BE_HERBI_DATE = g_date->Date();
623  SimpleEvent_(g_date->Date() + 10, pl_be_herbicide3, false, a_farm, a_field);
624  break;
625  case pl_be_herbicide3:
626  if (a_ev->m_lock || a_farm->DoIt(93))
627  {
628  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(10, 6) - g_date->DayInYear())) {
629  SimpleEvent_(g_date->Date() + 1, pl_be_herbicide3, true, a_farm, a_field);
630  break;
631  }
632  PL_BE_HERBI_DATE = g_date->Date();
633  PL_BE_HERBI3 = true;
634  }
635  SimpleEvent_(g_date->Date() + 10, pl_be_herbicide4, false, a_farm, a_field);
636  break;
637  case pl_be_herbicide4:
638  if (a_ev->m_lock || (a_farm->DoIt(81) && (PL_BE_HERBI1 == false || PL_BE_HERBI3 == false))) // which gives 46% of all farmers (and 81% of those who did not apply herbicides before beet emergence)
639  {
640  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(20, 6) - g_date->DayInYear())) {
641  SimpleEvent_(g_date->Date() + 1, pl_be_herbicide4, true, a_farm, a_field);
642  break;
643  }
644  PL_BE_HERBI_DATE = g_date->Date();
645  }
646  // End of thread
647  break;
648  case pl_be_fungicide1:
649  // Here comes the fungicide thread
650  if (a_ev->m_lock || a_farm->DoIt(83))
651  {
652  if (!a_farm->FungicideTreat(a_field, 0.0, g_date->DayInYear(5, 8) - g_date->DayInYear())) {
653  SimpleEvent_(g_date->Date() + 1, pl_be_fungicide1, true, a_farm, a_field);
654  break;
655  }
656  }
657  SimpleEvent_(g_date->Date() + 21, pl_be_fungicide2, false, a_farm, a_field);
658  break;
659  case pl_be_fungicide2:
660  if (a_ev->m_lock || a_farm->DoIt(63))
661  {
662  if (!a_farm->FungicideTreat(a_field, 0.0, g_date->DayInYear(25, 8) - g_date->DayInYear())) {
663  SimpleEvent_(g_date->Date() + 1, pl_be_fungicide2, true, a_farm, a_field);
664  break;
665  }
666  }
667  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 9), pl_be_harvest, false, a_farm, a_field);
668  break;
669  case pl_be_insecticide:
670  // Here comes the insecticide thread
671 
672  if (PL_BE_HERBI_DATE >= g_date->Date() - 2) { // Should by at least 3 days after herbicide
673  SimpleEvent_(g_date->Date() + 1, pl_be_insecticide, false, a_farm, a_field);
674  }
675  else
676  {
677  if (a_ev->m_lock || a_farm->DoIt(58))
678  {
679  // here we check wheter we are using ERA pesticide or not
680  if (!cfg_pest_beet_on.value() ||
681  !g_landscape_p->SupplyShouldSpray()) // Not using pesticide spray
682  {
683  if (!a_farm->InsecticideTreat(a_field, 0.0, g_date->DayInYear(25, 7) - g_date->DayInYear())) {
684  SimpleEvent_(g_date->Date() + 1, pl_be_insecticide, true, a_farm, a_field);
685  break;
686  }
687  }
688  else {
689  a_farm->ProductApplication(a_field, 0.0, 0, cfg_pest_product_1_amount.value(), ppp_1);
690  }
691  }
692  }
693  // End of thread
694  break;
695  case pl_be_harvest:
696  // Here the MAIN thread continues
697  // We don't move harvest days
698  if (!a_farm->Harvest(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
699  SimpleEvent_(g_date->Date() + 1, pl_be_harvest, true, a_farm, a_field);
700  break;
701  }
702  if (a_farm->IsStockFarmer()) //Stock Farmer
703  {
704  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s8, false, a_farm, a_field);
705  }
706  else SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p8, false, a_farm, a_field);
707  break;
708 
709  case pl_be_ferti_p8:
710  if (a_ev->m_lock || a_farm->DoIt(28))
711  {
712  if (a_field->GetMConstants(3) == 0) {
713  if (!a_farm->FP_Calcium(a_field, 0.0, -1)) { // raise an error
714  g_msg->Warn(WARN_BUG, "PLBeet::Do(): failure in 'FP_Calcium' execution", "");
715  exit(1);
716  }
717  }
718  else {
719  if (!a_farm->FP_Calcium(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
720  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_p8, true, a_farm, a_field);
721  break;
722  }
723  }
724  }
725  done = true;
726  // So we are done, and somwhere else the farmer will queue up the start event of the next crop
727  // END of MAIN THREAD
728  break;
729  case pl_be_ferti_s8:
730  if (a_ev->m_lock || a_farm->DoIt(28))
731  {
732  if (a_field->GetMConstants(3) == 0) {
733  if (!a_farm->FA_Calcium(a_field, 0.0, -1)) { // raise an error
734  g_msg->Warn(WARN_BUG, "PLBeet::Do(): failure in 'FA_Calcium' execution", "");
735  exit(1);
736  }
737  }
738  else {
739  if (!a_farm->FA_Calcium(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
740  SimpleEvent_(g_date->Date() + 1, pl_be_ferti_s8, true, a_farm, a_field);
741  break;
742  }
743  }
744  }
745  done = true;
746  // So we are done, and somwhere else the farmer will queue up the start event of the next crop
747  // END of MAIN THREAD
748  break;
749  default:
750  g_msg->Warn(WARN_BUG, "PLBeet::Do(): "
751  "Unknown event type! ", "");
752  exit(1);
753  }
754  return done;
755 }

References Landscape::BackTranslateVegTypes(), cfg_pest_beet_on, cfg_pest_product_1_amount, Farm::DoIt(), Farm::FP_PK(), g_landscape_p, Farm::GetType(), Farm::IsStockFarmer(), Crop::m_first_date, FarmEvent::m_first_year, FarmEvent::m_lock, FarmEvent::m_next_tov, FarmEvent::m_startday, FarmEvent::m_todo, pl_be_autumn_harrow1, pl_be_autumn_harrow2, PL_BE_FERTI_P1, pl_be_ferti_p1, pl_be_ferti_p2, pl_be_ferti_p3, pl_be_ferti_p4, pl_be_ferti_p5, pl_be_ferti_p6, pl_be_ferti_p7, pl_be_ferti_p8, PL_BE_FERTI_S1, pl_be_ferti_s1, pl_be_ferti_s2, pl_be_ferti_s3, pl_be_ferti_s4, pl_be_ferti_s5, pl_be_ferti_s6, pl_be_ferti_s7, pl_be_ferti_s8, pl_be_fungicide1, pl_be_fungicide2, pl_be_harrow_before_emergence, pl_be_harvest, pl_be_heavy_cultivator, PL_BE_HERBI1, PL_BE_HERBI3, PL_BE_HERBI_DATE, pl_be_herbicide1, pl_be_herbicide2, pl_be_herbicide3, pl_be_herbicide4, pl_be_insecticide, pl_be_preseeding_cultivator, pl_be_preseeding_cultivator_sow, PL_BE_SPRING_FERTI, pl_be_spring_harrow, pl_be_spring_sow, pl_be_start, pl_be_stubble_harrow, PL_BE_STUBBLE_PLOUGH, pl_be_stubble_plough, pl_be_thinning, PL_BE_WATER_DATE, pl_be_watering1, pl_be_watering2, pl_be_watering3, PL_BE_WINTER_PLOUGH, pl_be_winter_plough, pl_be_winter_stubble_cultivator_heavy, ppp_1, Crop::SimpleEvent_(), Landscape::SupplyShouldSpray(), and tof_OptimisingFarm.


The documentation for this class was generated from the following files:
pl_be_heavy_cultivator
Definition: PLBeet.h:64
Farm::IsStockFarmer
bool IsStockFarmer(void)
Definition: farm.h:905
pl_be_ferti_s8
Definition: PLBeet.h:86
FarmEvent::m_lock
bool m_lock
Definition: farm.h:465
Landscape::SupplyShouldSpray
bool SupplyShouldSpray()
Definition: Landscape.h:357
Farm::DoIt
bool DoIt(double a_probability)
Return chance out of 0 to 100.
Definition: farm.cpp:800
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
pl_be_ferti_s5
Definition: PLBeet.h:63
tof_OptimisingFarm
Definition: farm.h:273
pl_be_ferti_p2
Definition: PLBeet.h:53
pl_be_herbicide3
Definition: PLBeet.h:75
Landscape::BackTranslateVegTypes
int BackTranslateVegTypes(TTypesOfVegetation VegReference)
Definition: Landscape.h:1669
pl_be_stubble_plough
Definition: PLBeet.h:49
pl_be_ferti_p5
Definition: PLBeet.h:62
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
pl_be_watering3
Definition: PLBeet.h:72
pl_be_ferti_s3
Definition: PLBeet.h:56
pl_be_stubble_harrow
Definition: PLBeet.h:52
pl_be_ferti_p4
Definition: PLBeet.h:60
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
pl_be_ferti_p6
Definition: PLBeet.h:80
pl_be_autumn_harrow1
Definition: PLBeet.h:50
Farm::FP_PK
virtual bool FP_PK(LE *a_field, double a_user, int a_days)
Apply PK fertilizer, on a_field owned by an arable farmer.
Definition: farmfuncs.cpp:653
pl_be_ferti_s4
Definition: PLBeet.h:61
PL_BE_WATER_DATE
#define PL_BE_WATER_DATE
Definition: PLBeet.h:33
pl_be_herbicide1
Definition: PLBeet.h:73
pl_be_ferti_p1
Definition: PLBeet.h:47
pl_be_thinning
Definition: PLBeet.h:69
pl_be_winter_stubble_cultivator_heavy
Definition: PLBeet.h:58
pl_be_ferti_s6
Definition: PLBeet.h:81
pl_be_watering1
Definition: PLBeet.h:70
pl_be_ferti_p3
Definition: PLBeet.h:55
pl_be_preseeding_cultivator_sow
Definition: PLBeet.h:66
pl_be_ferti_s2
Definition: PLBeet.h:54
pl_be_fungicide2
Definition: PLBeet.h:78
cfg_pest_product_1_amount
CfgFloat cfg_pest_product_1_amount
cfg_pest_beet_on
CfgBool cfg_pest_beet_on
pl_be_spring_sow
Definition: PLBeet.h:67
pl_be_ferti_s1
Definition: PLBeet.h:48
PL_BE_STUBBLE_PLOUGH
#define PL_BE_STUBBLE_PLOUGH
Definition: PLBeet.h:30
pl_be_spring_harrow
Definition: PLBeet.h:59
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
PL_BE_FERTI_P1
#define PL_BE_FERTI_P1
A flag used to indicate autumn ploughing status.
Definition: PLBeet.h:28
pl_be_herbicide2
Definition: PLBeet.h:74
pl_be_harrow_before_emergence
Definition: PLBeet.h:68
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
pl_be_start
Definition: PLBeet.h:45
ppp_1
Definition: farm.h:422
pl_be_winter_plough
Definition: PLBeet.h:57
PL_BE_WINTER_PLOUGH
#define PL_BE_WINTER_PLOUGH
Definition: PLBeet.h:31
pl_be_insecticide
Definition: PLBeet.h:79
pl_be_ferti_s7
Definition: PLBeet.h:83
PL_BE_SPRING_FERTI
#define PL_BE_SPRING_FERTI
Definition: PLBeet.h:32
PL_BE_HERBI_DATE
#define PL_BE_HERBI_DATE
Definition: PLBeet.h:34
pl_be_preseeding_cultivator
Definition: PLBeet.h:65
pl_be_ferti_p8
Definition: PLBeet.h:85
pl_be_herbicide4
Definition: PLBeet.h:76
PL_BE_HERBI1
#define PL_BE_HERBI1
Definition: PLBeet.h:35
pl_be_ferti_p7
Definition: PLBeet.h:82
pl_be_harvest
Definition: PLBeet.h:84
pl_be_watering2
Definition: PLBeet.h:71
pl_be_fungicide1
Definition: PLBeet.h:77
PL_BE_FERTI_S1
#define PL_BE_FERTI_S1
Definition: PLBeet.h:29
PL_BE_HERBI3
#define PL_BE_HERBI3
Definition: PLBeet.h:36
pl_be_autumn_harrow2
Definition: PLBeet.h:51
g_landscape_p
Landscape * g_landscape_p
Definition: Landscape.cpp:258
Crop::SimpleEvent_
void SimpleEvent_(long a_date, int a_todo, bool a_lock, Farm *a_farm, LE *a_field)
Adds an event to this crop management without relying on member variables.
Definition: farm.cpp:312