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

PLSpringBarley class
. More...

#include <PLSpringBarley.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...
 
 PLSpringBarley ()
 
- 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

PLSpringBarley class
.

See PLSpringBarley.h::PLSpringBarleyToDo for a complete list of all possible events triggered codes by the spring barley 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

◆ PLSpringBarley()

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

References Crop::m_first_date.

Member Function Documentation

◆ Do()

bool PLSpringBarley::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 spring barley.

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_sb_start:
72  {
73  // pl_sb_start just sets up all the starting conditions and reference dates that are needed to start a pl_sb
74  PL_SB_FERTI_P1 = false;
75  PL_SB_FERTI_S1 = false;
76  PL_SB_STUBBLE_PLOUGH = false;
77  PL_SB_FERTI_P4 = false;
78  PL_SB_FERTI_S4 = false;
80  PL_SB_DECIDE_TO_GR = false;
81 
82  // Set up the date management stuff
83  // The next bit of code just allows for altering dates after harvest if it is necessary
84  // to allow for a crop which starts its management early.
85 
86  // 5 start and stop dates for all 'movable' events for this crop
87  int noDates = 4;
88  a_field->SetMDates(0, 0, g_date->DayInYear(15, 8)); // last possible day of harvest
89  a_field->SetMDates(1, 0, g_date->DayInYear(20, 8)); // last possible day of starw chopping, equal to harvest in this case
90  a_field->SetMDates(0, 1, 0); // start day of hay bailing (not used as it depend on previous treatment)
91  a_field->SetMDates(1, 1, g_date->DayInYear(25, 8)); // end day of hay bailing
92  a_field->SetMDates(0, 2, 0); // start day of RSM
93  a_field->SetMDates(1, 2, g_date->DayInYear(25, 8)); // end day of RSM
94  a_field->SetMDates(0, 3, 0); // start day of calcium application
95  a_field->SetMDates(1, 3, g_date->DayInYear(25, 8)); // end day of calcium application
96  // Can be up to 10 of these. If the shortening code is triggered
97  // then these will be reduced in value to 0
98 
99  a_field->SetMConstants(0, 1);
100 
101  // Check the next crop for early start, unless it is a spring crop
102  // in which case we ASSUME that no checking is necessary!!!!
103  // So DO NOT implement a crop that runs over the year boundary (i.e. from spring to spring!), at least not without fixing this.
104 
105  //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)
106  //optimising farms not used for now so most of related code is removed (but not in 'start' case)
107  if (!(a_farm->GetType() == tof_OptimisingFarm && g_date->GetYearNumber() > 0)) {
108 
109  if (a_ev->m_startday > g_date->DayInYear(1, 7)) {
110  if (a_field->GetMDates(0, 0) >= a_ev->m_startday)
111  {
112  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): ", "Harvest too late for the next crop to start!!!");
113  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
114  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
115  }
116  // Now fix any late finishing problems
117  for (int i = 0; i < noDates; i++) {
118  if (a_field->GetMDates(0, i) >= a_ev->m_startday) {
119  a_field->SetMDates(0, i, a_ev->m_startday - 1); //move the starting date
120  }
121  if (a_field->GetMDates(1, i) >= a_ev->m_startday) {
122  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)
123  a_field->SetMDates(1, i, a_ev->m_startday - 1); //move the finishing date
124  }
125  }
126  }
127  // Now no operations can be timed after the start of the next crop.
128 
129  if (!a_ev->m_first_year) {
130  // Are we before July 1st?
131  d1 = g_date->OldDays() + g_date->DayInYear(1, 7);
132  if (g_date->Date() < d1) {
133  // Yes, too early. We assumme this is because the last crop was late
134  printf("Poly: %d\n", a_field->GetPoly());
135  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): ", "Crop start attempt between 1st Jan & 1st July");
136  int prev = g_landscape_p->BackTranslateVegTypes(a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex()));
137  g_msg->Warn(WARN_BUG, "Previous Crop ", prev);
138  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
139  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
140  }
141  else {
142  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
143  if (g_date->Date() > d1) {
144  // Yes too late - should not happen - raise an error
145  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): ", "Crop start attempt after last possible start date");
146  g_msg->Warn(WARN_BUG, "Previous Crop ", "");
147  a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex());
148  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
149  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
150  }
151  }
152  }
153  else {
154  // Is the first year
155  // Some special code to cope with that first start-up year in ALMaSS - ignore for all practical purposes
156  // Code for first spring treatment used
157  if (a_farm->IsStockFarmer()) //Stock Farmer
158  {
159  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3), pl_sb_ferti_s4, false, a_farm, a_field);
160  }
161  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3), pl_sb_ferti_p4, false, a_farm, a_field);
162  break;
163  }
164  }//if
165 
166  // End single block date checking code. Please see next line comment as well.
167  // Reinit d1 to first possible starting date.
168  d1 = g_date->OldDays() + g_date->DayInYear(20, 7);
169  // OK, let's go.
170  // Here we queue up the first event - this differs depending on whether we have a
171  // stock or arable farmer
172  if (a_farm->IsStockFarmer()) { // StockFarmer
173  SimpleEvent_(d1, pl_sb_ferti_s1, false, a_farm, a_field);
174  }
175  else SimpleEvent_(d1, pl_sb_ferti_p1, false, a_farm, a_field);
176  }
177  break;
178 
179  // This is the first real farm operation
180  case pl_sb_ferti_p1:
181  // In total 10% of arable farmers do slurry in the autumn, either before stubble plough/harrow or later before autumn plough/cultivation
182  // We therefore assume that half of them (5%) do it now
183  if (a_ev->m_lock || a_farm->DoIt(5))
184  {
185  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
186  // If we don't suceed on the first try, then try and try again (until 20/8 when we will suceed)
187  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p1, true, a_farm, a_field);
188  break;
189  }
190  else
191  {
192  //Rest of farmers do slurry before autumn plough/stubble cultivation so we need to remeber who already did it
193  PL_SB_FERTI_P1 = true;
194  }
195  }
196  // Queue up the next event -in this case stubble ploughing
197  SimpleEvent_(g_date->Date() + 1, pl_sb_stubble_plough, false, a_farm, a_field);
198  break;
199  case pl_sb_ferti_s1:
200  // In total 40% of stock farmers do slurry in the autumn, either before stubble plough/harrow or later before autumn plough/cultivation
201  // We therefore assume that half of them (40%) do it now
202  if (a_ev->m_lock || a_farm->DoIt(40))
203  {
204  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
205  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s1, true, a_farm, a_field);
206  break;
207  }
208  else
209  {
210  //Rest of farmers do slurry before autumn plough/stubble cultivation so we need to remeber who already did it
211  PL_SB_FERTI_S1 = true;
212  }
213  }
214  // Queue up the next event -in this case stubble ploughing
215  SimpleEvent_(g_date->Date() + 1, pl_sb_stubble_plough, false, a_farm, a_field);
216  break;
218  // 50% will do stubble plough, but rest will get away with non-inversion cultivation
219  if (a_ev->m_lock || a_farm->DoIt(50))
220  {
221  if (!a_farm->StubblePlough(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
222  SimpleEvent_(g_date->Date() + 1, pl_sb_stubble_plough, true, a_farm, a_field);
223  break;
224  }
225  else
226  {
227  // 50% of farmers will do this, but the other 50% won't so we need to remember whether we are in one or the other group
228  PL_SB_STUBBLE_PLOUGH = true;
229  // Queue up the next event
230  SimpleEvent_(g_date->Date() + 1, pl_sb_autumn_harrow1, false, a_farm, a_field);
231  break;
232  }
233  }
234  SimpleEvent_(g_date->Date() + 1, pl_sb_stubble_harrow, false, a_farm, a_field);
235  break;
237  if (!a_farm->AutumnHarrow(a_field, 0.0, g_date->DayInYear(5, 11) - g_date->DayInYear())) {
238  SimpleEvent_(g_date->Date() + 1, pl_sb_autumn_harrow1, true, a_farm, a_field);
239  break;
240  }
241  SimpleEvent_(g_date->Date() + 2, pl_sb_autumn_harrow2, false, a_farm, a_field);
242  break;
244  if (a_ev->m_lock || a_farm->DoIt(40))
245  {
246  if (!a_farm->AutumnHarrow(a_field, 0.0, g_date->Date() + 7 - g_date->DayInYear())) {
247  SimpleEvent_(g_date->Date() + 1, pl_sb_autumn_harrow2, true, a_farm, a_field);
248  break;
249  }
250  }
251  d1 = g_date->Date() + 1;
252  if (d1 < g_date->OldDays() + g_date->DayInYear(10, 9)) {
253  d1 = g_date->OldDays() + g_date->DayInYear(10, 9);
254  }
255  if (a_farm->IsStockFarmer()) //Stock Farmer
256  {
257  SimpleEvent_(d1, pl_sb_ferti_s2, false, a_farm, a_field);
258  }
259  else SimpleEvent_(d1, pl_sb_ferti_p2, false, a_farm, a_field);
260  break;
262  if (!a_farm->StubbleHarrowing(a_field, 0.0, g_date->DayInYear(10, 11) - g_date->DayInYear())) {
263  SimpleEvent_(g_date->Date() + 1, pl_sb_stubble_harrow, true, a_farm, a_field);
264  break;
265  }
266  d1 = g_date->Date() + 1;
267  if (d1 < g_date->OldDays() + g_date->DayInYear(10, 9)) {
268  d1 = g_date->OldDays() + g_date->DayInYear(10, 9);
269  }
270  if (a_farm->IsStockFarmer()) //Stock Farmer
271  {
272  SimpleEvent_(d1, pl_sb_ferti_s2, false, a_farm, a_field);
273  }
274  else SimpleEvent_(d1, pl_sb_ferti_p2, false, a_farm, a_field);
275  break;
276  case pl_sb_ferti_p2:
277  // In total 10% of arable farmers do slurry in the autumn, either before stubble plough/harrow or later before autumn plough/cultivation
278  // We therefore assume that half of them (5%) do it now (if haven't done before)
279  if ((a_ev->m_lock || a_farm->DoIt(static_cast<int>((5.0 / 95.0) * 100))) && (PL_SB_FERTI_P1 == false))
280  {
281  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
282  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p2, true, a_farm, a_field);
283  break;
284  }
285  }
286  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p3, false, a_farm, a_field);
287  break;
288  case pl_sb_ferti_s2:
289  // In total 80% of stock farmers do slurry in the autumn, either before stubble plough/harrow or later before autumn plough/cultivation
290  // We therefore assume that half of them (40%) do it now (if haven't done before)
291  if ((a_ev->m_lock || a_farm->DoIt(static_cast<int>((40.0 / 60.0) * 100))) && (PL_SB_FERTI_S1 == false))
292  {
293  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
294  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s2, true, a_farm, a_field);
295  break;
296  }
297  }
298  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s3, false, a_farm, a_field);
299  break;
300  case pl_sb_ferti_p3:
301  if (a_ev->m_lock || a_farm->DoIt(28))
302  {
303  if (!a_farm->FP_NPKS(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
304  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p3, true, a_farm, a_field);
305  break;
306  }
307  }
308  SimpleEvent_(g_date->Date() + 1, pl_sb_winter_plough, false, a_farm, a_field);
309  break;
310  case pl_sb_ferti_s3:
311  if (a_ev->m_lock || a_farm->DoIt(28))
312  {
313  if (!a_farm->FA_NPKS(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
314  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s3, true, a_farm, a_field);
315  break;
316  }
317  }
318  SimpleEvent_(g_date->Date() + 1, pl_sb_winter_plough, false, a_farm, a_field);
319  break;
320  case pl_sb_winter_plough:
321  if (a_ev->m_lock || a_farm->DoIt(30))
322  {
323  if (!a_farm->WinterPlough(a_field, 0.0, g_date->DayInYear(15, 11) - g_date->DayInYear())) {
324  SimpleEvent_(g_date->Date() + 1, pl_sb_winter_plough, true, a_farm, a_field);
325  break;
326  }
327  }
328  if (a_farm->IsStockFarmer()) //Stock Farmer
329  {
330  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3) + 365, pl_sb_ferti_s4, false, a_farm, a_field);
331  }
332  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3) + 365, pl_sb_ferti_p4, false, a_farm, a_field);
333  break;
334  case pl_sb_ferti_p4:
335  if (a_ev->m_lock || a_farm->DoIt(23))
336  {
337  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(25, 3) - g_date->DayInYear())) {
338  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p4, true, a_farm, a_field);
339  break;
340  }
341  else
342  {
343  //All farmers who do spring slurry have to do harrow
344  PL_SB_FERTI_P4 = true;
345  }
346  }
347  SimpleEvent_(g_date->Date() + 1, pl_sb_spring_harrow, false, a_farm, a_field);
348  break;
349  case pl_sb_ferti_s4:
350  if (a_ev->m_lock || a_farm->DoIt(23))
351  {
352  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(25, 3) - g_date->DayInYear())) {
353  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s4, true, a_farm, a_field);
354  break;
355  }
356  else
357  {
358  //All farmers who do spring slurry have to do harrow
359  PL_SB_FERTI_S4 = true;
360  }
361  }
362  SimpleEvent_(g_date->Date() + 1, pl_sb_spring_harrow, false, a_farm, a_field);
363  break;
364  case pl_sb_spring_harrow:
365  if ((a_ev->m_lock) || (PL_SB_FERTI_P4) || (PL_SB_FERTI_S4) || (a_farm->DoIt(13)))
366  {
367  if (!a_farm->SpringHarrow(a_field, 0.0, g_date->DayInYear(25, 3) - g_date->DayInYear())) {
368  SimpleEvent_(g_date->Date() + 1, pl_sb_spring_harrow, true, a_farm, a_field);
369  break;
370  }
371  }
372  d1 = g_date->Date() + 1;
373  if (d1 < g_date->OldDays() + g_date->DayInYear(5, 3)) {
374  d1 = g_date->OldDays() + g_date->DayInYear(5, 3);
375  }
376  if (a_farm->IsStockFarmer()) //Stock Farmer
377  {
378  SimpleEvent_(d1, pl_sb_ferti_s5, false, a_farm, a_field);
379  }
380  else SimpleEvent_(d1, pl_sb_ferti_p5, false, a_farm, a_field);
381  break;
382  case pl_sb_ferti_p5:
383  if (a_ev->m_lock || a_farm->DoIt(88))
384  {
385  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
386  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p5, true, a_farm, a_field);
387  break;
388  }
389  PL_SB_SPRING_FERTI = true;
390  }
391  SimpleEvent_(g_date->Date() + 1, pl_sb_heavy_cultivator, false, a_farm, a_field);
392  break;
393  case pl_sb_ferti_s5:
394  if (a_ev->m_lock || a_farm->DoIt(88))
395  {
396  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
397  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s5, true, a_farm, a_field);
398  break;
399  }
400  PL_SB_SPRING_FERTI = 1;
401  }
402  SimpleEvent_(g_date->Date() + 1, pl_sb_heavy_cultivator, false, a_farm, a_field);
403  break;
405  if (PL_SB_SPRING_FERTI == 1)
406  {
407  if (!a_farm->HeavyCultivatorAggregate(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
408  SimpleEvent_(g_date->Date() + 1, pl_sb_heavy_cultivator, true, a_farm, a_field);
409  break;
410  }
411  }
412  d1 = g_date->Date() + 1;
413  if (d1 < g_date->OldDays() + g_date->DayInYear(20, 3)) {
414  d1 = g_date->OldDays() + g_date->DayInYear(20, 3);
415  }
416  SimpleEvent_(d1, pl_sb_preseeding_cultivator, false, a_farm, a_field);
417  break;
419  // 20% will do preseeding cultivation, the rest will do it together with sow
420  if (a_ev->m_lock || a_farm->DoIt(20))
421  {
422  if (!a_farm->PreseedingCultivator(a_field, 0.0, g_date->DayInYear(9, 4) - g_date->DayInYear())) {
423  SimpleEvent_(g_date->Date() + 1, pl_sb_preseeding_cultivator, true, a_farm, a_field);
424  break;
425  }
426  SimpleEvent_(g_date->Date() + 1, pl_sb_spring_sow, false, a_farm, a_field);
427  break;
428  }
429  SimpleEvent_(g_date->Date() + 1, pl_sb_preseeding_cultivator_sow, false, a_farm, a_field);
430  break;
431  case pl_sb_spring_sow:
432  if (!a_farm->SpringSow(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
433  SimpleEvent_(g_date->Date() + 1, pl_sb_spring_sow, true, a_farm, a_field);
434  break;
435  }
436  // Here is a fork leading to four parallel events
437  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 4), pl_sb_herbicide1, false, a_farm, a_field); // Herbidide thread
438  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_fungicide1, false, a_farm, a_field); // Fungicide thread
439  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 5), pl_sb_insecticide1, false, a_farm, a_field); // Insecticide thread = MAIN THREAD
440  if (a_farm->IsStockFarmer()) //Stock Farmer // N thread
441  {
442  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_s6, false, a_farm, a_field);
443  }
444  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_p6, false, a_farm, a_field);
445  if (a_farm->IsStockFarmer()) //Stock Farmer // Microelemnts thread
446  {
447  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_s7, false, a_farm, a_field);
448  }
449  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_p7, false, a_farm, a_field);
450  break;
452  // 80% will do preseeding cultivation with sow
453  if (!a_farm->PreseedingCultivatorSow(a_field, 0.0, g_date->DayInYear(10, 4) - g_date->DayInYear())) {
454  SimpleEvent_(g_date->Date() + 1, pl_sb_preseeding_cultivator_sow, true, a_farm, a_field);
455  break;
456  }
457  // Here is a fork leading to four parallel events
458  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 4), pl_sb_herbicide1, false, a_farm, a_field); // Herbidide thread
459  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_fungicide1, false, a_farm, a_field); // Fungicide thread
460  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(15, 5), pl_sb_insecticide1, false, a_farm, a_field); // Insecticide thread = MAIN THREAD
461  if (a_farm->IsStockFarmer()) //Stock Farmer // N thread
462  {
463  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_s6, false, a_farm, a_field);
464  }
465  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_p6, false, a_farm, a_field);
466  if (a_farm->IsStockFarmer()) //Stock Farmer // Microelemnts thread
467  {
468  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_s7, false, a_farm, a_field);
469  }
470  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 5), pl_sb_ferti_p7, false, a_farm, a_field);
471  break;
472  case pl_sb_ferti_p6:
473  // Here comes N thread
474  if (!a_farm->FP_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(30, 5) - g_date->DayInYear())) {
475  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p6, true, a_farm, a_field);
476  break;
477  }
478  // End of thread
479  break;
480  case pl_sb_ferti_s6:
481  if (!a_farm->FA_AmmoniumSulphate(a_field, 0.0, g_date->DayInYear(30, 5) - g_date->DayInYear())) {
482  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s6, true, a_farm, a_field);
483  break;
484  }
485  // End of thread
486  break;
487  case pl_sb_ferti_p7:
488  // Here comes the mickroelements thread
489  if (a_ev->m_lock || a_farm->DoIt(43))
490  {
491  if (!a_farm->FP_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(30, 5) - g_date->DayInYear())) {
492  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p7, true, a_farm, a_field);
493  break;
494  }
495  }
496  d1 = g_date->Date() + 14;
497  if (d1 < g_date->OldDays() + g_date->DayInYear(25, 5)) {
498  d1 = g_date->OldDays() + g_date->DayInYear(25, 5);
499  }
500  SimpleEvent_(d1, pl_sb_ferti_p8, false, a_farm, a_field);
501  break;
502  case pl_sb_ferti_s7:
503  if (a_ev->m_lock || a_farm->DoIt(43))
504  {
505  if (!a_farm->FA_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(30, 5) - g_date->DayInYear())) {
506  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s7, true, a_farm, a_field);
507  break;
508  }
509  }
510  d1 = g_date->Date() + 14;
511  if (d1 < g_date->OldDays() + g_date->DayInYear(25, 5)) {
512  d1 = g_date->OldDays() + g_date->DayInYear(25, 5);
513  }
514  SimpleEvent_(d1, pl_sb_ferti_s8, false, a_farm, a_field);
515  break;
516  case pl_sb_ferti_p8:
517  if (a_ev->m_lock || a_farm->DoIt(3))
518  {
519  if (!a_farm->FP_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(10, 6) - g_date->DayInYear())) {
520  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p8, true, a_farm, a_field);
521  break;
522  }
523  }
524  // End of thread
525  break;
526  case pl_sb_ferti_s8:
527  if (a_ev->m_lock || a_farm->DoIt(3))
528  {
529  if (!a_farm->FA_ManganeseSulphate(a_field, 0.0, g_date->DayInYear(10, 6) - g_date->DayInYear())) {
530  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s8, true, a_farm, a_field);
531  break;
532  }
533  }
534  // End of thread
535  break;
536  case pl_sb_herbicide1: // The first of the pesticide managements.
537  // Here comes the herbicide thread
538  if (a_ev->m_lock || a_farm->DoIt(97))
539  {
540  if (a_field->GetGreenBiomass() <= 0) {
541  SimpleEvent_(g_date->Date() + 5, pl_sb_herbicide1, true, a_farm, a_field);
542  }
543  else
544  {
545  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(10, 5) - g_date->DayInYear())) {
546  SimpleEvent_(g_date->Date() + 1, pl_sb_herbicide1, true, a_farm, a_field);
547  break;
548  }
549  }
550  }
551  // End of thread
552  break;
553  case pl_sb_fungicide1:
554  // Here comes the fungicide thread
555  if (a_ev->m_lock || a_farm->DoIt(83))
556  {
557  if (!a_farm->FungicideTreat(a_field, 0.0, g_date->DayInYear(15, 6) - g_date->DayInYear())) {
558  SimpleEvent_(g_date->Date() + 1, pl_sb_fungicide1, true, a_farm, a_field);
559  break;
560  }
561  }
562  SimpleEvent_(g_date->Date() + 14, pl_sb_fungicide2, false, a_farm, a_field);
563  break;
564  case pl_sb_fungicide2:
565  if (a_ev->m_lock || a_farm->DoIt(23))
566  {
567  if (!a_farm->FungicideTreat(a_field, 0.0, g_date->DayInYear(15, 6) - g_date->DayInYear())) {
568  SimpleEvent_(g_date->Date() + 1, pl_sb_fungicide2, true, a_farm, a_field);
569  break;
570  }
571  }
572  d1 = g_date->Date() + 14;
573  if (d1 < g_date->OldDays() + g_date->DayInYear(20, 5)) {
574  d1 = g_date->OldDays() + g_date->DayInYear(20, 5);
575  }
576  SimpleEvent_(d1, pl_sb_fungicide3, false, a_farm, a_field);
577  break;
578  case pl_sb_fungicide3:
579  if (a_ev->m_lock || a_farm->DoIt(4))
580  {
581  if (!a_farm->FungicideTreat(a_field, 0.0, g_date->DayInYear(20, 6) - g_date->DayInYear())) {
582  SimpleEvent_(g_date->Date() + 1, pl_sb_fungicide3, true, a_farm, a_field);
583  break;
584  }
585  }
586  // End of thread
587  break;
588  case pl_sb_insecticide1:
589  // Here comes the insecticide thread = MAIN THREAD
590  if (a_ev->m_lock || a_farm->DoIt(65))
591  {
592  // here we check wheter we are using ERA pesticide or not
593  if (!cfg_pest_springbarley_on.value() ||
594  !g_landscape_p->SupplyShouldSpray()) // Not using pesticide spray
595  {
596  if (!a_farm->InsecticideTreat(a_field, 0.0, g_date->DayInYear(15, 6) - g_date->DayInYear())) {
597  SimpleEvent_(g_date->Date() + 1, pl_sb_insecticide1, true, a_farm, a_field);
598  break;
599  }
600  }
601  else {
602  a_farm->ProductApplication(a_field, 0.0, 0, cfg_pest_product_1_amount.value(), ppp_1);
603  }
604  }
605  SimpleEvent_(g_date->Date() + 14, pl_sb_insecticide2, false, a_farm, a_field);
606  break;
607  case pl_sb_insecticide2:
608  if (a_ev->m_lock || a_farm->DoIt(46))
609  {
610  // here we check wheter we are using ERA pesticide or not
611  if (!cfg_pest_springbarley_on.value() ||
612  !g_landscape_p->SupplyShouldSpray()) // Not using pesticide spray
613  {
614  if (!a_farm->InsecticideTreat(a_field, 0.0, g_date->DayInYear(30, 6) - g_date->DayInYear())) {
615  SimpleEvent_(g_date->Date() + 1, pl_sb_insecticide2, true, a_farm, a_field);
616  break;
617  }
618  }
619  else {
620  a_farm->ProductApplication(a_field, 0.0, 0, cfg_pest_product_1_amount.value(), ppp_1);
621  }
622  }
623  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(20, 7), pl_sb_harvest, false, a_farm, a_field);
624  break;
625  case pl_sb_harvest:
626  // Here the MAIN thread continues
627  // We don't move harvest days
628  if (!a_farm->Harvest(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
629  SimpleEvent_(g_date->Date() + 1, pl_sb_harvest, true, a_farm, a_field);
630  break;
631  }
632  SimpleEvent_(g_date->Date() + 1, pl_sb_straw_chopping, false, a_farm, a_field);
633  break;
635  if (a_farm->IsStockFarmer()) //Stock Farmer
636  {
637  // 10% of stock farmers will do straw chopping, but rest will do hay bailing instead
638  if (a_ev->m_lock || a_farm->DoIt(10))
639  {
640  if (a_field->GetMConstants(0) == 0) {
641  if (!a_farm->StrawChopping(a_field, 0.0, -1)) { // raise an error
642  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'StrawChopping' execution", "");
643  exit(1);
644  }
645  }
646  else {
647  if (!a_farm->StrawChopping(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
648  SimpleEvent_(g_date->Date() + 1, pl_sb_straw_chopping, true, a_farm, a_field);
649  break;
650  }
651  else
652  {
653  // Queue up the next event
654  SimpleEvent_(g_date->Date(), pl_sb_ferti_s9, false, a_farm, a_field);
655  break;
656  }
657  }
658 
659  }
660  SimpleEvent_(g_date->Date() + 1, pl_sb_hay_bailing, false, a_farm, a_field);
661  break;
662  }
663  else
664  {
665  // 90% of arable farmers will do straw chopping, but rest will do hay bailing instead
666  if (a_ev->m_lock || a_farm->DoIt(90))
667  {
668  if (a_field->GetMConstants(0) == 0) {
669  if (!a_farm->StrawChopping(a_field, 0.0, -1)) { // raise an error
670  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'StrawChopping' execution", "");
671  exit(1);
672  }
673  }
674  else {
675  if (!a_farm->StrawChopping(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
676  SimpleEvent_(g_date->Date() + 1, pl_sb_straw_chopping, true, a_farm, a_field);
677  break;
678  }
679  else
680  {
681  // Queue up the next event
682  SimpleEvent_(g_date->Date(), pl_sb_ferti_p9, false, a_farm, a_field);
683  break;
684  }
685  }
686 
687  }
688  SimpleEvent_(g_date->Date() + 1, pl_sb_hay_bailing, false, a_farm, a_field);
689  break;
690  }
691  case pl_sb_hay_bailing:
692  if (a_field->GetMConstants(1) == 0) {
693  if (!a_farm->HayBailing(a_field, 0.0, -1)) { // raise an error
694  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'HayBailing' execution", "");
695  exit(1);
696  }
697  }
698  else {
699  if (!a_farm->HayBailing(a_field, 0.0, a_field->GetMDates(1, 1) - g_date->DayInYear())) {
700  SimpleEvent_(g_date->Date() + 1, pl_sb_hay_bailing, true, a_farm, a_field);
701  break;
702  }
703  }
704  if (a_farm->IsStockFarmer()) //Stock Farmer
705  {
706  SimpleEvent_(g_date->Date(), pl_sb_ferti_s10, false, a_farm, a_field);
707  }
708  else SimpleEvent_(g_date->Date(), pl_sb_ferti_p10, false, a_farm, a_field);
709  break;
710  case pl_sb_ferti_p9:
711  if (a_ev->m_lock || a_farm->DoIt(18))
712  {
713  if (a_field->GetMConstants(2) == 0) {
714  if (!a_farm->FP_RSM(a_field, 0.0, -1)) { // raise an error
715  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'FP_RSM' execution", "");
716  exit(1);
717  }
718  }
719  else {
720  if (!a_farm->FP_RSM(a_field, 0.0, a_field->GetMDates(1, 2) - g_date->DayInYear())) {
721  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p9, true, a_farm, a_field);
722  break;
723  }
724  }
725  }
726  if (a_farm->IsStockFarmer()) //Stock Farmer
727  {
728  SimpleEvent_(g_date->Date(), pl_sb_ferti_s10, false, a_farm, a_field);
729  }
730  else SimpleEvent_(g_date->Date(), pl_sb_ferti_p10, false, a_farm, a_field);
731  break;
732  case pl_sb_ferti_s9:
733  if (a_ev->m_lock || a_farm->DoIt(18))
734  {
735  if (a_field->GetMConstants(2) == 0) {
736  if (!a_farm->FA_RSM(a_field, 0.0, -1)) { // raise an error
737  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'FA_RSM' execution", "");
738  exit(1);
739  }
740  }
741  else {
742  if (!a_farm->FA_RSM(a_field, 0.0, a_field->GetMDates(1, 2) - g_date->DayInYear())) {
743  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s9, true, a_farm, a_field);
744  break;
745  }
746  }
747  }
748  if (a_farm->IsStockFarmer()) //Stock Farmer
749  {
750  SimpleEvent_(g_date->Date(), pl_sb_ferti_s10, false, a_farm, a_field);
751  }
752  else SimpleEvent_(g_date->Date(), pl_sb_ferti_p10, false, a_farm, a_field);
753  break;
754  case pl_sb_ferti_p10:
755  if (a_ev->m_lock || a_farm->DoIt(23))
756  {
757  if (a_field->GetMConstants(3) == 0) {
758  if (!a_farm->FP_Calcium(a_field, 0.0, -1)) { // raise an error
759  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'FP_Calcium' execution", "");
760  exit(1);
761  }
762  }
763  else {
764  if (!a_farm->FP_Calcium(a_field, 0.0, a_field->GetMDates(1, 3) - g_date->DayInYear())) {
765  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_p10, true, a_farm, a_field);
766  break;
767  }
768  }
769  }
770  done = true;
771  // So we are done, and somwhere else the farmer will queue up the start event of the next crop
772  // END of MAIN THREAD
773  break;
774  case pl_sb_ferti_s10:
775  if (a_ev->m_lock || a_farm->DoIt(23))
776  {
777  if (a_field->GetMConstants(3) == 0) {
778  if (!a_farm->FA_Calcium(a_field, 0.0, -1)) { // raise an error
779  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): failure in 'FA_Calcium' execution", "");
780  exit(1);
781  }
782  }
783  else {
784  if (!a_farm->FA_Calcium(a_field, 0.0, a_field->GetMDates(1, 3) - g_date->DayInYear())) {
785  SimpleEvent_(g_date->Date() + 1, pl_sb_ferti_s10, true, a_farm, a_field);
786  break;
787  }
788  }
789  }
790  done = true;
791  // So we are done, and somwhere else the farmer will queue up the start event of the next crop
792  // END of MAIN THREAD
793  break;
794  default:
795  g_msg->Warn(WARN_BUG, "PLSpringBarley::Do(): "
796  "Unknown event type! ", "");
797  exit(1);
798  }
799  return done;
800 }

