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

NLGrassGrazed1 class
. More...

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

NLGrassGrazed1 class
.

See NLGrassGrazed1.h::NLGrassGrazed1ToDo for a complete list of all possible events triggered codes by the TemporalGrassGrazed1 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

◆ NLGrassGrazed1()

NLGrassGrazed1::NLGrassGrazed1 ( )
inline
93  {
94  // When we start it off, the first possible date for a farm operation is 5th November
95  // This information is used by other crops when they decide how much post processing of
96  // the management is allowed after harvest before the next crop starts.
97  m_first_date=g_date->DayInYear( 30,11 );
98  }

References Crop::m_first_date.

Member Function Documentation

◆ Do()

bool NLGrassGrazed1::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 TemporalGrassGrazed1.

Reimplemented from Crop.

55 {
56  bool done = false; // The boolean value done indicates when we are totally finished with this plan (i.e. it is set to true).
57  int d1 = 0;
58  // Depending what event has occured jump to the correct bit of code
59  switch (a_ev->m_todo)
60  {
61  case nl_gg1_start:
62  {
63  // nl_gg1_start just sets up all the starting conditions and reference dates that are needed to start a nl_pot
64  NL_GG1_CUT_DATE = 0;
66 
67 
68  // Set up the date management stuff
69  // The next bit of code just allows for altering dates after harvest if it is necessary
70  // to allow for a crop which starts its management early.
71 
72  // 1 start and stop dates for all 'movable' events for this crop
73  int noDates = 1;
74  a_field->SetMDates(0, 0, g_date->DayInYear(10, 10)); // last possible day of last cutting
75  a_field->SetMDates(1, 0, g_date->DayInYear(31, 10)); // last possible day of NPK application
76 
77  a_field->SetMConstants(0, 1);
78 
79  // Check the next crop for early start, unless it is a spring crop
80  // in which case we ASSUME that no checking is necessary!!!!
81  // So DO NOT implement a crop that runs over the year boundary (i.e. from spring to spring!), at least not without fixing this.
82 
83  //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)
84  //optimising farms not used for now so most of related code is removed (but not in 'start' case)
85  if (!(a_farm->GetType() == tof_OptimisingFarm && g_date->GetYearNumber() > 0)) {
86 
87  if (a_ev->m_startday > g_date->DayInYear(1, 7)) {
88  if (a_field->GetMDates(0, 0) >= a_ev->m_startday)
89  {
90  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): ", "Harvest too late for the next crop to start!!!");
91  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
92  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
93  }
94  // Now fix any late finishing problems
95  for (int i = 0; i < noDates; i++) {
96  if (a_field->GetMDates(0, i) >= a_ev->m_startday) {
97  a_field->SetMDates(0, i, a_ev->m_startday - 1); //move the starting date
98  }
99  if (a_field->GetMDates(1, i) >= a_ev->m_startday) {
100  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)
101  a_field->SetMDates(1, i, a_ev->m_startday - 1); //move the finishing date
102  }
103  }
104  }
105  // Now no operations can be timed after the start of the next crop.
106 
107  if (!a_ev->m_first_year) {
108  // Are we before July 1st?
109  d1 = g_date->OldDays() + g_date->DayInYear(1, 7);
110  if (g_date->Date() < d1) {
111  // Yes, too early. We assumme this is because the last crop was late
112  printf("Poly: %d\n", a_field->GetPoly());
113  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): ", "Crop start attempt between 1st Jan & 1st July");
114  int prev = g_landscape_p->BackTranslateVegTypes(a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex()));
115  g_msg->Warn(WARN_BUG, "Previous Crop ", prev);
116  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
117  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
118  exit(1);
119  }
120  else {
121  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
122  if (g_date->Date() > d1) {
123  // Yes too late - should not happen - raise an error
124  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): ", "Crop start attempt after last possible start date");
125  int prev = g_landscape_p->BackTranslateVegTypes(a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex()));
126  g_msg->Warn(WARN_BUG, "Previous Crop ", prev);
127  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
128  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
129  exit(1);
130  }
131  }
132  }
133  else {
134  // Is the first year
135  // Some special code to cope with that first start-up year in ALMaSS - ignore for all practical purposes
136  // Code for first spring treatment used
137  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3), nl_gg1_spring_sow, false, a_farm, a_field);
138  break;
139  }
140  }//if
141 
142  // End single block date checking code. Please see next line comment as well.
143  // Reinit d1 to first possible starting date.
144  d1 = g_date->OldDays() + g_date->DayInYear(1, 10);
145  // OK, let's go.
146  // Here we queue up the first event - this differs depending on whether we have a
147  // stock or arable farmer
148  SimpleEvent_(d1, nl_gg1_winter_plough, false, a_farm, a_field);
149  }
150  break;
151 
152  // This is the first real farm operation
154  if (!a_farm->WinterPlough(a_field, 0.0, g_date->DayInYear(1, 12) - g_date->DayInYear())) {
155  SimpleEvent_(g_date->Date() + 1, nl_gg1_winter_plough, true, a_farm, a_field);
156  break;
157  }
158  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(5, 12), nl_gg1_herbicide, false, a_farm, a_field);
159  break;
160  case nl_gg1_herbicide:
161  if (!a_farm->HerbicideTreat(a_field, 0.0, g_date->DayInYear(25, 12) - g_date->DayInYear())) {
162  SimpleEvent_(g_date->Date() + 1, nl_gg1_herbicide, true, a_farm, a_field);
163  break;
164  }
165  if (a_farm->IsStockFarmer()) //Stock Farmer
166  {
167  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(20, 2) + 365, nl_gg1_ferti_s1, false, a_farm, a_field);
168  }
169  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(20, 2) + 365, nl_gg1_ferti_p1, false, a_farm, a_field);
170  break;
171  case nl_gg1_ferti_p1:
172  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
173  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p1, true, a_farm, a_field);
174  break;
175  }
176  SimpleEvent_(g_date->Date() + 1, nl_gg1_preseeding_cultivator, false, a_farm, a_field);
177  break;
178  case nl_gg1_ferti_s1:
179  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
180  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s1, true, a_farm, a_field);
181  break;
182  }
183  SimpleEvent_(g_date->Date() + 1, nl_gg1_preseeding_cultivator, false, a_farm, a_field);
184  break;
186  if (!a_farm->PreseedingCultivator(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
187  SimpleEvent_(g_date->Date() + 1, nl_gg1_preseeding_cultivator, true, a_farm, a_field);
188  break;
189  }
190  SimpleEvent_(g_date->Date() + 1, nl_gg1_spring_sow, false, a_farm, a_field);
191  break;
192  case nl_gg1_spring_sow:
193  if (!a_farm->SpringSow(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
194  SimpleEvent_(g_date->Date() + 1, nl_gg1_spring_sow, true, a_farm, a_field);
195  break;
196  }
197  d1 = g_date->Date() + 7;
198  if (d1 < g_date->OldDays() + g_date->DayInYear(1, 3)) {
199  d1 = g_date->OldDays() + g_date->DayInYear(1, 3);
200  }
201  if (a_farm->IsStockFarmer()) //Stock Farmer
202  {
203  SimpleEvent_(d1, nl_gg1_ferti_s2, false, a_farm, a_field);
204  }
205  else SimpleEvent_(d1, nl_gg1_ferti_p2, false, a_farm, a_field);
206  break;
207  case nl_gg1_ferti_p2:
208  if (a_farm->DoIt_prob(0.90)) {
209  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
210  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p2, true, a_farm, a_field);
211  break;
212  }
213  }
214  if (a_farm->DoIt_prob(0.50)) {
215  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), nl_gg1_cut_to_silage1, false, a_farm, a_field);
216  }
217  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(5, 4), nl_gg1_cattle_out, false, a_farm, a_field);
218  break;
219  case nl_gg1_ferti_s2:
220  if (a_farm->DoIt_prob(0.90)) {
221  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
222  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s2, true, a_farm, a_field);
223  break;
224  }
225  }
226  if (a_farm->DoIt_prob(0.50)) {
227  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), nl_gg1_cut_to_silage1, false, a_farm, a_field);
228  }
229  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(5, 4), nl_gg1_cattle_out, false, a_farm, a_field);
230  break;
232  // At least 7 days from last watering and 21 from last application of fertilizer.
233  if (g_date->Date() < NL_GG1_WATER_DATE + 7) {
234  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage1, true, a_farm, a_field);
235  break;
236  }
237  else
238  {
239  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(10, 5) - g_date->DayInYear())) {
240  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage1, true, a_farm, a_field);
241  break;
242  }
243  NL_GG1_CUT_DATE = g_date->DayInYear();
244  if (a_farm->IsStockFarmer()) //Stock Farmer
245  {
246  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s3, false, a_farm, a_field);
247  }
248  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p3, false, a_farm, a_field);
249  // Start water thread
250  SimpleEvent_(g_date->Date() + 1, nl_gg1_watering, false, a_farm, a_field);
251  break;
252  }
253  break;
254 
255  case nl_gg1_ferti_s3:
256  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
257  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s3, true, a_farm, a_field);
258  break;
259  }
260  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s4, false, a_farm, a_field);
261  break;
262  case nl_gg1_ferti_p3:
263  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
264  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p3, true, a_farm, a_field);
265  break;
266  }
267  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p4, false, a_farm, a_field);
268  break;
269  case nl_gg1_ferti_s4:
270  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
271  {
272  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(20, 5) - g_date->DayInYear())) {
273  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s4, true, a_farm, a_field);
274  break;
275  }
276  }
277  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage2, false, a_farm, a_field);
278  break;
279  case nl_gg1_ferti_p4:
280  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
281  {
282  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(20, 5) - g_date->DayInYear())) {
283  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p4, true, a_farm, a_field);
284  break;
285  }
286  }
287  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage2, false, a_farm, a_field);
288  break;
290  // At least 7 days from last watering and 21 from last application of fertilizer.
291  if (g_date->Date() < NL_GG1_WATER_DATE + 7) {
292  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage2, true, a_farm, a_field);
293  break;
294  }
295  else
296  {
297  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(15, 6) - g_date->DayInYear())) {
298  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage2, true, a_farm, a_field);
299  break;
300  }
301  NL_GG1_CUT_DATE = g_date->DayInYear();
302  if (a_farm->IsStockFarmer()) //Stock Farmer
303  {
304  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s5, false, a_farm, a_field);
305  }
306  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p5, false, a_farm, a_field);
307  break;
308  }
309  break;
310  case nl_gg1_ferti_s5:
311  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
312  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s5, true, a_farm, a_field);
313  break;
314  }
315  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s6, false, a_farm, a_field);
316  break;
317  case nl_gg1_ferti_p5:
318  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
319  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p5, true, a_farm, a_field);
320  break;
321  }
322  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p6, false, a_farm, a_field);
323  break;
324  case nl_gg1_ferti_s6:
325  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
326  {
327  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(25, 6) - g_date->DayInYear())) {
328  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s6, true, a_farm, a_field);
329  break;
330  }
331  }
332  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage3, false, a_farm, a_field);
333  break;
334  case nl_gg1_ferti_p6:
335  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
336  {
337  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(25, 6) - g_date->DayInYear())) {
338  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p6, true, a_farm, a_field);
339  break;
340  }
341  }
342  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage3, false, a_farm, a_field);
343  break;
345  // At least 7 days from last watering and 21 from last application of fertilizer.
346  if (g_date->Date() < NL_GG1_WATER_DATE + 7) {
347  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage3, true, a_farm, a_field);
348  break;
349  }
350  else
351  {
352  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(25, 7) - g_date->DayInYear())) {
353  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage3, true, a_farm, a_field);
354  break;
355  }
356  NL_GG1_CUT_DATE = g_date->DayInYear();
357  if (a_farm->IsStockFarmer()) //Stock Farmer
358  {
359  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s7, false, a_farm, a_field);
360  }
361  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p7, false, a_farm, a_field);
362  break;
363  }
364  break;
365 
366  case nl_gg1_ferti_s7:
367  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
368  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s7, true, a_farm, a_field);
369  break;
370  }
371  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s8, false, a_farm, a_field);
372  break;
373  case nl_gg1_ferti_p7:
374  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
375  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p7, true, a_farm, a_field);
376  break;
377  }
378  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p8, false, a_farm, a_field);
379  break;
380  case nl_gg1_ferti_s8:
381  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
382  {
383  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(5, 8) - g_date->DayInYear())) {
384  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s8, true, a_farm, a_field);
385  break;
386  }
387  }
388  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage4, false, a_farm, a_field);
389  break;
390  case nl_gg1_ferti_p8:
391  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
392  {
393  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(5, 8) - g_date->DayInYear())) {
394  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p8, true, a_farm, a_field);
395  break;
396  }
397  }
398  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage4, false, a_farm, a_field);
399  break;
401  // At least 7 days from last watering and 21 from last application of fertilizer.
402  if (g_date->Date() < NL_GG1_WATER_DATE + 7) {
403  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage4, true, a_farm, a_field);
404  break;
405  }
406  else
407  {
408  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear())) {
409  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage4, true, a_farm, a_field);
410  break;
411  }
412  NL_GG1_CUT_DATE = g_date->DayInYear();
413  if (a_farm->IsStockFarmer()) //Stock Farmer
414  {
415  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s9, false, a_farm, a_field);
416  }
417  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p9, false, a_farm, a_field);
418  break;
419  }
420  break;
421  case nl_gg1_ferti_s9:
422  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
423  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s9, true, a_farm, a_field);
424  break;
425  }
426  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s10, false, a_farm, a_field);
427  break;
428  case nl_gg1_ferti_p9:
429  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1_CUT_DATE + 4) - g_date->DayInYear())) {
430  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p9, true, a_farm, a_field);
431  break;
432  }
433  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p10, false, a_farm, a_field);
434  break;
435  case nl_gg1_ferti_s10:
436  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
437  {
438  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
439  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s10, true, a_farm, a_field);
440  break;
441  }
442  }
443  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage5, false, a_farm, a_field);
444  break;
445  case nl_gg1_ferti_p10:
446  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
447  {
448  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
449  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p10, true, a_farm, a_field);
450  break;
451  }
452  }
453  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage5, false, a_farm, a_field);
454  break;
456  // At least 7 days from last watering and 21 from last application of fertilizer.
457  if (g_date->Date() < NL_GG1_WATER_DATE + 7) {
458  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage5, true, a_farm, a_field);
459  break;
460  }
461  else
462  {
463  if (a_ev->m_lock || a_farm->DoIt_prob(0.40))
464  {
465  if (!a_farm->CutToSilage(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
466  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage5, true, a_farm, a_field);
467  break;
468  }
469  NL_GG1_CUT_DATE = g_date->DayInYear();
470  }
471  if (a_farm->IsStockFarmer()) //Stock Farmer
472  {
473  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s12, false, a_farm, a_field);
474  }
475  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p12, false, a_farm, a_field);
476  break;
477  }
478  break;
479  case nl_gg1_ferti_s12:
480  if (a_field->GetMConstants(0) == 0) {
481  if (!a_farm->FA_NPK(a_field, 0.0, -1)) { // raise an error
482  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): failure in 'NPK application' execution", "");
483  exit(1);
484  }
485  }
486  else {
487  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
488  {
489  if (!a_farm->FA_NPK(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
490  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s12, true, a_farm, a_field);
491  break;
492  }
493  }
494  }
495  done = true;
496  break;
497  case nl_gg1_ferti_p12:
498  if (a_field->GetMConstants(0) == 0) {
499  if (!a_farm->FP_NPK(a_field, 0.0, -1)) { // raise an error
500  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): failure in 'NPK application' execution", "");
501  exit(1);
502  }
503  }
504  else {
505  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
506  {
507  if (!a_farm->FP_NPK(a_field, 0.0, a_field->GetMDates(1, 0) - g_date->DayInYear())) {
508  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p12, true, a_farm, a_field);
509  break;
510  }
511  }
512  }
513  done = true;
514  break;
515  case nl_gg1_cattle_out:
516  if (!a_farm->CattleOut(a_field, 0.0, g_date->DayInYear(30, 4) - g_date->DayInYear())) {
517  SimpleEvent_(g_date->Date() + 1, nl_gg1_cattle_out, true, a_farm, a_field);
518  break;
519  }
520  // Keep them out there
521  SimpleEvent_(g_date->Date(), nl_gg1_cattle_is_out, false, a_farm, a_field);
522  break;
523 
524  case nl_gg1_cattle_is_out: // Keep the cattle out there
525  // CattleIsOut() returns false if it is not time to stop grazing
526  if (!a_farm->CattleIsOut(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear(), g_date->DayInYear(31, 8))) {
527  SimpleEvent_(g_date->Date() + 1, nl_gg1_cattle_is_out, false, a_farm, a_field);
528  break;
529  }
530  if (a_farm->IsStockFarmer()) //Stock Farmer
531  {
532  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s11, false, a_farm, a_field);
533  }
534  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p11, false, a_farm, a_field);
535  break;
536 
537  case nl_gg1_ferti_s11:
538  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
539  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s11, true, a_farm, a_field);
540  break;
541  }
542  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage6, false, a_farm, a_field);
543  break;
544  case nl_gg1_ferti_p11:
545  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
546  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p11, true, a_farm, a_field);
547  break;
548  }
549  SimpleEvent_(g_date->Date() + 21, nl_gg1_cut_to_silage6, false, a_farm, a_field);
550  break;
552  if (!a_farm->CutToSilage(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
553  SimpleEvent_(g_date->Date() + 1, nl_gg1_cut_to_silage6, true, a_farm, a_field);
554  break;
555  }
556  if (a_farm->IsStockFarmer()) //Stock Farmer
557  {
558  SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_s12, false, a_farm, a_field);
559  }
560  else SimpleEvent_(g_date->Date() + 1, nl_gg1_ferti_p12, false, a_farm, a_field);
561  break;
562  case nl_gg1_watering:
563  if (a_ev->m_lock || a_farm->DoIt_prob(0.40))
564  {
565  if (g_date->Date() < NL_GG1_CUT_DATE + 3) {
566  // Too close to silage cutting, so try again tomorrow.
567  SimpleEvent_(g_date->Date() + 1, nl_gg1_watering, true, a_farm, a_field);
568  }
569  else
570  {
571  if (!a_farm->Water(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear())) {
572  SimpleEvent_(g_date->Date() + 1, nl_gg1_watering, true, a_farm, a_field);
573  break;
574  }
575  NL_GG1_WATER_DATE = g_date->Date();
576  }
577  }
578  // End of thread
579  break;
580  default:
581  g_msg->Warn(WARN_BUG, "NLGrassGrazed1::Do(): "
582  "Unknown event type! ", "");
583  exit(1);
584  }
585  return done;
586 }

