ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
NLGrassGrazed1Spring.cpp
Go to the documentation of this file.
1 /*
2 *******************************************************************************************************
3 Copyright (c) 2017, Christopher John Topping, Aarhus University
4 All rights reserved.
5 
6 Redistribution and use in source and binary forms, with or without modification, are permitted provided
7 that the following conditions are met:
8 
9 Redistributions of source code must retain the above copyright notice, this list of conditions and the
10 following disclaimer.
11 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
12 the following disclaimer in the documentation and/or other materials provided with the distribution.
13 
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
15 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
17 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
19 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22 ********************************************************************************************************
23 */
38 //
39 // NLGrassGrazed1Spring.cpp
40 //
41 
42 
43 #include "../../Landscape/ls.h"
44 #include "../../Landscape/cropprogs/NLGrassGrazed1Spring.h"
45 
54 bool NLGrassGrazed1Spring::Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
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 }
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
FarmEvent
A struct to hold the information required to trigger a farm event.
Definition: farm.h:463
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
NLGrassGrazed1Spring::Do
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.
Definition: NLGrassGrazed1Spring.cpp:54
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
Farm
The base class for all farm types.
Definition: farm.h:767
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