References Landscape::BackTranslateVegTypes(), cfg_pest_product_1_amount, cfg_pest_springbarley_on, Farm::DoIt(), Farm::FP_Slurry(), 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_sb_autumn_harrow1, pl_sb_autumn_harrow2, PL_SB_DECIDE_TO_GR, PL_SB_FERTI_P1, pl_sb_ferti_p1, pl_sb_ferti_p10, pl_sb_ferti_p2, pl_sb_ferti_p3, PL_SB_FERTI_P4, pl_sb_ferti_p4, pl_sb_ferti_p5, pl_sb_ferti_p6, pl_sb_ferti_p7, pl_sb_ferti_p8, pl_sb_ferti_p9, PL_SB_FERTI_S1, pl_sb_ferti_s1, pl_sb_ferti_s10, pl_sb_ferti_s2, pl_sb_ferti_s3, PL_SB_FERTI_S4, pl_sb_ferti_s4, pl_sb_ferti_s5, pl_sb_ferti_s6, pl_sb_ferti_s7, pl_sb_ferti_s8, pl_sb_ferti_s9, pl_sb_fungicide1, pl_sb_fungicide2, pl_sb_fungicide3, pl_sb_harvest, pl_sb_hay_bailing, pl_sb_heavy_cultivator, pl_sb_herbicide1, pl_sb_insecticide1, pl_sb_insecticide2, pl_sb_preseeding_cultivator, pl_sb_preseeding_cultivator_sow, PL_SB_SPRING_FERTI, pl_sb_spring_harrow, pl_sb_spring_sow, pl_sb_start, pl_sb_straw_chopping, pl_sb_stubble_harrow, PL_SB_STUBBLE_PLOUGH, pl_sb_stubble_plough, pl_sb_winter_plough, ppp_1, Crop::SimpleEvent_(), Landscape::SupplyShouldSpray(), and tof_OptimisingFarm.


