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

NLGrassGrazed1Spring class
. More...

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

NLGrassGrazed1Spring class
.

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

◆ NLGrassGrazed1Spring()

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

References Crop::m_first_date.

Member Function Documentation

◆ Do()

bool NLGrassGrazed1Spring::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 TemporalGrassGrazed1Spring.

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_gg1s_start:
62  {
63  // nl_gg1s_start just sets up all the starting conditions and reference dates that are needed to start a nl_pot
64  NL_GG1S_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(30, 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, "NLGrassGrazed1Spring::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  d1 = g_date->OldDays() + m_first_date + 365; // Add 365 for spring crop
109  if (g_date->Date() > d1) {
110  // Yes too late - should not happen - raise an error
111  g_msg->Warn(WARN_BUG, "NLGrassGrazed1Spring::Do(): ", "Crop start attempt after last possible start date");
112  int prev = g_landscape_p->BackTranslateVegTypes(a_field->GetOwner()->GetPreviousCrop(a_field->GetRotIndex()));
113  g_msg->Warn(WARN_BUG, "Previous Crop ", prev);
114  int almassnum = g_landscape_p->BackTranslateVegTypes(a_ev->m_next_tov);
115  g_msg->Warn("Next Crop ", (double)almassnum); // this causes exit
116  exit(1);
117  }
118  }
119  else {
120  // Is the first year
121  // Some special code to cope with that first start-up year in ALMaSS - ignore for all practical purposes
122  // Code for first spring treatment used
123  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(1, 3), nl_gg1s_spring_sow, false, a_farm, a_field);
124  break;
125  }
126  }//if
127 
128  // End single block date checking code. Please see next line comment as well.
129  // Reinit d1 to first possible starting date.
130  d1 = g_date->OldDays() + g_date->DayInYear(28, 2);
131  if (g_date->Date() >= d1) d1 += 365;
132  // OK, let's go.
133  // Here we queue up the first event
134  SimpleEvent_(d1, nl_gg1s_preseeding_cultivator, false, a_farm, a_field);
135 
136  }
137  break;
138 
139  // This is the first real farm operation
141  if (!a_farm->PreseedingCultivator(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
142  SimpleEvent_(g_date->Date() + 1, nl_gg1s_preseeding_cultivator, true, a_farm, a_field);
143  break;
144  }
145  SimpleEvent_(g_date->Date() + 1, nl_gg1s_spring_sow, false, a_farm, a_field);
146  break;
147  case nl_gg1s_spring_sow:
148  if (!a_farm->SpringSow(a_field, 0.0, g_date->DayInYear(20, 3) - g_date->DayInYear())) {
149  SimpleEvent_(g_date->Date() + 1, nl_gg1s_spring_sow, true, a_farm, a_field);
150  break;
151  }
152  d1 = g_date->Date() + 7;
153  if (d1 < g_date->OldDays() + g_date->DayInYear(1, 3)) {
154  d1 = g_date->OldDays() + g_date->DayInYear(1, 3);
155  }
156  if (a_farm->IsStockFarmer()) //Stock Farmer
157  {
158  SimpleEvent_(d1, nl_gg1s_ferti_s2, false, a_farm, a_field);
159  }
160  else SimpleEvent_(d1, nl_gg1s_ferti_p2, false, a_farm, a_field);
161  break;
162  case nl_gg1s_ferti_p2:
163  if (a_farm->DoIt_prob(0.90)) {
164  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
165  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p2, true, a_farm, a_field);
166  break;
167  }
168  }
169  if (a_farm->DoIt_prob(0.50)) {
170  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), nl_gg1s_cut_to_silage1, false, a_farm, a_field);
171  }
172  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(5, 4), nl_gg1s_cattle_out, false, a_farm, a_field);
173  break;
174  case nl_gg1s_ferti_s2:
175  if (a_farm->DoIt_prob(0.90)) {
176  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(30, 3) - g_date->DayInYear())) {
177  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s2, true, a_farm, a_field);
178  break;
179  }
180  }
181  if (a_farm->DoIt_prob(0.50)) {
182  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(25, 4), nl_gg1s_cut_to_silage1, false, a_farm, a_field);
183  }
184  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(5, 4), nl_gg1s_cattle_out, false, a_farm, a_field);
185  break;
187  // At least 7 days from last watering and 21 from last application of fertilizer.
188  if (g_date->Date() < NL_GG1S_WATER_DATE + 7) {
189  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage1, true, a_farm, a_field);
190  break;
191  }
192  else
193  {
194  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(10, 5) - g_date->DayInYear())) {
195  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage1, true, a_farm, a_field);
196  break;
197  }
198  NL_GG1S_CUT_DATE = g_date->DayInYear();
199  if (a_farm->IsStockFarmer()) //Stock Farmer
200  {
201  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s3, false, a_farm, a_field);
202  }
203  else SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p3, false, a_farm, a_field);
204  // Start water thread
205  SimpleEvent_(g_date->Date() + 1, nl_gg1s_watering, false, a_farm, a_field);
206  break;
207  }
208  break;
209 
210  case nl_gg1s_ferti_s3:
211  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
212  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s3, true, a_farm, a_field);
213  break;
214  }
215  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s4, false, a_farm, a_field);
216  break;
217  case nl_gg1s_ferti_p3:
218  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
219  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p3, true, a_farm, a_field);
220  break;
221  }
222  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p4, false, a_farm, a_field);
223  break;
224  case nl_gg1s_ferti_s4:
225  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
226  {
227  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(20, 5) - g_date->DayInYear())) {
228  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s4, true, a_farm, a_field);
229  break;
230  }
231  }
232  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage2, false, a_farm, a_field);
233  break;
234  case nl_gg1s_ferti_p4:
235  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
236  {
237  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(20, 5) - g_date->DayInYear())) {
238  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p4, true, a_farm, a_field);
239  break;
240  }
241  }
242  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage2, false, a_farm, a_field);
243  break;
245  // At least 7 days from last watering and 21 from last application of fertilizer.
246  if (g_date->Date() < NL_GG1S_WATER_DATE + 7) {
247  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage2, true, a_farm, a_field);
248  break;
249  }
250  else
251  {
252  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(15, 6) - g_date->DayInYear())) {
253  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage2, true, a_farm, a_field);
254  break;
255  }
256  NL_GG1S_CUT_DATE = g_date->DayInYear();
257  if (a_farm->IsStockFarmer()) //Stock Farmer
258  {
259  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s5, false, a_farm, a_field);
260  }
261  else SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p5, false, a_farm, a_field);
262  break;
263  }
264  break;
265  case nl_gg1s_ferti_s5:
266  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
267  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s5, true, a_farm, a_field);
268  break;
269  }
270  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s6, false, a_farm, a_field);
271  break;
272  case nl_gg1s_ferti_p5:
273  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
274  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p5, true, a_farm, a_field);
275  break;
276  }
277  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p6, false, a_farm, a_field);
278  break;
279  case nl_gg1s_ferti_s6:
280  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
281  {
282  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(25, 6) - g_date->DayInYear())) {
283  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s6, true, a_farm, a_field);
284  break;
285  }
286  }
287  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage3, false, a_farm, a_field);
288  break;
289  case nl_gg1s_ferti_p6:
290  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
291  {
292  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(25, 6) - g_date->DayInYear())) {
293  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p6, true, a_farm, a_field);
294  break;
295  }
296  }
297  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage3, false, a_farm, a_field);
298  break;
300  // At least 7 days from last watering and 21 from last application of fertilizer.
301  if (g_date->Date() < NL_GG1S_WATER_DATE + 7) {
302  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage3, true, a_farm, a_field);
303  break;
304  }
305  else
306  {
307  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(25, 7) - g_date->DayInYear())) {
308  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage3, true, a_farm, a_field);
309  break;
310  }
311  NL_GG1S_CUT_DATE = g_date->DayInYear();
312  if (a_farm->IsStockFarmer()) //Stock Farmer
313  {
314  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s7, false, a_farm, a_field);
315  }
316  else SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p7, false, a_farm, a_field);
317  break;
318  }
319  break;
320 
321  case nl_gg1s_ferti_s7:
322  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
323  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s7, true, a_farm, a_field);
324  break;
325  }
326  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s8, false, a_farm, a_field);
327  break;
328  case nl_gg1s_ferti_p7:
329  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
330  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p7, true, a_farm, a_field);
331  break;
332  }
333  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p8, false, a_farm, a_field);
334  break;
335  case nl_gg1s_ferti_s8:
336  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
337  {
338  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(5, 8) - g_date->DayInYear())) {
339  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s8, true, a_farm, a_field);
340  break;
341  }
342  }
343  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage4, false, a_farm, a_field);
344  break;
345  case nl_gg1s_ferti_p8:
346  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
347  {
348  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(5, 8) - g_date->DayInYear())) {
349  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p8, true, a_farm, a_field);
350  break;
351  }
352  }
353  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage4, false, a_farm, a_field);
354  break;
356  // At least 7 days from last watering and 21 from last application of fertilizer.
357  if (g_date->Date() < NL_GG1S_WATER_DATE + 7) {
358  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage4, true, a_farm, a_field);
359  break;
360  }
361  else
362  {
363  if (!a_farm->CutToSilage(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear())) {
364  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage4, true, a_farm, a_field);
365  break;
366  }
367  NL_GG1S_CUT_DATE = g_date->DayInYear();
368  if (a_farm->IsStockFarmer()) //Stock Farmer
369  {
370  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s9, false, a_farm, a_field);
371  }
372  else SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p9, false, a_farm, a_field);
373  break;
374  }
375  break;
376  case nl_gg1s_ferti_s9:
377  if (!a_farm->FA_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
378  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s9, true, a_farm, a_field);
379  break;
380  }
381  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s10, false, a_farm, a_field);
382  break;
383  case nl_gg1s_ferti_p9:
384  if (!a_farm->FP_Slurry(a_field, 0.0, (NL_GG1S_CUT_DATE + 4) - g_date->DayInYear())) {
385  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p9, true, a_farm, a_field);
386  break;
387  }
388  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p10, false, a_farm, a_field);
389  break;
390  case nl_gg1s_ferti_s10:
391  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
392  {
393  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
394  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s10, true, a_farm, a_field);
395  break;
396  }
397  }
398  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage5, false, a_farm, a_field);
399  break;
400  case nl_gg1s_ferti_p10:
401  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
402  {
403  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
404  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p10, true, a_farm, a_field);
405  break;
406  }
407  }
408  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage5, false, a_farm, a_field);
409  break;
411  // At least 7 days from last watering and 21 from last application of fertilizer.
412  if (g_date->Date() < NL_GG1S_WATER_DATE + 7) {
413  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage5, true, a_farm, a_field);
414  break;
415  }
416  else
417  {
418  if (a_ev->m_lock || a_farm->DoIt_prob(0.40))
419  {
420  if (!a_farm->CutToSilage(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
421  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage5, true, a_farm, a_field);
422  break;
423  }
424  NL_GG1S_CUT_DATE = g_date->DayInYear();
425  }
426  if (a_farm->IsStockFarmer()) //Stock Farmer
427  {
428  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 11), nl_gg1s_ferti_s12, false, a_farm, a_field);
429  }
430  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 11), nl_gg1s_ferti_p12, false, a_farm, a_field);
431  break;
432  }
433  break;
434  case nl_gg1s_ferti_s12:
435  if (a_field->GetMConstants(0) == 0) {
436  if (!a_farm->FA_NPK(a_field, 0.0, -1)) { // raise an error
437  g_msg->Warn(WARN_BUG, "NLGrassGrazed1Spring::Do(): failure in 'NPK application' execution", "");
438  exit(1);
439  }
440  }
441  else {
442  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
443  {
444  if (!a_farm->FA_NPK(a_field, 0.0, g_date->DayInYear(30, 11) - g_date->DayInYear())) {
445  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s12, true, a_farm, a_field);
446  break;
447  }
448  }
449  }
450  done = true;
451  break;
452  case nl_gg1s_ferti_p12:
453  if (a_field->GetMConstants(0) == 0) {
454  if (!a_farm->FP_NPK(a_field, 0.0, -1)) { // raise an error
455  g_msg->Warn(WARN_BUG, "NLGrassGrazed1Spring::Do(): failure in 'NPK application' execution", "");
456  exit(1);
457  }
458  }
459  else {
460  if (a_ev->m_lock || a_farm->DoIt_prob(0.90))
461  {
462  if (!a_farm->FP_NPK(a_field, 0.0, g_date->DayInYear(30, 11) - g_date->DayInYear())) {
463  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p12, true, a_farm, a_field);
464  break;
465  }
466  }
467  }
468  done = true;
469  break;
470  case nl_gg1s_cattle_out:
471  if (!a_farm->CattleOut(a_field, 0.0, g_date->DayInYear(30, 4) - g_date->DayInYear())) {
472  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cattle_out, true, a_farm, a_field);
473  break;
474  }
475  // Keep them out there
476  SimpleEvent_(g_date->Date(), nl_gg1s_cattle_is_out, false, a_farm, a_field);
477  break;
478 
479  case nl_gg1s_cattle_is_out: // Keep the cattle out there
480  // CattleIsOut() returns false if it is not time to stop grazing
481  if (!a_farm->CattleIsOut(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear(), g_date->DayInYear(31, 8))) {
482  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cattle_is_out, false, a_farm, a_field);
483  break;
484  }
485  if (a_farm->IsStockFarmer()) //Stock Farmer
486  {
487  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s11, false, a_farm, a_field);
488  }
489  else SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p11, false, a_farm, a_field);
490  break;
491 
492  case nl_gg1s_ferti_s11:
493  if (!a_farm->FA_Slurry(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
494  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_s11, true, a_farm, a_field);
495  break;
496  }
497  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage6, false, a_farm, a_field);
498  break;
499  case nl_gg1s_ferti_p11:
500  if (!a_farm->FP_Slurry(a_field, 0.0, g_date->DayInYear(5, 9) - g_date->DayInYear())) {
501  SimpleEvent_(g_date->Date() + 1, nl_gg1s_ferti_p11, true, a_farm, a_field);
502  break;
503  }
504  SimpleEvent_(g_date->Date() + 21, nl_gg1s_cut_to_silage6, false, a_farm, a_field);
505  break;
507  if (!a_farm->CutToSilage(a_field, 0.0, a_field->GetMDates(0, 0) - g_date->DayInYear())) {
508  SimpleEvent_(g_date->Date() + 1, nl_gg1s_cut_to_silage6, true, a_farm, a_field);
509  break;
510  }
511  if (a_farm->IsStockFarmer()) //Stock Farmer
512  {
513  SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 11), nl_gg1s_ferti_s12, false, a_farm, a_field);
514  }
515  else SimpleEvent_(g_date->OldDays() + g_date->DayInYear(10, 11), nl_gg1s_ferti_p12, false, a_farm, a_field);
516  break;
517  case nl_gg1s_watering:
518  if (a_ev->m_lock || a_farm->DoIt_prob(0.40))
519  {
520  if (g_date->Date() < NL_GG1S_CUT_DATE + 3) {
521  // Too close to silage cutting, so try again tomorrow.
522  SimpleEvent_(g_date->Date() + 1, nl_gg1s_watering, true, a_farm, a_field);
523  }
524  else
525  {
526  if (!a_farm->Water(a_field, 0.0, g_date->DayInYear(31, 8) - g_date->DayInYear())) {
527  SimpleEvent_(g_date->Date() + 1, nl_gg1s_watering, true, a_farm, a_field);
528  break;
529  }
530  NL_GG1S_WATER_DATE = g_date->Date();
531  }
532  }
533  // End of thread
534  break;
535  default:
536  g_msg->Warn(WARN_BUG, "NLGrassGrazed1Spring::Do(): "
537  "Unknown event type! ", "");
538  exit(1);
539  }
540  return done;
541 }

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_gg1s_cattle_is_out, nl_gg1s_cattle_out, NL_GG1S_CUT_DATE, nl_gg1s_cut_to_silage1, nl_gg1s_cut_to_silage2, nl_gg1s_cut_to_silage3, nl_gg1s_cut_to_silage4, nl_gg1s_cut_to_silage5, nl_gg1s_cut_to_silage6, nl_gg1s_ferti_p10, nl_gg1s_ferti_p11, nl_gg1s_ferti_p12, nl_gg1s_ferti_p2, nl_gg1s_ferti_p3, nl_gg1s_ferti_p4, nl_gg1s_ferti_p5, nl_gg1s_ferti_p6, nl_gg1s_ferti_p7, nl_gg1s_ferti_p8, nl_gg1s_ferti_p9, nl_gg1s_ferti_s10, nl_gg1s_ferti_s11, nl_gg1s_ferti_s12, nl_gg1s_ferti_s2, nl_gg1s_ferti_s3, nl_gg1s_ferti_s4, nl_gg1s_ferti_s5, nl_gg1s_ferti_s6, nl_gg1s_ferti_s7, nl_gg1s_ferti_s8, nl_gg1s_ferti_s9, nl_gg1s_preseeding_cultivator, nl_gg1s_spring_sow, nl_gg1s_start, NL_GG1S_WATER_DATE, nl_gg1s_watering, Farm::PreseedingCultivator(), Crop::SimpleEvent_(), and tof_OptimisingFarm.