References Landscape::BackTranslateVegTypes(), g_landscape_p, Farm::GetType(), Crop::m_first_date, FarmEvent::m_first_year, FarmEvent::m_lock, FarmEvent::m_next_tov, FarmEvent::m_startday, FarmEvent::m_todo, nl_gg1_cattle_is_out, nl_gg1_cattle_out, NL_GG1_CUT_DATE, nl_gg1_cut_to_silage1, nl_gg1_cut_to_silage2, nl_gg1_cut_to_silage3, nl_gg1_cut_to_silage4, nl_gg1_cut_to_silage5, nl_gg1_cut_to_silage6, nl_gg1_ferti_p1, nl_gg1_ferti_p10, nl_gg1_ferti_p11, nl_gg1_ferti_p12, nl_gg1_ferti_p2, nl_gg1_ferti_p3, nl_gg1_ferti_p4, nl_gg1_ferti_p5, nl_gg1_ferti_p6, nl_gg1_ferti_p7, nl_gg1_ferti_p8, nl_gg1_ferti_p9, nl_gg1_ferti_s1, nl_gg1_ferti_s10, nl_gg1_ferti_s11, nl_gg1_ferti_s12, nl_gg1_ferti_s2, nl_gg1_ferti_s3, nl_gg1_ferti_s4, nl_gg1_ferti_s5, nl_gg1_ferti_s6, nl_gg1_ferti_s7, nl_gg1_ferti_s8, nl_gg1_ferti_s9, nl_gg1_herbicide, nl_gg1_preseeding_cultivator, nl_gg1_spring_sow, nl_gg1_start, NL_GG1_WATER_DATE, nl_gg1_watering, nl_gg1_winter_plough, Crop::SimpleEvent_(), tof_OptimisingFarm, and Farm::WinterPlough().