The documentation for this class was generated from the following files:
PL_SB_STUBBLE_PLOUGH
#define PL_SB_STUBBLE_PLOUGH
Definition: PLSpringBarley.h:30
pl_sb_ferti_s5
Definition: PLSpringBarley.h:59
pl_sb_ferti_p10
Definition: PLSpringBarley.h:81
Farm::IsStockFarmer
bool IsStockFarmer(void)
Definition: farm.h:905
cfg_pest_product_1_amount
CfgFloat cfg_pest_product_1_amount
FarmEvent::m_lock
bool m_lock
Definition: farm.h:465
Landscape::SupplyShouldSpray
bool SupplyShouldSpray()
Definition: Landscape.h:357
pl_sb_winter_plough
Definition: PLSpringBarley.h:54
PL_SB_DECIDE_TO_GR
#define PL_SB_DECIDE_TO_GR
Definition: PLSpringBarley.h:34
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_sb_ferti_p1
Definition: PLSpringBarley.h:44
tof_OptimisingFarm
Definition: farm.h:273
pl_sb_spring_harrow
Definition: PLSpringBarley.h:57
Landscape::BackTranslateVegTypes
int BackTranslateVegTypes(TTypesOfVegetation VegReference)
Definition: Landscape.h:1669
pl_sb_harvest
Definition: PLSpringBarley.h:76
pl_sb_preseeding_cultivator
Definition: PLSpringBarley.h:61
pl_sb_ferti_s8
Definition: PLSpringBarley.h:75
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
pl_sb_ferti_p9
Definition: PLSpringBarley.h:79
pl_sb_preseeding_cultivator_sow
Definition: PLSpringBarley.h:62
pl_sb_ferti_p6
Definition: PLSpringBarley.h:70
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
pl_sb_ferti_p7
Definition: PLSpringBarley.h:72
pl_sb_autumn_harrow1
Definition: PLSpringBarley.h:47
pl_sb_ferti_s3
Definition: PLSpringBarley.h:53
pl_sb_fungicide2
Definition: PLSpringBarley.h:66
pl_sb_ferti_s1
Definition: PLSpringBarley.h:45
pl_sb_start
Definition: PLSpringBarley.h:42
pl_sb_ferti_p8
Definition: PLSpringBarley.h:74
pl_sb_herbicide1
Definition: PLSpringBarley.h:64
cfg_pest_springbarley_on
CfgBool cfg_pest_springbarley_on
pl_sb_ferti_p3
Definition: PLSpringBarley.h:52
pl_sb_spring_sow
Definition: PLSpringBarley.h:63
pl_sb_ferti_p2
Definition: PLSpringBarley.h:50
pl_sb_stubble_harrow
Definition: PLSpringBarley.h:49
pl_sb_insecticide2
Definition: PLSpringBarley.h:69
pl_sb_stubble_plough
Definition: PLSpringBarley.h:46
PL_SB_FERTI_P1
#define PL_SB_FERTI_P1
A flag used to indicate autumn ploughing status.
Definition: PLSpringBarley.h:28
PL_SB_FERTI_S4
#define PL_SB_FERTI_S4
Definition: PLSpringBarley.h:32
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
pl_sb_fungicide3
Definition: PLSpringBarley.h:67
pl_sb_ferti_s2
Definition: PLSpringBarley.h:51
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
Farm::FP_Slurry
virtual bool FP_Slurry(LE *a_field, double a_user, int a_days)
Apply slurry to a_field owned by an arable farmer.
Definition: farmfuncs.cpp:701
pl_sb_autumn_harrow2
Definition: PLSpringBarley.h:48
ppp_1
Definition: farm.h:422
pl_sb_ferti_s7
Definition: PLSpringBarley.h:73
PL_SB_FERTI_P4
#define PL_SB_FERTI_P4
Definition: PLSpringBarley.h:31
pl_sb_insecticide1
Definition: PLSpringBarley.h:68
pl_sb_fungicide1
Definition: PLSpringBarley.h:65
pl_sb_ferti_s6
Definition: PLSpringBarley.h:71
pl_sb_heavy_cultivator
Definition: PLSpringBarley.h:60
pl_sb_ferti_s4
Definition: PLSpringBarley.h:56
pl_sb_ferti_p5
Definition: PLSpringBarley.h:58
pl_sb_hay_bailing
Definition: PLSpringBarley.h:78
pl_sb_ferti_p4
Definition: PLSpringBarley.h:55
pl_sb_straw_chopping
Definition: PLSpringBarley.h:77
pl_sb_ferti_s10
Definition: PLSpringBarley.h:82
PL_SB_FERTI_S1
#define PL_SB_FERTI_S1
Definition: PLSpringBarley.h:29
g_landscape_p
Landscape * g_landscape_p
Definition: Landscape.cpp:258
pl_sb_ferti_s9
Definition: PLSpringBarley.h:80
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
PL_SB_SPRING_FERTI
#define PL_SB_SPRING_FERTI
Definition: PLSpringBarley.h:33