The documentation for this class was generated from the following files:
nl_gg1s_ferti_s3
Definition: NLGrassGrazed1Spring.h:51
Farm::PreseedingCultivator
virtual bool PreseedingCultivator(LE *a_field, double a_user, int a_days)
Carry out preseeding cultivation on a_field (tilling set including cultivator and string roller to co...
Definition: farmfuncs.cpp:311
nl_gg1s_ferti_s4
Definition: NLGrassGrazed1Spring.h:53
FarmEvent::m_lock
bool m_lock
Definition: farm.h:465
nl_gg1s_ferti_p10
Definition: NLGrassGrazed1Spring.h:64
nl_gg1s_ferti_s7
Definition: NLGrassGrazed1Spring.h:59
nl_gg1s_cattle_is_out
Definition: NLGrassGrazed1Spring.h:72
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
tof_OptimisingFarm
Definition: farm.h:273
nl_gg1s_ferti_s9
Definition: NLGrassGrazed1Spring.h:63
nl_gg1s_watering
Definition: NLGrassGrazed1Spring.h:70
Landscape::BackTranslateVegTypes
int BackTranslateVegTypes(TTypesOfVegetation VegReference)
Definition: Landscape.h:1669
nl_gg1s_cut_to_silage5
Definition: NLGrassGrazed1Spring.h:48
nl_gg1s_preseeding_cultivator
Definition: NLGrassGrazed1Spring.h:40
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
nl_gg1s_ferti_p6
Definition: NLGrassGrazed1Spring.h:56
nl_gg1s_ferti_s6
Definition: NLGrassGrazed1Spring.h:57
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
nl_gg1s_cut_to_silage1
Definition: NLGrassGrazed1Spring.h:44
nl_gg1s_ferti_s2
Definition: NLGrassGrazed1Spring.h:43
nl_gg1s_cattle_out
Definition: NLGrassGrazed1Spring.h:71
nl_gg1s_spring_sow
Definition: NLGrassGrazed1Spring.h:41
nl_gg1s_ferti_s10
Definition: NLGrassGrazed1Spring.h:65
nl_gg1s_ferti_s12
Definition: NLGrassGrazed1Spring.h:69
NL_GG1S_WATER_DATE
#define NL_GG1S_WATER_DATE
Definition: NLGrassGrazed1Spring.h:29
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
nl_gg1s_ferti_s5
Definition: NLGrassGrazed1Spring.h:55
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
nl_gg1s_ferti_p8
Definition: NLGrassGrazed1Spring.h:60
nl_gg1s_ferti_p2
Definition: NLGrassGrazed1Spring.h:42
nl_gg1s_ferti_p12
Definition: NLGrassGrazed1Spring.h:68
nl_gg1s_cut_to_silage4
Definition: NLGrassGrazed1Spring.h:47
nl_gg1s_ferti_p4
Definition: NLGrassGrazed1Spring.h:52
nl_gg1s_cut_to_silage6
Definition: NLGrassGrazed1Spring.h:49
nl_gg1s_ferti_p7
Definition: NLGrassGrazed1Spring.h:58
nl_gg1s_cut_to_silage3
Definition: NLGrassGrazed1Spring.h:46
nl_gg1s_ferti_p5
Definition: NLGrassGrazed1Spring.h:54
nl_gg1s_ferti_s11
Definition: NLGrassGrazed1Spring.h:67
nl_gg1s_ferti_p3
Definition: NLGrassGrazed1Spring.h:50
nl_gg1s_ferti_p11
Definition: NLGrassGrazed1Spring.h:66
nl_gg1s_cut_to_silage2
Definition: NLGrassGrazed1Spring.h:45
nl_gg1s_ferti_s8
Definition: NLGrassGrazed1Spring.h:61
nl_gg1s_ferti_p9
Definition: NLGrassGrazed1Spring.h:62
NL_GG1S_CUT_DATE
#define NL_GG1S_CUT_DATE
A flag used to indicate autumn ploughing status.
Definition: NLGrassGrazed1Spring.h:28
nl_gg1s_start
Definition: NLGrassGrazed1Spring.h:38
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