The documentation for this class was generated from the following files:
nl_gg1_ferti_p4
Definition: NLGrassGrazed1.h:56
nl_gg1_ferti_s3
Definition: NLGrassGrazed1.h:55
nl_gg1_ferti_p2
Definition: NLGrassGrazed1.h:46
nl_gg1_cut_to_silage3
Definition: NLGrassGrazed1.h:50
FarmEvent::m_lock
bool m_lock
Definition: farm.h:465
nl_gg1_preseeding_cultivator
Definition: NLGrassGrazed1.h:44
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
tof_OptimisingFarm
Definition: farm.h:273
nl_gg1_ferti_s11
Definition: NLGrassGrazed1.h:71
NL_GG1_CUT_DATE
#define NL_GG1_CUT_DATE
A flag used to indicate autumn ploughing status.
Definition: NLGrassGrazed1.h:28
Landscape::BackTranslateVegTypes
int BackTranslateVegTypes(TTypesOfVegetation VegReference)
Definition: Landscape.h:1669
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
nl_gg1_ferti_p6
Definition: NLGrassGrazed1.h:60
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
nl_gg1_ferti_s1
Definition: NLGrassGrazed1.h:43
nl_gg1_winter_plough
Definition: NLGrassGrazed1.h:40
nl_gg1_ferti_s12
Definition: NLGrassGrazed1.h:73
nl_gg1_herbicide
Definition: NLGrassGrazed1.h:41
nl_gg1_cut_to_silage1
Definition: NLGrassGrazed1.h:48
nl_gg1_ferti_s7
Definition: NLGrassGrazed1.h:63
nl_gg1_ferti_s4
Definition: NLGrassGrazed1.h:57
nl_gg1_ferti_s8
Definition: NLGrassGrazed1.h:65
nl_gg1_ferti_p5
Definition: NLGrassGrazed1.h:58
nl_gg1_ferti_s10
Definition: NLGrassGrazed1.h:69
nl_gg1_start
Definition: NLGrassGrazed1.h:38
nl_gg1_ferti_p9
Definition: NLGrassGrazed1.h:66
nl_gg1_ferti_p12
Definition: NLGrassGrazed1.h:72
nl_gg1_cut_to_silage6
Definition: NLGrassGrazed1.h:53
nl_gg1_cut_to_silage4
Definition: NLGrassGrazed1.h:51
nl_gg1_ferti_p11
Definition: NLGrassGrazed1.h:70
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
nl_gg1_ferti_p10
Definition: NLGrassGrazed1.h:68
NL_GG1_WATER_DATE
#define NL_GG1_WATER_DATE
Definition: NLGrassGrazed1.h:29
nl_gg1_cattle_out
Definition: NLGrassGrazed1.h:75
nl_gg1_ferti_s2
Definition: NLGrassGrazed1.h:47
nl_gg1_ferti_p7
Definition: NLGrassGrazed1.h:62
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
nl_gg1_cattle_is_out
Definition: NLGrassGrazed1.h:76
nl_gg1_ferti_p3
Definition: NLGrassGrazed1.h:54
nl_gg1_cut_to_silage5
Definition: NLGrassGrazed1.h:52
nl_gg1_ferti_s9
Definition: NLGrassGrazed1.h:67
Farm::WinterPlough
virtual bool WinterPlough(LE *a_field, double a_user, int a_days)
Carry out a ploughing event in the winter on a_field.
Definition: farmfuncs.cpp:392
nl_gg1_ferti_p8
Definition: NLGrassGrazed1.h:64
nl_gg1_ferti_s5
Definition: NLGrassGrazed1.h:59
nl_gg1_cut_to_silage2
Definition: NLGrassGrazed1.h:49
nl_gg1_spring_sow
Definition: NLGrassGrazed1.h:45
nl_gg1_ferti_p1
Definition: NLGrassGrazed1.h:42
nl_gg1_watering
Definition: NLGrassGrazed1.h:74
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
nl_gg1_ferti_s6
Definition: NLGrassGrazed1.h:61